Convnet 训练误差没有减少

数据挖掘 机器学习 深度学习 神经网络 计算机视觉 卷积神经网络
2021-09-19 18:45:02

我正在训练一个卷积神经网络来驾驶一辆玩具车,无论我做什么,训练精度都不会超过 30-35%,这是随机初始化卷积网络时开始的地方。奇怪的是,一个简单得多的模型,一个具有单个隐藏层且没有卷积的神经网络,效果要好得多,准确率始终保持在 65-75%。我已经在这个项目上工作了一年多,感觉我已经尝试了一切来让 convnet 变得更好。我究竟做错了什么?

笔记:

  • 数据集包含 150,000 条记录,但由于我的视频提要每秒生成 20 帧,而且帧每秒变化不大,它更像是 150,000 / 20 = 7,500 条唯一记录。
  • 三个等比例的类:左转、直行、右转
  • convnet 和简单的 NN 都使用 Tensorflow 的 AdamOptimizer。简单的网络在 1e-5 和 1e-4 上表现良好,但 convnet 在任何价值上都表现不佳,我一直尝试 1e-2 到 1e-6
  • Simple NN使用sigmoid激活函数,convnet都是relu激活
  • 两种模型读取相同的数据。我有一个在所有模型之间共享的单个采样和数据增强类,所以我的数据还不错,因为简单的网络在相同的输入上工作得很好
  • 我的 convnet 甚至不能过度拟合训练数据,所以在我看来,问题不是数据大小
  • 两种模型的过度拟合似乎都不是问题:训练集和验证集往往具有相似的性能,给或取 5%
  • initial = tf.truncated_normal(shape, stddev=0.1)用来初始化所有权重
  • initial = tf.constant(0.1, shape=shape)用来初始化所有偏差
  • 问题可能出在卷积上,因为浅单隐藏层卷积网络表现不佳,但没有卷积的两隐藏层全连接神经网络的准确率约为 65%

Convnet 注释(都产生同样糟糕的结果):

  • 批量标准化
  • 最大池化
  • 50% 的辍学概率
  • 各种步幅大小
  • 各种深度的层:我尝试了 2-5 个修道院层,多个 2-4 个全连接层。我的层数少至 3 层,多至 9 层。Convnet 层有 32 到 64 个神经元,全连接层有 32 到 512 个神经元。
  • 3D 卷积(占用太多内存并导致我的 GPU 崩溃)
  • 1x1 卷积
  • 我没有尝试过的一件事是迁移学习,我希望仅将其用作最后的手段,因为简单的网络可以正常工作

代码:

1个回答

在您的 convnet 代码中,您手动计算交叉熵:

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1]))
train_step = tf.train.AdamOptimizer(1e-5).minimize(cross_entropy)

如果这样做,您可能会遇到数值稳定性问题。相反,您应该使用

tf.nn.softmax_cross_entropy_with_logits()

如果使用 tensorflow 1.8 或更高版本,请使用

tf.nn.softmax_cross_entropy_with_logits_v2()

为 tensorflow 的 API 状态哭泣。

有关更多信息,请参阅此问题:https ://github.com/tensorflow/tensorflow/issues/2462