PyTorch安装和环境准备
PyTorch下载地址:https://PyTorch.org/
- PyTorch可以同时安装GPU(CUDA)和CPU版本,使用时需要注意,不同版本PyTorch不能安装在同一个Python解释器下,否则会报错。可以尝试一个安装在本地Python解释器下,另一个使用Anaconda Prompt安装在Anaconda环境中。
- 如果发现安装的cuda版本在PyTorch中不存在预构建二进制文件,可以手动先安装低版本,例如电脑安装的是12.2版本cuda,PyTorch可以先安装11.8版本,最后使用PyTorch命令检查按照按照的PyTorch版本和cuda版本。
Anaconda专门环境配置
介绍:数据科学和机器学习软件套装
环境管理功能:使用cnnda包管理器,在管理软件包的同时,可以创建管理不同的Python环境
常用环境管理命令:
| 方法 | conda命令 |
|---|---|
| 创建新环境 | conda create –name 环境名称 |
| 创建指定版本环境 | conda create –name 环境名称 Python = 版本号 |
| 激活环境 | conda activate 环境名称 |
| 退出当前环境 | deactivate |
| 查看所有已创建环境 | conda env list |
| 复制环境 | conda create –name 复制后环境新名 –clone 环境名 |
| 删除环境 | conda env remove –name 环境名 |
| 查看帮助 | conda –help |
| 方法 | conda命令 |
|---|---|
| 安装包 | conda install 包名 |
| 安装指定版本包 | conda install 包名 = 版本号 |
| 更新包 | conda update 包名 |
| 卸载包 | conda remove 包名 |
| 查看已安装包 | conda list |
| 搜索包 | conda search 包名 |
| 清理conda缓存,删除不需要使用的包 | conda clean –all |
| 查看conda版本 | conda –version |
PyTorch
介绍:动态计算图、可自动微分、张量计算、多语言多设备支持的开源Python深度学习框架,基于torch库,底层由C++实现
结构(从上到下):
- PyTorch生态系统(专业库):
- torchvision:用于计算机视觉的数据集和模型
- torchtext:用于自然语言处理的数据集和模型
- torchaudio:用于音频处理的数据集和模型
- PyTorch核心:
- PyTorch API(顶层):开发者直接调用接口
torch: 张量核心计算
torch.nn:构建神经网络
torch.autograd: 自动微分,反向传播 - C++核心(中层):高性能计算,沟通Python代码和底层硬件
ATen: 基础张量和数学运算核心库
JIT: 即时编译优化模型,编译器和解释器的接口
Autograd引擎:自动微分计算引擎,增强ATen库 - 基础层(底层):直接操作硬件,实现高速优化
TN/THNN: C/C++实现的基础张量和神经网络操作库,非常底层
THC/THCUNN: 对应模块的CUDA实现
- PyTorch API(顶层):开发者直接调用接口
- PyTorch运算流程:python代码->Python API接口->C++核心计算->底层CUDA/C库加速计算->返回结果。
张量(Tensor)
定义:数据核心表示形式,类似于NumPy多维数组,数据可存储在CPU/GPU等计算设备
组成:
- 维度(Dimensionality):定义张量的多维数组结构
- 形状(shape):定义张量每个维度的大小
- 数据类型(Dtype):定义张量上每个元素存储所需的内存大小和解释方式,包括整理、浮点型和布尔型。
张量属性/方法工具如下:
| 方法属性 | 说明 |
|---|---|
| .shape/.size() | 获取张量形状 |
| .dtype | 获取张量数据类型 |
| .device | 查看张量所在计算设备(CPU/GPU) |
| .dim() | 获取张量的维度数 |
| .requires_grad | 判断张量是否使用梯度计算 |
| .numel() | 获取张量元素总数 |
| .is_cuda | 判断张量是否在GPU上 |
| .T | 获取张量转置(二维及以下张量) |
| .item() | 获取单元素张量值 |
| .is_contiguous() | 检查张量是否连续存储 |
| .view(shape)/.reshape(shape) | 在不改变数据的情况下,改变张量形状 |
| .unsqueeze(dim) | 在指定维度添加一个维度 |
| .squeeze(dim) | 去掉指定维度为1的维度 |
| .numpy() | 将张量转换为Numpy数组,仅限CPU张量, 数组和张量共享内存,修改数据互相影响 |
| .clone() | 数据克隆,深复制,可存放在新内存地址中 |
| .flatten() | 张量展平,构成一维向量 |
| Tensor创建 | |
| torch.tensor(data) | 从Python列表和numpy数组中创建张量 |
| torch.as_tensor(data) | 数据转换为张量(共享内存) |
| torch.zeros(size) | 创建全为零的张量 |
| torch.ones(size) | 创建全为1的张量 |
| torch.empty(size) | 创建未初始化的张量 |
| torch.eye(size) | 创建单位矩阵 |
| torch.full(size, fill_value) | 创建填充指定值的张量 |
| torch.manual_seed(seed) | 设置随机数种子 |
| torch.initial_seed() | 返回当前随机种子 |
| torch.rand(size) | 创建服从均匀分布的随机张量,值为[0, 1] |
| torch.randn(size) | 创建服从标准正态分布的随机张量 |
| torch.randint(low, high, size) | 创建整数随机张量 |
| torch.randperm(n) | 创建0到n-1的随机配列 |
| torch.arange(start, end, step) | 创建一维序列张量,类似Python的range函数 |
| torch.linspace(start, end, steps) | 创建指定范围内等间隔序列张量 |
| torch.logspace(start, end, steps) | 创建对数间隔序列张量 |
| torch.form_numpy(ndarray) | Numpy数组转换为张量,数组和张量共享内存,修改数据互相影响 |
| Tensor操作 | |
| torch.stack() | 沿着新维度堆叠张量 |
| torch.cat((x, y), dim) | 指定维度连接多个张量 |
| torch.matmul(x, y)/torch.mm(input, mat2) | 矩阵乘法 |
| torch.bmm(input, mat2) | 批量矩阵乘法 |
| torch.eig(input) | 计算矩阵特征值和特征向量 |
| torch.svd(input) | 计算矩阵的奇异值分解 |
| torch.inverse(input) | 计算矩阵的逆 |
| torch.det(input) | 计算矩阵的行列式 |
| torch.trance(input) | 计算矩阵的迹 |
| torch.dot(x, y) | 向量点积(仅适用于一维张量) |
| torch.abs(x) | 求绝对值 |
| torch.sqrt(x) | 求平方根 |
| torch.pow(x) | 求幂运算 |
| torch.exp(x) | 求指数函数 |
| torch.log(x) | 求自然对数 |
| torch.sum(x) | 求和 |
| torch.mean(x) | 求均值 |
| torch.max(x) | 求最大值 |
| torch.min(x) | 求最小值 |
| torch.clamp(input, min, max) | 张量限制在指定范围内 |
| torch.round(input) | 近似,四舍五入 |
| torch.floor(input) | 向下取整 |
| torch.ceil(input) | 向上取整 |
| torch.argmax(x, dim) | 返回指定维度下的最大值对应索引 |
| torch.softmax(x, dim) | 计算指定维度下的softmax |
| torch.meshgrid() | 生成网络,可用于生成坐标 |
注意:
- 共享内存的使用,典型如张量和Numpy数组之间的转化存在共享内存,张量形状的改变也存在共享内存,共享内存存在数据互相影响。
- 张量和Numpy有转换,是因为二者有相似的内存结构,所以有内置方法直接转换。如果PyTorch中Tensor和pandas里的DataFrame进行转换,需要通过Numpy作为中间步骤实现。
参考文献
[1] 深度学习与PyTorch入门实战
[2] Zhang, A., Lipton, Z. C., Li, M., & Smola, A. J. (2023). Dive into Deep Learning. Cambridge University Press. URL: https://D2L.ai
[3] PyTorch深度学习
[4] 菜鸟教程
[5] 深入浅出PyTorch