当前位置: 首页 > 知识库问答 >
问题:

为什么我的CNN不学习

应和光
2023-03-14

对于这样一个陈词滥调的问题我很抱歉,但我真的不知道为什么我的CNN没有进步。

我正在训练一个美国有线电视新闻网的SVHN数据集(一位数)与32x32的图像。

对于预处理,我将RGB转换为灰度,并通过标准化对所有像素数据进行规格化。因此,数据范围变为(-1,1)。为了验证我的Xy是否正确对应,我从X中随机选取了一个图像,并从y中选取了一个具有相同索引的标签,这表明它们是正确的。

以下是我的代码(Keras、tensorflow后端):

"""
    Single Digit Recognition
"""

import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense, Activation, Convolution2D
from keras.layers.pooling import MaxPooling2D
from keras.optimizers import SGD
from keras.layers.core import Dropout, Flatten
model = Sequential()

model.add(Convolution2D(16, 5, 5, border_mode='same', input_shape=(32, 32, 1)))
model.add(Activation("relu"))
model.add(Dropout(0.5))
model.add(MaxPooling2D(pool_size=(2, 2), strides=None, border_mode='same', dim_ordering='default'))
model.add(Convolution2D(32, 5, 5, border_mode='same', input_shape=(16, 16, 16)))
model.add(Activation("relu"))
model.add(Dropout(0.5))
model.add(MaxPooling2D(pool_size=(2, 2), strides=None, border_mode='same', dim_ordering='default'))
model.add(Convolution2D(64, 5, 5, border_mode='same', input_shape=(32, 8, 8)))
model.add(Activation("relu"))
model.add(Dropout(0.5))
model.add(MaxPooling2D(pool_size=(2, 2), strides=None, border_mode='same', dim_ordering='default'))
model.add(Flatten())
model.add(Dense(128, input_dim=1024))
model.add(Activation("relu"))
model.add(Dense(10, input_dim=128))
model.add(Activation('softmax'))

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
              optimizer=sgd,
              metrics=['accuracy'])
model.fit(train_X, train_y,
          validation_split=0.1,
          nb_epoch=20,
          batch_size=64)
score = model.evaluate(test_X, test_y, batch_size=16)

运行10个纪元后,精度仍然与第一个纪元相同,这就是我停止它的原因。

Train on 65931 samples, validate on 7326 samples
Epoch 1/20
65931/65931 [==============================] - 190s - loss: 2.2390 - acc: 0.1882 - val_loss: 2.2447 - val_acc: 0.1885
Epoch 2/20
65931/65931 [==============================] - 194s - loss: 2.2395 - acc: 0.1893 - val_loss: 2.2399 - val_acc: 0.1885
Epoch 3/20
65931/65931 [==============================] - 167s - loss: 2.2393 - acc: 0.1893 - val_loss: 2.2402 - val_acc: 0.1885
Epoch 4/20
65931/65931 [==============================] - 172s - loss: 2.2394 - acc: 0.1883 - val_loss: 2.2443 - val_acc: 0.1885
Epoch 5/20
65931/65931 [==============================] - 172s - loss: 2.2393 - acc: 0.1884 - val_loss: 2.2443 - val_acc: 0.1885
Epoch 6/20
65931/65931 [==============================] - 179s - loss: 2.2397 - acc: 0.1881 - val_loss: 2.2433 - val_acc: 0.1885
Epoch 7/20
65931/65931 [==============================] - 173s - loss: 2.2399 - acc: 0.1888 - val_loss: 2.2410 - val_acc: 0.1885
Epoch 8/20
65931/65931 [==============================] - 175s - loss: 2.2392 - acc: 0.1893 - val_loss: 2.2439 - val_acc: 0.1885
Epoch 9/20
65931/65931 [==============================] - 175s - loss: 2.2395 - acc: 0.1893 - val_loss: 2.2401 - val_acc: 0.1885
Epoch 10/20
 9536/65931 [===>..........................] - ETA: 162s - loss: 2.2372 - acc: 0.1909 

我应该继续耐心尝试,还是我的CNN出了问题?

共有1个答案

金飞
2023-03-14

尝试将您的优化器切换到Adam,因为它比SGD更有能力。你可以将Nesterov momentum与nAdam结合起来。所以我会尝试下面的方法。

model.compile(loss='categorical_crossentropy',
              optimizer='nadam',
              metrics=['accuracy'])

这将自动调整学习率,你不需要担心太多。

 类似资料:
  • 问题内容: 在下面的代码中,我看不出T1和T3有什么不同。当然我的计算器说不是。 那么为什么我得到以下输出: 在此示例程序中也不只是System.out.println。当我在日食中有T1并将鼠标悬停在变量上时,我得到一个光泽,显示相同的值。 Java版本“ 1.6.0_33” OSX 问题答案: 正如偏执的android所说,这是一个溢出问题。要了解为什么T3不同,请参见下文。 这里的所有数字都

  • 问题内容: 我在使用JMockit(1.21)模拟时遇到问题。请参阅以下内容,以简化我的实际课程。基本上我在我的代码中使用了某个地方,我希望对其进行模拟。 至于我的测试代码,此测试有效。 该测试失败。 我收到的错误消息: 我可以嘲笑像其他系统类和这样的,但只是似乎没有工作(也没有为此事)。我知道如何规避这是我的考验,所以我没有受到任何阻碍,但我不明白为什么不能嘲笑。删除Expectations块将

  • 本文向大家介绍什么是CNN的池化相关面试题,主要包含被问及什么是CNN的池化时的应答技巧和注意事项,需要的朋友参考一下 池化,简言之,即取区域平均或最大,如下图所示(图引自cs231n) 上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。

  • 操控浏览器的能力 广泛的使用领域 易学性 强大的性能 开放性 社区支持 每当我开始阅读一本很厚的书,总是先问自己,它值得我这样做吗? 读完一本书,就像完成一段旅程。有些旅程会让你终身回忆,而另一些旅程让你后悔不迭,不应该将宝贵的生命浪费在它之上。 所以我想,在读者开始阅读这本教程之前,我最好也谈谈为什么要学JavaScript,它有什么用?一方面,我不希望有人因为读了我的书而后悔;另一方面,这本教

  • Python 越来越火爆 Python 在诞生之初,因为其功能不好,运转功率低,不支持多核,根本没有并发性可言,在计算功能不那么好的年代,一直没有火爆起来,甚至很多人根本不知道有这门语言。 随着时代的发展,物理硬件功能不断提高,而软件的复杂性也不断增大,开发效率越来越被企业重视。因此就有了不一样的声音,在软件开发的初始阶段,性能并没有开发效率重要,没必然为了节省不到 1ms 的时间却让开发量增加好

  • 我正在运行一个模型来检测图像中一些有趣的特征。我有一组600x200像素的图像。这些图像具有我想识别的岩石碎片等特征。想象一个(4x12)网格覆盖在图像上,我可以使用注释器工具手动生成注释,例如((4,9),(3,10),(3,11),(3,12)),以识别图像中感兴趣的单元格。我可以用Keras建立CNN模型,输入为灰度图像。但我应该如何对输出进行编码。在我看来,一种直观的方法是将其视为形状的稀