Этот вопрос НЕ дублирует следующие вопросы.
Перемещен в 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