同学你好!本文章于2021年末编写,已与实际存在较大的偏差!
故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现,
Pytorch深度学习·理论篇(2023版)目录地址为:
CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录
本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲解与分析,通过将深度学习知识与Pytorch的高效结合,帮助各位新入门的读者理解深度学习各个模板之间的关系,这些均是在Pytorch上实现的,可以有效的结合当前各位研究生的研究方向,设计人工智能的各个领域,是经过一年时间打磨的精品专栏!
https://v9999.blog.csdn.net/article/details/127587345
欢迎大家订阅(2023版)理论篇
以下为2021版原文~~~~
1.基本概念
2.线性代数的实现
2.1标量
标量由只有一个元素的张量表示。
import torch x = torch.tensor([3.0]) y = torch.tensor([2.0]) x + y, x * y, x / y, x**y
(tensor([5.]), tensor([6.]), tensor([1.5000]), tensor([9.]))
2.2 向量
向量视为标量值组成的列表。我们将这些标量值称为向量的元素分量。
x = torch.arange(4) x
tensor([0, 1, 2, 3])
2.3 长度、维度、形状
与普通的Python数组一样,我们可以通过调用Python的内置len()函数来访问张量的长度。
len(x)
4
x.shape #在这个意义上,张量的某个轴的维数就是这个轴的长度。
torch.Size([4])
2.5 矩阵
#当调用函数来实例化张量时,我们可以通过指定两个分量 m 和 n 来创建一个形状为 m×n 的矩阵。 A = torch.arange(20).reshape(5, 4) A
/
tensor([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19]])
A.T
tensor([[ 0, 4, 8, 12, 16], [ 1, 5, 9, 13, 17], [ 2, 6, 10, 14, 18], [ 3, 7, 11, 15, 19]])
作为方矩阵的一种特殊类型,对称矩阵(symmetric matrix)AA等于其转置:A=A⊤A=A⊤。这里我们定义一个对称矩阵BB:
B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]]) B
tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
现在我们将B与它的转置进行比较。
B == B.T
tensor([[True, True, True], [True, True, True], [True, True, True]])
2.6 张量
就像向量是标量的推广,矩阵是向量的推广一样。张量(本小节中的“张量”指代数对象)为我们提供了描述具有任意数量轴的nn维数组的通用方法。例如,向量是一阶张量,矩阵是二阶张量。
当我们开始处理图像时,张量将变得更加重要,图像以nn维数组形式出现,其中3个轴对应于高度、宽度,以及一个通道(channel)轴,用于堆叠颜色通道(红色、绿色和蓝色)。
X = torch.arange(24).reshape(2, 3, 4) X
tensor([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])
2.7 张量算法的基本性质
标量、向量、矩阵和任意数量轴的张量有一些很好的属性,通常会派上用场。例如,你可能已经从按元素操作的定义中注意到,任何按元素的一元运算都不会改变其操作数的形状。同样,给定具有相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量。例如,将两个相同形状的矩阵相加会在这两个矩阵上执行元素加法。
A = torch.arange(20, dtype=torch.float32).reshape(5, 4) B = A.clone() # 通过分配新内存,将A的一个副本分配给B A, A + B
(tensor([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [12., 13., 14., 15.], [16., 17., 18., 19.]]), tensor([[ 0., 2., 4., 6.], [ 8., 10., 12., 14.], [16., 18., 20., 22.], [24., 26., 28., 30.], [32., 34., 36., 38.]]))
A * B
tensor([[ 0., 1., 4., 9.], [ 16., 25., 36., 49.], [ 64., 81., 100., 121.], [144., 169., 196., 225.], [256., 289., 324., 361.]])
将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。
a = 2 X = torch.arange(24).reshape(2, 3, 4) a + X, (a * X).shape
(tensor([[[ 2, 3, 4, 5], [ 6, 7, 8, 9], [10, 11, 12, 13]], [[14, 15, 16, 17], [18, 19, 20, 21], [22, 23, 24, 25]]]), torch.Size([2, 3, 4]))
2.8 张量算法的基本性质
求和:
x = torch.arange(4, dtype=torch.float32) x, x.sum()
(tensor([0., 1., 2., 3.]), tensor(6.))
默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。
我们还可以指定张量沿哪一个轴来通过求和降低维度。 由于输入矩阵沿0轴降维以生成输出向量,因此输入的轴0的维数在输出形状中丢失。
一个与求和相关的量是平均值(mean或average)。我们通过将总和除以元素总数来计算平均值。在代码中,我们可以调用函数来计算任意形状张量的平均值。
A.mean(), A.sum() / A.numel()
(tensor(9.5000), tensor(9.5000))
计算平均值的函数也可以沿指定轴降低张量的维度。
A.mean(axis=0), A.sum(axis=0) / A.shape[0]
(tensor([ 8., 9., 10., 11.]), tensor([ 8., 9., 10., 11.]))
2.9 非降维求和
2.10 点积
axis=0 形状就是去掉第一个
axis=1 形状就是去掉第二个
axis=2 形状就是去掉第三个
axis=[1,2] 形状就是去掉第二个和第三个
QA
1.稀疏化会导致出现有一百万个列,每个列只有一个数。但是不会影响太多
2.深度学习/机器学习为什么用张量?
深度学习是机器学习的一部分,统计学家认为是计算机对数学统计的理解,所以用张量
3.copy和clone的区别:
深拷贝和浅拷贝
4.对哪一维求和 等同于消除哪一维(正确)
5.torch不区分行列向量吗?
一维张量一定是行向量
列向量是一个矩阵
可以用二位矩阵来表示行列向量。
对于计算机来说都是数组
6.稀疏的时候可以把他当做单词来做词向量,并不是每次都可以,绝大多数可以。
7.关于学习框架的选择:工具和学习应该分开,跟着时代走,跟着潮流走。应该学习怎么样开车,而不是开什么车。不要因为工具限制自己。
8.医疗图像中的 SVS格式和医生勾画的XML格式的文件如何预处理?
两种做法:其一、像素级解决,利用手写文字识别解决。其二、利用nop的形式解决,通过计算机视觉的方式。也可两个配合使用。
9. axis = 0按照行,可以理解为把“行”给抹去只剩1行,也就是上下压扁。
axis = 1按照列,可以理解为把“列”给抹去只剩1列,也就是左右压扁。