问题
使用我的自定义生成器函数(见下面的代码)将数据输入Keras LSTM模型会给我带来以下错误:
WARNING:tensorflow:Model was constructed with shape (None, 3177, 2) for input
KerasTensor(type_spec=TensorSpec(shape=(None, 3177, 2), dtype=tf.float32, name='masking_9_input'),
name='masking_9_input', description="created by layer 'masking_9_input'"), but it was called on an
input with incompatible shape (None, None).
生成器函数
def padded_generator(trajectories=trajectories, max_length=3177):
X = []
Y = []
for trajectory in trajectories.values:
curr_X = np.hstack([trajectory[0][0]])
curr_Y = np.hstack([trajectory[0][2]])
temp = (np.hstack([trajectory[0][1:]]))
for i, point in enumerate(temp):
if i >= temp.shape[0] - 1: # Should break at second to last sample.
break
curr_X = np.vstack((curr_X, point)) # Stack next point on existing X
padded_X = np.squeeze(tf.keras.utils.pad_sequences([curr_X],
maxlen= 3177,
padding='post',
dtype=float,
value=-10))
curr_Y = temp[i+1] # Point added to X in next iter. is current target.
yield (padded_X, curr_Y)
data_gen = padded_generator()
这里的完整轨迹就是以
形式的点数组[[-0.1843775 0.6867699 ]
[-1.0841161 -3.0429556 ]
[ 1.3582058 -0.6040352 ]
[ 1.8754534 -1.7010269 ]
...
[-2.4015598 0.3573116 ]
[-1.3986164 -0.95052546]
[-0.705326 -1.3387672 ]
[-1.455082 -0.57572746]
[-3.1130497 -2.7871382 ]]
从这些,生成器每次调用时产生一个填充的部分轨迹X和相应的标签Y。它们的形状为:
Shape of X: (3177, 2)
Shape of Y: (2,)
现在,我为此编写的模型非常简单,但它确实具有相应的输入形状,以及正确的屏蔽层语法。
model = Sequential()
model.add(tf.keras.layers.Masking(mask_value=-10, input_shape=(3177, 2)))
model.add(LSTM(100, activation='relu', return_sequences=True))
model.add(LSTM(50, activation='relu', return_sequences=True))
model.add(LSTM(25, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(2))
model.compile(optimizer='adam', loss='mse')
然后,我运行:
model.fit(data_gen, verbose=1)
我在文章的顶部得到了错误。
我已经谷歌了,但我不知道如何解决这个问题。我根本不是专家,所以我希望用例子或简单的术语来解释。提前感谢您的帮助。
给将来有同样问题的人:
我不太确定是什么问题。我的猜测是,我的生成器将整个元组(input, label)作为输入提供给网络,而我只希望它提供输入而不是标签。因此,input_shape的错误。然而,Keras文档指出,应该使用返回(输入、目标)的Python生成器函数调用model.fit(generator_function),因此,虽然这听起来更合理,但我不确定情况是否如此,或者错误消息传递非常不清楚。
我通过制作tf来修复它。数据集从我的香草生成器中取出,只需运行:
data = tf.data.Dataset.from_generator(
padded_generator,
output_types= (tf.float32, tf.float32),
output_shapes= ((3177,2),(1,2))
)
data= data.batch(10)
最后一行确保批处理以创建形状(None, 3177, 2)的输入,以向LSTM层提供适当的ndims=3输入(在我修复问题中所指出的错误后给出错误)。
,
model.fit(data)
正常运行。
注意:如果你的生成器有函数参数,请使用lambda:
data = tf.data.Dataset.from_generator(
lambda: padded_generator(**Function arguments here**),
output_types= (tf.float32, tf.float32),
output_shapes= ((3177,2),(1,2))
)
data= data.batch(10)