目录
综合 cs231n 和 动手学深度学习pytorch 版的内容,笔记
一、神经网络
- 简单来说,神经网络是由简单函数构成的一组函数,用一种层次化的方法堆叠起来,组成了一个更复杂的非线性函数,可以看做多阶段分层计算(hierarchical computaion)
- 可以对这个两层神经网络的解释,W1像是一个模板(template),这个模板给对应的类打分,W2是对这些得分加权
神经网络确实从人类神经元中获取道灵感,但是直接的联系是不紧密的(主要是原理上并不一致);激活函数与突触-树突结构的放电率很像,其中ReLU最像真实神经元的放电行为。总之生物上的神经元非常复杂,具有复杂的非线性,神经网络不是一个生物真实模型。
- 常见的激活函数(如何选取在以后的课程中讲到)
神经网络的结构
二、CNN 卷积神经网络
全连接层
2012 年 AlexNet 和 CNN
被提出,在图像分类任务上的杰出表现引发深度学习狂潮
2.1 卷积层
用一个滤波核(又叫感受野)取对输入图像滑动进行卷积。
对图像的卷积可以保持输入的结构(矩阵结构,而不是拉伸成一维向量);滤波核总是和输入的图像的深度相同(通道数相同);滑动做内积(卷积)之后的结果是单通道的map;
使用多个卷积核获取不同的信息,32*32*3 的图与 5*5*3 kernal 做卷积之后得到一层 28*28*1 的activation map; 事实上会拿多个(一组)卷积核与输入做卷积,这样得到多个 activation maps;
也就是RGB三通道的情况下,不同通道得到的卷积值会加到一起。
代码实现
- 卷积运算(这里实际上是互相关运算), 使用pytorch 实现
import torch
import torch.nn as nn
def corr2d(X, K):
H, W = X.shape
h, w = K.shape
Y = torch.zeros(H - h + 1, W - w + 1)
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Y[i, j] = (X[i: i + h, j: j + w] * K).sum()
return Y
当然,pytorch 自带有相应的函数。
X = torch.rand(4, 2, 3, 5)
print(X.shape)
conv2d = nn.Conv2d(in_channels=2, out_channels=3, kernel_size=(3, 5), stride=1, padding=(1, 2))
Y = conv2d(X)
print('Y.shape: ', Y.shape)
print('weight.shape: ', conv2d.weight.shape)
print('bias.shape: ', conv2d.bias.shape)
2.2 卷积神经网络
卷积神经网络是由全连接层和卷积层(还有池化层Pooling)和激活函数组合起来的网络
(待续)
前几层卷积结果一般代表了图像的低级特征,比如边缘特征等;中层代表了一些更高级的特征,高层的更复杂,比如斑点等特征。
2.3 卷积的具体操作
input: N * N *depth volumn
convolution kernal: FF depth
output-activation map:
$(N-F)/Stride + 1$
stride - 步幅;大于 1 步幅相当于降采样
计算,先卷积,再加上偏置
w^Tx + b
- In practice: padding with x pixels 0 border;在边界补 0 或者复制边缘值;使得输入和输出大小相等(否则到了深层将会很缩得很小:shrink)。
2.4 卷积层超参数的个数
注意考虑 bias
2.5 CNN 的结构: 池化层 和 非线性层
池化层
池化器:
用一个激活值表示一个区域;(相当于)减小参数数量
- Max Pooling: 对滑动窗口内取最大的元素值
X = torch.arange(32, dtype=torch.float32).view(1, 2, 4, 4)
pool2d = nn.MaxPool2d(kernel_size=3, padding=1, stride=(2, 1))
Y = pool2d(X)
print(X)
print(Y)
- 平均池化层使用的是
nn.AvgPool2d
, 在滑动窗口取元素的平均值
Stride vs Pooling
卷积时的stride 参数大于1时和Pooling 都有降采样的效果。
全连接层 Fully Connected Layers (FC layer)
资源: ConvNetJS demo
LNet
- 使用全连接层的局限性
图像在同一列邻近的像素在这个向量中可能相距较远。它们构成的模式可能难以被模型识别。
对于大尺寸的输入图像,使用全连接层容易导致模型过大。
使用卷积层的优势
卷积层保留输入形状。
卷积层通过滑动窗口将同一卷积核与不同位置的输入重复计算,从而避免参数尺寸过大。
LeNet 模型
LeNet分为卷积层块和全连接层块两个部分。下面我们分别介绍这两个模块。
卷积层块里的基本单位是卷积层后接平均池化层:卷积层用来识别图像里的空间模式,如线条和物体局部,之后的平均池化层则用来降低卷积层对位置的敏感性。
卷积层块由两个这样的基本单位重复堆叠构成。在卷积层块中,每个卷积层都使用的窗口,并在输出上使用sigmoid激活函数。第一个卷积层输出通道数为6,第二个卷积层输出通道数则增加到16。
全连接层块含3个全连接层。它们的输出个数分别是120、84和10,其中10为输出的类别个数。
ALexNet
首次证明了学习到的特征可以超越⼿⼯设计的特征,从而⼀举打破计算机视觉研究的前状。
特征:
- 8层变换,其中有5层卷积和2层全连接隐藏层,以及1个全连接输出层。
- 将sigmoid激活函数改成了更加简单的ReLU激活函数。
- 用Dropout来控制全连接层的模型复杂度。
- 引入数据增强,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。