Последовательная модель TensorFlow Keras обучается по-разному, если потеря - это строка или функция - PullRequest
2 голосов
/ 19 октября 2019

Таким образом, я работал с последовательной моделью Keras в Tensor-Flow и столкнулся со странным поведением, когда, если я скомпилирую последовательную модель с потерей в виде функции, результат будет отличаться от того, если бы это была строка.

Сеть (сверточная по своей природе) определяется следующим образом:

model = tf.keras.Sequential()
add_model_layers(model)  # Can provide if needed
adam_opt = tf.train.AdamOptimizer(learning_rate=0.001,
                                  beta1=0.9,
                                  beta2=0.999)

Сеть затем компилируется:

loss_param1 = tf.keras.losses.categorical_crossentropy
loss_param2 = "categorical_crossentropy"

model.compile(optimizer=adam_opt,
              loss=loss_param  # ADD NUMBER TO END
              metrics=[tf.keras.metrics.categorical_accuracy])

После чего она обучается:

# Records are tf.data.Dataset based on TFRecord files
model.fit(train_records,
          epochs=400,
          use_multiprocessing=False,
          validation_data=validation_records)

# And for completeness, tested
model.evaluate(test_records)

Если параметр потерь в model.compile равен loss_param1, он начинает обучение с высокой величиной потерь (в моем случае, после эпохи или 5 около 192). С другой стороны, если используется loss_param2, обучение начинается с гораздо меньших потерь (около 41).

Кто-нибудь знает, почему это происходит?

(В качестве дополнительного примечания яЯ также сталкиваюсь с аналогичной проблемой, когда, если метрика в виде строки, я получаю другой результат. Однако в model.fit, если use_multiprocessing равен True, эффект отменяется (это также применяется и наоборот).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...