pytorch杂记

forward方法

nn.Module中的forward方法没有实际内容,用于被子类的 forward() 方法覆盖,且 forward 方法在__call__方法中被调用:
forward方法的具体流程:
以一个Module为例:

  1. 调用module的call方法
  2. module的call里面调用module的forward方法
  3. forward里面如果碰到Module的子类,回到第1步,如果碰到的是Function的子类,继续往下
  4. 调用Function的call方法
  5. Function的call方法调用了Function的forward方法。
  6. Function的forward返回值
  7. module的forward返回值
  8. 在module的call进行forward_hook操作,然后返回值。
    调用module的call方法是指nn.Module 的__call__方法
    Forward方法为正向传播,Backward方法为反向传播,在forward中进行操作的时候,其实我们已经对torch.autograd.Function的subclass进行了操作,backward 方法就会基于 Autograd 自动实现。自动计算所有的梯度, 这个张量的所有梯度将会自动积累到 .grad 属性。

Conv2d方法

二维卷积nn.Conv2d对宽度和高度都进行卷积,一般用于二维图像。
输入的尺度是(N, C_in,H,W),输出尺度(N,C_out,H_out,W_out)
nn.Conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True)
in_channels:输入维度
out_channels:输出维度
kernel_size:卷积核大小尺寸
stride:步长大小
padding:补0:控制零填充的数目。
dilation:控制卷积核点的间距
Groups: (卷积核个数):通常来说,卷积个数唯一,但是对某些情况,可以设置范围在1 —输入维度中数目的卷积核:
Bias:对输出增加一个可学习的偏置量
卷积神经网络的层级结构:
1.数据输入层/ Input layer
2.卷积计算层/ CONV layer
3.ReLU激励层 / ReLU layer
4.池化层 / Pooling layer
5.全连接层 / FC layer
1.数据输入层
该层要做的处理主要是对原始图像数据进行预处理,其中包括:
去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。
归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。
PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化
2.卷积计算层
这一层就是卷积神经网络最重要的一个层次,也是“卷积神经网络”的名字来源。
在这个卷积层,有两个关键操作:
局部关联。每个神经元看做一个滤波器(filter)
窗口(receptive field)滑动, filter对局部数据计算
参数共享机制
在卷积层中每个神经元连接数据窗的权重是固定的,每个神经元只关注一个特性。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即卷积层的每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等等,这些所有神经元加起来就好比就是整张图像的特征提取器集合。
需要估算的权重个数减少: AlexNet 1亿 => 3.5w
一组固定的权重和不同窗口内数据做内积: 卷积
3.激励层
把卷积层输出结果做非线性映射。
CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱
4.池化层
池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。
简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。
池化层的具体作用:
1.特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。
2.特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。
3.在一定程度上防止过拟合,更方便优化。池化层用的方法有Max pooling 和 average pooling
5.全连接层
两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部,也跟传统的神经网络神经元的连接方式是一样的。

GRU方法

nn.GRU(*args,**kwargs):GRU(Gate Recurrent Unit)是循环神经网络(Recurrent Neural Network, RNN)的一种。和LSTM(Long-Short Term Memory)一样,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。与LSTM相比,GRU内部少了一个“门控”,参数比LSTM少,但是却能够达到与LSTM相当的功能。
函数参数:
input_size:输入数据X的特征值的数目。
hidden_size:隐藏层的神经元数量,也就是隐藏层的特征数量。
num_layers:循环神经网络的层数,默认值是 1。
bias:默认为True,如果为false 则表示神经元不使用 和 偏移参数。
batch_first:如果设置为True,则输入数据的维度中第一个维度就是batch值,默认为False。默认情况下第一个维度是序列的长度,第二个维度才是batch,第三个维度是特征数目。
dropout:如果不为空,则表示最后跟一个dropout层抛弃部分数据,抛弃数据的比例由该参数指定。默认为0。
bidirectional : 如果True, 变为双向RNN,默认为 False
GRU的输入输出结构与普通的RNN是一样的。
有一个当前的输入 x t x^t xt,和上一个节点传递下来的隐状态(hidden state) h t − 1 h^{t-1} ht1 ,这个隐状态包含了之前节点的相关信息。
结合 x t x^t xt h t − 1 h^{t-1} ht1,GRU会得到当前隐藏节点的输出 y t y^t yt和传递给下一个节点的隐状态 h t h^t ht
首先,我们先通过上一个传输下来的状态 h t − 1 h^{t-1} ht1和当前节点的输入 x t x^t xt来获取两个门控状态。
得到门控信号之后,首先使用重置门控来得到“重置”之后的数据 h t − 1 ′ = h t − 1 ⊙ r h^{t-1'}=h{^t-1}\odot r ht1=ht1r,再将 h t − 1 ′ h^{t-1'} ht1与输入 x t x^t xt进行拼接,再通过一个tanh激活函数来将数据放缩到-1~1的范围内。这里的 h ′ h' h主要是包含了当前输入的 x t x^t xt数据。有针对性地对 h ′ h' h添加到当前的隐藏状态,相当于“记忆了当前时刻的状态”。
在这里插入图片描述
GRU最关键的一个步骤,可以称之为”更新记忆“阶段。
在这个阶段,同时进行了遗忘和记忆两个步骤。我们使用了先前得到的更新门控z
更新表达式:
在这里插入图片描述

首先,门控信号(这里的z)的范围为0~1。门控信号越接近1,代表“记忆”下来的数据越多;而越接近0则代表“遗忘”的越多。
GRU很聪明的一点就在于,使用了同一个门控z就同时可以进行遗忘和选择记忆(LSTM则要使用多个门控)。
( 1 − z ) ⊙ h t − 1 (1-z) \odot h^{t-1} (1z)ht1:表示对原本隐藏状态的选择性“遗忘”。这里的 1-z可以想象成遗忘门,忘记 h t − 1 h^{t-1} ht1维度中一些不重要的信息。
z ⊙ h ′ z\odot h' zh: 表示对包含当前节点信息的 h ′ h' h进行选择性“记忆”。与上面类似,这里的1-z同理会忘记 h ′ h' h维度中的一些不重要的信息。或者,这里我们更应当看做是对 h ′ h' h维度中的某些信息进行选择。
h t = ( 1 − z ) ⊙ h t − 1 + z ⊙ h ′ h^t=(1-z)\odot h^{t-1}+z \odot h' ht=(1z)ht1+zh:结合上述,这一步的操作就是忘记传递下来的 h t − 1 h^{t-1} ht1 中的某些维度信息,并加入当前节点输入的某些维度信息。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值