gpt4 book ai didi

tensorflow - 具有中间层输出的 Keras 多输出自定义损失

转载 作者:行者123 更新时间:2023-12-04 15:03:43 35 4
gpt4 key购买 nike

我在 keras 中有一个模型,它接受两个输入并返回 3 个输出,我想计算一个自定义损失。我遇到的问题是我不知道如何在损失中使用中间层的输出。到目前为止,该模型由两个子模型(图中的 submodel1 和 submodel2)组成,最终损失由 loss1 和 loss2 之和组成。这很容易,因为 loss1 将 output1 与数据生成器的 label1 进行比较,并将 output2 与数据生成器的 label2 进行比较。

Multioutput custom loss

当我在模型中包含 submodel3 时,问题就来了,因为 loss3 将 output1 与 output3 进行比较,output1 是模型一层的输出,而不是数据生成器的 label3。我试过这种方式:

input1 = Input(shape=input1_shape)
input2 = Input(shape=input2_shape)
output1 = submodel1()([input1,input2]) #do not pay attention to the code notation, as it is a code to explain the problem.
output2 = submodel2()(output1)
output3 = submodel3()(output1)
@tf.function
def MyLoss(y_true, y_pred):
out1, out2, out3 = y_pred
inp1, inp2 = y_true

loss1 = tf.keras.losses.some_loss1(out1,inp1)
loss2 = tf.keras.losses.some_loss2(out2, inp2)
loss3 = tf.keras.losses.some_loss3(out2,out3)

loss = loss1 + loss2 + loss3
return loss

model = Model([input1,input2],[output1,output2,output3])
model.compile(optimizer='adam',loss = MyLoss)

但是我得到这个错误:

 OperatorNotAllowedInGraphError: iterating over `tf.Tensor` is not allowed: AutoGraph did convert this function. This might indicate you are trying to use an unsupported feature.

我正在使用 TensorFlow 2.3.0-rc0 版本。

最佳答案

您可以使用 add_loss 将多层输出传递给您的自定义函数。下面我在虚拟回归任务中复制了你的案例

X1 = np.random.uniform(0,1, (100,5))
X2 = np.random.uniform(0,1, (100,5))

y1 = np.random.uniform(0,1, 100)
y2 = np.random.uniform(0,1, 100)


def MyLoss(true1, true2, out1, out2, out3):

loss1 = tf.keras.losses.mse(out1, true1)
loss2 = tf.keras.losses.mse(out2, true2)
loss3 = tf.keras.losses.mse(out2, out3)

loss = loss1 + loss2 + loss3
return loss


input1 = Input(shape=(5,))
input2 = Input(shape=(5,))

output1 = Dense(1)(Concatenate()([input1,input2]))
output2 = Dense(1)(output1)
output3 = Dense(1)(output1)

true1 = Input(shape=(1,))
true2 = Input(shape=(1,))

model = Model([input1,input2,true1,true2], [output1,output2,output3])
model.add_loss(MyLoss(true1, true2, output1, output2, output3))
model.compile(optimizer='adam', loss=None)

model.fit(x=[X1,X2,y1,y2], y=None, epochs=3)

在推理模式下使用模型(移除 y1y2 作为输入):

final_model = Model(model.inputs[:2], model.output)
final_model.predict([X1,X2])

关于tensorflow - 具有中间层输出的 Keras 多输出自定义损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66526604/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com