将Keras拟合生成器功能中使用的验证数据的培训设置为False

将Keras拟合生成器功能中使用的验证数据的培训设置为False,keras,Keras,如何将Keras fit_generator中使用的验证_数据的training设置为False?我的模型中有退出层,我希望训练在训练期间为True,在验证和测试期间为False。我在数据生成器函数中添加了一个is_训练参数。如果是真的,我将Keras学习阶段设置为1,否则设置为0。请参阅Keras.io/backend/: if is_training: K.set_learning_phase( 1 ) else: K.set_learning_phase( 0 ) 因此,

如何将Keras fit_generator中使用的验证_数据的training设置为False?我的模型中有退出层,我希望训练在训练期间为True,在验证和测试期间为False。

我在数据生成器函数中添加了一个is_训练参数。如果是真的,我将Keras学习阶段设置为1,否则设置为0。请参阅Keras.io/backend/:

if is_training:
    K.set_learning_phase( 1 )
else:
    K.set_learning_phase( 0 )

因此,对于我的训练数据生成器,我使用is_training=True,对于我的验证数据生成器,我使用is_training=False。

Keras在进行验证时自动将学习阶段设置为False。你不需要做任何额外的事情

退出节点自动检查它们是否处于训练模式

如果要验证Keras是否自动更改学习模式标志,可以执行下面的代码。它添加了一个Lambda层,该层向图形添加一个打印张量,在每种情况下输出不同的消息

from tensorflow import keras
from tensorflow.keras.layers import *
from tensorflow.keras.models import Model
from tensorflow.keras import backend as K

def inspect(x):
  xp = K.in_train_phase(K.print_tensor(x, message='train x:'),
                        K.print_tensor(x, message='test x:'))
  return xp

def make_model():
  inp = Input(shape=(4,))
  h1 = Dense(2)(inp)
  h1p = Lambda(inspect)(h1)
  out = Dense(1)(h1p)
  model = Model(inp, out)
  model.compile('adam', 'mse')
  return model

model = make_model()
model.summary()


import numpy as np

X_train = np.random.rand(1, 4)
Y_train = np.random.rand(1, 1)
X_test = np.random.rand(1, 4)
Y_test = np.random.rand(1, 1)

model.fit(X_train, Y_train, validation_data=(X_test, Y_test))

那么,为什么当我在数据生成器函数中打印K.learning_phase时,它会在运行训练数据和验证数据时打印0?我相信数据生成器不会从TensorFlow图运行;至少在TensorFlow<2.0中,它作为python函数独立运行,然后调用该图。K.学习阶段将在执行图形时设置。如果您想使用K.learning_phase,您需要在图形操作期间执行的函数中执行。即使如此,如果它在图形上发生变化,如果从生成器函数打印,我是否应该看不到这种变化?我可以在哪里打印以查看更改发生的时间?如果我在您发布的源代码的核心模块的调用函数中的return语句上方添加打印,我会在那里看到它,是吗?那么确定发生了什么的有效方法是什么?我想确认Keras实际上是在做它所说的。网络上有很多错误信息,我需要直接验证Keras是否在这样做。开发人员如何确定它在没有打印的情况下工作?无论谁投了反对票,请参阅Francois Chollet blog.keras.io/的这篇博客文章…。这是2016年的,但仍然证实了我的怀疑。