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

Python 两个连接的自动编码器的Keras损耗,python,tensorflow,keras,Python,Tensorflow,Keras,我想共同训练两个自动编码器,并在最深层连接它们的激活层 如何在一个损失函数中添加所有项 假设: 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','

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

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

假设:

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->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>]

这可能吗?我该怎么做

因此,您所做的是对每个
n=3
输出执行
RootMeanSquareError
,然后执行加权和(在您的情况下权重相同)

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

ValueError:将列表作为丢失传递时,每个列表应具有一个条目 模型输出。模型有3个输出,但您通过了

通过在编译模型时传递一个包含3个损失函数(可能相同或不同)的列表,您可以执行与自定义损失函数相同的操作。此外,您还可以通过传递
loss\u 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])

谢谢你的回复。我已经有了同样的方法,但我怀疑每个网络都是单独优化的,不会影响并行分支中的权重;这就是为什么我想将所有输出合并到一个损失函数中。如果我使用单独的损失函数,反向传播会修改所有权重吗?
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])