-
问题描述:PaddlePaddle的Fluid版输入数据是否可以不指定尺寸,或者实际输入图像跟所指定尺寸不一样?
-
报错输出:
Traceback (most recent call last):
File "/Users/jizhi/Desktop/Paddle/Paddlecode/test.py", line 4, in <module>
images = fluid.layers.data(name='pixel', shape=None, dtype='float32')
File "/Users/jizhi/anaconda3/envs/paddle/lib/python3.5/site-packages/paddle/fluid/layers/io.py", line 77, in data
shape = list(shape)
TypeError: 'NoneType' object is not iterable
- 问题复现:
import paddle.fluid as fluid
import numpy as np
images = fluid.layers.data(name='pixel', shape=None, dtype='float32')
- 问题分析:
在PaddlePaddle中,data layer是必须指定shape尺寸的,但实际输入叙事指定尺寸可以不一样,如果data layer没有定义shape,则会报出'NoneType' object is not iterable
- 问题解答:
使用fluid.lyaers.data()方法时需要指定shape参数
images = fluid.layers.data(name='images', shape=[3, 32, 32], dtype='float32')
- 问题拓展:
data layer中shape是必须添加的,可以从PaddlePaddle的data()方法代码看出这一样要求。
def data(name,
shape,
append_batch_size=True,
dtype='float32',
lod_level=0,
type=core.VarDesc.VarType.LOD_TENSOR,
stop_gradient=True):
helper = LayerHelper('data', **locals())
shape = list(shape)
for i in six.moves.range(len(shape)):
if shape[i] is None:
shape[i] = -1
append_batch_size = False
elif shape[i] < 0:
append_batch_size = False
if append_batch_size:
shape = [-1] + shape # append batch size as -1
data_var = helper.create_global_variable(
name=name,
shape=shape,
dtype=dtype,
type=type,
stop_gradient=stop_gradient,
lod_level=lod_level,
is_data=True)
return data_var
从data()方法的代码中可以看出,如果shape中没有定义batch,会自动设置为-1。