//本文为学习笔记,思路与部分代码均参考自课程文件
第一部分:搭建jupyter
1.给base安装上nb_conda
(base)conda install nb_conda
2.在对应的环境中安装ipykernel
(Jimsum) conda install ipykernel
3.在环境中
(jimsum)python -m ipykernel install --name jimsum
4.保持激活环境,打开jupyter,选择对应的jupyter文件打开
第二部分:张量
张量是最基本的数据容器
0维张量/标量 标量是一个数字
1维张量/向量 1维张量称为“向量”。
2维张量 2维张量称为矩阵
3维张量 公用数据存储在张量 时间序列数据 股价 文本数据 彩色图片(RGB
2.1 tensor新建
方法1:构建随机矩阵
x = torch.rand(4, 3)
print(x)
方法2:添加默认类型
x = torch.zeros(4, 3, dtype=torch.long)
print(x) #定义一个4*3的全0矩阵,且默认数据类型为long
方法3:直接使用数据
x = torch.tensor([5.5, 3]) #直接使用数据构造
print(x)
4.获取维度
print(x.size())
print(x.shape)
5.常见新建tensor工具
2.1 tensor操作
data:具体数值
dtype:默认数据结构
device:指定计算机构(GPU等)
require_grad:是否允许求导
pin_memory:
1.加法
# 加法运算 也可以:print(torch.add(x, y))
o = torch.add(k,l)
print(o)
2.索引(索引出来的跟源矩阵同源,有一个改变另一个也随即改变)
# tensor的索引方式与numpy类似
print(o[:,1])
print(o[0,:])
3.改变tensor的形状 torch.view:
print(o.view((3,2)))
print(o.view(-1,2)) #-1表达的是这一边的维数由矩阵元素决定,若矩阵有6位,那如上两行一样
4.广播机制:当对两个形状不同的 Tensor 按元素运算时,可能会触发广播(broadcasting)机制:先适当复制元素使这两个 Tensor 形状相同后再按元素运算。
# tensor的广播机制(使用时要注意这个特性)
p = torch.arange(1, 3).view(1, 2)
print(p)
q = torch.arange(1, 4).view(3, 1)
print(q)
print(p + q)
#p、q形状不一样,当让他们两个相加的时候,会适当复制到一样再相加
tensor([[1, 2]]) tensor([[1], [2], [3]]) tensor([[2, 3], [3, 4], [4, 5]])
5.扩展与压缩tensor的维度
压缩:(unsqueeze)
# 扩展&压缩tensor的维度:squeeze
print(o)
r = o.unsqueeze(1)
print(r)
print(r.shape)
tensor([[1.2256, 1.2177, 1.5296], [1.1153, 1.4385, 1.3054]]) tensor([[[1.2256, 1.2177, 1.5296]], [[1.1153, 1.4385, 1.3054]]]) torch.Size([2, 1, 3])
扩展:(squeeze)
t = r.squeeze(1)#前方有压缩到一维
print(t)
print(t.shape)
tensor([[1.2256, 1.2177, 1.5296], [1.1153, 1.4385, 1.3054]]) torch.Size([2, 3])
2.2自动求导机制
1.requires_grad
为 True
,那么它将会追踪对于该张量的所有操作。当完成计算后可以通过调用.backward()
,来自动计算所有的梯度。这个张量的所有梯度将会自动累加到.grad
属性。
x1 = torch.tensor(1.0, requires_grad=True)
x2 = torch.tensor(2.0, requires_grad=True)
#在新建tensor的时候要先申明require_grad=True,表示需要求导
#可以首先查看每个变量是否需要求导
print(x1.requires_grad)
2.正向传播
## 反向传播后才能求导数大小
y = x1 + 2*x2 ##正向传播
y.backward() ##反向传播
print(x1.grad.data) ##求导数
print(x2.grad.data) ##求导数
#导数会累积
3.利用.detach()停止累计
2.3并行计算简介
在编写程序中,当我们使用了 cuda()
时,其功能是让我们的模型或者数据迁移到GPU当中,通过GPU开始计算。
并行计算的方法:
1.模型拆分
就是将模型拆拆分,并分别到各个gpu计算
2.任务层内拆分
3.数据拆分(主流)