【问题标题】:Using tf.data.Dataset to feed data to a Keras model with multiple inputs使用 tf.data.Dataset 将数据提供给具有多个输入的 Keras 模型
【发布时间】:2019-12-10 02:36:41
【问题描述】:

我有一个使用 tf.keras 构建的模型,它有两个输入(“input_1”和“input_2”),它们被馈送到网络中的不同分支。最终输出是单个输出。由于我的数据量很大,我想使用 tf.data 来处理输入管道。

我尝试了此处提供的解决方案: https://stackoverflow.com/a/52661189/5956578

但是,当我使用该解决方案运行 model.fit 时出现错误:

Invalid argument: You must feed a value for the placeholder tensor 'input_2' with dtype float and shape [20,375,1242,1]
[[{{node input_2}}]]

我意识到这是因为 Dataset 的输出是由“input_1”和“input_2”组成的 dict,model.fit 无法正确输入相应的输入。

任何解决此问题的帮助,或训练多输入 tf.keras 网络的替代解决方案将不胜感激。

编辑:根据上述链接中的解决方案,这是我的代码的相关部分:

...

input_1 = tf.keras.layers.Input(name='input_1', batch_size=batch_size, shape=(IMAGE_HEIGHT, IMAGE_WIDTH, 3))
input_2 = tf.keras.layers.Input(name='input_2', batch_size=batch_size, shape=(IMAGE_HEIGHT, IMAGE_WIDTH, 1))
output = KerasFunctionalAPINet(input_1, input_2)
model = tf.keras.models.Model(inputs=[input_1, input_2], outputs=output, name='Network')

...

def train_generator():
    for i in range(100):
        # Code to get images "source_1", "source_2" and labels "labels" from another python module
        yield {"input_1": source_1, "input_2": source_2}, labels
train_set = tf.data.Dataset.from_generator(train_generator, output_types=({"input_1": tf.float32, "input_2": tf.float32}, tf.float32), output_shapes=({"input_1": (IMAGE_HEIGHT, IMAGE_WIDTH, 3), "input_2": (IMAGE_HEIGHT, IMAGE_WIDTH, 1)}, (6, 1)))
train_set = train_set.batch(batch_size*2, drop_remainder=True)

def test_generator():
    for i in range(100):
        # Code to get images "source_1", "source_2" and labels "labels" from another python module
        yield {"input_1": source_1, "input_2": source_2}, labels
test_set = tf.data.Dataset.from_generator(test_generator, output_types=({"input_1": tf.float32, "input_2": tf.float32}, tf.float32), output_shapes=({"input_1": (IMAGE_HEIGHT, IMAGE_WIDTH, 3), "input_2": (IMAGE_HEIGHT, IMAGE_WIDTH, 1)}, (6, 1)))
train_set = train_set.batch(batch_size*2, drop_remainder=True)

...

model.fit(
    train_set,
    steps_per_epoch=(int)(no_of_samples/batch_size),
    epochs=epochs,
    validation_data=test_set,
    validation_steps=(int)(no_of_samples/batch_size),
    shuffle=True,
    verbose=1
)

【问题讨论】:

  • 我认为你应该同时提供你的代码,这样我们就可以知道这个错误是在什么情况下出现的
  • 在编辑中添加。
  • steps_per_epoch=(int)(no_of_samples/batch_size)
  • 你不应该使用model.fit_generator而不是model.fit吗?另外,您使用的是什么版本的 tensorflow:2.0 还是最旧的?

标签: python tensorflow keras tf.keras


【解决方案1】:
yield [source_1, source_2], labels

【讨论】:

  • 谢谢。我想到了这一点,但是我在为数据集定义 output_types 和 output_shapes 时遇到了麻烦。你能帮忙吗?
猜你喜欢
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2021-08-13
相关资源
最近更新 更多