文章目录
PyTorch基础篇:
- PyTorch基础知识 | 安装 | 张量 | 自动求导
- PyTorch主要组成模块 | 数据读入 | 数据预处理 | 模型构建 | 模型初始化 | 损失函数 | 优化器 | 训练与评估
- PyTorch主要组成模块 | hook函数 | 正则化weight decay与Dropout | 标准化
- PyTorch模型定义 | 模型容器 | 模型块 | 修改模型 | 模型读取与保存
- PyTorch进阶技巧 | 自定义损失函数 | 动态调整学习率 | 模型微调 | 半精度训练 | 使用argparse进行调参
- PyTorch可视化 | 可视化网络结构 | 使用TensorBoard可视化训练过程
一、PyTorch安装
这里介绍两种安装方式:
1.基于whl安装
https://download.pytorch.org/whl/torch_stable.html下载对应cuda版本或cpu,对应pytorch版本,对应python版本、对应电脑系统的文件,选择两个文件torch
与torchvision
,然后在对应的虚拟环境下pip安装即可。
2.官网命令行安装
https://pytorch.org/get-started/previous-versions/选择对应cuda版本或cpu,对应pytorch版本,对应python版本、对应电脑系统的命令。每个版本都有两种安装方式:conda和wheel。网速快的话,wheel方式更快一点。
二、张量
1.张量的简介
张量的核心就是一个数据容器。
张量维度 | 代表含义 |
---|---|
0维张量 | 代表的是标量(数字) |
1维张量 | 代表的是向量 |
2维张量 | 代表的是矩阵 |
3维张量 | 时间序列数据 、股价、 文本数据、单张彩色图片(RGB) |
4维张量 | 多张彩色图片(RGB) |
5维张量 | 视频 |
多数情况下,它只包含数字。在PyTorch
中, 张量(torch.Tensor
) 是存储和变换数据的主要工具。Tensor
提供GPU
计算和自动求梯度等更多功能。
Tensor
有8个属性:
data
:被包装的Tensor
dtype
:张量的数据类型,如torch.FloatTensor
,torch.cuda.FloatTensor
(表示数据放到了GPU上)shape
:张量的形状,如(64,3,224,224)device
:张量所在设备,GPU/CPU
,是加速的关键grad
:data
的梯度grad_fn
:创建Tensor
的Function
,是自动求导的关键requires_grad
:指示是否需要梯度is_leaf
:指示是否是叶子结点(张量)
2.创建tensor
常见的构造Tensor
的方法如下:
函数 | 功能 |
---|---|
Tensor(sizes) | 基础构造函数 |
tensor(data) | data可以传入list, tuple,ndarray, scalar等,返回tensor |
ones(sizes) | 全1 |
zeros(sizes) | 全0 |
eye(sizes) | 对角为1,其余为0 |
arange(s,e,step) | 从s到e,步长为step |
linspace(s,e,steps) | 从s到e,均匀分成step份 |
rand/randn(sizes) | rand是[0,1)均匀分布;randn是服从N(0,1)的正态分布 |
normal(mean,std) | 正态分布(均值为mean,标准差是std) |
randperm(m) | 随机排列 |
2.1 直接创建
torch.tensor()
:直接传入数据list, tuple,ndarray, scalar等,构造一个张量。
torch.tensor(data, dtype=None, device=None, requires_grad=False,pin_memory=False)
功能:从data
创建tensor
data
:数据,可以是list, tuple,ndarray, scalardtype
:数据类型,默认与data的一致device
:所在设备,cuda/cpu
requires_grad
:是否需要梯度pin_memory
:是否存于锁页内存(这与转换效率有关)
注意:
torch.tensor
创建得到的张量和原数据是不共享内存的,张量对应的变量是独立变量。
传入列表:
import torch
x = torch.tensor([5.5, 3])
print(x)
tensor([5.5000, 3.0000])
传入ndarry:
# tensor和numpy array之间的相互转换
import numpy as np
g = np.array([[1,2,3],[4,5,6]])
h = torch.tensor(g)
print(h)
tensor([[1, 2, 3],
[4, 5, 6]], dtype=torch.int32)
通过torch.from_numpy()
创建张量
torch.from_numpy(ndarray)
注意事项:从torch.from_numpy
创建的tensor与原ndarray共享内存,当修改其中一个的数据,另外一个也将会被改动。
import torch
import numpy as np
arr = np.ones((2, 2))
t1 = torch.from_numpy(arr)
print(arr)
print(t1)
t1 += 1
print(arr)
print(t1)
[[1. 1.]
[1. 1.]]
tensor([[1., 1.],
[1., 1.]], dtype=torch.float64)
[[2. 2.]
[2. 2.]]
tensor([[2., 2.],
[2., 2.]], dtype=torch.float64)
2.2 依据数值创建
torch.zeros()
:创建全0张量
torch.zeros(*size,
out=None,dtype=None,
layout=torch.strided,device=None,
requires_grad=False)
功能:依size创建全0张量
- size:张量的形状,如(3,3)、(3,224,224)
- out:输出的张量
- layout :内存中布局形式,有strided,sparse_coo等
- device :所在设备,gpu/cpu
- requires_grad:是否需要梯度
torch.zeros_like()
torch.zeros_like( input,
dtype=None,layout=None,device=None,
requires_grad=False)
功能:依input形状创建全0张量
- intput:创建与input同形状的全0张量
- dtype:数据类型
- layout :内存中布局形式
torch.ones()
,torch.ones_like()
:创建全1张量
torch.ones( *size,
out=None,dtype=None,
layout=torch.strided,device=None,
requires_grad=False)
功能:依size创建全1张量
torch.ones_like( input,
dtype=None,layout=None,device=None,
requires_grad=False)
功能:依input形状创建全1张量
- size:张量的形状,如(3,3)、(3,224,224)
- dtype:数据类型
- layout :内存中布局形式
- device :所在设备,gpu/cpu
- requires_grad:是否需要梯度
torch.full()
,torch.full_like()
:创建指定数据的张量
torch.full(size,
fill_value,out=None,dtype=None,
layout=torch.strided,device=None,
requires_grad=False)
功能:依input形状创建指定数据的张量
- size:张量的形状,如(3,3)
- fill_value:张量的值
t2 = torch.full((3, 3), fill_value=10)
print(t2)
#tensor([[10., 10., 10.],
# [10., 10., 10.],
# [10., 10., 10.]])
torch.arange()
:创建等差张量
torch.arange(start=0,
end,step=1,
out=None,dtype=None,
layout=torch.strided ,device=None,
requires_grad=False)
功能:创建等差的1维张量
注意事项:数值区间为[start, end),start:数列起始值,end:数列“结束值”,step:数列公差,默认为1
t3 = torch.arange(2, 10, 2)
print(t3)
# tensor([2, 4, 6, 8])
torch.linspace()
:创建均分的1维张量
torch.linspace(start,
end,
steps=100,out=None,dtype=None,
layout=torch.strided,device=None,
requires_grad=False)
功能:创建均分的1维张量
注意:数值区间为[start, end],start:数列起始值,end :数列结束值,steps:数列长度
torch.logspace()
:创建对数均分的1维张量
torch. logspace(start,end,
steps=100,base=10.0,out=None,dtype=None,
layout=torch.strided,device=None,
requires_grad=False)
功能:创建对数均分的1维张量
注意:长度为steps,底为base;start:数列起始值,end :数列结束值,steps:数列长度,base :对数函数的底,默认为10
torch.eye()
:创建单位对角矩阵
torch.eye(n,
m=None,out=None,dtype=None,
layout=torch.strided,device=None,
requires_grad=False)
功能:创建单位对角矩阵(2维张量)
注意:默认为方阵;n:矩阵行数,m:矩阵列数
2.3 依概率分布创建
torch.normal()
:生成正态分布的张量。
torch.normal(mean,
std,
out=None)
功能:生成正态分布(高斯分布);mean :均值,std :标准差
四种模式:
- mean为标量,std为标量
- mean为标量,std为张量
- mean为张量, std为标量
- mean为张量,std为张量
# mean:张量 std: 张量
mean = torch.arange(1, 5, dtype=torch.float)
std = torch.arange(1, 5, dtype=torch.float)
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)
# mean:标量 std: 标量
t_normal = torch.normal(0., 1., size=(4,))
print(t_normal)
# mean:张量 std: 标量
mean = torch.arange(1, 5, dtype=torch.float)
std = 1
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)
mean:tensor([1., 2., 3., 4.])
std:tensor([1., 2., 3., 4.])
tensor([0.3966, 1.5400, 0.7993, 9.4299])
tensor([-0.0378, -0.6219, -0.1607, -1.1813])
mean:tensor([1., 2., 3., 4.