如何使用自定义生成器函数来提供Keras模型.一个接一个地试装样品?



问题

使用我的自定义生成器函数(见下面的代码)将数据输入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)

相关内容

  • 没有找到相关文章

最新更新