我有下面的神经网络,用Keras编写,使用Tensorflow作为后端,我在Windows 10上的python3.5(Anaconda)上运行:
model = Sequential()
model.add(Dense(100, input_dim=283, init='normal', activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(150, init='normal', activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(200, init='normal', activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(200, init='normal', activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(200, init='normal', activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(4, init='normal', activation='sigmoid'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
我在用我的GPU训练。在训练过程中(10000个时代),朴素网络的准确度从0.25稳定地增加到0.7到0.9之间,然后突然下降并保持在0.25:
^{pr2}$我猜这是由于优化程序陷入了局部最小值,它将所有数据分配到一个类别。我怎么能阻止它这么做呢?在
我尝试过的事情(但似乎没能阻止这一切的发生):
这些都没用。还有什么其他的想法吗?为什么会发生这种情况和/或如何抑制它?可能是Keras的虫子吗?非常感谢您的建议。在
编辑: 通过将最终激活更改为softmax(从sigmoid)并将maxnorm(3)正则化添加到最后两个隐藏层,问题似乎已得到解决:
model = Sequential()
model.add(Dense(100, input_dim=npoints, init='normal', activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(150, init='normal', activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(200, init='normal', activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(200, init='normal', activation='relu', W_constraint=maxnorm(3)))
model.add(Dropout(0.2))
model.add(Dense(200, init='normal', activation='relu', W_constraint=maxnorm(3)))
model.add(Dropout(0.2))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.add(Dense(ncat, init='normal', activation='softmax'))
model.compile(loss='mean_squared_error', optimizer=sgd, metrics=['accuracy'])
非常感谢你的建议。在
问题在于}损失,因为已经证明该函数在这种优化情况下更有效。在
sigmoid
函数作为最后一层的激活。在这种情况下,最后一层的输出不能解释为属于单个类的给定示例的概率分布。这一层的输出通常不等于1。在这种情况下,优化可能会导致意外行为。在我看来,添加一个maxnorm
约束是不必要的,但是我强烈建议您使用categorical_crossentropy
而不是{相关问题 更多 >
编程相关推荐