一、环境简介
PyTorch是由Facebook人工智能研究小组开发的一种基于Lua编写的Torch库的Python实现的深度学习库,目前被广泛应用于学术界和工业界,而随着Caffe2项目并入Pytorch, Pytorch开始影响到TensorFlow在深度学习应用框架领域的地位。
二、miniconda下pytorch相关环境配置
1.pytorch安装
直接参考课件即可,离线安装较好。.condarc配置
channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud ssl_verify: true
2.jupyter-lab安装
pip install jupyterlab
3.启用
pip install ipykernel python -m ipykernel install --user --name pytorch # pytorch 为需要安装jupyter-lab虚拟环境的名称
执行上述命令后,即可安装kernel,在jupyter页面可以选择你需要的kernel。
4.启动
jupyter-lab
5.win下默认环境设置
原先参考: 如何修改 Conda 默认启动的 Python 环境 | MakeOptim 工具 - 如何修改 Conda 默认启动的 Python 环境 | MakeOptim https://makeoptim.com/tool/conda-default-python-env ,结果发现这个什么都好,win下的配置是错误的。
正确的做法是修改文档下 WindowsPowerShell 的 profile.ps1
例如我的路径: D:\我的资料库\Documents\WindowsPowerShell\profile.ps1
#region conda initialize # !! Contents within this block are managed by 'conda init' !! (& "C:\miniconda3\Scripts\conda.exe" "shell.powershell" "hook" ) | Out-String | Invoke-Expression #endregion conda activate pytorch
在最末尾添加activate命令即可。
三、PyTorch基础知识
1.张量
几何代数中定义的张量是基于向量和矩阵的推广,比如我们可以将标量视为零阶张量,矢量可以视为一阶张量,矩阵就是二阶张量。
2.操作
2.1 加法
import torch # 方式1 y = torch.rand(4, 3) print(x + y) # 方式2 print(torch.add(x, y)) # 方式3 in-place,原值修改 y.add_(x) print(y)
切记 add_ 有下划线,去掉效果不同。。。。。。
2.2 索引
- 索引出来的结果与原数据共享内存,修改一个,另一个会跟着修改。如果不想修改,可以考虑使用copy()等方法
torch.view()
返回的新tensor
与源tensor
共享内存(其实是同一个tensor
),更改其中的一个,另外一个也会跟着改变。(顾名思义,view()仅仅是改变了对这个张量的观察角度)- 为为了使创建的张量和原始张量不共享内存,我们需要使用第二种方法
torch.reshape()
, 同样可以改变张量的形状,但是此函数并不能保证返回的是其拷贝值,所以官方不推荐使用。推荐的方法是我们先用clone()
创造一个张量副本然后再使用torch.view()
进行函数维度变换 。 - . 取值操作 如果我们有一个元素
tensor
,我们可以使用.item()
来获得这个value
,而不获得其他性质。
2.3 广播机制
- 当对两个形状不同的 Tensor 按元素运算时,可能会触发广播(broadcasting)机制:先适当复制元素使这两个 Tensor 形状相同后再按元素运算。
3.自动求导
3.1 Autograd简介
- PyTorch 中,所有神经网络的核心是
autograd
包。autograd包为张量上的所有操作提供了自动求导机制。它是一个在运行时定义 ( define-by-run )的框架,这意味着反向传播是根据代码如何运行来决定的,并且每次迭代可以是不同的。 torch.Tensor
是这个包的核心类。如果设置它的属性.requires_grad
为True
,那么它将会追踪对于该张量的所有操作。当完成计算后可以通过调用.backward()
,来自动计算所有的梯度。这个张量的所有梯度将会自动累加到.grad
属性。- 在 y.backward() 时,如果 y 是标量,则不需要为 backward() 传入任何参数;否则,需要传入一个与 y 同形的Tensor。
- 要阻止一个张量被跟踪历史,可以调用
.detach()
方法将其与计算历史分离,并阻止它未来的计算记录被跟踪。为了防止跟踪历史记录(和使用内存),可以将代码块包装在with torch.no_grad():
中。在评估模型时特别有用,因为模型可能具有requires_grad = True
的可训练的参数,但是我们不需要在此过程中对他们进行梯度计算。 - Tensor
和
Function互相连接生成了一个无环图 (acyclic graph),它编码了完整的计算历史。每个张量都有一个
.grad_fn属性,该属性引用了创建
Tensor自身的
Function。
3.2 梯度
现在开始进行反向传播,因为out
是一个标量,因此out.backward()
和out.backward(torch.tensor(1.))
等价。