AlexNet

贡献:

① 与LeNet对比,网络结构和基本操作模块变化微小,仅在网络深度和复杂度上具有优势。

② 第一次把卷积神经网络用于海量图像数据的ImageNet数据集,揭示了卷积神经网络强大的学习能力和表示能力。引发了深度学习。

③ 网络结构引入了一些新颖或不寻常的特征:激活函数‘ReLU’;利用多个GPU实现网络训练局部响应规范化(LRN);重叠池(Overlapping Pooling),有重叠池稍微更难过拟合;为防止过拟合引入数据增强(data augmentation),dropout

Data Augmentation: 改变图像的角度,位置,获得更多的训练数据。

Dropout :包括将每个隐藏神经元的输出设置为零,概率为 0.5。以这种方式“退出”的神经元不参与正向传递,也不参与反向传播。

④ 最终网络包含五个卷积层和三个全连通层,这个深度似乎很重要:我们发现移除任何卷积层( 每个卷积层包含不超过模型参数的 1% )会导致较差的性能。

网络结构:

在这里插入图片描述
在这里插入图片描述
共有八层(有参数的层数有8个),5个卷积层,3个全连接层。值得注意的是5个卷积层中只有前两个做了归一化(Normalized)和最大池化(MaxPooled)处理,后三个卷积层的连接中没有任何的归一化和池化(或者叫汇集),第五个卷积层做完卷积后做一次最大池化处理。第一,二,五个卷积层卷积后有池化处理,共3次最大池化处理。

Summary of AlexNet Architecture

在这里插入图片描述

C1: 用96个尺寸为11×11×3的卷积核,步长(stride)为4,对224×224×3的输入图像做卷积。

C2: 以第一层经过normalized 和 pooled 后的输出作为输入,并用256个大小为5 × 5 ×48的卷积核对其进行滤波。

C3:有 384 个大小为 3 × 3 × 256 的内核,连接到C2的(归一化的、汇集的)输出。

C4:有 384 个大小为 3 × 3 × 192 的核。

C5: 有 256 个大小为 3 × 3 × 192 的核。

F6,F7,F8 完全连接的层各有 4096 个神经元。

代码实现:

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

from keras import datasets, models
from keras.utils import to_categorical
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.core import Dropout, Dense, Flatten # 注意这里和上一条语句都是keras.调用,是统一的。如果一条用tf.keras 一条用keras.会出错哦!

# Step 1: Loading Data & Preprocess
(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()

train_size = 60000
test_size = 10000

x_train = x_train.reshape((train_size, 28, 28, 1))
x_train = x_train.astype('float32') / 255

x_test = x_test.reshape((test_size, 28, 28, 1))
x_test = x_test.astype('float32') / 255

y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

# 划分验证集
x_val = x_train[:test_size]
partial_x_train = x_train[test_size:]

y_val = y_train[:test_size]
partial_y_train = y_train[test_size:]

def alexnet_model(img_shape, n_class=10, weights=None):
    # initialize mode
    alexnet = models.Sequential()

    # Layer1
    alexnet.add(Conv2D(96, (11, 11), input_shape=img_shape, activation='relu', padding='same', name='C1'))
    alexnet.add(MaxPooling2D(pool_size=(2, 2), name='P1'))

    # Layer2
    alexnet.add(Conv2D(256, (5, 5), activation='relu', padding='same', name='C2'))
    alexnet.add(MaxPooling2D(pool_size=(2, 2), name='P2'))

    # Layer3
    alexnet.add(Conv2D(384, (3, 3), activation='relu', padding='same', name='C3'))

    # Layer4
    alexnet.add(Conv2D(384, (3, 3), activation='relu', padding='same', name='C4'))

    # Layer5
    alexnet.add(Conv2D(256, (3, 3), activation='relu', padding='same', name='C5'))
    alexnet.add(MaxPooling2D(pool_size=(2, 2), name='P3'))

    # Layer6
    alexnet.add(Flatten())
    alexnet.add(Dense(4096, activation='relu', name='D1'))
    alexnet.add(Dropout(0.5))

    # Layer7
    alexnet.add(Dense(4096, activation='relu', name='D2'))
    alexnet.add(Dropout(0.5))

    # Layer8
    alexnet.add(Dense(n_class, activation='softmax', name='D3'))

    return alexnet

# Step 3: Just Do it
img_shape = (28,28,1)
model = alexnet_model(img_shape)

model.compile(optimizer='rmsprop',
                      loss='categorical_crossentropy',
                      metrics=['acc'])

epochs = 5
model.fit(partial_x_train, partial_y_train, epochs=epochs, validation_data=(x_val, y_val))

test_loss, test_acc = model.evaluate(x_test, y_test)

print('\nThe accuracy of the AlexNet model: {:.4f}'.format(test_acc))


做了些简化处理,卷积层使用了默认strides,也没有把输入图像填充到论文中的输入图像尺寸(224,224)。

在这里插入图片描述

总结

1,这篇文章动机是啥,主要是在做啥?

2,这篇论文相比于当前方法有啥优点?

3,这篇论文是如何实现的?为啥可以达到这样的效果?

采用八层网络结构,五个卷积层,三个池化层,前两个和第五个卷积层后面接最大池化处理。

4,这篇论文的亮点是啥?

引入了一些新的处理方法,用relu当激活函数,使得收敛更快;多GPU训练,使得计算速度大大提升;局部响应规范化(LRN);重叠池,对抑制过拟合有些许作用;用数据增强(data augment)和随机失活(dropout)处理过拟合。
.

5,这篇论文有哪些技术可以借用?

用relu当激活函数;多GPU训练;数据增强,dropout。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值