文章目录

  • 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相关推荐

  1. pytorch dropout用法

    关于dropout改进的新技术分享: dropout改进_jacke121的专栏-CSDN博客_dropout改进 链接:https://www.zhihu.com/question/67209417 ...

  2. PyTorch——Dropout(丢弃法)

    参考链接 https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter03_DL-basics/3.13_dropout dropout 深度学习模型常常使 ...

  3. pytorch dropout代码解读

    1.代码 class Net(nn.Module):def __init__(self):#对所有的层初始化super(Net, self).__init__()#父类的所有的属性self.conv1

  4. PyTorch 笔记(20)— torchvision 的 datasets、transforms 数据预览和加载、模型搭建(torch.nn.Conv2d/MaxPool2d/Dropout)

    计算机视觉是深度学习中最重要的一类应用,为了方便研究者使用,PyTorch 团队专门开发了一个视觉工具包torchvision,这个包独立于 PyTorch,需通过 pip instal torchv ...

  5. Pytorch中的序列化容器-度消失和梯度爆炸-nn.Sequential-nn.BatchNorm1d-nn.Dropout

    Pytorch中的序列化容器-度消失和梯度爆炸-nn.Sequential-nn.BatchNorm1d-nn.Dropout 1. 梯度消失和梯度爆炸 在使用pytorch中的序列化 容器之前,我们 ...

  6. 【深度学习】Dropout、正反向传播、计算图等的介绍和实现(Pytorch)

    [深度学习]Dropout.正反向传播.计算图等的介绍和实现(Pytorch) 文章目录 1 Dropout概述 2 实践中的dropout2.1 从零开始实现2.2 定义模型参数2.3 定义模型2. ...

  7. pytorch 笔记 :实现Dropout

    1 理论部分 首先说明一点,dropout是用来解决overfitting的,如果在训练集上实验效果就不理想,那么加了dropout也救不了. 1.1 training时的dropout 使用了Dro ...

  8. 深度学习总结:用pytorch做dropout和Batch Normalization时需要注意的地方,用tensorflow做dropout和BN时需要注意的地方,

    用pytorch做dropout和BN时需要注意的地方 pytorch做dropout: 就是train的时候使用dropout,训练的时候不使用dropout, pytorch里面是通过net.ev ...

  9. 【Pytorch神经网络实战案例】21 基于Cora数据集实现Multi_Sample Dropout图卷积网络模型的论文分类

    Multi-sample Dropout是Dropout的一个变种方法,该方法比普通Dropout的泛化能力更好,同时又可以缩短模型的训练时间.XMuli-sampleDropout还可以降低训练集和 ...

最新文章

  1. 系统测试和集成测试的区别
  2. 阿里云负载均衡器(SLB)的配置方法
  3. 《深入理解 Spring Cloud 与微服务构建》第十三章 配置中心 Spring Cloud Config
  4. springmvc从request中获取body的数据的方法
  5. 交换机端口呈现err-disable的原因
  6. 字符串 (String)
  7. 常见地理知识总结的连接
  8. 基于php网上书店存在问题及解决方案,基于PHP的网上书店系统设计与实现
  9. AsposeCells Excel转Pdf时异常
  10. Smart3D系列教程7之 《手动配置S3C索引加载全部的瓦片数据》
  11. 13部成功预知未来科技的科幻电影
  12. Unexpected exception parsing XML document from class path resource
  13. 用计算机用语说唯美的话,古风说说唯美句子
  14. 数据库索引(B树,B+树,哈希)
  15. 《算法分析与设计》第二周课堂笔记 孙晓 老湿
  16. 备战网络工程师认证考试:历年真题合集
  17. mybatis-day03-自带数据源、事务、动态sql、多表配置
  18. eclipse没有提示
  19. 《工作的意义》书中的精髓:明白我们为什么要工作,且在我们认为工作没有意义的时候,借助《圣经》的智慧来让工作重新变得有意义。
  20. openSUSE SDB:配置显卡

热门文章

  1. 华为交换机vlan划分常用命令
  2. Winform文件下载之断点续传
  3. tipask mysql调取dedecms_如何实现dedecms外部数据库调用
  4. mysql解压版有配置文件么_3分钟安装MySQL5.7解压版
  5. excel内容少却文件很大_009- EXCEL文件的表格内的数据内容明明不多,但是文件却变得很大...
  6. (三.1)基于MicroBlaze的PowerlinkC代码分析
  7. 【转】MongoDB介绍及下载与安装
  8. Windows系统单网卡配置双IP双网关
  9. java面试题 接口和抽象类的区别是什么
  10. C11标准库原子操作/无锁队列 stdatomic.h