import torch ?torch.tensor # ? + 想查找到函数即可展示它的定义信息,这是jupyter notebook的特别功能,jupyter利于可视化展示 # 创建tensor,用dtype指定类型,注意类型匹配!!! a = torch.tensor(1.0, dtype = torch.float) # dtype即default type b = torch.tensor(1, dtype = torch.long) c = torch.tensor(1.0, dtype = torch.int8) # 类型不匹配!!! print(a, b, c) # 使用指定类型的函数随机初始化指定大小的tensor d = torch.FloatTensor(2, 3) e = torch.IntTensor(2) f = torch.IntTensor([1, 2, 3, 4]) print(d, 'n', e, 'n', f) # tensor和numpy array之间的互相转换。 # tensor专门为机器学习而设计,可以求导、支持GPU、并行计算等;而numpy array用于科学计算 import numpy as np g = np.array([[1, 2, 3],[4, 5, 6]]) h = torch.tensor(g) print(h) i = torch.from_numpy(g) print(i) j = h.numpy() print(j) # 常见的构造tensor的函数 k = torch.rand(2, 3) l = torch.ones(2, 3) m = torch.zeros(2, 3) n = torch.arange(0, 10, 2) # [0, 10)每隔2取一个数 print(k, 'n', l, 'n', m, 'n', n) # 查看tensor的维度信息(两种方式) print(k.shape) print(k.size()) # tensor的运算 o = torch.add(k, 1) print(o) # tensor的索引和numpy类似 print(o[:, 1]) print(o[1, :]) # 改变tensor形状的神器:view / reshape print(o.view(3, 2)) print(o.view(-1, 3)) # -1表示自动计算该维度 # tensor的广播机制,这里要注意,容易出错!!! p = torch.arange(1, 3).view(1, 2) print(p) q = torch.arange(1, 4).view(3, 1) print(q) print(p + q) # tensor会自动扩维来匹配计算 # 扩展或压缩tensor维度:squeeze。 # 这可以用来匹配维度 print(o) r = o.unsqueeze(1) print(r) print(r.shape) s = r.squeeze(0) # 只能缩维度为1的维度!!! print(s) print(s.shape) s = r.squeeze(1) print(s) print(s.shape) t = torch.arange(0, 20).reshape(4, 5) # view也可以,但是形状必须匹配前面数值的范围 print(t) u = t.sum() print(u) v = torch.sum(t, dim = 1, keepdim = True) # dim = 0是对列求和,保留行;dim = 1是对行求和,保留列;keepdim是保留维度形状 print(v) # 自动求导示例 import torch x1 = torch.tensor(1.0, requires_grad = True) x2 = torch.tensor(2.0, requires_grad = True) y = x1 + 2 * x2 # 首先查看每个变量是否需要求导 print(x1.requires_grad) print(x2.requires_grad) print(y.requires_grad) # 查看每个变量导数大小。此时还未反向传播,因此导数不存在 print(x1.grad.data) print(x2.grad.data) print(y.grad.data) # 反向传播后看导数大小 y = x1 + 2 * x2 y.backward() # 导数是会累积的,如果不清零,每次计算都会加上上次的导数 print(x1.grad.data) print(x2.grad.data) # 尝试不允许求导,会出现什么情况? x1 = torch.tensor(1.0, requires_grad = False) x2 = torch.tensor(2.0, requires_grad = False) y = x1 + 2 * x2 y.backward()



