我正在训练一个卷积神经网络来驾驶一辆玩具车,无论我做什么,训练精度都不会超过 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 卷积
- 我没有尝试过的一件事是迁移学习,我希望仅将其用作最后的手段,因为简单的网络可以正常工作
代码: