动手学深度学习-Pytorch 版 笔记2

综合 cs231n 和 动手学深度学习pytorch 版的内容,笔记

一、神经网络

  1. 简单来说,神经网络是由简单函数构成的一组函数,用一种层次化的方法堆叠起来,组成了一个更复杂的非线性函数,可以看做多阶段分层计算(hierarchical computaion)
  2. 可以对这个两层神经网络的解释,W1像是一个模板(template),这个模板给对应的类打分,W2是对这些得分加权
  3. 神经网络确实从人类神经元中获取道灵感,但是直接的联系是不紧密的(主要是原理上并不一致);激活函数与突触-树突结构的放电率很像,其中ReLU最像真实神经元的放电行为。总之生物上的神经元非常复杂,具有复杂的非线性,神经网络不是一个生物真实模型。

  4. 常见的激活函数(如何选取在以后的课程中讲到)
  5. 神经网络的结构
    image

二、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来控制全连接层的模型复杂度。
  • 引入数据增强,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。

猜你喜欢

转载自www.cnblogs.com/sunchaothu/p/12331984.html