在Cifar-10上的Keras中实现AlexNet会导致准确性下降

时间:2018-07-18 13:47:55

标签: machine-learning keras neural-network deep-learning conv-neural-network

我尝试按照this视频中的说明实施AlexNet。如果执行错误,请原谅我,这是我在keras中执行该代码。

编辑:cifar-10 ImageDataGenerator

cifar_generator = ImageDataGenerator()

cifar_data = cifar_generator.flow_from_directory('datasets/cifar-10/train', 
                                                 batch_size=32, 
                                                 target_size=input_size, 
                                                 class_mode='categorical')

在Keras中描述的模型:

model = Sequential()

model.add(Convolution2D(filters=96, kernel_size=(11, 11), input_shape=(227, 227, 3), strides=4, activation='relu'))
model.add(MaxPool2D(pool_size=(3 ,3), strides=2))

model.add(Convolution2D(filters=256, kernel_size=(5, 5), strides=1, padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=(3 ,3), strides=2))

model.add(Convolution2D(filters=384, kernel_size=(3, 3), strides=1, padding='same', activation='relu'))
model.add(Convolution2D(filters=384, kernel_size=(3, 3), strides=1, padding='same', activation='relu'))
model.add(Convolution2D(filters=256, kernel_size=(3, 3), strides=1, padding='same', activation='relu'))

model.add(MaxPool2D(pool_size=(3 ,3), strides=2))

model.add(Flatten())
model.add(Dense(units=4096))
model.add(Dense(units=4096))
model.add(Dense(units=10, activation='softmax'))

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

我已经使用ImageDataGenerator在cifar-10数据集上训练了这个网络。但是,我只能获得大约0.20的精度。我不知道自己在做什么错。

1 个答案:

答案 0 :(得分:1)

对于初学者来说,您还需要将relu激活扩展到两个中间密集层;就像现在一样:

model.add(Dense(units=4096))
model.add(Dense(units=4096))

即使用线性激活(默认),可以证明它们每个都等效于一个简单的线性单位(Andrew Ng在他关于DL专业化的第一门课程中专门介绍a whole lecture对此进行了解释)。将它们更改为:

model.add(Dense(units=4096, activation='relu'))
model.add(Dense(units=4096, activation='relu'))

检查SO线程Why must a nonlinear activation function be used in a backpropagation neural network?以及AlexNet实现herehere来确认这一点。