Blu*_*ird 5 robotics machine-learning computer-vision conv-neural-network keras
如何防止懒惰的卷积神经网络?在用KERAS训练之后,我以'懒惰的CNN'结束.无论输入是什么,输出都是恒定的.您认为问题是什么?
我尽量重复NVIDIA的最终的实验结束学习的自动驾驶汽车的纸.当然,我没有真正的汽车,而是Udacity的模拟器.模拟器生成有关汽车前景的数据.
CNN接收该图,并给出转向角以使汽车保持在轨道中.游戏规则是让模拟赛车安全地在赛道上运行.这不是很困难.
奇怪的是,有时候我会用KERAS训练懒惰的CNN结束,这会给出恒定的转向角度.模拟汽车将脱离技巧,但CNN的输出没有变化.特别是层变深,例如纸张中的CNN .
如果我使用这样的CNN,我可以在训练后得到一个有用的模型.
model = Sequential()
model.add(Lambda(lambda x: x/255.0 - 0.5, input_shape = (160,320,3)))
model.add(Cropping2D(cropping=((70,25),(0,0))))
model.add(Conv2D(24, 5, strides=(2, 2)))
model.add(Activation('relu'))
model.add(Conv2D(36, 5, strides=(2, 2)))
model.add(Activation('relu'))
model.add(Conv2D(48, 5, strides=(2, 2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(50))
model.add(Activation('sigmoid'))
model.add(Dense(10))
model.add(Activation('sigmoid'))
model.add(Dense(1))
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用更深的CNN,我有更多机会接收懒惰的CNN.具体来说,如果我使用喜欢NVIDIA的CNN,我每次训练后都会收到懒惰的CNN.
model = Sequential()
model.add(Lambda(lambda x: x/255.0 - 0.5, input_shape = (160,320,3)))
model.add(Cropping2D(cropping=((70,25),(0,0))))
model.add(Conv2D(24, 5, strides=(2, 2)))
model.add(Activation('relu'))
model.add(Conv2D(36, 5, strides=(2, 2)))
model.add(Activation('relu'))
model.add(Conv2D(48, 5, strides=(2, 2)))
model.add(Activation('relu'))
model.add(Conv2D(64, 3, strides=(1, 1)))
model.add(Activation('relu'))
model.add(Conv2D(64, 3, strides=(1, 1)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(1164))
model.add(Activation('sigmoid'))
model.add(Dense(100))
model.add(Activation('sigmoid'))
model.add(Dense(50))
model.add(Activation('sigmoid'))
model.add(Dense(10))
model.add(Activation('sigmoid'))
model.add(Dense(1))
Run Code Online (Sandbox Code Playgroud)
我使用'relu'作为卷积层,完全连接层的激活函数是'sigmoid'.我尝试更改激活功能,但没有效果.
有我的分析.我不同意我的程序中的错误,因为我可以使用相同的代码和更简单的CNN成功驾驶汽车.我认为原因是模拟器或神经网络的结构.在真正的自动驾驶汽车中,训练信号即转向角应包含噪音; 因此,驾驶员永远不会将车轮保持在真正的道路上.但在模拟器中,训练信号非常干净.几乎60%的转向角为零.优化器可以通过将CNN的输出接近零来轻松完成工作.似乎优化器也很懒惰.但是,当我们真的想要这个CNN输出时,它也会给出零.因此,我为这些零转向角添加了小噪音.我得到一个懒惰的CNN的机会较小,但它并没有消失.
您如何看待我的分析?我可以使用其他策略吗?我想知道在CNN研究的悠久历史中是否已经解决了类似的问题.
资源:
相关文件已上传到GitHub.您可以使用这些文件重复整个实验.
我无法运行你的模型,因为问题和 GitHub 存储库都不包含数据。这就是为什么我对我的答案有 90% 的把握。
但我认为你的网络的主要问题是sigmoid密集层之后的激活函数。我认为,当只有两个时它会训练得很好,但四个就太多了。
不幸的是,NVidia 的自动驾驶汽车端到端学习论文没有明确指定它,但现在默认激活不再是sigmoid(像以前那样),而是relu. 如果您有兴趣为什么会这样,请参阅此讨论。所以我建议的解决方案是尝试这个模型:
model = Sequential()
model.add(Lambda(lambda x: x/255.0 - 0.5, input_shape = (160,320,3)))
model.add(Cropping2D(cropping=((70,25),(0,0))))
model.add(Conv2D(24, (5, 5), strides=(2, 2), activation="relu"))
model.add(Conv2D(36, (5, 5), strides=(2, 2), activation="relu"))
model.add(Conv2D(48, (5, 5), strides=(2, 2), activation="relu"))
model.add(Conv2D(64, (3, 3), strides=(1, 1), activation="relu"))
model.add(Conv2D(64, (3, 3), strides=(1, 1), activation="relu"))
model.add(Flatten())
model.add(Dense(1164, activation="relu"))
model.add(Dense(100, activation="relu"))
model.add(Dense(50, activation="relu"))
model.add(Dense(10, activation="relu"))
model.add(Dense(1))
Run Code Online (Sandbox Code Playgroud)
它模仿 NVidia 的网络架构,并且不会受到梯度消失的影响。
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |