数据操作
numpy数据操作
创建数组
1 | import numpy as np |
数组属性
1 | x = np.array([1,2,3]) |
数组操作
1 | # 不改变数据内容改变数据形状 |
数组统计函数
1 | ''' |
tensor数据操作
Tensor和tensor的区别
参考: pytorch中Tensor与tensor有什么区别
pytorch搭建神经网络
构建网络层
pytorch是通过模型Module来构建神经网络的层次。
torch.nn.Module
不管是全连接层,还是卷积层等等,都可以通过Module调用,并且可以自动backward。相当于所有网络模型的一个基本支撑,是他们的父类。
Ex:实现LinearModule过程分析与原理
1 | import torch |
这是一个线性模型的实现过程,通过继承Module类实现一个linearModule类。实现了构造方法和重写forward方法。
构造方法使用继承父类的构造函数,并实现Linear类,forward函数实现了前向传播计算方法,说到Linear类我们可以点进去分析一下他的源码是怎么实现的:
1 | class Linear(Module): |
Loss-Function and optimizer
Loss-Function
网络层模型构建完,接下来就是选择损失函数与优化器,损失函数作为衡量输出值与实际值偏差的大小,是根据模型进行选择。
在这里线性模型使用的是mse_loss 均方损失函数,这个函数常用在回归问题中:
$$
Loss = (\frac1N)\displaystyle\sum^N_iloss_i|\begin{bmatrix}\hat{loss_1}\\hat{loss_2}\\hat{loss_3}\\vdots \end{bmatrix} = ( \begin{bmatrix}\hat{y_1}\\hat{y_2}\\hat{y_3}\\vdots \end{bmatrix} - \begin{bmatrix}{y_1}\{y_2}\{y_3}\\vdots \end{bmatrix})^2
$$
这1/N可有可无,就是对所有损失做一个均值,这个在使用函数中有参数选择:
1 | # size_average 是否求均值,默认为True reduce 是否求和,默认为True |
还有很多常用的损失函数:
- CrossEntropyLoss-交叉熵:交叉熵损失函数,刻画的是实际输出(概率)与期望输出(概率)分布的距离,也就是交叉熵的值越小,两个概率分布就越接近,多用在多分类问题中。
- BCELoss-二分类交叉熵:二分类交叉熵把 y , 1 − y {y, 1-y}y,1−y 当做两项分布,计算出来的loss就比交叉熵大(因为包含了正类和负类的交叉熵了)
等等…
这篇博客介绍了pytorch中的loss函数,可做参考,这里不再一一列举。
optimizer
接下来就是优化器选择,它不属于.nn包下,它在 torch.optim.
下,下面是在定义loss后的优化器代码。
这段代码是实例化一个SGD的类,lr表示学习率,也称为步长,momentum表示动量。
1 | optimizer = torch.optim.SGD(module.parameters(),lr=0.01,momentum=0.5) |
这里我们看到SGD这个类传入了三个参数,一个是module的parameters方法返回值,还有两个是学习率和动量,这个module.parameters()我们也可以点进去看一下它的源码到底是什么:
1 | def parameters(self, recurse: bool = True) -> Iterator[Parameter]: |
可以看到注释介绍了parameter是表示组成module的参数,在linear模型中就表示w和b,它的特点是默认requires_grad=True
,就是在训练过程中的反向传播,在反向传播过程中调整w和b。pytoch中有很多优化器模型,这里使用的SGD是随机梯度下降,可以选择动量。
pytoch常用的优化器有:
- SGD-随机梯度下降
- Momentum-标准动量优化算法
- RMSProp算法
- Adam
实现
1 | for epoch in range(10000): |
zero_grad()作用:
根据pytorch中backward()函数的计算,当网络参量进行反馈时,梯度是累积计算而不是被替换,但在处理每一个batch时并不需要与其他batch的梯度混合起来累积计算,因此需要对每个batch调用一遍zero_grad()将参数梯度置0.
另外,如果不是处理每个batch清除一次梯度,而是两次或多次再清除一次,相当于提高了batch_size,对硬件要求更高,更适用于需要更高batch_size的情况
完整模型
1 | import torch |