Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the reason of the error ValueError: Expected more than 1 value per channel?

reference fast.ai

github repository of fast.ai (as the code elevates the library which is built on top of PyTorch)

Please scroll the discussion a bit

I am running the following code, and get an error while trying to pass the data to the predict_array function

The code is failing when i am trying to use it to predict directly on a single image but it run's perfectly when that same image is in a test folder

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))

Here's the Traceback I am Getting

  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]

Things I have Tried

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

  • Tried a different way of reading the image

    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 the error still remains

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

Can't find any reference in The Google search also..

like image 889
Aditya Avatar asked Jan 19 '18 14:01

Aditya


2 Answers

It will fail on batches of size 1 if we use feature-wise batch normalization.

As Batch normalization computes:

y = (x - mean(x)) / (std(x) + eps)

If we have one sample per batch then mean(x) = x, and the output will be entirely zero (ignoring the bias). We can't use that for learning...

like image 85
Aditya Avatar answered Nov 17 '22 14:11

Aditya


To use your trained model, call model.eval() to disable further training. This stops BatchNorm layers from updating their mean and variance, and allows input of just one sample. Use model.train() to resume training mode, if needed.

like image 39
Tronic Avatar answered Nov 17 '22 16:11

Tronic