date
summary
tags
category
相关基础知识
直接跑代码还是很难完全理解代码的过程,所以我决定从更基础的pytorch相关操作学起,尽管第一周有一部分的介绍。
view操作
返回一个有相同数据但大小不同的tensor。 返回的tensor必须有与原tensor相同的数据和相同数目的元素,但可以有不同的大小。一个tensor必须是连续的
contiguous()
才能被查看。举例子:
简单来说,view主要起了一个张量形状重塑的操作,核心的逻辑就是重新排列维度使张量的结构改变,但需要底层存储时数据连续(相当于将一块连续的内存重新定义了行列形成不同结构的张量)
-1的作用:占位符,让pytorch自动计算该维度大小,确保新的形状元素总数与原来张量总数保持一致。
计算规则:推断维度 = 总元素数 / 其他指定维度的乘积例如:
若x有24个元素,则
x.view(-1, 8)
→形状为 [3, 8](因 24/8=3)。
若x有32个元素,则结果为 [4, 8](32/8=4)。核心特性:前面提到了,1️⃣共享内存,因此不存在数据拷贝,仅修改数据的呈现形式,前后变量共享同一块内存。2️⃣连续性要求。view操作仅适用于连续内存,如果x不连续需要先使用
x.contiguous()
使其连续或者该用reshape()
函数达到同样效果。注意:新形状的元素总数必须与原始张量元素总数一致,在使用占位符自动计算时也要保证另一列(行)数可以被整除
工程应用场景:
- CNN特征图展平:
- RNN序列数据重塑。
将时间步序列展平以输入线形层。
autograd自动微分
对Tensor上所有操作进行自动微分的包,对pytorch中的神经网络相当重要。
torch.Tensor是包的核心类,设置其属性为
requires_grad
为True,则会开始跟踪对于tensor的所有操作。再调用backward()
函数计算所有梯度。要停止 tensor 历史记录的跟踪,可以调用
detach()
,它将其与计算历史记录分离,并防止将来的计算被跟踪。PyTorch神经网络
神经网络可以用
torch.nn
来构建。它是基于autograd自动梯度来定义一些模型,一个nn.Module
包括层和一个方法forward,它会返回输出。比如一个数字图片识别的网络,是一个简单的前馈神经网络,它接手输入,让输入一个接着一个的通过一些层,最后给出输出。
一个典型神经网络的训练过程有如下几点:
- 定义一个包含可训练参数的神经网络
- 迭代整个输入
- 通过神经网络处理输入
- 计算损失
- 反向传播梯度到神经网络的参数
- 更新网络参数(一个简单的更新参数的方法:weight = weight - learning_rate *gradient)
二维卷积层
class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
二维卷积层, 输入的尺度是(N, C_in,H,W),输出尺度(N,C_out,H_out,W_out)的计算方式:
说明:
- bigotimes: 表示二维的相关系数计算
- stride: 控制相关系数的计算步长
- dilation: 用于控制内核点之间的距离
- groups: 控制输入和输出之间的连接: group=1,输出是所有的输入的卷积;group=2,此时相当于有并排的两个卷积层,每个卷积层计算输入通道的一半,并且产生的输出是输出通道的一半,随后将这两个输出连接起来。
参数
kernel_size
,stride
,padding
,dilation
可以是一个int
的数据,此时卷积height和width值相同;也可以是一个tuple
数组,tuple
的第一维度表示height的数值,tuple的第二维度表示width的数值Parameters:参数列表解释
in_channels(int)
:输入信号的通道
out_channels(int)
:卷积产生的通道
kerner_size(int or tuple)
:卷积核的尺寸
stride(int or tuple, optional)
:卷积步长
padding(int or tuple, optional)
:输入的每一条边补充0的层数
dilation(int or tuple, optional)
:卷积核元素之间的间距
groups(int, optional)
:从输入通道到输出通道的阻塞连接数
bias(bool, optional)
:如果bias=True
,添加偏置
例子:
总结卷积核:
- 步长、填充、空洞卷积d的值类型如果为tuple类型时,第一个参数控制height方向,第二个参数控制width方向
- 步长为2时,下采样,可以压缩特定方向的信息,只关注特定方向。比如stride = (2,1)时宽度方向的信息保留。
- 边界填充是为了保留边缘信息。
- dilation=(3, 1):意味着高度方向的卷积核间距为3,等效扩大感受野为9
仅扩大感受野但是不增加参数量(代替大的卷积核,减少了计算量),用于大范围捕获上下文。
体现在运算过程如下图:(dilation为2的时候,此时感受野为5)

本实验仅用到了二维卷积核,故只详细看了该部分的接口内容。
池化层
class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
对于输入信号的输入通道,提供2维最大池化(
max pooling
)操作。如果输入的大小是(N,C,H,W),那么输出的大小是(N,C,H_out,W_out)和池化窗口大小(kH,kW)的关系是:
参数说明:
kernel_size(int or tuple)
:max pooling的窗口大小
stride(int or tuple, optional)
:max pooling的窗口移动的步长。默认值是kernel_size
padding(int or tuple, optional)
:输入的每一条边补充0的层数
dilation(int or tuple, optional)
:一个控制窗口中元素步幅的参数
return_indices
:如果等于True
,会返回输出最大值的序号,对于上采样操作会有帮助
ceil_mode
:如果等于True
,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作
与卷积核类似的参数列表类似:
参数
kernel_size
,stride
, padding
,dilation
数据类型: 可以是一个int
类型的数据,此时卷积height和width值相同; 也可以是一个tuple
数组(包含来两个int类型的数据),第一个int
数据表示height的数值,tuple
的第二个int类型的数据表示width的数值举例:
推断维度 = 总元素数 / 其他指定维度的乘积例如:
若 x有 24 个元素,则 x.view(-1, 8)→ 形状为 [3, 8](因 24/8=3)。
若 x有 32 个元素,则结果为 [4, 8](32/8=4)。
复现网络

- 作者:Raining
- 链接:http://www.raining976.top/article/ouc-sprouts-week2
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章