Индивидуальное обучение с фазами Tensorflow - PullRequest
1 голос
/ 19 сентября 2019

Мне нужно создать пользовательский обучающий цикл с Tensorflow / Keras (потому что я хочу иметь более одного оптимизатора и сказать, на какие веса должен работать каждый оптимизатор).

Хотя это руководство и что тоже совершенно ясно в этом вопросе, они упускают очень важный пункт: как я могу предсказать для фазы обучения и как я могу предсказать для фазы проверки?

Предположим, что моя модель имеет Dropout слоев или BatchNormalization слоев.Они, безусловно, работают совершенно по-другому, независимо от того, проходят ли они обучение или проходят аттестацию.

Как мне адаптировать эти учебники?Это фиктивный пример (может содержать один или два фрагмента псевдокода):

# Iterate over epochs.
for epoch in range(3):


    # Iterate over the batches of the dataset.
    for step, (x_batch_train, y_batch_train) in enumerate(train_dataset):
        with tf.GradientTape() as tape:

            #model with two outputs
            #IMPORTANT: must be in training phase (use dropouts, calculate batch statistics)
            logits1, logits2 = model(x_batch_train) #must be "training"

            loss_value1 = loss_fn1(y_batch_train[0], logits1)
            loss_value2 = loss_fn2(y_batch_train[1], logits2)

            grads1 = tape.gradient(loss_value1, model.trainable_weights[selection1])    
            grads2 = tape.gradient(loss_value2, model.trainable_weights[selection2])

            optimizer1.apply_gradients(zip(grads1, model.trainable_weights[selection1]))
            optimizer2.apply_gradients(zip(grads2, model.trainable_weights[selection2]))



    # Run a validation loop at the end of each epoch.
    for x_batch_val, y_batch_val in val_dataset:

        ##Important: must be validation phase
            #dropouts are off: calculate all neurons and divide value    
            #batch norms use previously calculated statistics    
        val_logits1, val_logits2 = model(x_batch_val)

        #.... do the evaluations

1 Ответ

2 голосов
/ 19 сентября 2019

Я думаю, вы можете просто передать параметр training при вызове tf.keras.Model, и он будет передан слоям:

# On training
logits1, logits2 = model(x_batch_train, training=True)
# On evaluation
val_logits1, val_logits2 = model(x_batch_val, training=False)
...