【发布时间】: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