如何同时训练两个神经网络以最小化它们的输出之间的差异?

Posted

技术标签:

【中文标题】如何同时训练两个神经网络以最小化它们的输出之间的差异?【英文标题】:How to simultaneously train two neural networks to minimize the difference between their outputs? 【发布时间】:2019-01-10 05:26:02 【问题描述】:

对于每个事件/样本,我有一组值 x1、x2、y1、y2、z、k。我有 2 个神经网络,我想接受两个阶段的训练。第一个神经网络将 x1,x2 作为输入和输出 z。第二个神经网络以 y1,y2 作为输入,输出 k。

第一阶段: 分别训练输入 x1,x2 输出 z 的第一个神经网络和输入 y1,y2 输出 k 的第二个神经网络。

第二阶段: 在这里,我准备放弃 z 和 k,我正在寻找一个介于 z 和 k 之间的值 h。因此,对于这个阶段,我想训练两个神经网络以最小化它们的输出之间的差异(即对于每个时期,在 NN2 的输出上训练 NN1,并在 NN1 的输出上训练 NN2。更新每个神经网络的权重和偏差. 然后,使用新的权重和偏差为每个计算一个新的输出。然后,通过另一个 epoch 在 NN2 的新输出上训练 NN1,并在 NN1 的新输出上训练 NN2)

什么机器学习包可以让我做到这一点。我熟悉 Keras(带有 TensorFlow 后端)。在 Keras 有可能吗?如果没有,在 TensorFlow 中可以吗?

谢谢

【问题讨论】:

TensorFlow 已经可以做到这一点,Keras 也可能如此。但是你试过什么?我们无法判断您自己的尝试可能会出现哪些问题。 【参考方案1】:

假设您拥有model1model2 这两个模型。

让我们创建一个层来计算它们的输出之间的差异:

from keras.layers import Lambda

difference = Lambda(lambda x: x[0] - x[1])([model1.output, model2.output])

那么,让我们制作一个输出差异的模型。

#if your models have one input each, (if x1 and x2 are elements in the input array)
diffModel = Model([model1.input, model2.input], difference)

#if your models have two inputs (if x1 and x2 are two input tensors)    
diffModel = Model(model1.inputs + model2.inputs, difference)

让我们编译这个模型,选择一个损失来比较与0的差异:

diffModel.compile(optimizer = 'adam', loss='mse')

让我们用零作为输出来训练它:

#if models with one input:
diffModel.fit([x,y], np.zeros(shape))

#if models with two inputs:
diffModel.fit([x1,x2,y1,y2], np.zeros(shape))

【讨论】:

以上是关于如何同时训练两个神经网络以最小化它们的输出之间的差异?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 中训练网络以适应不同的输出大小

如何置换二进制字符串以最小化它们之间的距离?

CCF最小差值

我应该如何使用预训练模型优化神经网络以进行图像分类

如何在仍然能够训练的同时转换 NN 的输出?

Keras:如何“合并”两个不同神经网络的输出来训练解码器?