Keras分类器的准确度在训练期间稳步提高,然后下降到0.25(局部最小值?)

2024-10-01 00:15:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的神经网络,用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}$

我猜这是由于优化程序陷入了局部最小值,它将所有数据分配到一个类别。我怎么能阻止它这么做呢?在

我尝试过的事情(但似乎没能阻止这一切的发生):

  1. 使用不同的乐观者(亚当)
  2. 确保培训数据包括每个类别中相同数量的示例
  3. 增加培训数据量(目前为6000)
  4. 在2到5之间改变类别的数量
  5. 将网络中隐藏层的数量从1增加到5
  6. 更改层的宽度(从50到500)

这些都没用。还有什么其他的想法吗?为什么会发生这种情况和/或如何抑制它?可能是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'])

非常感谢你的建议。在


Tags: addinput数量modelinit类别activationdropout
1条回答
网友
1楼 · 发布于 2024-10-01 00:15:56

问题在于sigmoid函数作为最后一层的激活。在这种情况下,最后一层的输出不能解释为属于单个类的给定示例的概率分布。这一层的输出通常不等于1。在这种情况下,优化可能会导致意外行为。在我看来,添加一个maxnorm约束是不必要的,但是我强烈建议您使用categorical_crossentropy而不是{}损失,因为已经证明该函数在这种优化情况下更有效。在

相关问题 更多 >