【问题标题】:Keras costume loss for two connected Autoencoders两个连接的自动编码器的 Keras 服装丢失
【发布时间】:2019-12-05 19:12:08
【问题描述】:

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

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

假设:

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

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'

这可能吗?我怎样才能做到这一点?

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

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

    正如错误消息清楚地表明:

    ValueError: 当将列表作为损失传递时,它应该有一个条目 模型输出。该模型有 3 个输出,但您通过了....

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

    【讨论】:

    • 感谢您的回复。我已经采用了相同的方法,但我怀疑每个网络都是单独优化的,不会影响并行分支中的权重;这就是为什么我想将所有输出组合到一个损失函数中。如果我使用单独的损失函数,反向传播会修改所有权重吗?
    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 2018-09-13
    • 1970-01-01
    • 2018-11-19
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    相关资源
    最近更新 更多