首页 > 解决方案 > Tensorflow SGD 没有学习并且在本地实施中表现优于

问题描述

我设置了具有以下结构的张量流:

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 之后,准确性永远不会改变:

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

但是,如果我使用 Adam 作为优化器:

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%。使用相似数量的实际数据点,我的实现与 tensorflow 中的 Adam 优化器取得了大致相似的结果。我还应该提到,我在模型之间尽可能地保持相同(结构完全相同,输入数据也是如此)。tensorflows end 和 mine 上的 SGD 具有完全相同的学习率,动量为 0。

有人会解释为什么 tensorflow 似乎表现出色吗?为什么 SGD 在 tensorflow 中使用时似乎基本上没有用,但在通常实施时却没有?

标签: pythontensorflowmachine-learningconv-neural-network

解决方案


您是否在每一层都使用了激活?如果您使用from_logits=True后有,请尝试从最后一层删除 softmax 。


推荐阅读