Керас категориальной кросс-энтропии softmax input.dim_size error - PullRequest
1 голос
/ 10 января 2020

Я разрабатываю довольно сложный конвейер, в котором я создаю наборы tf.Datase из файлов TFRecords и передаю их в модель Keras вместе с дополнением данных и множеством проверок и проверок работоспособности. Поэтому, пожалуйста, позвольте мне извиниться за то, что я не смог привести полностью воспроизводимый пример.

В любом случае, я пытаюсь обучить модель классификации изображений, и у меня есть данные моего изображения в виде 192 * 256 тензоров в оттенках серого, и помечает их как трехмерные векторы с горячим кодированием.

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

output_len = 3
activation = 'softmax'
loss = 'categorical_crossentropy'
optimizer = keras.optimizers.Adam()

categorical_model = keras.Sequential([
    keras.layers.Flatten(input_shape=(192, 256, 1)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(output_len, activation='softmax')
])

categorical_model.summary()

categorical_model.compile(optimizer=optimizer,
              loss=loss)

print(aug_data[0])
print(aug_data[1])

categorical_model.fit(aug_data, steps_per_epoch = 1070, epochs=2)

в вышеприведенном «aug_data [0]» - обучающие выборки, а [1] - метки (для подачи наборов tf.data в Keras требуется, чтобы образцы и метки были в кортежах). Запуск вышеприведенного заставляет меня:

Model: "sequential_27"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten_27 (Flatten)         (None, 49152)             0         
_________________________________________________________________
dense_54 (Dense)             (None, 128)               6291584   
_________________________________________________________________
dense_55 (Dense)             (None, 3)                 387       
=================================================================
Total params: 6,291,971
Trainable params: 6,291,971
Non-trainable params: 0
_________________________________________________________________
Tensor("IteratorGetNext_26:0", shape=(?, 192, 256, 1), dtype=float32)
Tensor("IteratorGetNext_26:1", shape=(?, 3), dtype=float32)
Train on 1070 samples
Epoch 1/2
---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-77-12cc2cbea62b> in <module>()
     18 print(aug_data[1])
     19 
---> 20 categorical_model.fit(aug_data, steps_per_epoch = 1070, epochs=2)

4 frames
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/client/session.py in __call__(self, *args, **kwargs)
   1470         ret = tf_session.TF_SessionRunCallable(self._session._session,
   1471                                                self._handle, args,
-> 1472                                                run_metadata_ptr)
   1473         if run_metadata:
   1474           proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

InvalidArgumentError: 2 root error(s) found.
  (0) Invalid argument: Expected begin[0] == 0 (got 1) and size[0] == 0 (got 1) when input.dim_size(0) == 0
     [[{{node loss_27/dense_55_loss/softmax_cross_entropy_with_logits/Slice_1}}]]
  (1) Invalid argument: Expected begin[0] == 0 (got 1) and size[0] == 0 (got 1) when input.dim_size(0) == 0
     [[{{node loss_27/dense_55_loss/softmax_cross_entropy_with_logits/Slice_1}}]]
     [[loss_27/mul/_1495]]
0 successful operations.
0 derived errors ignored.

Я печатаю форму тензоров ввода и метки (прямо под сводкой модели), чтобы подтвердить, что форма соответствует ожидаемой. Однако я получаю эту странную ошибку, которую я не могу решить за свою жизнь. С разреженной перекрестной энтропией я получаю еще одну ошибку, опять же с уменьшением количества пакетов.

Интересно, что использование бинарной кроссентропии позволяет модели работать (хотя и не многому учиться ...).

Я никогда прежде не пытался соединить вместе tf.datasets и Keras, и это кажется довольно сложной задачей. Любой вклад в это будет полезно и высоко ценится!

Приветствия

1 Ответ

0 голосов
/ 10 января 2020

Попробуйте заменить следующую строку кода:

categorical_model.fit(aug_data, steps_per_epoch = 1070, epochs=2)

этой строкой:

categorical_model.fit(aug_data[0], aug_data[1], steps_per_epoch = 1070, epochs=2)

Поскольку входные данные для функции categorical_model.fit() должны быть кортежем (aug_data[0], aug_data[1]) чем вход, который содержит как входы, так и метки, расположенные вдоль 0-го измерения.

...