-
问题描述:在使用预测模型进行预测图片的时候,图片也经过预处理,但是在执行预测的时出现卷积层输入的形状不为4维或者5维的错误。
-
报错信息:
/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: Conv intput should be 4-D or 5-D tensor. at [/paddle/paddle/fluid/operators/conv_op.cc:47]
PaddlePaddle Call Stacks:
- 问题复现:使用预测模型来预测图片,图片进下面的代码进行预处理,先是对图片进行压缩统一大小,然后再对图片转换成向量,接着改变图片的顺序,最后进行归一化。但是在执行预测的时候就会出现。错误代码如下:
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
return im
- 解决问题:PaddlePaddle最后读取预测的数据应该是有4个维度的,分别是Batch大小、图片的通道数、图片的宽、图片的高。错误的代码是因为没有对图片数据加一个Batch的维度。所以最后需要使用
numpy.expand_dims(im, axis=0)
需要进行修改图片的维度。
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
- 问题拓展:不仅在预测的是需要设置数据的Batch大小,在训练的是也需要设置图片的Batch的大小,在使用接口
fluid.layers.data
定义输入层时,shape
参数设置也应该要有数据的Batch大小的,但是不用我们手动设置,PaddlePaddle可以自动设置。