[深度学习实战]基于PyTorch的深度学习实战(中)[线性回归、numpy矩阵的保存、模型的保存和导入、卷积层、池化层](二)

简介: 笔记

5.2 Conv1d

  conv1d 是一维卷积,它和 conv2d 的区别在于只对宽度进行卷积,对高度不卷积。


5.2.1 函数定义

torch.nn.functional.conv1d(input, weight, bias=None, stride=1, padding=0, dilation=

5.2.2 参数说明

 input:输入的Tensor数据,格式为 (batch,channels,W),三维数组,第一维度是样本数量,第二维度是通道数或者记录数,三维度是宽度。

 weight:卷积核权重,也就是卷积核本身。是一个三维数组,(out_channels, in_channels/groups, kW)。 out_channels 是卷积核输出层的神经元个数,也就是这层有多少个卷积核;in_channels 是输入通道数;kW 是卷积核的宽度。

 bias:位移参数,可选项,一般也不用管。

 stride:滑动窗口,默认为 1,指每次卷积对原数据滑动 1 个单元格。

 padding:是否对输入数据填充 0。Padding 可以将输入数据的区域改造成是卷积核大小的整数倍,这样对不满足卷积核大小的部分数据就不会忽略了。通过 padding 参数指定填充区域的高度和宽度,默认 0(就是填充区域为0,不填充的意思)。

 ilation:卷积核之间的空格,默认 1。

 groups:将输入数据分组,通常不用管这个参数,没有太大意义。


5.2.3 测试代码

import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
print("conv1d sample")
a=range(16)
x = Variable(torch.Tensor(a))
x=x.view(1,1,16)
print("x variable:", x)
b=torch.ones(3)
b[0]=0.1
b[1]=0.2
b[2]=0.3
weights = Variable(b)
weights=weights.view(1,1,3)
print ("weights:",weights)
y=F.conv1d(x, weights, padding=0)
print ("y:",y)


5.2.4 最终结果

10.png

 我们看看它是怎么计算的:

 (1)原始数据大小是 0-15 的一共 16 个数字,卷积核宽度是 3,向量是 [0.1,0.2,0.3]。

 我们看第一个卷积是对 x[0:3] 共 3 个值 [0,1,2] 进行卷积,公式如下:

0 * 0.1+1 * 0.2+2 * 0.3=0.8

 (2)对第二个目标卷积,是 x[1:4] 共 3 个值 [1,2,3] 进行卷积,公式如下:

1 * 0.1+2 * 0.2+3 * 0.3=1.4

 看到和计算结果完全一致!

11.png

 该图就是conv1d的示意图,和conv2d的区别就是只对宽度卷积,不对高度卷积。最后结果的宽度是原始数据的宽度减去卷积核的宽度再加上

1,这里就是 14。

 所以最终卷积之后的结果一共是 14 个数值,显示如下:

12.png

 我们再看看输入数据有多个通道的情况:


5.2.5 核心代码

print("conv1d sample")
a=range(16)
x = Variable(torch.Tensor(a))
x=x.view(1,2,8)
print("x variable:", x)
b=torch.ones(6)
b[0]=0.1
b[1]=0.2
b[2]=0.3
weights = Variable(b)
weights=weights.view(1,2,3)
print ("weights:",weights)
y=F.conv1d(x, weights, padding=0)
print ("y:",y)

13.png

我们看看返回结果第一个元素 27.8 是怎么计算出来的,这时候卷积核有 2 个通道:

[0.1,0.2,0.3] 和 [1,1,1]

 第 1 个卷积对象也有 2 个通道:[0,1,2] 和 [8,9,10]

 结果是 2 个卷积核分别对应 2 个输入通道进行卷积然后求和。

 卷积核对第 1 个卷积对象的卷积值:(0.1 * 0+0.2 * 1+0.3 * 2)+(1 * 8+1 * 9+1 * 10)=27.8

 第2个卷积对象也有 2 个通道:[1,2,3] 和 [9,10,11]

 卷积核对第 2 个卷积对象的卷积值:(0.1 * 1+0.2 * 2+0.3 * 3)+(1 * 9+1 * 10+1 * 11)=31.4,和 pytorch 计算结果相同。


六、池化层


 池化层比较容易理解,就是将多个元素用一个统计值来表示。

 那为什么要池化呢?

 比如对于一个图像来说,单个的像素其实不代表什么含义。统计值可以取最大值,也可以取平均值,用不同的池化函数来表示。


6.1 max_pool2d

 对于二维最大值池化来说,用 torch.nn.functional. F.max_pool2d 方法来操作。

 比如:


import torch.nn.functional as F
from torch.autograd import Variable
print("conv2d sample")
a=range(20)
x = Variable(torch.Tensor(a))
x=x.view(1,1,4,5)
print("x variable:", x)
y=F.max_pool2d(x, kernel_size=2,stride=2)
print ("y:",y)


 最后显示结果如下图:

14.png

 x 是 4*5 的矩阵,表示高度 4,宽度 5,一个样本,每个样本一个通道。

 x=x.view(1,1,4,5) 意思是将 x 矩阵转换成 (1,1,4,5) 的四维矩阵,第一个 1 是样本数,第二个 1 是通道数,第三个 4 和第四个 5 是高度和宽度。

 b=F.max_pool2d(x, kernel_size=2,stride=2) 中的参数 2 表示池化的核大小是 2,也就是 (2,2),表示核是一个行 2 列 2 的矩阵,每两行两列池化成一个数据。比如:

 [[1,2],

 [3,4]]

 会被池化成最大的数,就是 4。

 stride=2 表示滑动窗口为 2,第一个池化对象之后相隔 2 个元素距离,如果剩下的不够池化核的尺寸,则忽略掉不作池化处理。

 第 1 个池化目标是 [[0,1],[5,6]],因此最大池化结果是 6;第 2 个池化目标是 [[2,3],[7,8]],因此最大池化结果是 8。

 max_pool2d 方法的说明如下:

torch.nn.functional.max_pool2d(input, kernel_size, stride=None, padding=0, dilation=1

 那么具体的各个参数的含义说明如下:

 input:输入的 Tensor 数据,格式为 (channels,H,W),三维数组,第一维度是通道数或者记录数,二、三维度是高度和宽度。

 kernel_size:池化区的大小,指定宽度和高度 (kh x kw),如果只有一个值则表示宽度和高度相同。

 stride:滑动窗口,默认和 kernel_size 相同值,这样在池化的时候就不会重叠。如果设置的比 kernel_size 小,则池化时会重叠。它也是高度和宽度两个值。

 padding:是否对输入在左前端填充 0。池化时,如果剩余的区域不够池化区大小,则会丢弃掉。 Padding 可以将输入数据的区域改造成是池化核的整数倍,这样就不会丢弃掉原始数据了。Padding 也是指定填充区域的高度和宽度,默认 0(就是填充区域为 0,不填充的意思)。

 ceil_mode:在计算输出 shape 大小时按照 ceil 还有 floor 计算,是数序函数(如ceil(4.5)=5;floor(4.5)=4)。

 count_include_pad:为 True 时,在求平均时会包含 0 填充区域的大小。这个参数只有在 avg_pool2d 并且 padding 参数不为 0 时才有意义。


6.2 avg_pool2d

 那么同样的,avg_pool2d 和 max_pool2d 的计算原理是一样的!只不过avg_pool2d 取的是平均值,而不是最大值而已。这里就不重复说明计算过程了。


6.3 max_pool1d

 max_pool1d 和 max_pool2d 的区别和卷积操作类似,也是只对宽度进行池化。

 先看看示例代码:


print("conv1d sample")
a=range(16)
x = Variable(torch.Tensor(a))
x=x.view(1,1,16)
print("x variable:", x)
y=F.max_pool1d(x, kernel_size=2,stride=2)
print ("y:",y)


 输出结果:

15.png

 max_pool1d 方法对输入参数的最后一个维度进行最大池化。

 第一个池化目标 [0,1],池化输出 1;

 第二个池化目标 [2,3],池化输出 3;

 ……

 最后结果就是这样计算得来的。

 同样,我们仿照卷积操作再看看多通道的池化示例。代码:


print("conv1d sample")
a=range(16)
x = Variable(torch.Tensor(a))
x=x.view(1,2,8)
print("x variable:", x)
y=F.max_pool1d(x, kernel_size=2,stride=2)
print ("y:",y)


 输出结果:

16.png

 可以看到通道数保持不变。


七、后记


 好的,恭喜你看完了本文的全部内容!其余的知识点,会在基于PyTorch的深度学习实战的下篇和补充篇分享,会在下周放出!如果有兴趣跟着我学习的话,请在这周复习回顾并尽量手敲代码来体验并加深理解。下周见!

相关文章
|
6月前
|
机器学习/深度学习 自然语言处理 算法
PyTorch PINN实战:用深度学习求解微分方程
物理信息神经网络(PINN)是一种将深度学习与物理定律结合的创新方法,特别适用于微分方程求解。传统神经网络依赖大规模标记数据,而PINN通过将微分方程约束嵌入损失函数,显著提高数据效率。它能在流体动力学、量子力学等领域实现高效建模,弥补了传统数值方法在高维复杂问题上的不足。尽管计算成本较高且对超参数敏感,PINN仍展现出强大的泛化能力和鲁棒性,为科学计算提供了新路径。文章详细介绍了PINN的工作原理、技术优势及局限性,并通过Python代码演示了其在微分方程求解中的应用,验证了其与解析解的高度一致性。
720 5
PyTorch PINN实战:用深度学习求解微分方程
|
机器学习/深度学习 数据采集 人工智能
《零基础实践深度学习》基于线性回归实现波士顿房价预测任务1.3.3
这篇文章详细介绍了如何使用线性回归算法实现波士顿房价预测任务,包括数据读取、形状变换、集划分、归一化处理、模型设计、前向计算以及损失函数的计算等步骤,并提供了相应的Python代码实现。
 《零基础实践深度学习》基于线性回归实现波士顿房价预测任务1.3.3
|
10月前
|
机器学习/深度学习 人工智能 TensorFlow
基于TensorFlow的深度学习模型训练与优化实战
基于TensorFlow的深度学习模型训练与优化实战
422 3
|
11月前
|
机器学习/深度学习 PyTorch 算法框架/工具
揭秘深度学习中的微调难题:如何运用弹性权重巩固(EWC)策略巧妙应对灾难性遗忘,附带实战代码详解助你轻松掌握技巧
【10月更文挑战第1天】深度学习中,模型微调虽能提升性能,但常导致“灾难性遗忘”,即模型在新任务上训练后遗忘旧知识。本文介绍弹性权重巩固(EWC)方法,通过在损失函数中加入正则项来惩罚对重要参数的更改,从而缓解此问题。提供了一个基于PyTorch的实现示例,展示如何在训练过程中引入EWC损失,适用于终身学习和在线学习等场景。
879 4
揭秘深度学习中的微调难题:如何运用弹性权重巩固(EWC)策略巧妙应对灾难性遗忘,附带实战代码详解助你轻松掌握技巧
|
12月前
|
机器学习/深度学习 算法 数据可视化
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
特征工程是机器学习流程中的关键步骤,通过将原始数据转换为更具意义的特征,增强模型对数据关系的理解能力。本文重点介绍处理数值变量的高级特征工程技术,包括归一化、多项式特征、FunctionTransformer、KBinsDiscretizer、对数变换、PowerTransformer、QuantileTransformer和PCA,旨在提升模型性能。这些技术能够揭示数据中的潜在模式、优化变量表示,并应对数据分布和内在特性带来的挑战,从而提高模型的稳健性和泛化能力。每种技术都有其独特优势,适用于不同类型的数据和问题。通过实验和验证选择最适合的变换方法至关重要。
328 6
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
|
11月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
372 2
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
深入浅出深度学习:从基础到实战
【9月更文挑战第19天】本文将带你走进深度学习的世界,从基础概念入手,逐步深入到实战应用。我们将通过简单易懂的语言和生动的比喻,让你轻松理解深度学习的原理和应用场景。同时,我们还为你准备了一些实用的代码示例,帮助你快速入门深度学习,开启你的AI之旅。
149 10
|
11月前
|
机器学习/深度学习 Python
深度学习笔记(六):如何运用梯度下降法来解决线性回归问题
这篇文章介绍了如何使用梯度下降法解决线性回归问题,包括梯度下降法的原理、线性回归的基本概念和具体的Python代码实现。
550 0
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习:从基础到实战
【9月更文挑战第23天】本文将带你走进深度学习的世界,从基本概念到实际应用,一步步揭示深度学习的神秘面纱。我们将通过实例和代码示例,帮助你理解和掌握深度学习的核心技术和方法。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的参考和启示。让我们一起探索深度学习的奥秘吧!
105 0
|
12月前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
193 0

热门文章

最新文章

推荐镜像

更多