在我的神经网络中,我试图在预测阶段保持辍学活跃。我正在尝试通过在Tensorflow 2.0 RC中使用tensorflow.keras.backend.set_learning_phase(1)来实现此目的。
当我调用model.compile时,问题就来了,这似乎在预测阶段关闭了辍学。
以下以下代码显示了我如何设置学习阶段。在编译模型之前,预测是半随机的。编译模型后,即使学习阶段仍然为1,预测也不再是半随机的
import tensorflow as tf
from tensorflow import keras
import tensorflow.keras.backend as K
from tensorflow.keras import layers
# load boston housing data
from tensorflow.keras.datasets import boston_housing
(x_train, y_train), (x_test, y_test) = boston_housing.load_data()
# define model
K.clear_session()
K.set_learning_phase(1)
x = keras.Input(shape=(13,))
y = layers.Dense(10, activation='relu')(x)
y = layers.Dropout(0.5)(y)
y = layers.Dense(1)(y)
model = keras.Model(inputs=x,outputs=y)
# these results will have randomness
model.predict(x_test[0:1])
model.predict(x_test[0:1])
model.predict(x_test[0:1])
model.compile(optimizer="adam", loss='mse')
# now that model is compiled randomness is lost
model.predict(x_test[0:1])
model.predict(x_test[0:1])
model.predict(x_test[0:1])
print(K.learning_phase()) # == 1
在过去的tensorflow版本中这对我有用
答案 0 :(得分:0)
Dropout
层采用training
参数来控制其是否处于训练模式。查看github上的代码,在没有training
参数的情况下,应该使用已明确设置的学习阶段。
但是,这种行为也许已经有所改变。 This github thread建议明确设置训练参数,例如one commenter写道:
import tensorflow.keras
inputs = tensorflow.keras.Input(shape=(10,))
x = tensorflow.keras.layers.Dense(3)(inputs)
outputs = tensorflow.keras.layers.Dropout(0.5)(x, training=True)
model = tensorflow.keras.Model(inputs, outputs)