python - 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 中使用时似乎基本上没有用,但在通常实施时却没有?
解决方案
您是否在每一层都使用了激活?如果您使用from_logits=True后有,请尝试从最后一层删除 softmax 。
推荐阅读
- java - 如何从 Textview 在 getText() 中添加预定义的文本并显示结果
- java - 许多线程访问的地图上的准确数据
- android - 此应用无权在发布版本中使用 Firebase 身份验证
- python - Python用它的eval替换括号内的文本
- ios - 无法为签名者“iPhone Developer”建立自签名根的链
- python - 美汤:刮表数据
- javascript - 带有 getElementsByClassName 的 Javascript 执行引擎
- asp.net - Asp.Net Core 路由参数始终为 0 或 null
- python - Python Google Cloud Function Connection 由对等方重置
- javascript - 特快专递所有路线