在keras实施对抗性训练

时间:2017-08-02 23:17:30

标签: python neural-network deep-learning keras keras-2

我想用分类器实现一个对抗网络,该分类器的输出连接到一个对手,该对手必须根据分类器的输出猜测分类器输入的特定特征(一个讨厌的参数)(详细说明)在这篇文章中可以找到这种对抗性网络:learning to pivot with adversarial networks

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

  1. 批量训练对手(分类器将被修复)
  2. 冻结对手
  3. 训练整个模型,而对手被批量冻结
  4. 解冻对手
  5. 重复其他批次
  6. 随机播放并重复其他时代
  7. 训练对手时我希望损失函数是分类交叉熵,当训练整个模型时,我希望它是分类器的损失函数(二进制交叉熵损失)减去对手的损失乘以参数: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'])
    

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

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

    在使用model.fit时,是否有更好的方法进行对抗训练?

0 个答案:

没有答案