У меня установлен тензорный поток со следующей структурой:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 32, 32, 5) 140
_________________________________________________________________
conv2d_1 (Conv2D) (None, 32, 32, 3) 138
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 11, 11, 3) 0
_________________________________________________________________
flatten (Flatten) (None, 363) 0
_________________________________________________________________
dense (Dense) (None, 363) 132132
_________________________________________________________________
dense_1 (Dense) (None, 10) 3640
=================================================================
Обучение на данных cifar10.
Используя SGD, модель никогда не нарушает 10% точности, что делает ее хуже , чем случайное угадывание. Используемый код компиляции приведен ниже:
model.compile(optimizer=SGD,
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
После многих эпох точность никогда не меняется:
Epoch 1/100
1563/1563 [==============================] - 34s 22ms/step - loss: 2.4016 - accuracy: 0.0960 - val_loss: 2.3027 - val_accuracy: 0.1007
Epoch 2/100
1563/1563 [==============================] - 33s 21ms/step - loss: 2.3027 - accuracy: 0.0958 - val_loss: 2.3026 - val_accuracy: 0.1004
Epoch 3/100
1563/1563 [==============================] - 34s 22ms/step - loss: 2.3026 - accuracy: 0.0982 - val_loss: 2.3026 - val_accuracy: 0.1008
Epoch 4/100
1563/1563 [==============================] - 33s 21ms/step - loss: 2.3026 - accuracy: 0.0971 - val_loss: 2.3025 - val_accuracy: 0.1003
Epoch 5/100
1563/1563 [==============================] - 37s 24ms/step - loss: 2.3026 - accuracy: 0.0985 - val_loss: 2.3025 - val_accuracy: 0.1006
Однако, если я использую Адама в качестве оптимизатора:
Epoch 1/100
1563/1563 [==============================] - 31s 20ms/step - loss: 1.9048 - accuracy: 0.3525 - val_loss: 1.5429 - val_accuracy: 0.4587
Epoch 2/100
1563/1563 [==============================] - 31s 20ms/step - loss: 1.3919 - accuracy: 0.5070 - val_loss: 1.3676 - val_accuracy: 0.5231
Epoch 3/100
1563/1563 [==============================] - 31s 20ms/step - loss: 1.2187 - accuracy: 0.5726 - val_loss: 1.3393 - val_accuracy: 0.5352
Epoch 4/100
1563/1563 [==============================] - 31s 20ms/step - loss: 1.0961 - accuracy: 0.6187 - val_loss: 1.3050 - val_accuracy: 0.5563
Epoch 5/100
1563/1563 [==============================] - 31s 20ms/step - loss: 0.9806 - accuracy: 0.6582 - val_loss: 1.3215 - val_accuracy: 0.5505
В этом нет смысла, поскольку SGD все еще является допустимым оптимизатором, он не должен быть таким избыточным, как здесь. Поэтому я протестировал его на своей собственной реализации CNN, которая использует только SGD. При этом я обнаружил, что после обучения на размерах всего 100 пакетов для 100 итераций точность набора для проверки составила в среднем 31,71%. Используя такое же количество фактических точек данных, моя реализация достигла результатов, примерно аналогичных оптимизатору Adam в tensorflow. Я также должен упомянуть, что я сохранил все, что мог, между моделями одинаковыми (структура точно такая же, как и входные данные). SGD на конце тензорных потоков и на моем имели точно такую же скорость обучения с импульсом 0.
Может ли кто-нибудь объяснить, почему тензорный поток, кажется, превосходит? Почему кажется, что SGD по существу бесполезен при использовании в тензорном потоке, но не при обычной реализации?