Logistic Regression
该概念现目前已经完全被Classification替换掉
就是通过输出加sigmoid函数,让输出接近0或1,达到分类的效果。
dist(pred,y)
Logistic Regression 一般使用交叉熵作为Loss函数,在Pytoch梯度中的交叉熵一节有对交叉熵loss函数详细的讲解,这里就不再赘述。
多分类问题实战——函数API实现
前面对这一部分的介绍已经非常详细了,这里就不再赘述。
网络结构
1 | w1, b1 = torch.randn(200, 784, requires_grad=True),\ |
注意:初始化中tensor第一个维度是out(下一层向量长度),第二个维度是in(这一层向量长度)
训练过程
训练过程的原理和博客PyTorch梯度最后讲的一样,这里不再赘述
1 | optimizer = optim.SGD([w1, b1, w2, b2, w3, b3], lr=learning_rate) |
汇总
采用的是MINIST数据集,代码如下:
1 | import torch |
全连接层——类API实现
网络结构
在上一次的实践中,我们使用分散的w,b tensor实现了一个非常简单的三层全连接层(函数API实现)。但是这样虽然简单,但是不够直观,变量稍微有点多,这次我们介绍使用PyTorch自带的API实现一个和上面一样的三层全连接层。
1 | In [3]: x=torch.randn(1,784) |
这个只是比较像,但是还是有些区别,因为我们还没有加层之间的激活函数。
下面我们在层之间添加激活函数:
1 | In [3]: from torch import nn |
relu
中的inplace参数如果设置为true的话,节省了内存,相当于输出和输入用同一份内存。
学会了如上API定义网络,因为一般情况下的工程,网络都会定义成为一个类,所以这里,我们学习如何将网络定义为一个类。
1 | class MPL(nn.Module): |
注意区分F.relu(x,inplace=True)
和上面nn.ReLU(inplace=True)这两种类型的API,前者是函数类型API,其中的tensor支持自己管理,后者是类-类型API,tensor为类内部变量不能随意访问,使用也必须将类实例化后才可以使用。
训练过程
代码如下,详情见注释:
1 | net=MLP()# 实例化网络 |
汇总
采用类API书写,使用的是MINIST数据集,代码如下:
1 | import torch |
以上为目前的主流版本,值得学习与参考!
激活函数与GPU加速
激活函数
- tanh——RNN
- sigmoid——probability
- ReLU——DL
- LeakyReLU——DL
- SELU——优化了ReLU在0点导数不连续的情况
- softplus——同SELU,光滑了ReLU在0点处的连接
GPU加速
现目前较高版本的PyTorch已经可以使用to方法指定使用特定设备进行运算,而不必像原来使用不同设备进行相同的运算需要调用不同的API。
使用GPU cuda加速运算的代码如下图所示:
1 | device = torch.device('cuda:0') |
上述代码相当于是将网络,loss函数和所有的数据都搬运到了GPU上去。
汇总
采用的是MINIST数据集,
- 优化激活函数变为LeakyReLU
- 使用了GPU cuda加速
代码如下:
1 | import torch |
测试环节
可以发现前面所讲的内容只是覆盖了网络结构的初始化以及训练过程,并没有讲解测试过程,下面我们就来学习一下当PyTorch训练完成后,如何进行测试。
对于MINIST数据集其实就是将最后的算loss和loss.backward()
去掉,直接将logits
接一个softmax层(其实也可以不加)然后找到最大值的index即可(使用argmax
函数)。
计算准确率就是用预测正确的数量除以总数量。
代码实现
下面是一个简单的测试环节的模拟代码,其中计算准确率这一部分还是有一些技术性的。
1 | In [3]: logits=torch.rand(4,10) |
还有一些其他的评价参数,比如precision或recall,这些后面会单独写一篇博客进行讲解。
什么时候测试?
- 在运行完几个Batch后进行一次test
- 运行完一个epoch后进行一次测试
汇总
代码汇总见上面的汇总模块
Visdom可视化
step1:安装visdom
1 | pip install visdom |
step2:开启visdom Web服务器
命令行中输入:
1 | python -m visdom.server |
step3:然后就可以将数据丢入visdom进行可视化查看了
1 | from visdom import Visdom |
env
:大窗口ID,大窗口中可以有很多个小窗口,默认是main
大窗口 update
:若为append表示添加在当前直线的后面,若不指定会被覆盖掉
多条曲线一个窗口
上面的代码实现的是一条曲线一个窗口,下面我们来讲一下如何实现多条曲线画在一个窗口。
1 | from matplotlib.pyplot import legend |
其实就是将y参数的list增加了一个长度,就可以一个小窗口画两条曲线。
visual x
这是visdom提供的一个可视化的功能
1 | from matplotlib.pyplot import legend |