在喀拉拉邦进行对抗训练

ani*_*omi 6 python neural-network deep-learning keras keras-2

我想用一个分类器实现一个对抗网络,该分类器的输出连接到一个对手,该对手必须根据分类器的输出(该分类器的详细说明)来猜测分类器输入的具体特征(讨厌的参数)。对抗网络可以在本文中找到:学习如何对抗网络

然后将对模型进行如下训练:

  1. 批量训练对手(分类器将被固定)
  2. 冻结对手
  3. 在对手冻结的情况下训练整个模型
  4. 解冻对手
  5. 对其他批次重复
  6. 随机播放并重复其他时期

在训练对手时,我希望损失函数是分类交叉熵,而在训练整个模型时,我希望它是分类器的损失函数(二进制交叉熵损失)减去对手的损失乘以参数:L_c() - b * L_a()

我见过的大多数对抗性训练代码都是使用train_on_batch在Keras中训练的。但是,由于我已经使用另一个顺序模型进行了大量代码设置,并且想重用它,因此我想知道是否存在一种实现此模型并在Keras中使用model.fit对其进行训练的方法。

我当时想做的是使用Keras功能API设置模型,其中将分类器输入作为输入,将分类器和对手输出作为输出。我还将模型编译为仅具有单个输出的对手模型。例如:

classifier_input = Input(shape=(10,))
x = Dense(50, activation='tanh')(classifier_input)
x = Dense(25, activation='tanh')(x)
x = Dense(5, activation='tanh')(x)
classifier_output = Dense(1, activation='sigmoid')(x)

x = Dense(30, activation='tanh')(classifier_output)
x = Dense(15, activation='tanh')(x)
x = Dense(5, activation='tanh')(x)
adversary_output = Dense(3, activation='sgimoid')(x)

adversary = Model(inputs=classifier_input , outputs=adversary_output)
adversary.compile(optimizer='Adamax', loss='categorical_crossentropy', metrics=['accuracy'])

final_model = Model(inputs=classifier_input,outputs=[classifier_output,adversary_output])
final_model.compile(optimizer='Adamax', 
              loss=['binary_crossentropy', 'categorical_crossentropy'], 
              loss_weights=[1.0, -0.1], metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

然后我想在on_batch_begin中设置一个回调来训练对手(冻结分类器中的层之后),然后使用model.fit代码完成final_model的训练(我将冻结对手并解冻分类器层。 on_batch_begin即将在final_model的训练开始之前)。

但是然后我不知道是否有可能将当前批处理作为参数传递给on_batch_begin。我必须在Callback中设置自己的批次,还是可以通过model.fit传递批次?

在仍然使用model.fit的同时,有没有更好的方式进行对抗训练?