d2l自学笔记 – 2.预备知识

(。_ 。) ✎_假期FLAG:入门深度学习!

自学教材为《动手学深度学习》一书:

《动手学深度学习》 — 动手学深度学习 2.0.0-beta0 documentation (d2l.ai)

其实想学深度学习好久了,但都苦于没有大块时间去学习。刚刚过去的一学期里在不同教程里反复横跳,却都没挺过第二章… 大概光看看书不太行,容易忘。看来还是得做做笔记的。有输入,有输出,谨遵费曼先生的教诲。

下面是第二章的笔记,但愿这个系列不要在这章完结吧。

numpy与pytorch内存存储方式

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不会共享内存

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone()  # 通过分配新内存,将A的一个副本分配给B
A, A + B

非降维求和

有时在调用函数来计算总和或均值时保持轴数不变会很有用。

sum_A = A.sum(axis=1, keepdims=True)
sum_A

tensor([[ 6.],
        [22.],
        [38.],
        [54.],
        [70.]])

例如,由于sum_A在对每行进行求和后仍保持两个轴,我们可以通过广播将A除以sum_A。

A / sum_A

tensor([[0.0000, 0.1667, 0.3333, 0.5000],
        [0.1818, 0.2273, 0.2727, 0.3182],
        [0.2105, 0.2368, 0.2632, 0.2895],
        [0.2222, 0.2407, 0.2593, 0.2778],
        [0.2286, 0.2429, 0.2571, 0.2714]])

如果我们想沿某个轴计算A元素的累积总和, 比如axis=0(按行计算),我们可以调用cumsum函数。 此函数不会沿任何轴降低输入张量的维度。

A.cumsum(axis=0)

tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  6.,  8., 10.],
        [12., 15., 18., 21.],
        [24., 28., 32., 36.],
        [40., 45., 50., 55.]])

乘法

点积 torch.dot(x,y)
矩阵-向量积 torch.mv(A,x)
矩阵-矩阵乘法 torch.mm(A,B)

发表评论

%d 博主赞过: