pytorch基础知识
1 基础知识
01 张量
- 它表示一个多维矩阵,张量类似于NumPy的ndarrays,张量可以在GPU上使用以加速计算
- 张量是支持高效的科学计算的数组。标量视为零阶张量,向量视为一阶张量,矩阵是二阶张量,更高维的数组(高阶数据)
- 张量和Numpy的数组ndarray通常可以共享相同的底层内存,无需复制数据。
Tensor的最基本数据类型
• 32位浮点型:torch.float32/torch.float
• 64位浮点型:torch.float64
• 32位整型: torch.int32
• 16位整型: torch.int16
• 64位整型: torch.int64/torch.long
12 Tensor数据结构的特点
- grad 记录梯度值
- grad_fn 记录通过什么样的运算方法
- data-返回实际的Tensor值
13 入门实例模型的分解方法
14 二分类示例-逻辑回归与交叉熵
-
平方差所惩罚的是与损失为同一数量级的情形对于分类问题,我们最好的使用交叉熵损失函数会更有效交叉熵会输出一个更大的“损失”。
-
交叉熵损失函数:交叉熵刻画的是实际输出(概率)与期望输出(概率)的距
离,也就是交叉熵的值越小,两个概率分布就越接近。假设
概率分布p为期望输出,概率分布q为实际输出,H(p,q)为交
叉熵,则: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VedjRi1J-1650033733957)(C:\Users\31898\AppData\Roaming\Typora\typora-user-images\image-20220227144939156.png)]
15 逻辑回归模型的创建与训练
5.多层感知机
16 多层感知器简介
逻辑回归是单个神经元
- 计算输入特征的加权和,使用一个激活函数(传递函数)计算输出。
- 单层神经元无法拟合“异或” 问题
- 神经元要求数据必须是线性可分的。
多个神经元(多分类)
- 自定义激活函数:线性,可导
激活函数
- relu
- sigmoid
- tanh
- Leak relu
17 多层感知器实例-数据预处理
- 多层感知器如何创建
01 dataset 进行重构
- PyTorch有一个抽象的Dataset类。Dataset可以是任何具有len函数和getitem作为对其进行索引的方法的函数。
- PyTorch的TensorDataset 是一个包装张量的Dataset。通过定义索引的长度和方式,这也为我们提供了沿张量的第一维进行迭代,索引和切片的方法。这将使我们在训练的同一行中更容易访问自变量和因变量。
02 使用DataLoader进行重构
-
Pytorch DataLoader负责管理批次。
DataLoader从Dataset创建。
DataLoader使遍历批次变得更容易。DataLoader会自动为我们提供每个小批量。
无需使用 HRdataset[i * batch: i * batch + batch]
25 多分类问题与Softmax
- pytorch里。对于多分类问题使用nn.CrossEntropyLoss()和nn.NLLLoss等来计算softmax交叉熵。
26 torchvision加载内置数据库
- 常见的图片格式:(高, 宽, 通道)
ToTensor() 作用:
1. 将输入转为tensor
2. 规范图片格式为 (channel, height, width)
3. 将像素取值范围规范到(0,1)
torch.utils.data.DataLoader 对dataset进行封装:
1.乱序 shuffle 防止过拟合,
2.将数据采样为小批次 batch_size : 小批次的批次训练
3. num_workers 多个子进程加速数据读取
4. 设置批次处理函数 collate_fn
- torch.utils.data.Dataset类
- torch.utils.data.DataLoader类
35 梯度下降算法与学习速率
01学习梯度
-
梯度下降法致力于找到函数极值点的算法。
-
梯度:若干偏导数构成的向量,它的每个分量对应于函数对输入向量的相应分量的偏导。
-
梯度的输出向量表明了在每个位置损失函数增长最快的方法。(可视为表示了在函数的每个位置向哪个方向移动函数值可以增长。
02学习速率
-
梯度表明损失函数相对参数的变化率
-
对梯度进行缩放的参数被称为学习速率
-
在具体实践中,可通过查看损失函数值随时间的变化曲线,来判断学习速率的选取是否是合适的。
-
学习速率选取的原则:在调整学习速率时,既需要使其足够的小,保证不至于发生超调。也要保证它足够大,使损失函数能够尽快下调,从而可通过较少次数的迭代更快地完成学习。
-
局部极值点:可通过将权值随机初始化来改善局部极值的问题。权值的初值使用随机值,可以增加从靠近全局最优点附近开始下降的机会。
36 反向传播算法&常见优化器
常见优化器
- 建议使用优化器的默认参数(除了lr可以被自由调节)
- RMSprop 常使用序列
- Adam算法 = 修正之后的Momentum+RMSProp
37 基础部分知识点总结!!!
创建模型的三种方法
- 单层创建 nn.Linear
- torch.nn.Sequential
- 自定义类(继承自nn.Module)
数据输入方式
- 从ndarray创建Tensor直接切片输入
- 使用torch.utils.data.TensorDataset创建dataset
- 使用torchvision的内置数据集
- 使用torch.utils.data.DataLoader封装(创建batch,对数据进行shuffle)
模型训练的步骤
- 预处理数据
- 创建模型和优化方法
- 模型调用
- 计算损失
- 梯度归零
- 计算梯度
- 优化模型
- 打印指标
不同问题使用的损失函数和输出设置
01回归问题
-
预测连续的值叫回归问题
-
损失函数:均方误差mse
-
输出层激活方式:无
02二分类问题
- 回答是否的问题
- 损失函数:BCEloss 输出层激活方式:sigmoid 输出张量长度 :1
- 损失函数:CrossEntropyLoss 输出层激活方式:无 输出张量长度 :2
03多分类问题!!!
- 多个分类的问题:输出与分类个数相同长度的张量
- 损失函数:CrossEntropyLoss 输出层激活方式:无 输出张量长度 :n
04多分类问题
- 多个分类的问题:输出与分类个数相同长度的张量
- 损失函数:nn.NLLLoss 要求:labels必须是独热编码方式
- 输出层激活方式:torch.log_softmax 输出张量长度 :n
120 文本的向量化
121 简单文本分类模型与embedingbag
01文本分类预处理的步骤
01分词
02创建词表
03词嵌入表示
-
映射到张量
-
pytorch里面内置了Embedding Layer层
- torch.nn.Embedding()
-
torch.nn.EmbeddingBag(),聚合方法,对一个序列中文字的embeding输出做聚合。聚合的方法:求和,求均值和求最大值。
04 输入模型
125Dataloader批次处理函数
01 collate_fn
- collate_fn函数就是手动将抽取出的样本堆叠起来的函数
- 用处
- 自定义数据的堆叠过程
- 自定义batch数据的输出形式
- 使用
- 定义一个以data为输入的函数
- 注意:输入输出分别与getitem函数和loader调用时对应
146.RNN优化方法
- 增加网络容量的通常做法是增加每层单元数或增加层数。
- 循环层堆叠 numlayers=
- 使用循环dropout来降低过拟合
- 对每个时间步应该使用相同的dropout掩码(dropout mask,相同模式的舍弃单元),而不是让dropout掩码随着时间步的增加而随机变化。
- 使用双向RNN
pytorch中collate_fn函数
-
注意: 在最后一步堆叠的时候可能会出现问题: 如果一条数据中所含有的每个数据元的长度不同, 那么将无法进行堆叠. 如: multi-hot类型的数据, 序列数据.
collate_fn函数最大的一个好处: 可以自定义取出一个batch数据的格式. 该函数的输出就是对dataloader进行遍历, 取出一个batch的数据.
19.文本与注意力
147. 循环神经网络其他应用及seq2seq简介
1.RNN应用
-
关键字提取(many to one)(输出只取最后一个状态,用它来表示这句话的关键字
-
手写数字识别(many to many)
-
seq2seq(机器翻译:将句子输入,输出是根据前面的输入得到的。输出长度不确定 序列到序列来解决),聊天机器人,问答系统。
2.seq2seq
-
包括:
- Encoder:把文本序列转换成隐含表示,编码成一个统一的语义向量Context。
- Decoder:把隐含表示还原成另一个文本序列,解码。将前一个时刻的输出作为后一个时刻的输入,循环解码。直到输出停止符为止。
- ps:编码器和解码器的任务都能使用循环神经网络来实现。
-
缺点:只有一个context不断往后面输出,可能损失大,仍然不可以避免遗忘的发生。。
148.注意力机制
-
针对seq2seq的缺陷进行改进
-
定义:注意力机制就是通过引入一个神经网络,计算编码器的输出对解码器贡献的权重,最后计算加权平均编码器的输出,即上下文(Context)。
-
通过在编码器的输出和下一步的输入中引入上下文的信息,最后达到让解码器的某一个特定的解码和编码器的一些输出关联起来,即**对齐(Alignment)**的效果。
149. 自注意力机制简介????
-
针对循环神经网络进行的优化
-
循环神经网络的缺点:
- 模型的运行效率和代码优化的问题:循环神经网络的上下步的计算相互依赖,造成模型不能进行并行化计算。
- 多层神经网络的计算和优化问题:每一层之间的相互依赖关系,造成模型优化上的困难。
-
自注意力机制:
-
attention is all you need核心思想:不需要使用循环神经网络,取而代之可以使用注意力机制来描述序列的上下文相关性。对应的注意力机制称为自注意力机制。
-
自注意力机制需要输入三个值:查询张量Q、键张量K和值张量V。
-
构成的张量维度为:NTC连乘的意思。
-
第一个维度是批次维度,第二个维度是序列的时间长度。第三个维度是序列的特征长度。
-
思路:前两个张量**(Q,K)的作用是根据查询张量获取每个键张量对应的分数**,然后根据分数计算对应的权重(Query和Key进行矩阵乘法),用得到的权重乘以值(V)张量,并对值张量加权平均,最后输出结果。
-
具体步骤:
- 第一、使用Q、K、V对应的权重矩阵对这三个张量进行线性变换,获得对应的变换后的张量Query、Key、Value。
- 接下来计算相应的分数和权重,Query和Key进行矩阵乘法。
在Query和Key最后的特征维度相等的状况下,这里相当于使用Query的每个特征,对Key的每个特征,求得两个特征的相似度,用这个相似度作为分数,沿着Key做Softmax函数来计算具体的权重。如果Query和Key相似度越大,那么该Key对应的分数也较大,同时对应的权重也比较大。 - 在实践中经常使用多个并行的自注意力机制,成为多头注意力(Multihead Attention),即使用多个注意力矩阵和多个权重对输入值进行加权平均,最后对加权平均的结果进行拼接。
150.Transformer模型的简介
-
-
Transformer模型=使用自注意力机制执行Seq2Seq任务。
-
相比RNN模型,基于自注意力机制执行Seq2Seq总体思路是类似的,只不过把RNN模块换成了多头自注意力模块
2代码
第2章 1入门示例
1.转换数据为Tensor
#查看特征数据
data.Education
#查看特征数据 index
data.Education.index
#查看特征数据 value
data.Education.values
#特征数据变换形状
data.Education.values.reshape(-1,1)
#查看特征数据变换后的形状
data.Education.values.reshape(-1,1).shape
#查看特征数据变换后的数据类型
type(data.Education.values.reshape(-1,1))
#修改特征数据变换后的数据类型
X = data.Education.values.reshape(-1,1).astype(np.float32)
print(type(X))
X.shape
#特征数据和标签转换为Tensor
X = torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32) ) #转换数据类型
Y = torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float32) ) #转换数据类型
第三章 入门实例 收入数据集 分解写法
#数据
x=torch.rand(size=(200,1))*10
y=2*x+(5+torch.randn(200,1))
# 2.模型
w = torch.randn(1, requires_grad=True)#跟踪运算
b = torch.zeros(1, requires_grad=True)
for epoch in range(5000):
for x, y in zip(X, Y):
#3.forward 前向传播就是求出预测值
y_pred = torch.matmul(x, w) + b#矩阵乘法
#4.损失函数
loss = (y-y_pred).pow(2).sum()#均方误差
if not w.grad is None:#每次都需要将w,b置为0
w.grad.data.zero_()#就地改变,置为0
if not b.grad is None:
b.grad.data.zero_()
#backward 反向传播为了求出各个神经元的梯度,从而便于优化模型
loss.backward()#计算权重和偏置的梯度
#优化器
with torch.no_grad():#不需要跟踪,只是优化
w.data -= w.grad.data*learning_rate
b.data -= b.grad.data*learning_rate
张量与数据类型
张量的自动微分
-
t.requires_grad =True 是否需要pytorch去跟踪对应张量的所有计算
-
y.grad_fn 返回计算得到此张量的方法
-
t.grad打印t的梯度,返回微分运算的结果 d(out)/d(t)
-
grad 这个属性记录计算得到的梯度
grad_fn什么样的运算方法得到属性 -
out.data得到什么值。
with torch.no_grad():#with 上下文管理器 不会跟踪运算
y = t + 2
print(y.requires_grad)
t.requires_grad_(False)#下划线_ 就地改变!!!!不再优化
result = out.detach()#截断梯度运算,不再跟踪运算
第四章 二分类实例 信用卡欺诈数据
torchtext.vocab
build_vocab_from_iterator(iterator: Iterable, min_freq: int = 1, specials: Optional[List[str]] = None, special_first: bool = True) → torchtext.vocab.Vocab
功能:用迭代器来生成Vocab对象。
参数:
- iterator:迭代器。用于创建词典的yield或词语迭代器。
- min_freq:整型,默认1。最小词频,创建时会忽略小于最小词频的词语。
- specials:字符串列表,默认None。一些需要加入词典的特殊符号,加入顺序与列表中顺序一致。
- special_first:布尔,默认True。表示是否将specials中的符号插在词典最前面。
返回值:对应的Vocab对象