zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

【他山之石】Pytorch学习笔记

2023-03-14 22:56:19 时间

“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。

来源:知乎—勃疯疯

地址:https://zhuanlan.zhihu.com/p/419195914

01

第一章 NumPy基础

1.1 生成NumPy数组

1.1.1 从已有数据中创建数组

将列表转换成ndarray

1.1.2 random模块生成数组

np.random常用函数

生成三行三列随机数

指定一个随机种子,使用shuffle打乱生成的随机数

1.1.3 创建特定形状多维数组

numpy数组创建函数

生成3*3零矩阵;3*3全是1的矩阵;3阶单位矩阵;3阶对角矩阵

暂时保存生成数据

1.1.4 利用arange、linspace生成数组

arange(start,stop,step)

linspace(start,stop,num);num意为“num等分”

1.2 获取元素

[3]取第4个;[3:6]取第4~6个;[1:6:2]第2~6之间隔一个取一个;[: : -2]逆序隔一个取一个;reshape([5,5])把数据组成5行5列;[1:3 , 1:3]取第一行到第三行的第一列到第三列;[1:3,: ]取第1, 2行;[ : ,1: 3]取第1, 2列

1.3 NumPy的算术运算

1.3.1 相乘

A*B 或 multiply(A, B)

1.3.2 点积

1.4 数组变形

1.4.1 更改数组形状

NumPy中改变形状的函数

reshape改变向量行列,向量本身不变

resize改变向量行列及其本身

.T 求转置

ravel( 'F' ) 按列展平;ravel( ) 按行展平

flatten 将矩阵转换为一行向量

squeeze 去掉矩阵中含1的维度

transpose 改变矩阵维度的顺序

1.4.2 合并数组

NumPy数组合并方法

append 合并一维数组

append( axis=0 )按行合并;append( axis=1 )按列合并

concatenate( axis=0 )按行连接;concatenate( axis=1 )按列连接

stack( axis=0 )按行堆叠;stack( axis=1 )按列堆叠

1.5 批量处理

得到数据集 - 随机打乱 - 定义批大小 - 批处理

1.6 通用函数

NumPy常用通用函数

02

第二章 Tensor

2.4 Numpy与Tensor

2.4.2 创建Tensor

新建Tensor方法

eye 单位矩阵;zeros 全零矩阵;linspace(start,stop,步长);rand 均匀分布;randn标准分布;zeros_like( ) 数据形状与括号内相同,值为零的矩阵

2.4.3 修改Tensor形状

Tensor常用修改形状函数

dim 查看维度;view 修改行列;unsqueeze 添加维度;numel 计算元素个数

2.4.4 索引操作

常用选择操作函数

[ 0, : ] 第一行数据;[ : ,-1] 最后一列数据;nonzero 获取非零向量的下标

2.4.5 广播机制

torch.from_numpy(A) 把ndarray转换为Tensor;A1与B1维数不同,相加自动实现广播,见下图

C=A+B,自动广播

2.4.6 逐元素操作

常见逐元素操作

addcdiv( t, t1, t2) 等价于 t+(t1/t2);clamp( t, 0, 1) 将 t 矩阵元素限定在0~1之间;t.add_(2) 矩阵 t 每个元素都加2

2.4.7 归并操作

常见归并操作

sum( dim = 0 ) 沿 y 轴方向累加;sum( dim = 1 )沿 x 轴方向累加

2.4.8 比较操作

常用比较函数

max( x ) 取最大元素;max( x , dim=0) 取最大行并返回下标;topk( x, 1, dim=0) 取一个最大行并返回下标

2.4.9 矩阵操作

常用矩阵函数

dot 向量点积;mm 矩阵乘法;bmm 三维矩阵乘法

2.4.10 Pytorch与Numpy比较

pytorch与numpy函数对照表

2.5 Tensor与Autograd

2.5.2 计算图

左图正向传播,右图反向传播;不随计算发生变化称 叶子节点( x, w, b ) , 随计算发生变化称 非叶子节点( y, z )

2.5.3 标量反向传播

requires_grad 是否需要保留对应的梯度信息;x.requires_grad 查看requires_grad属性

x.is_leaf 查看是否为叶子节点;grad_fn 指导反向传播;y.grad_fn 查看grad_fn属性

z.backward 基于z进行梯度反向传播

2.5.4 非标量反向传播

对应上图

retain_graph = True 重复使用backward( )

03

第三章 PyTorch神经网络工具箱

3.2 实现神经网络实例(手写数字识别)

构建神经网络使用的 主要工具 及 相互关系

3.2.2 准备数据

导入模块

超参数定义

下载数据并进行预处理;transforms.Compose 把一些转换函数组合在一起;Normalize([0.5],[0.5]) 对张量归一化,0.5 0.5 表示归一化全局平均值和方差;download 是否需要下载;DataLoader得到生成器,节省内存

3.2.3 可视化源数据

显示MNIST源数据实例

3.2.4 构建模型

使用sequential构建网络;Sequential( ) 将网络的层组合到一起;forward 连接输入层、网络层、输出层,实现前向传播;

实例化网络

3.2.5 训练模型

model.train( ) 训练模式;optimizer.zero_grad( ) 梯度清零;loss.backward( ) 自动生成梯度;optimizer.step( ) 执行优化器;img.view( img.size(0), -1) 将img展平成一维;shape[0] 图片通道数,shape[1]图片高度, shape[2]图片宽度

model.eval( ) 测试模式

04

第四章 数据处理工具箱Pytorch

4.2 utils.data

__getitem__ 获取数据和标签;__len__ 提供数据大小(size)

获取数据

dataset 加载的数据集;batch_size 批大小;shuffle 打乱数据;sampler 抽样;num_workers 多进程加载;collate_fn 拼接batch方式;pin_memory 数据保存在pin memory区;drop_last 丢弃不足一个batch的数据

batch = 2 批量读取

4.3 torchvision

4.3.2 ImageFolder

RandomResizedCrop(224) 将图像随机裁剪为不同的大小和宽高比,然后缩放为224*224;RandomHorizontalFlip( ) 将图像以默认概率0.5随机水平旋转;ToTensor( ) 将给定图像转换为Tensor

datasets.ImageFolder 读取不同目录下图片数据;data.DataLoader 加载数据

05

第五章 机器学习基础

5.5 损失函数

分类问题——交叉熵;回归问题——均方误差(MSE)

torch.nn.MSELoss

torch.nn.CrossEntropyLoss

参考

1. http://www.feiguyunai.com/index.php/2020/11/24/python-dl-baseon-pytorch-01/