Alexnet论文解读及代码实现

简介: Alexnet论文解读及代码实现

文章标题

ImageNet classification with deep revolutional Neural Networks(也就是经典的Alexnet网络)

论文链接:http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

Summary

  作者使用ImageNet更大的数据集来训练神经网络。

激活函数

  与传统论文使用的tanh和sigmoid激活函数不同,本论文使用的是非线性函数Relu(Rectified Linear Units)函数。

  论文中称ReLU会使训练误差下降的更快。如下图所示

eb2c2060d8faaa526509c4ad01e3b8c2.jpg

在多GPU中运行

  论文中使用了两块GTX580训练,两个GPU会在特定的层进行通信。双GPU会使得提高1.7%的top-1和1.2%的top-5准确度。并且会加快训练速度。

局部响应归一化

  ReLU本不需要对输入进行标准化,但是作者发现进行局部相应归一化能够提升性能。归一化公式如下:

36b5eeb28fc7b2dfe5ffa22efb2075f1.png

重叠池化

  在传统方法中,相邻池化单元之间互不重叠,但是实验表示使用带交叠的Pooling的效果比的传统要好,在top-1和top-5上分别提高了0.4%和0.3%,在训练阶段有避免过拟合的作用。

神经网络结构

dde8b674201c29ecce51748e9e95d005.jpg

 该网络包含了八层权重:前五个是卷积层,其余三个为全连接层。最后的全连接层的输出被送到1000维的softmax函数,其产生1000个类的预测。我们的网络最大化多项逻辑回归目标,这相当于在预测的分布下最大化训练样本中正确标签对数概率的平均值。第二,第四和第五个卷积层的内核仅与上一层存放在同一GPU上的内核映射相连。第三个卷积层的内核连接到第二层中的所有内核映射。全连接层中的神经元连接到前一层中的所有神经元。响应归一化层紧接着第一个和第二个卷积层,后面连接响应归一化层以及第五个卷积层。将ReLU应用于每个卷积层和全连接层的输出。

减少过拟合

  减少过拟合有两种方法:一种是数据增强,一种是Dropout。

  ①数据增强:对图片进行水平映射、垂直映射、旋转等等变换。由于是对图片进行较小的计算,所以增强后的图片不用保存到硬盘里。

  ②Dropout:在训练期间,只需要消耗1/2的参数。它会以50%的概率将隐含层的神经元输出置为0。以这种方法被置0的神经元不参与网络的前馈和反向传播。因此,每次给网络提供了输入后,神经网络都会采用一个不同的结构,但是这些结构都共享权重。这种技术减少了神经元的复杂适应性,因为神经元无法依赖于其他特定的神经元而存在。因此,它被迫学习更强大更鲁棒的功能,使得这些神经元可以与其他神经元的许多不同的随机子集结合使用。

训练细节

  论文中使用随机梯度下降,权重衰减为0.005,momentum为0.9,batch_size=128。

  使用标准差=0.01,均值为0的高斯分布来初始化权重。在第二、四、五还有全连接层使用偏差为1来加速前期的训练,在其余层使用偏差为0。对每个层使用相同的学习率,learning_rate=0.01,训练过程进行3次的手动调整。

Evaluation

  去掉任一层都会使得结果降低,说明深度很重要。

  没有使用无监督方法去预训练数据。对视频序列效果不明显,因为时间结构往往在静态图像中丢失了。

结合代码看更容易理解网络结构

import pandas as pd
import numpy as np
from keras.callbacks import EarlyStopping, ModelCheckpoint
from matplotlib import pyplot as plt
from skimage.io import imread, imshow
from skimage import transform
import warnings
from tqdm import tqdm
from keras.layers import Input, Lambda, Conv2D, MaxPool2D, BatchNormalization, Dense, Flatten, Dropout
from keras.models import Model
from keras.utils import to_categorical
warnings.filterwarnings('ignore')
image_path = 'F:\\Keras_cnn\\images\\'  #文件路径这样写才正确,刚开始以为是'/'一直显示找不到该文件
IMG_HEIGHT = 400
IMG_WIDTH = 500
IMG_CHANNELS = 1
'''
    处理label
'''
train_csv = pd.read_csv('train.csv')
train_label_string = train_csv['species'].values
train_id = train_csv['id'].values
laber_number_dict = {}
train_label_number = []
number = 0
for i in train_label_string:
    if i in laber_number_dict:
        train_label_number.append(laber_number_dict[i])
    else:
        laber_number_dict.update({i: number})
        train_label_number.append(number)
        number += 1
id_label_dict = dict(zip(train_id, train_label_number))
test_csv = pd.read_csv('test.csv')
test_id = test_csv['id'].values
train_data = np.zeros((len(train_id), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)
train_label = np.zeros((len(train_id), 1), dtype=np.uint8)
test_data = np.zeros((len(test_id), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)
for n, i in tqdm(enumerate(train_id), total=len(train_data)):
    image_data = imread(image_path + str(i) + '.jpg')
    image_data = transform.resize(image_data, (IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))
    train_data[n] = image_data
    train_label[n] = id_label_dict[i]
train_label = to_categorical(train_label, 99)
for n, i in tqdm(enumerate(test_id), total=len(test_id)):
    image_data = imread(image_path + str(i) + '.jpg')
    image_data = transform.resize(image_data, (IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))
    test_data[n] = image_data
random_number = np.random.randint(len(train_id))
show_train_data = train_data[random_number].reshape(IMG_HEIGHT, IMG_WIDTH)
imshow(show_train_data)
plt.show()
'''
    开始搭建 AlexNet
'''
inputs = Input((IMG_HEIGHT, IMG_WIDTH, 1))
c1 = Conv2D(48, (11, 11), strides=4, activation='relu', kernel_initializer='uniform', padding='valid')(inputs)
c2 = BatchNormalization()(c1)
c3 = MaxPool2D((3, 3), strides=2, padding='valid')(c2)
c4 = Conv2D(128, (5, 5), strides=1, padding='same', activation='relu', kernel_initializer='uniform')(c3)
c5 = BatchNormalization()(c4)
c6 = MaxPool2D((3, 3), strides=2, padding='valid')(c5)
c7 = Conv2D(192, (3, 3), strides=1, padding='same', activation='relu', kernel_initializer='uniform')(c6)
c8 = Conv2D(192, (3, 3), strides=1, padding='same', activation='relu', kernel_initializer='uniform')(c7)
c9 = Conv2D(128, (3, 3), strides=1, padding='same', activation='relu', kernel_initializer='uniform')(c8)
c10 = MaxPool2D((3, 3), strides=2, padding='valid')(c9)
c11 = Flatten()(c10)
c12 = Dense(256, activation='relu')(c11)  # 论文中是2048
c13 = Dropout(0.5)(c12)
c14 = Dense(256, activation='relu')(c13)  # 论文中是2048
c15 = Dropout(0.5)(c14)
outputs = Dense(99, activation='softmax')(c15)  # 论文中是1000
model = Model(inputs=[inputs], outputs=[outputs])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
earlystopper = EarlyStopping(patience=5, verbose=1)
checkpointer = ModelCheckpoint('model-1.h5', verbose=1, save_best_only=True)
model.fit(train_data, train_label, validation_split=0.1, batch_size=256, epochs=256,
          callbacks=[earlystopper, checkpointer])
相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
机器学习/深度学习 移动开发 编解码
RepVGG(一)论文解析
RepVGG(一)论文解析
354 0
|
机器学习/深度学习 数据挖掘 计算机视觉
经典神经网络论文超详细解读(一)——AlexNet学习笔记(翻译+精读)
经典神经网络论文超详细解读(一)——AlexNet学习笔记(翻译+精读)
1416 2
经典神经网络论文超详细解读(一)——AlexNet学习笔记(翻译+精读)
|
机器学习/深度学习 算法 数据挖掘
|
机器学习/深度学习 算法 计算机视觉
经典神经网络论文超详细解读(五)——ResNet(残差网络)学习笔记(翻译+精读+代码复现)
经典神经网络论文超详细解读(五)——ResNet(残差网络)学习笔记(翻译+精读+代码复现)
4045 1
经典神经网络论文超详细解读(五)——ResNet(残差网络)学习笔记(翻译+精读+代码复现)
|
机器学习/深度学习 编解码 算法
经典神经网络论文超详细解读(四)——InceptionV2-V3学习笔记(翻译+精读+代码复现)
经典神经网络论文超详细解读(四)——InceptionV2-V3学习笔记(翻译+精读+代码复现)
237 0
经典神经网络论文超详细解读(四)——InceptionV2-V3学习笔记(翻译+精读+代码复现)
|
机器学习/深度学习 人工智能 数据可视化
【Pytorch神经网络实战案例】20 基于Cora数据集实现图卷积神经网络论文分类
CORA数据集里面含有每一篇论文的关键词以及分类信息,同时还有论文间互相引用的信息。搭建AI模型,对数据集中的论文信息进行分析,根据已有论文的分类特征,从而预测出未知分类的论文类别。
713 0
|
机器学习/深度学习 编解码 算法框架/工具
经典神经网络论文超详细解读(八)——ResNeXt学习笔记(翻译+精读+代码复现)
经典神经网络论文超详细解读(八)——ResNeXt学习笔记(翻译+精读+代码复现)
783 1
经典神经网络论文超详细解读(八)——ResNeXt学习笔记(翻译+精读+代码复现)
|
机器学习/深度学习 数据采集 监控
经典神经网络论文超详细解读(六)——DenseNet学习笔记(翻译+精读+代码复现)
经典神经网络论文超详细解读(六)——DenseNet学习笔记(翻译+精读+代码复现)
3229 1
经典神经网络论文超详细解读(六)——DenseNet学习笔记(翻译+精读+代码复现)
|
机器学习/深度学习 人工智能 数据可视化
【Pytorch神经网络实战案例】22 基于Cora数据集实现图注意力神经网络GAT的论文分类
有一个记录论文信息的数据集,数据集里面含有每一篇论文的关键词以及分类信息,同时还有论文间互相引用的信息。搭建AI模型,对数据集中的论文信息进行分析,使模型学习已有论文的分类特征,以便预测出未知分类的论文类别。
507 0
|
机器学习/深度学习 PyTorch 算法框架/工具
什么是LSTM模型,什么是BILSTM模型,给出 pytorch案例
LSTM模型是一种循环神经网络模型,它在处理序列数据时能够有效地解决梯度消失和梯度爆炸的问题。LSTM模型引入了门机制(如遗忘门、输入门和输出门),以便在序列中选择性地保存或遗忘信息。这些门可以根据输入数据自适应地学习。 BILSTM模型是一种双向LSTM模型,它包含两个LSTM模型,一个正向模型和一个反向模型。正向模型按照时间顺序读取输入序列,而反向模型按照相反的顺序读取输入序列。这使得BILSTM模型能够同时考虑过去和未来的上下文信息,因此通常比单向LSTM模型表现更好。
1024 0