imagenet-classification-with-deep-convolutional-nn
Alexnet在当时的cv环境下以算法主要以低误差为优势突出。
其中利用到了ImageNet数据集,该数据集内容及其庞大,而大部分的引用仅采用了其中的120万(全部利用效果更好,但是部分引用对结果影响忽略不计)。
主要讲了用来5个卷积层以及3个全连接层。
为了使训练速度加快,使用了非饱和神经元和非常有效的
GPU实现卷积操作。
为了减少全连接层中的过度拟合,采用了开发的名为==“dropout”的正则化方法==,该方法被证明是非常有效的(由于本文具有划时代意义,因此很多结论放在现在并不适用,这里dropout对全连接层意义重大,此外由于现在的gpu技术提升,之前针对部分训练的方式不再使用多个gpu)。
数据集
ImageNet数据集是由不同分辨率的图像组成,而系统需要固定的输入尺寸。这里采用的方法是:给定一个矩形图像,首先依据最短的那条边重新缩放图像,使其缩放到256,然后从得到的图像中裁剪出中央的256x256块。出来从每个像素上减去训练集的平均活动外,没有采取其他方法进行预处理图像
搭建过程
发现Relu比tanh要好
在多个GPU上进行训练(现在不能成为主流)
局部反应归一化(当前不再使用该论文提出的公式)

明确划分两个GPU之间的职责划分,同时规定在某些层进行通信
减少过度拟合方法:
数据增强:使用标签保护的变换来人为的扩大数据集(常用的方法有:随机水平翻转、尺度变换、随机竖直翻转、平移变换、噪声扰动、镜像变换)
该论文采用了两种形式:(1)包括图像的平移和水平反射(2)包括改变训练图像中的RGB通道的强度,具体来说就是对训练集的RGB像素值进行PCA( 详细解释主成分分析 ——数据降维)在每张训练的图像中,添加所发现的主成分倍数。
细节
采用SDG(随机梯度下降法)训练模型。在调整参数时,学习率初始化为0.01(一般规律)可以采用平滑一点的方法,即对所有层使用相同的学习率,在整个训练过程手动调整。也可以采用启发式方法,当验证错误率不再随当前的学习率提高时,将学习率除以10。
该论文采用的是有监督学习方法,在当时那种以无监督学习为主流的时代具有特殊意义。作者希望在视频序列上使用非常大的深度卷积网络。
监督学习和无监督学习
监督学习: 从给定的训练数据集中学习出一个函数(模型参数),当新的数据到来时,可以根据这个函数预测结果。
无监督学习: 输入数据没有被标记,也没有确定的结果。样本数据类别未知,需要根据样本间的相似性对样本集进行分类(聚类,clustering)试图使类内差距最小化,类间差距最大化。
非饱和神经元和饱和神经元
与神经元对应出现的有non-linear activation,这里non-linear activation分为两类:
全连接层
全连接层在卷积神经网络中起到一个“分类器”的作用,如果说卷积层、池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则是起到将学到的“分布式特征表示”映射到样本标记空间的作用

PCA主成分分析
PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。
步骤:
样本归0:将样本进行均值归0,即所有样本减去样本的均值。样本的分布没有改变,只是将坐标轴进行了移动。
此时的方差公式结果为0
找到样本点映射后方差最大的单位向量ω,转化为求目标函数的最优化问题:
V
a
r
(
X
p
r
o
j
e
c
t
)
=
1
m
∑
i
=
1
m
(
X
(
i
)
⋅
ω
)
2
Var(X_{project})= \frac{1}{m} \sum^m_{i=1}(X^{(i)}·ω)^2
Var(Xproject)=m1i=1∑m(X(i)⋅ω)2
求 ω 使公式(1)最大

利用算法梯度法求解
在求极值的问题中,有梯度上升和梯度下降两个最优方法,梯度上升用于求最大值,梯度下降用于求最小值
使损失函数变小的迭代公式:
(
a
k
+
1
,
b
k
+
1
)
=
(
a
k
+
1
−
η
∂
L
∂
a
,
b
k
+
1
−
η
∂
L
∂
b
)
(a_{k+1},b_{k+1}) =(a_{k+1}-η \frac{∂L}{∂a},b_{k+1}-η \frac{∂L}{∂b})
(ak+1,bk+1)=(ak+1−η∂a∂L,bk+1−η∂b∂L)
Dropout正则化
它不仅防止了过度拟合,并提供了一种有效地以指数级方式组合许多不同的神经网络体系结构的方法 。
dropout是指在训练模型时,神经网络随机(以一定的概率)丢弃一些神经元
丢弃神经元:意味着在神经网络中“临时”的将其和与其相连的全部输入和输出链接删除。
Dropout正则化主要解决过拟合问题:
在一般解决过程中,主要通过两种方法进行解决或改善:
Dropout比较流行的实现主要有两种类型:Vanilla Dropout 和Inverted Dropout
其中Vanilla Dropout是朴素实现版本,而Inverted Dropout是更加广为使用和流行的实现。
Vanilla Dropout:具体应用在深度神经网络的中间隐藏层,对于某一层L,如果应用了概率p的Dropout,在网络的训练/测试中,每个神经元都有p的概率会被“丢弃”,即该神经元不参与权重矩阵的计算。

模型训练时应用Dropout的流程,概况是:
**Inverted Dropout:**在训练节点,同样应用p的概率来随机失活,不过额外提前除以1-p,这样相当于将网络的分布提前“拉伸”,好处就是在预测阶段,网络无需再乘以1-p来压缩分布
# -*- coding = utf-8 -*-
# @Time : 2022/7/27 14:35
# @Author : Vinci
# @File : f_dropout.py
# @Software: PyCharm
import torch
def dropout(X, drop_prob):
X = X.float()
assert 0 <= drop_prob <= 1
keep_prob = 1 - drop_prob
if keep_prob == 0:
return torch.zeros_like(X)
mask = (torch.rand(X.shape) < keep_prob).float()
Y = mask * X / keep_prob
return Y
if __name__ == "__main__":
X = torch.arange(16).resize(2, 8)
print(dropout(X, 0.2) * 0.8)