我用两个输入构建了一个LSTM模型:一个用于分类变量,一个用于数值变量:
model = Model(inputs = [cat_input, num_input], outputs = x, name = "LSTM")
LSTM的输入数据通过tensorflow.keras.utils.timeseries_dataset_from_array()
生成:
input_dataset = timeseries_dataset_from_array(
df[["cat", "num1", "num2"]], df["target"], sequence_length=n_timesteps, sequence_stride=1, batch_size=20
)
当我直接将input_dataset
输入到模型中时,我得到了以下错误:"值错误:层"LSTM"期望2个输入,但它接收到1个输入Tensor。接收到的输入:[〈tf. Tensor 'IteratorGetNext:0' shape =(None,None,3)dtype = int64〉]",因为模型期望两个输入而不是一个。
我可以这样实现这个(有点难看):
input_dataset2 = input_dataset.map(lambda x, y: ((x[:,:,0:1], x[:,:,1:3]), y))
model.fit(
input_dataset2, steps_per_epoch=20, epochs=50, verbose=0, shuffle=True
) # this now works
我的问题:我找到的解决方案不是很优雅,这种拆分在tf.split()
或其他函数中也有可能吗?
编辑:当我尝试以下操作时:
input_dataset.map(lambda x, y: ((split(value=x, num_or_size_splits=[1, 2], axis = -1)), y))
我得到这个错误:"值错误:值[〈tf.Tensor'拆分:0'形状=(无,无,1)dtype = int64〉,〈tf.Tensor'拆分:1'形状=(无,无,2)dtype = int64〉]不能转换为数据类型〈dtype:和形状(2,无,无,无)。"
2条答案
按热度按时间nom7f22z1#
您可以使用tf.split()函数沿着最后一个轴分割输入Tensor,然后将分割Tensor作为单独的输入传递给模型。要修复遇到的“ValueError”,您需要将tf.split()的输出转换为tf.int64或其他兼容的数据类型作为模型的输入:
ve7v8dk22#
我通过显式添加
tuple()
解决了这个问题-否则括号不会被识别为元组: