两个相连的自动编码器的Keras损耗

2024-10-02 00:35:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我想联合训练两个自动编码器,并在最深层连接它们的激活层

如何在一个损失函数中添加所有项

假设:

diffLR = Lambda(lambda x: abs(x[0] - x[1]))([model1_act7, model2_act5])
model = Model(inputs=[in1, in2], outputs=[diffLR, model1_conv15, model2_conv10])
model.compile(loss=['MAE', 'mean_squared_error','mean_squared_error'],
          optimizer='SGD',
          metrics=['mae', rmse])

model.fit([x_train_n, y_train_n], [yM1, x_train_n, y_train_n], batch_size=10, epochs=350, validation_split=0.2, shuffle=True) #, callbacks=[es])

两个网络是卷积自动编码器映射x->;x和y->;是的。Lambda层连接两个网络的潜在空间。diffLR的目标是训练网络,使两个特征空间代表相同的分布(yM1是与潜在特征空间大小相同的零矩阵。)

现在每一个都是单独优化的(或者我认为它们是单独优化的…),我想把它们合并到一个单一的损失函数中,如下所示:

def my_loss(z, x, y, z_pred, x_pred, y_pred):
loss = backend.sqrt(backend.mean(backend.square(x_pred-x))) + backend.sqrt(backend.mean(backend.square(y_pred-y))) + backend.sqrt(backend.mean(backend.square(z_pred-z)))
return loss

model.compile(loss=[my_loss],
          optimizer='SGD',
          metrics=['mae', rmse])

我得到这个错误:

ValueError: When passing a list as loss, it should have one entry per model outputs. The model has 3 outputs, but you passed loss=[<function my_loss at 0x7fa3d17f2158>]

或者

model.compile(loss=my_loss,
          optimizer='SGD',
          metrics=['mae', rmse])

TypeError: my_loss() missing 4 required positional arguments: 'y', 'z_pred', 'x_pred', and 'y_pred'

这有可能吗?我该怎么做


Tags: backendmodelmytrainmeanoutputsmetricsoptimizer
1条回答
网友
1楼 · 发布于 2024-10-02 00:35:12

因此,您要做的是对每个输出执行RootMeanSquareError,然后执行加权和(在您的例子中是相同的权重)

正如错误消息明确指出的:

ValueError: When passing a list as loss, it should have one entry per model outputs. The model has 3 outputs, but you passed....

通过在编译模型时传递一个包含3个loss函数的列表(可能相同或不同),您可以执行与在自定义loss函数中执行的操作相同的操作。此外,还可以通过传递loss_weights参数值来定义每个损失的权重。此外,您可以执行以下操作:

def my_loss(y_true, y_pred):
        return backend.sqrt(K.mean(K.square(y_pred - y_true))) 

 model.compile(loss=[my_loss, my_loss, my_loss], # you can pass 3 different (custom) loss function as well
          loss_weight=[1.0, 1.0, 1.0], # Default value is 1
          optimizer='SGD',
          metrics=['mae', rmse])

相关问题 更多 >

    热门问题