Я пытаюсь изменить поведение своей модели 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)