以下内容为本人学习《动手学深度学习》的学习笔记,教材网址为https://zh-v2.d2l.ai/index.html
2.0 基本概念
机器学习是人工智能的一个分支,而深度学习是机器学习的一个子集。
n维数组,也称为张量,张量类在深度学习框架中,能利用GPU进行加速计算,并且,张量类支持自动微分,更适合深度学习。
张量表示一个由数值组成的数组,这个数组可能有多个维度。
数学上的向量(vector)对应一维张量,矩阵(matrix)对应二维张量;具有两个轴以上的张量没有特殊的数学名称
张量中的每个值都称为张量的元素(element)
2.1运算符
2.1.1 按元素操作
对于任意具有相同形状的张量, 常见的标准算术运算符(+、-、*、/和**)都可以被升级为按元素运算。
torch.cat((x,y),dim=0)沿轴连结张量
逻辑运算符==
对张量中所有元素进行求和x.sum()
2.1.2 广播机制
通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;
对生成的数组执行按元素操作。
2.1.3 索引与切片
清楚x[-1],x[1,2],x[1:2,:],x[1:],x[-3:]的具体意义
其中-1代表倒数第一
2.1.4 节省内存
我们用Python的id()函数演示了这一点, 它给我们提供了内存中引用对象的确切地址。
原地更新十分必要:
首先,我们不想总是不必要地分配内存。在机器学习中,我们可能有数百兆的参数,并且在一秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新;
如果我们不原地更新,其他引用仍然会指向旧的内存位置,这样我们的某些代码可能会无意中引用旧的参数。
如果在后续计算中没有重复使用X, 我们也可以使用X[:] = X + Y或X += Y来减少操作的内存开销。
2.1.5 转换为其他python对象
将深度学习框架定义的张量转换为NumPy张量(ndarray)很容易,反之也同样容易。 torch张量和numpy数组将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。
关于共享内存的回答
感谢你的回答,我再次总结了一下。看下面的代码
X = torch.tensor([1.0, 2, 4, 8])
print(id(X))
A = X.numpy()
print(id(A))
X.add_(1), A
输出
140487850431104 140487850554928
(tensor([2., 3., 5., 9.]), array([2., 3., 5., 9.], dtype=float32))
虽然,X和A的地址不一样,但共享内存更新X会改变A。而要把一个numpy转为tensor
a = numpy.ones(5),
方法一 b = torch.tensor(a) 相当于创建一个新tensor,不会共享内存
方法二 b = torch.from_numpy(a) 相当于从获取numpy中的值,会共享内存
故.numpy和from_numpy会共享内存,torch.tensor不会共享内存
要将大小为1的张量转换为Python标量,我们可以调用item函数或Python的内置函数。
a = torch.tensor([3.5])
a, a.item(), float(a), int(a)
2.x 代码指令汇总(此后均基于pytorch)
1.可以使用 arange 创建一个行向量 x。这个行向量包含以0开始的前12个整数,它们默认创建为整数。也可指定创建类型为浮点数。除非额外指定,新的张量将存储在内存中,并采用基于CPU的计算。
x = torch.arange(12)
可以通过张量的shape属性来访问张量(沿每个轴的长度)的形状 。
x.shape
如果只想知道张量中元素的总数,即形状的所有元素乘积,可以检查它的大小(size)
x.numel()
要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数。通过改变张量的形状,张量的大小不会改变。
X = x.reshape(3, 4)
我们不需要通过手动指定每个维度来改变形状。 我们可以通过-1来调用此自动计算出维度的功能。 即我们可以用x.reshape(-1,4)或x.reshape(3,-1)来取代x.reshape(3,4)。
我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为0
torch.zeros((2, 3, 4))
同样,我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为1
torch.ones((2, 3, 4))
有时我们想通过从某个特定的概率分布中随机采样来得到张量中每个元素的值。 例如,当我们构造数组来作为神经网络中的参数时,我们通常会随机初始化参数的值。
创建一个形状为(3,4)的张量。 其中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。
torch.randn(3, 4)
通过提供包含数值的Python列表(或嵌套列表),来直接为所需张量中的每个元素赋予确定值。 在这里,最外层的列表对应于轴0,内层的列表对应于轴1。
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])