【问题标题】:Keras model with several inputs and several outputs具有多个输入和多个输出的 Keras 模型
【发布时间】:2019-01-22 17:35:25
【问题描述】:

我想构建一个具有两个输入和两个输出的 Keras 模型,它们都使用相同的架构/权重。然后使用两个输出来计算单个损失。

这是我想要的架构的图片。

这是我的伪代码:

model = LeNet(inputs=[input1, input2, input3],outputs=[output1, output2, output3])

model.compile(optimizer='adam',
          loss=my_custom_loss_function([output1,outpu2,output3],target)
          metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)

这种方法可行吗?
我需要使用不同的 Keras API 吗?

【问题讨论】:

  • 这在 Keras 的functional API 中有很好的记录。您可以在此处找到有关如何构建此类模型的示例和说明。
  • 我已经阅读了它,但我仍然不清楚。我想通过整个网络运行input1得到output1,然后通过同一个网络运行input2并得到output2。然后在最后计算一个组合损失。能否提供一个小代码示例?

标签: tensorflow keras


【解决方案1】:

架构很好。这是一个玩具示例,其中包含如何使用 keras 的功能 API 定义它的训练数据:

from keras.models import Model
from keras.layers import Dense, Input

# two separate inputs
in_1 = Input((10,10))
in_2 = Input((10,10))


# both inputs share these layers
dense_1 = Dense(10)
dense_2 = Dense(10)

# both inputs are passed through the layers
out_1 = dense_1(dense_2(in_1))
out_2 = dense_1(dense_2(in_2))

# create and compile the model
model = Model(inputs=[in_1, in_2], outputs=[out_1, out_2])

model.compile(optimizer='adam', loss='mse')
model.summary()

# train the model on some dummy data
import numpy as np

i_1 = np.random.rand(10, 10, 10)
i_2 = np.random.rand(10, 10, 10)

model.fit(x=[i_1, i_2], y=[i_1, i_2])

编辑如果您想一起计算损失,您可以使用Concatenate()

output = Concatenate()([out_1, out_2])

您传递给model.compile 的任何损失函数都将应用于output 的组合状态。从预测中获得输出后,您可以将其拆分回原始状态:

f = model.predict(...)

out_1, out_2 = f[:n], f[n:]

【讨论】:

  • # 创建和编译模型 model = Model(inputs=[in_1, in_2], outputs=[out_1, out_2]) model.compile(optimizer='adam', loss='mse')在您的示例中,损失是如何计算的?两种输出是否结合并评估为单一目标? => 这就是我需要的。
  • 您可以定义自定义损失函数,但在本例中使用了 mse。如果你想组合你的目标,你也可以使用concatenate在你的模型中组合它们,然后只输出一个向量。然后,您可以以任何方式拆分该向量以重建原始输出。
猜你喜欢
  • 2022-01-08
  • 2019-08-09
  • 2021-04-06
  • 2019-03-06
  • 2018-06-27
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2019-03-31
相关资源
最近更新 更多