Tensorflow 更改自定义图层KERA的培训和测试行为
我试图在培训和测试期间改变我的Keras模型的行为 更准确地说,我只想在训练期间评估预测,并添加另一个Lambda层(作为一种后处理)进行测试 我找到了一个解决方案,其中Tensorflow 更改自定义图层KERA的培训和测试行为,tensorflow,keras,Tensorflow,Keras,我试图在培训和测试期间改变我的Keras模型的行为 更准确地说,我只想在训练期间评估预测,并添加另一个Lambda层(作为一种后处理)进行测试 我找到了一个解决方案,其中K.function接收指定的K.learning\u phase()并返回一个输出。据我所知,使用K.in_test_phase()或K.in_training_phase()将根据传递的训练参数返回第一个或第二个参数() 我在TF2.0上作为后端运行,所以在默认情况下启用了急切执行。尽管如此, 通过K.learning_ph
K.function
接收指定的K.learning\u phase()
并返回一个输出。据我所知,使用K.in_test_phase()
或K.in_training_phase()
将根据传递的训练参数返回第一个或第二个参数()
我在TF2.0上作为后端运行,所以在默认情况下启用了急切执行。尽管如此,
通过K.learning_phase()
会导致错误,如前所述,请参阅。因此,我使用
tensorflow.python.keras.symbolic\u learning\u 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)