PaddlePaddle在使用预测模型预测图片的时候出现in_dims[1]:32 != filter_dims[1] * groups:3错误

  • 问题描述:在使用预测模型预测图片的时候,图片也经过预处理,但是在执行预测的时候就保存,错误提示in_dims[1]:32 != filter_dims[1] * groups:3。

  • 报错信息:

<ipython-input-17-246b35b3c3dc> in infer(use_cuda, inference_program, params_dirname)
     27 
     28     ## inference
---> 29     results = inferencer.infer({'pixel': img})
     30 
     31     label_list = [

/usr/local/lib/python3.5/dist-packages/paddle/fluid/contrib/inferencer.py in infer(self, inputs, return_numpy)
    102             results = self.exe.run(feed=inputs,
    103                                    fetch_list=[self.predict_var.name],
--> 104                                    return_numpy=return_numpy)
    105 
    106         return results

/usr/local/lib/python3.5/dist-packages/paddle/fluid/executor.py in run(self, program, feed, fetch_list, feed_var_name, fetch_var_name, scope, return_numpy, use_program_cache)
    468 
    469         self._feed_data(program, feed, feed_var_name, scope)
--> 470         self.executor.run(program.desc, scope, 0, True, True)
    471         outs = self._fetch_data(fetch_list, fetch_var_name, scope)
    472         if return_numpy:

EnforceNotMet: Enforce failed. Expected in_dims[1] == filter_dims[1] * groups, but received in_dims[1]:32 != filter_dims[1] * groups:3.
The number of input channels should be equal to filter channels * groups. at [/paddle/paddle/fluid/operators/conv_op.cc:60]
PaddlePaddle Call Stacks: 
0       0x7ff682f386b6p paddle::platform::EnforceNotMet::EnforceNotMet(std::__exception_ptr::exception_ptr, char const*, int) + 486
1       0x7ff6837b01c6p paddle::operators::ConvOp::InferShape(paddle::framework::InferShapeContext*) const + 5622
  • 问题复现:使用训练CIFAR-10数据的模型来预测图片,图片进下面的代码进行预处理,先是对图片进行压缩统一大小,然后再对图片转换成向量,接着进行归一化,最后改变图片的维度。但是在执行预测的时候就会出现。错误代码如下:
def load_image(file):
    im = Image.open(file)
    im = im.resize((32, 32), Image.ANTIALIAS)
    im = np.array(im).astype(np.float32)
    im = im / 255.0
    im = numpy.expand_dims(im, axis=0)
    return im
  • 解决问题:使用预测模型进行预测图片的时候,图片的通道顺序需要的是(通道数, 宽, 高),但PIL打开方式是(宽, 高, 通道数),所以才会导致出现的出现,需要加一行代码im.transpose((2, 0, 1))改名通道顺序。正确代码如下:
def load_image(file):
    im = Image.open(file)
    im = im.resize((32, 32), Image.ANTIALIAS)
    im = np.array(im).astype(np.float32)
    im = im.transpose((2, 0, 1))  ## CHW
    im = im / 255.0
    im = numpy.expand_dims(im, axis=0)
    return im
  • 问题拓展:图片转化成向量,它的维度分别由通道数、图片的宽、图片的高。PaddlePaddle读取的方式是(通道数, 宽, 高),所以无论是用什么工具对图片进行预处理,都要转换成这个顺序。PIL工具的im.transpose((2, 0, 1))函数,0表示图片的宽、1表示图片的高、2表示图片的通道数。

猜你喜欢

转载自blog.csdn.net/PaddlePaddle/article/details/87642099
今日推荐