我想联合训练两个自动编码器,并在最深层连接它们的激活层
如何在一个损失函数中添加所有项
假设:
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'
这有可能吗?我该怎么做
因此,您要做的是对每个输出执行
RootMeanSquareError
,然后执行加权和(在您的例子中是相同的权重)正如错误消息明确指出的:
通过在编译模型时传递一个包含3个loss函数的列表(可能相同或不同),您可以执行与在自定义loss函数中执行的操作相同的操作。此外,还可以通过传递
loss_weights
参数值来定义每个损失的权重。此外,您可以执行以下操作:相关问题 更多 >
编程相关推荐