Tensorflow 更改自定义图层KERA的培训和测试行为

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

我试图在培训和测试期间改变我的Keras模型的行为

更准确地说,我只想在训练期间评估预测,并添加另一个Lambda层(作为一种后处理)进行测试

我找到了一个解决方案,其中
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)