Pytorch——Dropout
文章目录
- 1.前言
- 2.制造人工数据
- 3.搭建神经网络模型
- 4.训练模型
- 5.可视化drop与不drop的情况
1.前言
过拟合让人头疼, 明明训练时误差已经降得足够低, 可是测试的时候误差突然飙升. 这很有可能就是出现了过拟合现象.下面将用可视化的形式来对比使用Dropout和不使用Dropout的情况。
2.制造人工数据
import torch
import matplotlib.pyplot as plttorch.manual_seed(123)#制造训练数据
x = torch.unsqueeze(torch.linspace(-1,1,40), 1)
y = x + 0.3*torch.normal(torch.zeros(40,1), torch.ones(40,1)) #均值为0, 方差为1#制造测试数据
test_x = torch.unsqueeze(torch.linspace(-1,1,40), 1)
test_y = test_x + 0.3*torch.normal(torch.zeros(40,1), torch.ones(40,1))#可视化数据
plt.scatter(x.data.numpy(), y.data.numpy(), c = 'magenta', s = 50, alpha = 0.5, label = "train")
plt.scatter(test_x.data.numpy(), test_y.data.numpy(), c = 'cyan', s = 50, alpha = 0.5, label = "test")
plt.legend(loc = 'upper left')
plt.ylim((-2.5, 2.5))
plt.show()
3.搭建神经网络模型
我们在这里搭建两个神经网络, 一个没有 dropout, 一个有 dropout. 没有 dropout 的容易出现 过拟合, 那我们就命名为 net_overfitting, 另一个就是 net_dropped. torch.nn.Dropout(0.5) 这里的 0.5 指的是随机有 50% 的神经元会被关闭/丢弃.
net_overfitting = torch.nn.Sequential(torch.nn.Linear(1,200),torch.nn.ReLU(),torch.nn.Linear(200,200),torch.nn.ReLU(),torch.nn.Linear(200,1)
)net_dropped = torch.nn.Sequential(torch.nn.Linear(1,200),torch.nn.Dropout(0.5),torch.nn.ReLU(),torch.nn.Linear(200,200),torch.nn.Dropout(0.5),torch.nn.ReLU(),torch.nn.Linear(200,1)
)
4.训练模型
训练的时候, 这两个神经网络分开训练. 训练的环境都一样.
optimizer_ofit = torch.optim.Adam(net_overfitting.parameters(), lr = 0.01)
optimizer_drop = torch.optim.Adam(net_dropped.parameters(), lr = 0.01)loss_func = torch.nn.MSELoss()for t in range(500):pred_ofit = net_overfitting(x)pred_drop = net_dropped(x)loss_ofit = loss_func(pred_ofit, y)loss_drop = loss_func(pred_drop, y)optimizer_ofit.zero_grad()optimizer_drop.zero_grad()loss_ofit.backward()loss_drop.backward()optimizer_ofit.step()optimizer_drop.step()
5.可视化drop与不drop的情况
optimizer_ofit = torch.optim.Adam(net_overfitting.parameters(), lr = 0.01)
optimizer_drop = torch.optim.Adam(net_dropped.parameters(), lr = 0.01)loss_func = torch.nn.MSELoss()for t in range(500):pred_ofit = net_overfitting(x)pred_drop = net_dropped(x)loss_ofit = loss_func(pred_ofit, y)loss_drop = loss_func(pred_drop, y)optimizer_ofit.zero_grad()optimizer_drop.zero_grad()loss_ofit.backward()loss_drop.backward()optimizer_ofit.step()optimizer_drop.step()if t % 10 == 0: #每10步画一次图#将神经网络转换成测试形式,画好图之后改回训练形式net_overfitting.eval() # 因为 drop 网络在 train 的时候和 test 的时候参数不一样.net_dropped.eval()test_pred_ofit = net_overfitting(test_x) #测试数据放入模型,得到模型的预测值 test_pred_drop = net_dropped(test_x)#可视化操作plt.scatter(x.data.numpy(), y.data.numpy(), c = 'magenta', s = 50, alpha = 0.5, label = "train" )plt.scatter(test_x.data.numpy(), test_y.data.numpy(),c = 'cyan', s = 50, alpha = 0.5, label = "test" )plt.plot(test_x.data.numpy(), test_pred_ofit.data.numpy(),'r-',lw=5)plt.plot(test_x.data.numpy(), test_pred_drop.data.numpy(),'b--',lw=5)plt.text(0,-1.2,'overfitting loss = %.4f' % loss_func(test_pred_ofit,test_y),fontdict = {'size':20,'color':'red'})plt.text(0,-1.5,'dropout loss = %.4f' % loss_func(test_pred_drop,test_y),fontdict={'size':20,'color':'blue'})plt.legend(loc = 'upper left')plt.ylim(-2.5,2.5)plt.pause(0.1)#net_overfitting.train() #预测完后,把神经网络放回去再训练#net_dropped.train()
Pytorch——Dropout相关推荐
- pytorch dropout用法
关于dropout改进的新技术分享: dropout改进_jacke121的专栏-CSDN博客_dropout改进 链接:https://www.zhihu.com/question/67209417 ...
- PyTorch——Dropout(丢弃法)
参考链接 https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter03_DL-basics/3.13_dropout dropout 深度学习模型常常使 ...
- pytorch dropout代码解读
1.代码 class Net(nn.Module):def __init__(self):#对所有的层初始化super(Net, self).__init__()#父类的所有的属性self.conv1
- PyTorch 笔记(20)— torchvision 的 datasets、transforms 数据预览和加载、模型搭建(torch.nn.Conv2d/MaxPool2d/Dropout)
计算机视觉是深度学习中最重要的一类应用,为了方便研究者使用,PyTorch 团队专门开发了一个视觉工具包torchvision,这个包独立于 PyTorch,需通过 pip instal torchv ...
- Pytorch中的序列化容器-度消失和梯度爆炸-nn.Sequential-nn.BatchNorm1d-nn.Dropout
Pytorch中的序列化容器-度消失和梯度爆炸-nn.Sequential-nn.BatchNorm1d-nn.Dropout 1. 梯度消失和梯度爆炸 在使用pytorch中的序列化 容器之前,我们 ...
- 【深度学习】Dropout、正反向传播、计算图等的介绍和实现(Pytorch)
[深度学习]Dropout.正反向传播.计算图等的介绍和实现(Pytorch) 文章目录 1 Dropout概述 2 实践中的dropout2.1 从零开始实现2.2 定义模型参数2.3 定义模型2. ...
- pytorch 笔记 :实现Dropout
1 理论部分 首先说明一点,dropout是用来解决overfitting的,如果在训练集上实验效果就不理想,那么加了dropout也救不了. 1.1 training时的dropout 使用了Dro ...
- 深度学习总结:用pytorch做dropout和Batch Normalization时需要注意的地方,用tensorflow做dropout和BN时需要注意的地方,
用pytorch做dropout和BN时需要注意的地方 pytorch做dropout: 就是train的时候使用dropout,训练的时候不使用dropout, pytorch里面是通过net.ev ...
- 【Pytorch神经网络实战案例】21 基于Cora数据集实现Multi_Sample Dropout图卷积网络模型的论文分类
Multi-sample Dropout是Dropout的一个变种方法,该方法比普通Dropout的泛化能力更好,同时又可以缩短模型的训练时间.XMuli-sampleDropout还可以降低训练集和 ...
最新文章
- 系统测试和集成测试的区别
- 阿里云负载均衡器(SLB)的配置方法
- 《深入理解 Spring Cloud 与微服务构建》第十三章 配置中心 Spring Cloud Config
- springmvc从request中获取body的数据的方法
- 交换机端口呈现err-disable的原因
- 字符串 (String)
- 常见地理知识总结的连接
- 基于php网上书店存在问题及解决方案,基于PHP的网上书店系统设计与实现
- AsposeCells Excel转Pdf时异常
- Smart3D系列教程7之 《手动配置S3C索引加载全部的瓦片数据》
- 13部成功预知未来科技的科幻电影
- Unexpected exception parsing XML document from class path resource
- 用计算机用语说唯美的话,古风说说唯美句子
- 数据库索引(B树,B+树,哈希)
- 《算法分析与设计》第二周课堂笔记 孙晓 老湿
- 备战网络工程师认证考试:历年真题合集
- mybatis-day03-自带数据源、事务、动态sql、多表配置
- eclipse没有提示
- 《工作的意义》书中的精髓:明白我们为什么要工作,且在我们认为工作没有意义的时候,借助《圣经》的智慧来让工作重新变得有意义。
- openSUSE SDB:配置显卡
热门文章
- 华为交换机vlan划分常用命令
- Winform文件下载之断点续传
- tipask mysql调取dedecms_如何实现dedecms外部数据库调用
- mysql解压版有配置文件么_3分钟安装MySQL5.7解压版
- excel内容少却文件很大_009- EXCEL文件的表格内的数据内容明明不多,但是文件却变得很大...
- (三.1)基于MicroBlaze的PowerlinkC代码分析
- 【转】MongoDB介绍及下载与安装
- Windows系统单网卡配置双IP双网关
- java面试题 接口和抽象类的区别是什么
- C11标准库原子操作/无锁队列 stdatomic.h