0

我的模型中有 dropout 层,所以我希望 keras 找出训练和测试阶段以运行或忽略 dropout 层,我发现 K.set_learning_phase 可以帮我这个忙,但是我如何将它添加到训练和测试过程中? 我的代码是这样的:

def discriminator(self):
    x_A = Input(shape=self.shape)
    x_B = Input(shape=self.shape)
    x = concatenate([x_A, x_B], axis=-1)
    self.model = Sequential()
    self.model.add(Dropout(0.5, input_shape=self.shape_double))
    self.model.add(LSTM(200, return_sequences=True, kernel_constraint=unit_norm()))
    self.model.add(Dropout(0.5))
    self.model.add(LSTM(200, return_sequences=True, kernel_constraint=unit_norm()))
    self.model.add(Dropout(0.5))
    self.model.add(Flatten())
    self.model.add(Dense(8, activation="softmax", kernel_constraint=unit_norm())

    label=self.model(x)

    return Model([x_A,x_B], label)
...
def train(self, epoch, batch_size):
    for epoch in range(epochs):
        for batch,train_A,train_B,train_label in enumerate(Load_train(batch_size)):
            Dloss = self.discriminator.train_on_batch([train_A,train_B],train_label)
            ...
def test(self,test_A,test_B,test_label):
    predicted_label_dist = self.discriminator.predict([test_A,test_B])
    ...

任何建议将不胜感激。谢谢。

4

1 回答 1

3

默认情况下,当您调用 fit 或 predict 时,Keras 确实会自行计算出适当的学习阶段。因此,您的 dropout 只会在训练期间应用,而不是在测试期间应用。但是,如果您仍然希望自己配置训练阶段,即覆盖默认行为,您可以这样做(来自 keras 文档):

keras.backend.set_learning_phase(value) 

在哪里:

value:学习阶段值,0 或 1(整数)。

只需将此代码添加到您的训练和测试功能中。

于 2019-01-09T12:16:09.323 回答