#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