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

这篇具有很好参考价值的文章主要介绍了Pytorch学习笔记(5):torch.nn---网络层介绍(卷积层、池化层、线性层、激活函数层)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

目录

 一、卷积层—Convolution Layers

 1.1 1d / 2d / 3d卷积

1.2 卷积—nn.Conv2d()

nn.Conv2d

1.3 转置卷积—nn.ConvTranspose

nn.ConvTranspose2d

 二、池化层—Pooling Layer

(1)nn.MaxPool2d

(2)nn.AvgPool2d

(3)nn.MaxUnpool2d

 三、线性层—Linear Layer

 nn.Linear

 四、激活函数层—Activate Layer

(1)nn.Sigmoid

 (2)nn.tanh

(3)nn.ReLU

(4)nn.LeakyReLU

(5)nn.PReLU

(6)nn.RReLU


前期回顾: 

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

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

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

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


 一、卷积层—Convolution Layers

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

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

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

 1.1 1d / 2d / 3d卷积

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

(1)1d卷积示意 

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

 (2)2d卷积示意 

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

 (3)3d卷积示意

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络


1.2 卷积—nn.Conv2d()

nn.Conv2d

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

主要参数:

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

尺寸计算方式:

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

 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()

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

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

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络


1.3 转置卷积—nn.ConvTranspose

nn.ConvTranspose2d

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

主要参数

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

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

转置卷积代码如下:

# ================ 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)

转置卷积结果: 

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

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


 二、池化层—Pooling Layer

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

“收集”:多变少

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

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络


(1)nn.MaxPool2d

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

主要参数:

  • 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)

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

输出尺寸变化:

 torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

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


(2)nn.AvgPool2d

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

主要参数:

  • 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)

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

 输出尺寸变化:

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

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


(3)nn.MaxUnpool2d

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

主要参数

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

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

  反池化代码:

# ================ 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))

输出结果:

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络


 三、线性层—Linear Layer

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

 nn.Linear

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

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

主要参数

  • 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:

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

 偏置为0.5:

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络


 四、激活函数层—Activate Layer

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

(1)nn.Sigmoid

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

代码:

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

 (2)nn.tanh

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

 代码:

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

(3)nn.ReLU

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

代码: 

  >>> 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:均匀分布上限

torch.nn,Pytorch,pytorch,深度学习,python,人工智能,神经网络

 代码:

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

本文参考:

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

[PyTorch 学习笔记] 3.3 池化层、线性层和激活函数层 - 知乎 (zhihu.com)文章来源地址https://www.toymoban.com/news/detail-807955.html

到了这里,关于Pytorch学习笔记(5):torch.nn---网络层介绍(卷积层、池化层、线性层、激活函数层)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深度学习】神经网络和深度学习--卷积和池化的作用

    深度学习通常指训练大型深度的神经网络的过程。 与传统的神经网络模型相比,深度学习模型在结构上与之非常相似; 不同的是,深度学习模型的“深度”更大,“深度”的体现就是神经网络层数多,神经网络每一层的结点数多。 本章介绍两种深度神经网络——卷积神经网

    2024年02月16日
    浏览(51)
  • 【深度学习】特征图的上采样(nn.Upsample)和转置卷积(nn.ConvTranspose2d) | pytorch

    这次就不废话了,我想赶在10点前回去洗头(现在9.17,还差一篇文章) 该函数有四个参数: 参数的介绍如下: 稍微翻译一下: 参数: 1)size(int或Tuple[int]或Tuple[int,int]或Tupple[int,int,int],可选):输出空间大小 2)scale_factor(float或Tuple[floot]或Tuple[floot,float]或Tuple[floo

    2023年04月08日
    浏览(45)
  • Pytorch平均池化nn.AvgPool2d()使用记录

    【pytorch官方文档】 :https://pytorch.org/docs/stable/generated/torch.nn.AvgPool2d.html?highlight=avgpool2d#torch.nn.AvgPool2d 在由多通道组成的输入特征中进行2D平均池化计算 假设输入特征为S,输出特征为D 情况一 ceil_mode=False, count_include_pad=True(计算时包含零填充) 计算过程: 输出形状= floor[(3 - 3

    2023年04月19日
    浏览(36)
  • 【AI】《动手学-深度学习-PyTorch版》笔记(十七):卷积神经网络入门

    我们在前面学习的多层感知机中,已经认识了全链接层,缺点很明显,在稍微大点的网络模型中,参数成指数级别增长。参数量很快就达到数十亿,这样的量级几乎无法计算。为此科学家们想出一个减少参数的方法:卷积。 从全链接层到卷积的推论,使用如下两个原则: 平

    2024年02月13日
    浏览(61)
  • 【AI】《动手学-深度学习-PyTorch版》笔记(十八):卷积神经网络模型

    发布时间:1989年 模型目的:识别手写数字 1.3.1 相关函数原型 1)nn.Conv2d:卷积层

    2024年02月13日
    浏览(79)
  • 【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)

    卷积神经网络(convolutional neural network, CNN)在提出之初被成功应用于手写字符图像识别,2012年的AlexNet网络在图像分类任务中取得成功,此后,卷积神经网络发展迅速,现在已经被广泛应用于图形、图像、语音识别等领域。 图片的像素数往往非常大,如果用多层全连接网络来

    2024年02月08日
    浏览(43)
  • Pytorch:torch.nn.Module

    torch.nn.Module 是 PyTorch 中神经网络模型的基类,它提供了模型定义、参数管理和其他相关功能。 以下是关于 torch.nn.Module 的详细说明: 1. torch.nn.Module 的定义: torch.nn.Module 是 PyTorch 中所有神经网络模型的基类,它提供了模型定义和许多实用方法。自定义的神经网络模型应该继

    2024年01月16日
    浏览(47)
  • 【Pytorch】torch.nn.LeakyReLU()

    Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~   ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做

    2024年02月02日
    浏览(36)
  • 深度学习基础入门篇[8]::计算机视觉与卷积神经网络、卷积模型CNN综述、池化讲解、CNN参数计算

    计算机视觉作为一门让机器学会如何去“看”的学科,具体的说,就是让机器去识别摄像机拍摄的图片或视频中的物体,检测出物体所在的位置,并对目标物体进行跟踪,从而理解并描述出图片或视频里的场景和故事,以此来模拟人脑视觉系统。因此,计算机视觉也通常被叫

    2024年02月05日
    浏览(82)
  • 【AI】《动手学-深度学习-PyTorch版》笔记(十九):卷积神经网络模型(GoogLeNet、ResNet、DenseNet)

    发布时间:2014年 GoogLeNet的贡献是如何选择合适大小的卷积核,并将不同大小的卷积核组合使用。 之前介绍的网络结构都是串行的,GoogLeNet使用并行的网络块,称为“Inception块” “Inception块”前后进化了四次,论文链接: [1]https://arxiv.org/pdf/1409.4842.pdf [2]https://arxiv.org/pdf/150

    2024年02月12日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包