Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Machine learning 如何防止懒惰的卷积神经网络?_Machine Learning_Computer Vision_Keras_Conv Neural Network_Robotics - Fatal编程技术网

Machine learning 如何防止懒惰的卷积神经网络?

Machine learning 如何防止懒惰的卷积神经网络?,machine-learning,computer-vision,keras,conv-neural-network,robotics,Machine Learning,Computer Vision,Keras,Conv Neural Network,Robotics,如何防止懒惰的卷积神经网络?在与KERAS一起训练后,我以一个“懒惰的CNN”结尾。无论输入是什么,输出都是恒定的。你认为问题是什么 我试图重复NVIDIA针对自动驾驶汽车的端到端学习实验。当然,我没有一辆真正的车,但有一辆Udacity的。模拟器生成关于汽车前景的图形 有线电视新闻网接收到这个数字,并给出转向角,以使汽车保持在轨道上。游戏规则是让模拟赛车在赛道上安全行驶。这不是很难 奇怪的是,有时我在用KERAS训练CNN之后,会以一个懒惰的CNN结束,因为KERAS可以提供恒定的转向角。模

如何防止懒惰的卷积神经网络?在与KERAS一起训练后,我以一个“懒惰的CNN”结尾。无论输入是什么,输出都是恒定的。你认为问题是什么

我试图重复NVIDIA针对自动驾驶汽车的端到端学习实验。当然,我没有一辆真正的车,但有一辆Udacity的。模拟器生成关于汽车前景的图形

有线电视新闻网接收到这个数字,并给出转向角,以使汽车保持在轨道上。游戏规则是让模拟赛车在赛道上安全行驶。这不是很难

奇怪的是,有时我在用KERAS训练CNN之后,会以一个懒惰的CNN结束,因为KERAS可以提供恒定的转向角。模拟的汽车会出问题,但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))
但是,如果我使用更深层次的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))
我对卷积层使用'relu',完全连接层的激活函数是'sigmoid'。我试图改变激活功能,但没有效果

这是我的分析。我不同意程序中的错误,因为我可以用相同的代码和更简单的CNN成功驾驶汽车。我认为原因是模拟器或神经网络的结构。在真正的自动驾驶汽车中,训练信号,即转向角,应该包含噪声;因此,在真实道路上,驾驶员从不让车轮静止不动。但在模拟器中,训练信号非常清晰。几乎60%的转向角为零。优化器可以通过将CNN的输出接近于零来轻松完成这项工作。看起来优化器也很懒。然而,当我们真的想要CNN输出一些东西时,它也会给出零。所以,我为这些零转向角添加了小噪音。我得到一个懒惰的CNN的机会较小,但它并没有消失

你觉得我的分析怎么样?我还可以使用其他策略吗?我想知道,在CNN研究的漫长历史中,类似的问题是否已经得到解决

资源


相关文件已上载到。您可以使用这些文件重复整个实验。

我无法运行您的模型,因为问题和GitHub repo都不包含数据。这就是为什么我对我的答案有90%的把握

但我认为你们网络的主要问题是密集层之后的
sigmoid
激活功能。我想,如果只有两个人,训练会很好,但是四个人太多了

不幸的是,NVidia的论文并没有明确规定它,但是现在默认的激活不再是
sigmoid
(就像以前那样),而是
relu
。看看你是否感兴趣,为什么会这样。因此,我建议的解决方案是尝试这种模式:

model=Sequential()
添加(Lambda(Lambda x:x/255.0-0.5,输入_形状=(160320,3)))
添加(裁剪2D(裁剪=((70,25),(0,0)))
添加(Conv2D(24,(5,5),跨步=(2,2),activation=“relu”))
添加(Conv2D(36,(5,5),跨步=(2,2),activation=“relu”))
添加(Conv2D(48,(5,5),跨步=(2,2),activation=“relu”))
add(Conv2D(64,(3,3),跨步=(1,1),activation=“relu”))
add(Conv2D(64,(3,3),跨步=(1,1),activation=“relu”))
model.add(展平())
添加(密集(1164,activation=“relu”))
添加(密集(100,activation=“relu”))
添加(密集(50,activation=“relu”))
添加(密集(10,activation=“relu”))
模型.添加(密度(1))

它模仿NVidia的网络架构,不受渐变消失的影响。

相关文件已上载到[GitHub]。你可以用这些文件重复整个实验。请不要使用评论空间来更新问题-改为编辑帖子。非常感谢你的建议。这些天我在处理另一个令人悲伤的问题。在某些文化中,忽视他人是非常严重的。我没有忽视,但我的小脑袋无法处理这么多的信息。我会回来的。你90%的信心是对的。懒惰的卷积神经网络已经消失了。非常感谢。似乎我有一个消失梯度问题。如果梯度无法通过网络,优化器必须通过提供一个延迟CNN来完成工作!这是可能的,但我认为详细的原因值得研究。