Tensorflow SGD не обучается и превосходит локальную реализацию - PullRequest
0 голосов
/ 25 мая 2020

У меня установлен тензорный поток со следующей структурой:

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 по существу бесполезен при использовании в тензорном потоке, но не при обычной реализации?

1 Ответ

0 голосов
/ 25 мая 2020

Вы использовали активации на каждом уровне? Попробуйте удалить softmax из последнего слоя, если вы это сделали, так как вы используете from_logits = True .

...