PaddlePaddle使用预测模型预测图片时出现输出数据维度错误

  • 问题描述:在使用预测模型进行预测图片的时候,图片也经过预处理,但是在执行预测的时出现卷积层输入的形状不为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可以自动设置。

你可能感兴趣的:(PaddlePaddle,问答专区)