我正在尝试在培训和测试过程中更改Keras模型的行为。
更准确地说,我想简单地评估训练期间的预测,并添加另一个Lambda层(作为一种后处理)进行测试。
我找到了解决方案Here,其中K.function
收到指定的K.learning_phase()
并返回输出。据我了解,根据传递的训练参数,使用K.in_test_phase()
或K.in_training_phase()
将返回第一个或第二个参数(as described in the docs)。
我在TF 2.0上作为后端运行,因此默认情况下启用急切执行。话虽如此,
传递K.learning_phase()
会导致错误,有关错误的说明,请参见here。因此,我正在使用
tensorflow.python.keras.symbolic_learning_phase()
,似乎有效。
目前,我可以使用K.function()
获得输出,但是我的目标是执行model.fit()
以训练我的模型,然后调用model.evaluate()
(我正在使用Keras'功能性API)。
根据学习标记,训练和测试模型的正确方法是什么?
当前我的MWE是:
def build_model(images, training=None):
input_layer = Input(shape=(256,256,3), dtype="float32", batch_size=80)
...
#performing some factor disentanglement here
angle_pred = UpSampling2D(size=(8, 8), interpolation='bilinear')(angle)
radius_pred = UpSampling2D(size=(8, 8), interpolation='bilinear')(radius)
angle_radius_stack = tf.stack([angle_pred, radius_pred], 0)
hough_voting = Lambda(hough_vote)((angle_radius_stack, images))
train_test = K.in_test_phase(hough_voting, angle_radius_stack, training = training)
angle_v, radius_v = tf.unstack(train_test)
model = Model(inputs=input_layer, outputs=[angle_v, radius_v])
adam = Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(optimizer=adam, loss='mean_absolute_error', metrics=['accuracy'], run_eagerly=True)
return model
然后使用培训:
def train_model(model, patches, radii, angles):
fun = K.function([model.layers[0].input, B.symbolic_learning_phase()], [model.layers[-1].output])
print(fun([patches[0:80,:,:,:], True]))
model.fit(patches, [radii, angles], batch_size=80, epochs=1)