错误的原因是什么ValueError:每个通道预计超过1个值?

时间:2018-01-19 14:58:43

标签: python torch pytorch

reference fast.ai

github repository of fast.ai (因为代码提升了构建在 PyTorch 之上的库)

  

请滚动讨论

我正在运行以下代码,并在尝试将数据传递给predict_array函数时出错

当我尝试使用它直接在单个图像上进行预测时代码失败但是当同一图像位于test文件夹中时它完美运行

from fastai.conv_learner import *
from planet import f2

PATH = 'data/shopstyle/'

metrics=[f2]
f_model = resnet34

def get_data(sz):
    tfms = tfms_from_model(f_model, sz, aug_tfms=transforms_side_on, max_zoom=1.05)
    return ImageClassifierData.from_csv(PATH, 'train', label_csv, tfms=tfms, suffix='.jpg', val_idxs=val_idxs, test_name='test')

def print_list(list_or_iterator):
        return "[" + ", ".join( str(x) for x in list_or_iterator) + "]"

label_csv = f'{PATH}prod_train.csv'
n = len(list(open(label_csv)))-1
val_idxs = get_cv_idxs(n)

sz = 64
data = get_data(sz)

print("Loading model...")
learn = ConvLearner.pretrained(f_model, data, metrics=metrics)
learn.load(f'{sz}')
#learn.load("tmp")

print("Predicting...")
learn.precompute=False
trn_tfms, val_tfrms = tfms_from_model(f_model, sz)
#im = val_tfrms(open_image(f'{PATH}valid/4500132.jpg'))
im = val_tfrms(np.array(PIL.Image.open(f'{PATH}valid/4500132.jpg')))
preds = learn.predict_array(im[None])
p=list(zip(data.classes, preds))
print("predictions = " + print_list(p))

这里是我正在获取的回溯

  Traceback (most recent call last):
  File "predict.py", line 34, in <module>
    preds = learn.predict_array(im[None])
  File "/home/ubuntu/fastai/courses/dl1/fastai/learner.py", line 266, in predict_array
    def predict_array(self, arr): return to_np(self.model(V(T(arr).cuda())))
  File "/home/ubuntu/src/anaconda3/envs/fastai/lib/python3.6/site-packages/torch/nn/modules/module.py", line 325, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/ubuntu/src/anaconda3/envs/fastai/lib/python3.6/site-packages/torch/nn/modules/container.py", line 67, in forward
    input = module(input)
  File "/home/ubuntu/src/anaconda3/envs/fastai/lib/python3.6/site-packages/torch/nn/modules/module.py", line 325, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/ubuntu/src/anaconda3/envs/fastai/lib/python3.6/site-packages/torch/nn/modules/batchnorm.py", line 37, in forward
    self.training, self.momentum, self.eps)
  File "/home/ubuntu/src/anaconda3/envs/fastai/lib/python3.6/site-packages/torch/nn/functional.py", line 1011, in batch_norm
    raise ValueError('Expected more than 1 value per channel when training, got input size {}'.format(size))
ValueError: Expected more than 1 value per channel when training, got input size [1, 1024]

我尝试过的事情

  • np.expand_dims(IMG,axis=0) or image = image[..., np.newaxis]

  • 尝试了另一种阅读图像的方法

    img = cv2.imread(img_path)
    img = cv2.resize(img, dsize = (200,200))
    img = np.einsum('ijk->kij', img)
    img = np.expand_dims(img, axis =0) 
    img = torch.from_numpy(img) 
    learn.model(Variable(img.float()).cuda())
    

BTW错误仍然存​​在

ValueError: Expected more than 1 value per channel when training, got input size [1, 1024]

Google搜索中也找不到任何参考 ..

3 个答案:

答案 0 :(得分:7)

如果我们使用基于特征的批量规范化,它将在批量1的批次上失败。

作为批量标准化计算:

(SELECT a.id, a.group_type, a.promoted, a.created_at
 FROM ( 
       SELECT group_type, MAX(promoted) AS max_promoted
              FROM nodes
              WHERE node_id=4321 and status=1
              GROUP BY group_type
      ) AS g
 INNER JOIN nodes AS a
 ON a.group_type = g.group_type AND a.promoted = g.max_promoted
 WHERE node_id= 4321 and status=1 ORDER BY created_at desc
limit 1)
union
(select a.id, a.group_type, a.promoted, a.created_at from nodes a order by created_at desc limit 1)
limit 1

如果我们每批有一个样本,那么y = (x - mean(x)) / (std(x) + eps) ,输出将完全为零(忽略偏差)。我们不能用它来学习......

答案 1 :(得分:0)

要使用训练有素的模型,请调用model.eval()禁用进一步的训练。这将阻止BatchNorm图层更新其均值和方差,并仅允许输入一个样本。如果需要,请使用model.train()恢复训练模式。

答案 2 :(得分:0)

我今天遇到了同样的问题。我的批量大小是五。看起来我的数据集是最后一批只有 1,所以它会导致批标准化层出现错误。 将批大小更改为确保最后一批不等于 1 的值解决了我的问题。就我而言,我从 5 改为 6