Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
Debugging 为什么我的CNN没有学习_Debugging_Tensorflow_Neural Network_Keras - Fatal编程技术网

Debugging 为什么我的CNN没有学习

Debugging 为什么我的CNN没有学习,debugging,tensorflow,neural-network,keras,Debugging,Tensorflow,Neural Network,Keras,对于这样一个陈词滥调的问题我很抱歉,但我真的不知道为什么我的CNN没有进步 我正在为SVHN数据集(单个数字)培训CNN,图像为32x32 对于预处理,我将RGB转换为灰度,并通过标准化对所有像素数据进行规格化。因此,数据范围变为(-1,1)。为了验证我的X和y是否正确对应,我从X中随机选取了一个图像,并从y中选取了一个具有相同索引的标签,这表明它们是正确的 以下是我的代码(Keras、tensorflow后端): 在运行了10个历元之后,精度仍然与第一个历元相同,这就是为什么我停止了它 Tr

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

我正在为SVHN数据集(单个数字)培训CNN,图像为32x32

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

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

在运行了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有什么问题?

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

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

这将自动调整学习率,您无需太过担心。

尝试降低学习率。0.1是巨大的。尝试类似1e-5的方法。同意学习率太高。此外,请尝试将数据规格化为[0,1]范围而不是[-1,1]。@pyan为什么建议将输入值缩放到[0,1]范围而不是[-1,1]?因为您使用ReLU作为激活函数,如果输入小于0,它将为您提供0。因此,给定相同的初始参数,[0,1]范围的训练速度可能比[-1,1]快。
model.compile(loss='categorical_crossentropy',
              optimizer='nadam',
              metrics=['accuracy'])