Изменить обучение и поведение при тестировании пользовательских Layer Keras - PullRequest
2 голосов
/ 25 марта 2020

Я пытаюсь изменить поведение своей модели Keras во время обучения и тестирования.

Чтобы быть более точным, я хочу просто оценить прогнозы во время обучения и добавить еще один лямбда-слой (в качестве разновидности постобработки) для тестирования.

Я нашел решение Здесь , где K.function получает указанное K.learning_phase() и возвращает вывод. Как я понимаю, использование K.in_test_phase() или K.in_training_phase() вернет либо первый, либо второй параметр (, как описано в документации ), на основе переданного параметра обучения.

I ' m работает на TF 2.0 в качестве Backend, поэтому активное выполнение по умолчанию включено. При этом прохождение K.learning_phase() приводит к ошибке, которая была описана, см. здесь . Следовательно, я использую tensorflow.python.keras.symbolic_learning_phase(), который, кажется, работает. В настоящее время я могу получить вывод с помощью K.function(), но моя цель - выполнить model.fit(), чтобы обучить мою модель, а затем вызвать model.evaluate() (я использую функциональный API Keras).

Каким будет правильный способ обучения и тестирования моей модели на основе флага обучения?

В настоящее время мой 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...