tensorflow 多输入LSTM的分裂张流BatchDataset

q8l4jmvw  于 2023-02-09  发布在  其他
关注(0)|答案(2)|浏览(182)

我用两个输入构建了一个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,无,无,无)。"

nom7f22z

nom7f22z1#

您可以使用tf.split()函数沿着最后一个轴分割输入Tensor,然后将分割Tensor作为单独的输入传递给模型。要修复遇到的“ValueError”,您需要将tf.split()的输出转换为tf.int64或其他兼容的数据类型作为模型的输入:

input_dataset = timeseries_dataset_from_array(
    df[["cat", "num1", "num2"]], df["target"], sequence_length=n_timesteps, sequence_stride=1, batch_size=20
)

input_dataset2 = input_dataset.map(lambda x, y: (tf.split(x, [1, 2], axis=-1), y))
input_dataset2 = input_dataset2.map(lambda x, y: (list(map(lambda x: tf.cast(x, tf.int64), x)), y))

model.fit(
    input_dataset2, steps_per_epoch=20, epochs=50, verbose=0, shuffle=True
)
ve7v8dk2

ve7v8dk22#

我通过显式添加tuple()解决了这个问题-否则括号不会被识别为元组:

input_dataset = input_dataset.map(lambda x, y: 
    (
        tuple(
            tf.split(x, [1,2], -1)
        ),
        y
    )
)

相关问题