Почему официальный пример Tensorflow CNN застрял на 10-процентной точности (= случайное предсказание) на моей машине?

#tensorflow #deep-learning #tensorflow2.x

#tensorflow #глубокое обучение #tensorflow2.x

Вопрос:

Я запускаю пример CNN с официального сайта Tensorflow — (https://www.tensorflow.org/tutorials/images/cnn ) Я запустил ноутбук как есть без каких-либо изменений.

Моя точность (точность обучения) застряла на 10%. Я пытался перестроиться, используя только первые 10 пар (изображение, метка), но результат все тот же. Сеть просто не обучается.

Вот моя модель.summary() —

 Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 30, 30, 32)        896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 15, 15, 32)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 13, 13, 64)        18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 6, 6, 64)          0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 4, 4, 64)          36928     
_________________________________________________________________
flatten (Flatten)            (None, 1024)              0         
_________________________________________________________________
dense (Dense)                (None, 64)                65600     
_________________________________________________________________
dense_1 (Dense)              (None, 10)                650       
=================================================================
Total params: 122,570
Trainable params: 122,570
Non-trainable params: 0
 

Вот мой код компиляции и подгонки:-

 model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=10, 
                    validation_data=(test_images, test_labels))
 

Журналы обучения модели:-

 Epoch 1/10
1563/1563 [==============================] - 14s 9ms/step - loss: 2.3072 - accuracy: 0.0993 - val_loss: 2.3026 - val_accuracy: 0.0994
Epoch 2/10
1563/1563 [==============================] - 3s 2ms/step - loss: 2.3028 - accuracy: 0.0996 - val_loss: 2.3047 - val_accuracy: 0.1001
Epoch 3/10
1563/1563 [==============================] - 3s 2ms/step - loss: 2.3029 - accuracy: 0.0998 - val_loss: 2.3027 - val_accuracy: 0.1000
Epoch 4/10
1563/1563 [==============================] - 3s 2ms/step - loss: 2.3038 - accuracy: 0.0986 - val_loss: 2.3054 - val_accuracy: 0.1007
Epoch 5/10
1563/1563 [==============================] - 3s 2ms/step - loss: 2.3031 - accuracy: 0.0988 - val_loss: 2.3026 - val_accuracy: 0.0999
Epoch 6/10
1563/1563 [==============================] - 3s 2ms/step - loss: 2.3031 - accuracy: 0.0985 - val_loss: 2.3159 - val_accuracy: 0.0999
Epoch 7/10
1563/1563 [==============================] - 3s 2ms/step - loss: 2.3221 - accuracy: 0.0995 - val_loss: 2.9215 - val_accuracy: 0.1003
Epoch 8/10
1563/1563 [==============================] - 3s 2ms/step - loss: 2.3035 - accuracy: 0.0973 - val_loss: 2.3270 - val_accuracy: 0.1001
Epoch 9/10
1563/1563 [==============================] - 3s 2ms/step - loss: 2.3028 - accuracy: 0.0999 - val_loss: 2.3399 - val_accuracy: 0.0984
Epoch 10/10
1563/1563 [==============================] - 3s 2ms/step - loss: 2.3054 - accuracy: 0.1001 - val_loss: 2.3116 - val_accuracy: 0.1002
 

Я проверил построенные данные, и они не случайны. Метки правильные, и с данными, которые я вижу, проблем нет.

Я запускаю этот код в Tensorflow 2.2 на Nvidia RTX 3060 Ti

 __CUDA Information__
CUDA Device Initialized                       : True
CUDA Driver Version                           : 11010
CUDA Detect Output:
Found 1 CUDA devices

cudnn                     7.6.5                cuda10.1_0 
 

Пожалуйста, помогите.

Комментарии:

1. каковы ваши функции активации для каждого плотного слоя?

2. Так что это тот же самый код, да? Вы разделили на 255?

3. @Proko Я использую функцию активации Relu для каждого слоя, за исключением последнего слоя. Я не использую какую-либо функцию активации для последнего уровня. Это работает, потому что я использую параметр ‘from_logits = True’ при вычислении функции потерь.

4. @GaussianPrior Я загрузил ноутбук и выполнил его. Итак, это точно то же самое. И чтобы ответить на ваш вопрос — я делю на 255,0

5. Очень странно. Я просто запускаю его на colab, и он работает так, как должен. Возможно, какие-то разногласия между версиями? (например, версии Tensorflow) Кроме этого, единственная причина, о которой я мог подумать, которая мешает правильному обучению сети, — это неправильная инициализация веса, но я сомневаюсь, что это будет происходить при каждом запуске модели. Извините, я не могу придумать ничего другого :/

Ответ №1:

Это просто потому, что вы используете меньше данных с немного большей моделью по сравнению с данными. Вам нужно либо использовать more data , либо определить модель, less layers чтобы избежать такой проблемы.

Я попытался воспроизвести эту проблему в том же TensorFlow version==2.2.0 .

если вы используете 10 изображений, 10 меток (небольшой набор данных), лучше использовать один слой свертки с:

 model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))
 

И model.summary()

 Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 30, 30, 32)        896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 15, 15, 32)        0         
_________________________________________________________________
flatten (Flatten)            (None, 7200)              0         
_________________________________________________________________
dense (Dense)                (None, 64)                460864    
_________________________________________________________________
dense_1 (Dense)              (None, 10)                650       
=================================================================
Total params: 462,410
Trainable params: 462,410
Non-trainable params: 0
 

и журналы обучения модели будут: (Точность: 90%)

Вывод:

 Epoch 1/10
1/1 [==============================] - 0s 347ms/step - loss: 2.3649 - accuracy: 0.0000e 00 - val_loss: 2.4008 - val_accuracy: 0.0000e 00
Epoch 2/10
1/1 [==============================] - 0s 75ms/step - loss: 2.0693 - accuracy: 0.2000 - val_loss: 2.4810 - val_accuracy: 0.0000e 00
Epoch 3/10
1/1 [==============================] - 0s 53ms/step - loss: 1.9101 - accuracy: 0.2000 - val_loss: 2.5218 - val_accuracy: 0.0000e 00
Epoch 4/10
1/1 [==============================] - 0s 64ms/step - loss: 1.7163 - accuracy: 0.4000 - val_loss: 2.5354 - val_accuracy: 0.0000e 00
Epoch 5/10
1/1 [==============================] - 0s 60ms/step - loss: 1.5290 - accuracy: 0.5000 - val_loss: 2.5635 - val_accuracy: 0.0000e 00
Epoch 6/10
1/1 [==============================] - 0s 59ms/step - loss: 1.3485 - accuracy: 0.9000 - val_loss: 2.6416 - val_accuracy: 0.0000e 00
Epoch 7/10
1/1 [==============================] - 0s 63ms/step - loss: 1.1629 - accuracy: 0.9000 - val_loss: 2.7497 - val_accuracy: 0.1000
Epoch 8/10
1/1 [==============================] - 0s 61ms/step - loss: 0.9642 - accuracy: 0.9000 - val_loss: 2.8680 - val_accuracy: 0.1000
Epoch 9/10
1/1 [==============================] - 0s 58ms/step - loss: 0.8041 - accuracy: 0.9000 - val_loss: 2.9326 - val_accuracy: 0.1000
Epoch 10/10
1/1 [==============================] - 0s 69ms/step - loss: 0.6698 - accuracy: 0.9000 - val_loss: 2.9153 - val_accuracy: 0.1000