Keras tensorflow бэкэнд модифицирует потерю

Хорошо, у меня есть небольшая проблема с изменением потери keras с помощью бэкэнда tensorflow.

Если я использую keras.losses.sparse_categorical_crossentropy как потерю, это будет работать как обычная sparse_categorical_crossentropy.

Однако, если я точно скопирую этот источник и передам скопированную функцию потере, произойдет следующая ошибка.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-118-840fee9ad06b> in <module>()
      3 
      4                   epochs=10, continue_train=False, load_model_weight=False,
----> 5              batch_size=256 * 1, common_columns=columns, code_columns=code_columns)

6 frames
/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    136                             ': expected ' + names[i] + ' to have shape ' +
    137                             str(shape) + ' but got array with shape ' +
--> 138                             str(data_shape))
    139     return data
    140 

ValueError: Error when checking target: expected dense_279 to have shape (37279,) but got array with shape (1,)

Вроде как оригинал меняет свое значение на one hot vectors, а скопированный нет. Я не могу найти, где он меняет значения.

Чтобы изменить потерю, оригинальная копия должна работать на моей платформе. Кто-нибудь может помочь?


person Isaac Sim    schedule 02.08.2019    source источник


Ответы (1)


Проблема в том, что keras вводит специальные проверки выходных/целевых форм, если вы используете потерю sparse_categorical_crossentropy, иначе вы получите ту же ошибку, поскольку цели являются целыми числами, но выход представляет собой вектор. Вы можете увидеть модификацию форм, используемых для проверки >здесь.

Я не знаю, как избавиться от такой ошибки, проверка работает только при использовании sparse_categorical_crossentropy, и, похоже, нет возможности переопределить проверку для использования с другими потерями. Возможно, вы захотите открыть вопрос в репозитории keras github с просьбой об этой функции.

person Dr. Snoopy    schedule 02.08.2019
comment
Привет, я проверил еще несколько вещей. Если я передам keras.losses.sparse_categorical_crossentropy, тогда он будет работать, а если я буду использовать keras.backend.tensorflow_backend.sparse_categorical_crossentropy, то нет. Может быть, это две разные вещи? - person Isaac Sim; 05.08.2019
comment
В конце концов мне удалось заменить keras.losses.sparse_category_crossentropy моей собственной функцией в экземпляре. keras.losses.sparse_category_crossentropy = моя_функция. Тогда это сработает, как я и предполагал - person Isaac Sim; 05.08.2019