Таким образом, я работал с последовательной моделью 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, эффект отменяется (это также применяется и наоборот).