Pytorch学习笔记(5):torch.nn---网络层介绍(卷积层、池化层、线性层、激活函数层)

简介: Pytorch学习笔记(5):torch.nn---网络层介绍(卷积层、池化层、线性层、激活函数层)


前期回顾:

Pytorch学习笔记(1):基本概念、安装、张量操作、逻辑回归

Pytorch学习笔记(2):数据读取机制(DataLoader与Dataset)

Pytorch学习笔记(3):图像的预处理(transforms)

Pytorch学习笔记(4):模型创建(Module)、模型容器(Containers)、AlexNet构建


一、卷积层—Convolution Layers

卷积运算:卷积核在输入信号(图像)上滑动,相应位置上进行乘加。

卷积核:又称滤波器,过滤器,可认为是某种模式,某种特征。

卷积过程:类似于用一个模板去图像上寻找与它相似的区域,与卷积核模式越相似,激活值越高,从而实现特征提取。

1.1 1d / 2d / 3d卷积

卷积维度:一般情况下,卷积核在几个维度上滑动,就是几维卷积

(1)1d卷积示意

(2)2d卷积示意

(3)3d卷积示意


1.2 卷积—nn.Conv2d()

nn.Conv2d

功能:对多个二维信号进行二维卷积

主要参数:

  • in_channels:输入通道数
  • out_channels:输出通道数,等价于卷积核个数
  • kernel_size:卷积核尺寸
  • stride:步长
  • padding:填充个数(一般用来保持输入输出尺寸一致)
  • dilation:空洞卷积大小
  • groups:分组卷积设置
  • bias:偏置

尺寸计算方式:

Conv2d运算原理

主要代码段如下:

(1)加载图片,将图片处理成张量的形式:

# ================================= load img ==================================
path_img = os.path.join(os.path.dirname(os.path.abspath(__file__)), "pig.jpeg")
print(path_img)
img = Image.open(path_img).convert('RGB')  # 0~255
# convert to tensor
img_transform = transforms.Compose([transforms.ToTensor()])
img_tensor = img_transform(img)
# 添加 batch 维度
img_tensor.unsqueeze_(dim=0)    # C*H*W to B*C*H*W

(2) 进行卷积操作:

# =============== create convolution layer ==================
# ================ 2d
 flag = 1
#flag = 0
if flag:
    #定义一个卷积层
    conv_layer = nn.Conv2d(3, 1, 3)   # input:(i, o, size) weights:(o, i , h, w)
    # 初始化卷积层权值
    nn.init.xavier_normal_(conv_layer.weight.data)
    # nn.init.xavier_uniform_(conv_layer.weight.data)
    # 卷积运算
    img_conv = conv_layer(img_tensor)

(3)运行并打印图片:

# ================================= visualization ==================================
print("卷积前尺寸:{}\n卷积后尺寸:{}".format(img_tensor.shape, img_conv.shape))
img_conv = transform_invert(img_conv[0, 0:1, ...], img_transform)
img_raw = transform_invert(img_tensor.squeeze(), img_transform)
plt.subplot(122).imshow(img_conv, cmap='gray')
plt.subplot(121).imshow(img_raw)
plt.show()

我们来看一下效果,可以看到,卷积核对特征进行了提取:

我们再看一下图像尺寸的变化:

卷积前,图像尺寸是1000×1000, 卷积后, 图像尺寸是998×998。我们这里的卷积核设置, 输入通道3, 卷积核个数1, 卷积核大小3, 无padding,步长是1, 那么我们根据上面的公式, 输出尺寸:(1000−3)/1+1=998

我们继续随机初始化卷积核权重进行卷积后,则会出现以下效果:


1.3 转置卷积—nn.ConvTranspose

nn.ConvTranspose2d

功能:转置卷积实现上采样

主要参数

  • in_channels:输入通道数
  • out_channels:输出通道数
  • kernel_size:卷积核尺寸
  • stride:步长
  • padding:填充个数
  • dilation:空洞卷积大小
  • groups:分组卷积设置
  • bias:偏置

转置卷积的尺寸计算(卷积运算的尺寸逆):

转置卷积代码如下:

# ================ transposed
flag = 1
# flag = 0
if flag:
    conv_layer = nn.ConvTranspose2d(3, 1, 3, stride=2)   # input:(input_channel, output_channel, size)
    # 初始化网络层的权值
    nn.init.xavier_normal_(conv_layer.weight.data)
    # calculation
    img_conv = conv_layer(img_tensor)

转置卷积结果:

我们再看一下图像尺寸的变化:

我们发现,输入图像是1000的, 卷积核大小是3,stride=2, 所以输出尺寸:(1000−1)×2+3=2001


二、池化层—Pooling Layer

池化运算:对信号进行“收集”并“总结”, 类似水池收集水资源, 因而叫作池化层。

“收集”:多变少

“总结”:最大值 or 平均值

如图用2×2的窗口进行池化操作,最大池化用最大值代替这个窗口,平均池化用平均值代替这个窗口。


(1)nn.MaxPool2d

功能:对二维信号(图像)进行最大值池化

主要参数:

  • kernel_size:卷积核尺寸
  • stride:步长
  • padding:填充个数
  • dilation:池化间隔大小
  • ceil_mode:尺寸向上取整,默认为False
  • return_indices:记录池化像素索引

注意stride一般设置的与窗口大小一致,以避免重叠

具体代码如下:

数据预处理:

set_seed(1)  # 设置随机种子
# ================================= load img ==================================
path_img = os.path.join(os.path.dirname(os.path.abspath(__file__)), "pig.jpeg")
img = Image.open(path_img).convert('RGB')  # 0~255
# convert to tensor
img_transform = transforms.Compose([transforms.ToTensor()])
img_tensor = img_transform(img)
img_tensor.unsqueeze_(dim=0)    # C*H*W to B*C*H*W

最大池化代码:

# ================ maxpool
 flag = 1
#flag = 0
if flag:
    maxpool_layer = nn.MaxPool2d((2, 2), stride=(2, 2))   # input:(i, o, size) weights:(o, i , h, w)
    img_pool = maxpool_layer(img_tensor)

我们来看一下最大池化的效果:

输出尺寸变化:

我们可以发现,图像基本上没什么差别,但是图像的尺寸减少了一半, 所以池化层是可以帮助我们剔除一些冗余像素或减少后面计算量。


(2)nn.AvgPool2d

功能:对二维信号(图像)进行平均值池化

主要参数:

  • kernel_size:卷积核尺寸
  • stride:步长
  • padding:填充个数
  • dilation:池化间隔大小
  • count_include_pad :填充值用于计算
  • divisor_override:除法因子(自定义分母)

平均池化代码:

# ================ avgpool
flag = 1
#flag = 0
if flag:
    avgpoollayer = nn.AvgPool2d((2, 2), stride=(2, 2))   # input:(i, o, size) weights:(o, i , h, w)
    img_pool = avgpoollayer(img_tensor)

我们来看一下平均池化的效果:

输出尺寸变化:

最大值池化和平均池化的差别:最大池化的亮度会稍微亮一些,毕竟它都是取的最大值,而平均池化是取平均值。


(3)nn.MaxUnpool2d

功能:对二维信号(图像)进行最大值池化上采样(反池化:将大尺寸图像变为小尺寸图像)

主要参数

  • kernel_size:卷积核尺寸
  • stride:步长
  • padding:填充个数

这里的参数与池化层是类似的。唯一的不同就是前向传播的时候我们需要传进一个indices, 我们的索引值,要不然不知道把输入的元素放在输出的哪个位置上。

 反池化代码:

# ================ max unpool
flag = 1
#flag = 0
if flag:
    # pooling
    img_tensor = torch.randint(high=5, size=(1, 1, 4, 4), dtype=torch.float)
    #最大值池化保留索引    
    maxpool_layer = nn.MaxPool2d((2, 2), stride=(2, 2), return_indices=True)
    img_pool, indices = maxpool_layer(img_tensor)
    # unpooling
    img_reconstruct = torch.randn_like(img_pool, dtype=torch.float)
    #反池化操作
    maxunpool_layer = nn.MaxUnpool2d((2, 2), stride=(2, 2))
    img_unpool = maxunpool_layer(img_reconstruct, indices)
    print("raw_img:\n{}\nimg_pool:\n{}".format(img_tensor, img_pool))
    print("img_reconstruct:\n{}\nimg_unpool:\n{}".format(img_reconstruct, img_unpool))

输出结果:


三、线性层—Linear Layer

线性层又称为全连接层,其每个神经元与上一层所有神经元相连实现对前一层的线性组合,线性变换。

nn.Linear

功能:对一维信号(向量)进行线性组合

主要参数

  • in_features:输入结点数
  • out_features:输出结点数
  • bias:是否需要偏置

计算公式:y = 𝒙𝑾𝑻 + 𝒃𝒊𝒂𝒔

具体代码如下:

# ================ linear
flag = 1
# flag = 0
if flag:
    inputs = torch.tensor([[1., 2, 3]])
    linear_layer = nn.Linear(3, 4)
    linear_layer.weight.data = torch.tensor([[1., 1., 1.],
                                             [2., 2., 2.],
                                             [3., 3., 3.],
                                             [4., 4., 4.]])
    #设置偏置
    linear_layer.bias.data.fill_(0)
    output = linear_layer(inputs)
    print(inputs, inputs.shape)
    print(linear_layer.weight.data, linear_layer.weight.data.shape)
    print(output, output.shape)

运行结果:

偏置为0:

偏置为0.5:


四、激活函数层—Activate Layer

激活函数对特征进行非线性变换,赋予多层神经网络具有深度的意义

(1)nn.Sigmoid

代码:

m = nn.Sigmoid()
input = torch.randn(2)
output = m(input)

 (2)nn.tanh

代码:

m = nn.Tanh()
input = torch.randn(2)
output = m(input)

(3)nn.ReLU

代码:

  >>> m = nn.ReLU()
  >>> input = torch.randn(2)
  >>> output = m(input)

(4)nn.LeakyReLU

  • negative_slope:负半轴斜率

代码:

m = nn.LeakyReLU(0.1)
input = torch.randn(2)
output = m(input)

(5)nn.PReLU

  • init:可学习斜率

代码:

m = nn.PReLU(3)
output = m(input)
print(output)

(6)nn.RReLU

  • lower:均匀分布下限
  • upper:均匀分布上限

代码:

>>> m = nn.RReLU(0.1, 0.3)
>>> input = torch.randn(2)
>>> output = m(input)

本文参考:

系统学习Pytorch笔记五:nn的网络层介绍(卷积层,池化层,激活函数,全连接层等)

[PyTorch 学习笔记] 3.3 池化层、线性层和激活函数层 - 知乎 (zhihu.com)

相关文章
|
6月前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
186 1
|
6月前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
296 0
|
10月前
|
机器学习/深度学习 PyTorch 算法框架/工具
基于Pytorch 在昇腾上实现GCN图神经网络
本文详细讲解了如何在昇腾平台上使用PyTorch实现图神经网络(GCN)对Cora数据集进行分类训练。内容涵盖GCN背景、模型特点、网络架构剖析及实战分析。GCN通过聚合邻居节点信息实现“卷积”操作,适用于非欧氏结构数据。文章以两层GCN模型为例,结合Cora数据集(2708篇科学出版物,1433个特征,7种类别),展示了从数据加载到模型训练的完整流程。实验在NPU上运行,设置200个epoch,最终测试准确率达0.8040,内存占用约167M。
基于Pytorch 在昇腾上实现GCN图神经网络
|
10月前
|
机器学习/深度学习 算法 PyTorch
Perforated Backpropagation:神经网络优化的创新技术及PyTorch使用指南
深度学习近年来在多个领域取得了显著进展,但其核心组件——人工神经元和反向传播算法自提出以来鲜有根本性突破。穿孔反向传播(Perforated Backpropagation)技术通过引入“树突”机制,模仿生物神经元的计算能力,实现了对传统神经元的增强。该技术利用基于协方差的损失函数训练树突节点,使其能够识别神经元分类中的异常模式,从而提升整体网络性能。实验表明,该方法不仅可提高模型精度(如BERT模型准确率提升3%-17%),还能实现高效模型压缩(参数减少44%而无性能损失)。这一革新为深度学习的基础构建模块带来了新的可能性,尤其适用于边缘设备和大规模模型优化场景。
432 16
Perforated Backpropagation:神经网络优化的创新技术及PyTorch使用指南
|
10月前
|
机器学习/深度学习 搜索推荐 PyTorch
基于昇腾用PyTorch实现CTR模型DIN(Deep interest Netwok)网络
本文详细讲解了如何在昇腾平台上使用PyTorch训练推荐系统中的经典模型DIN(Deep Interest Network)。主要内容包括:DIN网络的创新点与架构剖析、Activation Unit和Attention模块的实现、Amazon-book数据集的介绍与预处理、模型训练过程定义及性能评估。通过实战演示,利用Amazon-book数据集训练DIN模型,最终评估其点击率预测性能。文中还提供了代码示例,帮助读者更好地理解每个步骤的实现细节。
|
10月前
|
机器学习/深度学习 自然语言处理 PyTorch
基于Pytorch Gemotric在昇腾上实现GAT图神经网络
本实验基于昇腾平台,使用PyTorch实现图神经网络GAT(Graph Attention Networks)在Pubmed数据集上的分类任务。内容涵盖GAT网络的创新点分析、图注意力机制原理、多头注意力机制详解以及模型代码实战。实验通过两层GAT网络对Pubmed数据集进行训练,验证模型性能,并展示NPU上的内存使用情况。最终,模型在测试集上达到约36.60%的准确率。
|
10月前
|
算法 PyTorch 算法框架/工具
PyTorch 实现FCN网络用于图像语义分割
本文详细讲解了在昇腾平台上使用PyTorch实现FCN(Fully Convolutional Networks)网络在VOC2012数据集上的训练过程。内容涵盖FCN的创新点分析、网络架构解析、代码实现以及端到端训练流程。重点包括全卷积结构替换全连接层、多尺度特征融合、跳跃连接和反卷积操作等技术细节。通过定义VOCSegDataset类处理数据集,构建FCN8s模型并完成训练与测试。实验结果展示了模型在图像分割任务中的应用效果,同时提供了内存使用优化的参考。
|
10月前
|
机器学习/深度学习 算法 PyTorch
基于Pytorch Gemotric在昇腾上实现GraphSage图神经网络
本实验基于PyTorch Geometric,在昇腾平台上实现GraphSAGE图神经网络,使用CiteSeer数据集进行分类训练。内容涵盖GraphSAGE的创新点、算法原理、网络架构及实战分析。GraphSAGE通过采样和聚合节点邻居特征,支持归纳式学习,适用于未见节点的表征生成。实验包括模型搭建、训练与验证,并在NPU上运行,最终测试准确率达0.665。
|
计算机视觉
RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
301 5
RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
|
计算机视觉
YOLOv11改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
YOLOv11改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
483 0

推荐镜像

更多