AlexNet共分为5个卷积层和3个全连接层
1、conv1(卷积层)
将96像素层分为两组,每组在独立GPU上运行
2、conv2(卷积层)
第二层输入数据为第一层输出的27*27*96的像素层,为便于后续处理,每幅像素层的左右两边和上下两边都要填充2个像素;
3、conv3(卷积层)
为便于后续处理,每幅像素层的左右两边和上下两边都要填充1个像素;
4、conv4(卷积层)
5、conv5(卷积层)
6、全连接层1
7、全连接层2
8、全连接层3
基于keras实现代码如下:
model = Sequential()
## Architecture
model.add(
Conv2D(filters=96, kernel_size=(11, 11), strides=4, padding='same', activation='relu', input_shape=(64, 64, 1),
kernel_initializer='he_normal'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same', data_format=None)) # overlapping pooling
model.add(Conv2D(filters=256, kernel_size=(5, 5), strides=1, padding='same', activation='relu',
kernel_initializer='he_normal'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same', data_format=None))
model.add(Conv2D(filters=384, kernel_size=(3, 3), strides=1, padding='same', activation='relu',
kernel_initializer='he_normal'))
model.add(Conv2D(filters=384, kernel_size=(3, 3), strides=1, padding='same', activation='relu',
kernel_initializer='he_normal'))
model.add(Conv2D(filters=256, kernel_size=(3, 3), strides=1, padding='same', activation='relu',
kernel_initializer='he_normal'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same', data_format=None))
model.add(Flatten())
model.add(Dense(units=4096, activation='relu'))
model.add(Dense(units=4096, activation='relu'))
model.add(Dense(units=1000, activation='softmax'))
model.summary()
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
model.fit(image_train, label_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(image_test, label_test))