Обучение Keras работает с binary_crossentropy, но не с category_crossentropy

Этот вопрос НЕ дублирует следующие вопросы.

Перемещен в Tensorflow 2.0, обучение теперь зависает после третьего шаг

Керас видит мой графический процессор, но не видит не использовать его при обучении нейронной сети


Разбивка того, что я делаю и что происходит:

При запуске простого CNN, приведенного ниже, выдается следующий вывод и возникает ошибка. Обратите внимание, что у меня уже есть ярлыки с горячим кодированием с tensorflow.keras.utils.to_categorical, поэтому ошибок быть не должно.

import numpy as np
import tensorflow.keras
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.optimizers import Nadam
from tensorflow.keras.layers import Conv2D, Dense, Flatten

# image dimensions
img_rows, img_cols = 28, 28
num_classes = 10

# the data, split between train and test sets
(x, y), (x_val, y_val) = mnist.load_data()

# float32 for the model
x = x.astype('float32')
x_val = x_val.astype('float32')

print('x:', x.shape)
print('y:', y.shape)
print('x_val:', x_val.shape)
print('y_val:', y_val.shape)

# reshape into required dimensions
x = x.reshape(x.shape[0], img_rows, img_cols, 1)
x_val = x_val.reshape(x_val.shape[0], img_rows, img_cols, 1)

# convert class vectors to binary class matrices
y = tensorflow.keras.utils.to_categorical(y, num_classes)
y_val = tensorflow.keras.utils.to_categorical(y_val, num_classes)

print('Convert class vectors to binary class matrices: 1 becomes {}'.format(y[1]))
print('y:', y.shape)
print('y_val:', y_val.shape)


input_shape = x[0].shape

model = Sequential()

model.add(Conv2D(4, 3, 1, padding='same', input_shape=input_shape, activation='relu'))
model.add(Flatten())
model.add(Dense(10, activation='softmax'))

model.compile(loss=tensorflow.keras.losses.categorical_crossentropy,
              optimizer=Nadam(),
              metrics=['acc'])

history = model.fit(x, y, 
                        validation_data=[x_val, y_val],
                        batch_size=128,
                        epochs=100,
                        verbose=1)

Вывод:

Обратите внимание, что CNN просто прекращает обучение на 36096/60000 в реальном времени. Другими словами, он не застревает на 36096 только из-за вставленного кода.

x: (60000, 28, 28)
y: (60000,)
x_val: (10000, 28, 28)
y_val: (10000,)
Convert class vectors to binary class matrices: 1 becomes [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
y: (60000, 10)
y_val: (10000, 10)
Train on 60000 samples, validate on 10000 samples
Epoch 1/10
WARNING:root:Limited tf.compat.v2.summary API due to missing TensorBoard installation.
60000/60000 [==============================] - 3s 55us/sample - loss: 4.9133 - acc: 0.8514 - val_loss: 1.5114 - val_acc: 0.8999
Epoch 2/10
36096/60000 [=================>............] - ETA: 0s - loss: 0.9090 - acc: 0.9264

Ошибка:

2019-12-10 13:13:48.694128: W tensorflow/stream_executor/cuda/redzone_allocator.cc:312] Internal: Invoking ptxas not supported on Windows
Relying on driver to perform ptx compilation. This message will be only logged once.

С другой стороны

Когда меняю проигрыш с categorical_crossentropy на binary_crossentropy, все работает.

Изменение:

model.compile(loss=tensorflow.keras.losses.binary_crossentropy,
              optimizer=Nadam(),
              metrics=['acc'])

Новый результат:

Обратите внимание, что теперь CNN работает без сбоев; на определенном образце нет замораживания. Также нет ptxas ошибки, как раньше.

x: (60000, 28, 28)
y: (60000,)
x_val: (10000, 28, 28)
y_val: (10000,)
Convert class vectors to binary class matrices: 1 becomes [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
y: (60000, 10)
y_val: (10000, 10)
Train on 60000 samples, validate on 10000 samples
Epoch 1/10
WARNING:root:Limited tf.compat.v2.summary API due to missing TensorBoard installation.
60000/60000 [==============================] - 3s 58us/sample - loss: 0.2263 - acc: 0.9745 - val_loss: 0.0710 - val_acc: 0.9891
Epoch 2/10
60000/60000 [==============================] - 2s 29us/sample - loss: 0.0460 - acc: 0.9917 - val_loss: 0.0434 - val_acc: 0.9914
Epoch 3/10
60000/60000 [==============================] - 2s 29us/sample - loss: 0.0240 - acc: 0.9943 - val_loss: 0.0370 - val_acc: 0.9918
Epoch 4/10
60000/60000 [==============================] - 2s 29us/sample - loss: 0.0158 - acc: 0.9958 - val_loss: 0.0283 - val_acc: 0.9932
Epoch 5/10
60000/60000 [==============================] - 2s 29us/sample - loss: 0.0120 - acc: 0.9964 - val_loss: 0.0301 - val_acc: 0.9926
Epoch 6/10
60000/60000 [==============================] - 2s 30us/sample - loss: 0.0094 - acc: 0.9971 - val_loss: 0.0301 - val_acc: 0.9931
Epoch 7/10
60000/60000 [==============================] - 2s 29us/sample - loss: 0.0084 - acc: 0.9974 - val_loss: 0.0310 - val_acc: 0.9932
Epoch 8/10
60000/60000 [==============================] - 2s 29us/sample - loss: 0.0078 - acc: 0.9976 - val_loss: 0.0303 - val_acc: 0.9933
Epoch 9/10
60000/60000 [==============================] - 2s 30us/sample - loss: 0.0074 - acc: 0.9977 - val_loss: 0.0312 - val_acc: 0.9928
Epoch 10/10
60000/60000 [==============================] - 2s 30us/sample - loss: 0.0069 - acc: 0.9979 - val_loss: 0.0308 - val_acc: 0.9931
​

Вопросы:

  • Я сделал что-то не так?
  • Что-то не так с categorical_crossentropy?

Я пробовал повторно запускать несколько раз, получая те же результаты.

Системная информация:

tensorflow-gpu 2.0.0
keras-gpu 2.2.4
Cuda compilation tools, release 10.0, V10.0.130
cuDNN 7.4.02
Windows 10
python 3.6.8

Обновление:

Я попробовал то, что предложил saurjog, но проблема все еще сохраняется. Обучение CNN все еще зависает с categorical_crossentropy, но отлично работает с biniary_crossentropy.

Версии, которые я пробовал:

TF 1.12.0/CUDA 9.0/cuDNN 7.3.1.20
TF 1.14/CUDA 10.0/cuDNN 7.4.0.20

person nicgh3    schedule 10.12.2019    source источник


Ответы (1)


Эта проблема с Github может помочь, хотя она все еще открыта. Похоже, проблема не связана с функциями потерь в вашем вопросе. Ниже приведены версии Keras / cuDNN / TF, которые, похоже, работают в соответствии с веткой обсуждения проблемы Github:

  1. Tensorflow 1.12.0 / CUDA 9.0 / cuDNN 7.3.1.20
  2. Tensorflow 1.14 / CUDA 10.0
person S.Au.Ra.B.H    schedule 10.12.2019
comment
Спасибо за ответ. Я действительно видел эту открытую проблему, прежде чем задавать этот вопрос. Я надеялся, что есть решение без понижения версии TF / CUDA / cuDNN. В любом случае, я попробую. - person nicgh3; 10.12.2019