为什么我的CNN没有学习

时间:2017-01-14 15:47:23

标签: debugging tensorflow neural-network keras

我很抱歉这个陈词滥调的问题,但我真的不知道为什么我的CNN没有改善。

我正在训练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 个答案:

答案 0 :(得分:0)

请尝试将优化器切换为Adam,因为它比SGD更强大。您可以将Nesterov动量包含在nAdam中。所以我会尝试以下。

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

这将自动调整学习率,您不必为此担心。