(。_ 。) ✎_假期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)