使用多输入tf.data.Dataset训练Keras模型报错求助
解决多输入Keras模型使用tf.data.Dataset训练的报错问题
错误根源
你当前的a_train_ds和b_train_ds都是包含(输入数据, 标签)的Dataset,但Keras多输入模型需要的输入结构是**(输入1数据, 输入2数据)**与标签配对的格式,直接传入两个独立的Dataset列表会导致数据适配器无法识别输入格式。另外代码里的中文引号(‘’)也会引发语法错误,需要替换为英文引号('')。
修正步骤
调整Dataset结构
先分别创建仅包含输入数据的Dataset,再将两个输入Dataset合并,并与标签配对,形成((输入a, 输入b), 标签)的结构:# 仅创建输入数据的Dataset,不包含标签 a_train_ds = tf.data.Dataset.from_tensor_slices(x_train) b_train_ds = tf.data.Dataset.from_tensor_slices(x_train) # 合并两个输入Dataset,并与标签配对 train_ds = tf.data.Dataset.zip((a_train_ds, b_train_ds)).map(lambda a, b: ((a, b), y_train)) # 验证集同理 a_valid_ds = tf.data.Dataset.from_tensor_slices(x_valid) b_valid_ds = tf.data.Dataset.from_tensor_slices(x_valid) valid_ds = tf.data.Dataset.zip((a_valid_ds, b_valid_ds)).map(lambda a, b: ((a, b), y_valid))若x_train是numpy数组,也可以直接一步创建:
train_ds = tf.data.Dataset.from_tensor_slices(((x_train, x_train), y_train)) valid_ds = tf.data.Dataset.from_tensor_slices(((x_valid, x_valid), y_valid))修正代码中的中文引号
将所有中文单引号‘’替换为英文单引号'',比如name=‘a_input’改为name='a_input',loss=‘mse’改为loss='mse'等。修改model.fit调用
直接传入合并后的Dataset,不需要列表形式:model.fit(train_ds, validation_data=valid_ds, epochs=1)
完整修正后的代码
import tensorflow as tf from tensorflow import keras import numpy as np # 示例测试数据(替换为你的真实数据) x_train = np.random.rand(100, 4, 4) y_train = np.random.rand(100, 2) x_valid = np.random.rand(20, 4, 4) y_valid = np.random.rand(20, 2) # 创建正确结构的Dataset train_ds = tf.data.Dataset.from_tensor_slices(((x_train, x_train), y_train)) valid_ds = tf.data.Dataset.from_tensor_slices(((x_valid, x_valid), y_valid)) # 构建模型(修正引号) a_input = keras.layers.Input(shape=(4,4), name='a_input') x = keras.layers.Flatten()(a_input) x = keras.layers.Dense(5)(x) b_input = keras.layers.Input(shape=(4,4), name='b_input') y = keras.layers.Flatten()(b_input) y = keras.layers.Dense(5)(y) z = keras.layers.concatenate([x,y]) z = keras.layers.Dense(2)(z) model = keras.models.Model(inputs=[a_input, b_input], outputs=z) model.compile(loss='mse', optimizer='adam', metrics=['mae']) model.fit(train_ds, validation_data=valid_ds, epochs=1)
内容的提问来源于stack exchange,提问作者bric depo
相关产品推荐
相关产品推荐

