我如何重新使用经过训练的 fastai 模型?
How do I re-use trained fastai models?
如何在 PyTorch 上使用 fastai 实现加载预训练模型?就像在 SkLearn 中一样,我可以使用 pickle 将模型转储到文件中,然后加载并稍后使用。在像下面这样声明学习实例后,我使用了 .load() 方法来加载以前保存的权重:
arch=resnet34
data = ImageClassifierData.from_paths(PATH, tfms=tfms_from_model(arch, sz))
learn = ConvLearner.pretrained(arch, data, precompute=False)
learn.load('resnet34_test')
然后预测图像的class:
trn_tfms, val_tfms = tfms_from_model(arch,100)
img = open_image('circle/14.png')
im = val_tfms(img)
preds = learn.predict_array(im[None])
print(np.argmax(preds))
但它给我带来了错误:
ValueError: Expected more than 1 value per channel when training, got input size [1, 1024]
如果我使用 learn.fit(0.01, 3)
而不是 learn.load()
,则此代码有效。我真正想要的是在我的应用程序中避免训练步骤。
这可能是一种边缘情况,其中某些批次的批次大小等于 1。确保 none 批次 = 1(主要是最后一批)
只要您的一批数据包含单个元素,就会出现此错误。
解决方案 1:
在 learn.load('resnet34_test')
之后调用 learn.predict()
解决方案 2:
从训练集中删除 1 个数据点。
在训练中,如果训练集批次中有 1 个数据,则会出现此错误。
如果您使用模型来预测输出,请确保设置
learner.eval()
如何在 PyTorch 上使用 fastai 实现加载预训练模型?就像在 SkLearn 中一样,我可以使用 pickle 将模型转储到文件中,然后加载并稍后使用。在像下面这样声明学习实例后,我使用了 .load() 方法来加载以前保存的权重:
arch=resnet34
data = ImageClassifierData.from_paths(PATH, tfms=tfms_from_model(arch, sz))
learn = ConvLearner.pretrained(arch, data, precompute=False)
learn.load('resnet34_test')
然后预测图像的class:
trn_tfms, val_tfms = tfms_from_model(arch,100)
img = open_image('circle/14.png')
im = val_tfms(img)
preds = learn.predict_array(im[None])
print(np.argmax(preds))
但它给我带来了错误:
ValueError: Expected more than 1 value per channel when training, got input size [1, 1024]
如果我使用 learn.fit(0.01, 3)
而不是 learn.load()
,则此代码有效。我真正想要的是在我的应用程序中避免训练步骤。
这可能是一种边缘情况,其中某些批次的批次大小等于 1。确保 none 批次 = 1(主要是最后一批)
只要您的一批数据包含单个元素,就会出现此错误。
解决方案 1: 在 learn.load('resnet34_test')
之后调用 learn.predict()解决方案 2: 从训练集中删除 1 个数据点。
在训练中,如果训练集批次中有 1 个数据,则会出现此错误。
如果您使用模型来预测输出,请确保设置
learner.eval()