更改自定义Layer Keras的培训和测试行为

时间:2020-03-25 14:04:35

标签: tensorflow keras

我正在尝试在培训和测试过程中更改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)

0 个答案:

没有答案