简述

深度学习模型常常使用丢弃法(dropout)[1] 来应对过拟合问题。丢弃法有一些不同的变体。文中提到的丢弃法特指倒置丢弃法(inverted dropout)。

对于激活函数而言有:
hi=ϕ(x1w1i+x2w2i+x3w3i+x4w4i+bi)h_i = ϕ(x_1w_{1i} + x_2w_{2i} + x_3w_{3i} + x_4w_{4i} + b_i)hi​=ϕ(x1​w1i​+x2​w2i​+x3​w3i​+x4​w4i​+bi​)
这里ϕ是激活函数,x1,...,x4x_1,...,x_4x1​,...,x4​是输入,隐藏单元i的权重参数是w1i,...,w4iw_{1i},...,w_{4i}w1i​,...,w4i​,偏差参数为bib_ibi​.当对该隐藏层使用丢弃法时,该层的隐藏层单元有一定概率被丢弃.设丢弃概率为ppp,那么有ppp的概率hih_ihi​会被清零,有1−p1-p1−p的概率做拉伸.丢弃概率是丢弃法的超参数.具体来说,设随机变量ξiξ_iξi​为0和1的概率分别为ppp和1−p1-p1−p.使用丢弃法时我们计算新的隐藏单元hi′h'_ihi′​
hi′=ξi1−phih'_i = \frac{ξ_i}{1-p}h_ihi′​=1−pξi​​hi​
由于E(ξi)=1−pE(ξ_i)=1-pE(ξi​)=1−p,因此:
E(hi′)=E(ξi)1−phi=hiE(h'_i)=\frac{E(ξ_i)}{1-p}h_i = h_iE(hi′​)=1−pE(ξi​)​hi​=hi​
即丢弃法不改变其输入的期望值.
由于在训练中隐藏层神经元的丢弃是随机的,即h1,...,h5h_1,...,h_5h1​,...,h5​都有可能被清零,输出层的计算无法过度依赖h1,...,h5h_1,...,h_5h1​,...,h5​ 中的任一个,从而在训练模型时起到正则化的作用,并可以用来应对过拟合。在测试模型时,我们为了拿到更加确定性的结果,一般不使用丢弃法。

手动实现

简述

  • 定义的模型将全连接层和激活函数ReLU串起来,并对每个激活函数的输出使用丢弃法。我们可以分别设置各个层的丢弃概率。通常的建议是把靠近输入层的丢弃概率设得小一点。在这个实验中,我们把第一个隐藏层的丢弃概率设为0.2,把第二个隐藏层的丢弃概率设为0.5。我们可以通过参数is_training来判断运行模式为训练还是测试,并只需在训练模式下使用丢弃法。

d2lzh_pytorch.py

import random
from IPython import display
import matplotlib.pyplot as plt
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import time
import sys
import torch.nn as nndef use_svg_display():# 用矢量图显示display.set_matplotlib_formats('svg')def set_figsize(figsize=(3.5, 2.5)):use_svg_display()# 设置图的尺寸plt.rcParams['figure.figsize'] = figsize'''给定batch_size, feature, labels,做数据的打乱并生成指定大小的数据集'''
def data_iter(batch_size, features, labels):num_examples = len(features)indices = list(range(num_examples))random.shuffle(indices)for i in range(0, num_examples, batch_size): #(start, staop, step)j = torch.LongTensor(indices[i: min(i + batch_size, num_examples)]) #最后一次可能没有一个batchyield features.index_select(0, j), labels.index_select(0, j)'''定义线性回归的模型'''
def linreg(X, w, b):return torch.mm(X, w) + b'''定义线性回归的损失函数'''
def squared_loss(y_hat, y):return (y_hat - y.view(y_hat.size())) ** 2 / 2'''线性回归的优化算法 —— 小批量随机梯度下降法'''
def sgd(params, lr, batch_size):for param in params:param.data -= lr * param.grad / batch_size #这里使用的是param.data'''MINIST,可以将数值标签转成相应的文本标签'''
def get_fashion_mnist_labels(labels):text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat','sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']return [text_labels[int(i)] for i in labels]'''定义一个可以在一行里画出多张图像和对应标签的函数'''
def show_fashion_mnist(images, labels):use_svg_display()# 这里的_表示我们忽略(不使用)的变量_, figs = plt.subplots(1, len(images), figsize=(12, 12))for f, img, lbl in zip(figs, images, labels):f.imshow(img.view((28, 28)).numpy())f.set_title(lbl)f.axes.get_xaxis().set_visible(False)f.axes.get_yaxis().set_visible(False)plt.show()'''获取并读取Fashion-MNIST数据集;该函数将返回train_iter和test_iter两个变量'''
def load_data_fashion_mnist(batch_size):mnist_train = torchvision.datasets.FashionMNIST(root='Datasets/FashionMNIST', train=True, download=True,transform=transforms.ToTensor())mnist_test = torchvision.datasets.FashionMNIST(root='Datasets/FashionMNIST', train=False, download=True,transform=transforms.ToTensor())if sys.platform.startswith('win'):num_workers = 0  # 0表示不用额外的进程来加速读取数据else:num_workers = 4train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers)test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers)return train_iter, test_iter'''评估模型net在数据集data_iter的准确率,同时考虑了drop_out的情况'''
def evaluate_accuracy(data_iter, net):acc_sum, n = 0.0, 0for X, y in data_iter:if isinstance(net, torch.nn.Module):net.eval()  # 评估模式, 这会关闭dropoutacc_sum += (net(X).argmax(dim=1) == y).float().sum().item()net.train()  # 改回训练模式else: #自定义的模型if ('is_training' in net.__code__.co_varnames):  # 如果有is_training这个参数# 将is_training设置成Falseacc_sum += (net(X, is_training = False).argmax(dim=1) == y).float().sum().item()else:acc_sum += (net(X).argmax(dim=1) == y).float().sum().item()n += y.shape[0]return acc_sum / n'''训练模型,softmax'''
def train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, params=None, lr=None, optimizer=None):for epoch in range(num_epochs):train_l_sum, train_acc_sum, n = 0.0, 0.0, 0for X, y in train_iter:y_hat = net(X)l = loss(y_hat, y).sum()# 梯度清零if optimizer is not None:optimizer.zero_grad()elif params is not None and params[0].grad is not None:for param in params:param.grad.data.zero_()l.backward()if optimizer is None:sgd(params, lr, batch_size)else:optimizer.step()train_l_sum += l.item()train_acc_sum += (y_hat.argmax(dim=1) == y).sum().item()n += y.shape[0]test_acc = evaluate_accuracy(test_iter, net)print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f'% (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))'''对x的形状转换'''
class FlattenLayer(nn.Module):def __init__(self):super(FlattenLayer, self).__init__()def forward(self, x):return x.view(x.shape[0], -1)'''作图函数,其中y轴使用了对数尺度,画出训练与测试的Loss图像'''
def semilogy(x_vals, y_vals, x_label, y_label, x2_vals = None, y2_vals = None,legend = None, figsize=(3.5, 2.5)):set_figsize(figsize)plt.xlabel(x_label)plt.ylabel(y_label)plt.semilogy(x_vals, y_vals)if x2_vals and y2_vals:plt.semilogy(x2_vals, y2_vals, linestyle=':')plt.legend(legend)plt.show()

main.py

import torch
import torch.nn as nn
import numpy as np
import sys
sys.path.append("..")
import d2lzh_pytorch as d2ldef dropout(X, drop_prob):X = X.float()assert 0 <= drop_prob <= 1keep_prob = 1 - drop_prob# 这种情况下把全部元素都丢弃if keep_prob == 0:return torch.zeros_like(X)mask = (torch.rand(X.shape) < keep_prob).float()return mask * X / keep_prob# 定义模型参数
num_inputs, num_hiddens1, num_hiddens2, num_outputs = 784, 256, 256, 10
w1 = torch.tensor(np.random.normal(0, 0.01, (num_inputs, num_hiddens1)), dtype = torch.float, requires_grad=True)
b1 = torch.zeros(num_hiddens1, requires_grad=True)
w2 = torch.tensor(np.random.normal(0, 0.01, (num_hiddens1, num_hiddens2)), dtype = torch.float, requires_grad=True)
b2 = torch.zeros(num_hiddens2, requires_grad=True)
w3 = torch.tensor(np.random.normal(0, 0.01, (num_hiddens2, num_outputs)), dtype = torch.float, requires_grad=True)
b3 = torch.zeros(num_outputs, requires_grad=True)
params = [w1, b1, w2, b2, w3, b3]# 定义模型
drop_prob1, drop_prob2 = 0.2, 0.5def net(X, is_training = True):X = X.view(-1, num_inputs)H1 = (torch.mm(X, w1) + b1).relu()if is_training:H1 = dropout(H1, drop_prob1)H2 = (torch.matmul(H1, w2) + b2).relu()if is_training:H2 = dropout(H2, drop_prob2)return torch.matmul(H2, w3) + b3# 测试与训练模型
num_epochs, lr, batch_size = 5, 100.0, 256
loss = torch.nn.CrossEntropyLoss()
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, params, lr)

简洁实现

import torch
import torch.nn as nn
import numpy as np
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l# 定义参数,损失函数,并获取数据集
num_inputs, num_hiddens1, num_hiddens2, num_outputs = 784, 256, 256, 10
num_epochs, lr, batch_size = 5, 100.0, 256
loss = torch.nn.CrossEntropyLoss()
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
drop_prob1, drop_prob2 = 0.2, 0.5# 定义模型
net = nn.Sequential(d2l.FlattenLayer(),nn.Linear(num_inputs, num_hiddens1),nn.ReLU(),nn.Dropout(drop_prob1),nn.Linear(num_hiddens1, num_hiddens2),nn.ReLU(),nn.Dropout(drop_prob2),nn.Linear(num_hiddens2, num_outputs)
)
for param in net.parameters():nn.init.normal_(param, mean = 0, std = 0.01)optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)

小结

  • 我们可以通过使用丢弃法应对过拟合.
  • 丢弃法只在训练模型时使用.

Pytorch与drop_out(丢弃法)相关推荐

  1. PyTorch——Dropout(丢弃法)

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

  2. 【pytorch】过拟合的应对办法 —— 丢弃法(dropout)

    文章目录 一.什么是丢弃法,为什么丢弃法可以缓解过拟合? 二.丢弃法的手动实现 三.丢弃法的pytorch实现 参考 关于过拟合.欠拟合的解释可以参考我的博文:[pytorch]过拟合和欠拟合详解,并 ...

  3. [pytorch、学习] - 3.13 丢弃法

    参考 3.13 丢弃法 过拟合问题的另一种解决办法是丢弃法.当对隐藏层使用丢弃法时,隐藏单元有一定概率被丢弃. 3.12.1 方法 3.13.2 从零开始实现 import torch import ...

  4. 动手学深度学习V2.0(Pytorch)——13.丢弃法

    文章目录 1. 课件讲解 插一句(正则的分类) 2. Q&A 2.1 dropout是初次生效,还是每次都重新选取概率 2.2 dropout的感性评价 2.3 dropout随机置0对求梯度 ...

  5. 丢弃法——dropout

    <动手学深度学习pytorch>部分学习笔记,仅用作自己复习. 丢弃法--dropout 除了权重衰减以外,深度学习模型常使⽤丢弃法(dropout) 来应对过拟合问题.丢弃法有一些不同的 ...

  6. 《动手学深度学习》丢弃法(dropout)

    丢弃法(dropout) 丢弃法 方法 从零开始实现 定义模型参数 定义模型 训练和测试模型 简洁实现 小结 参考文献 丢弃法 除了前一节介绍的权重衰减以外,深度学习模型常常使用丢弃法(dropout ...

  7. 【深度学习】丢弃法(dropout)

    丢弃法 在小虾的这篇文章中介绍了权重衰减来应对过拟合问题(https://blog.csdn.net/qq_33432841/article/details/107879937),下面在介绍一种应对过 ...

  8. 丢弃法(dropout)

    1 对于丢弃法的一点小思考 (1) 对于模型设计我们可以把隐藏层设计的稍微大一点然后用drop out控制隐藏层大小这样的设计可能比隐藏层设计的小一点的效果更好,防止过拟合,drop out 其实就是 ...

  9. 丢弃法Dropout

    丢弃法Dropout:一种抑制过拟合的方法. 上图中提到的两种解决方案:1.downgrade_in_infer:训练时随机丢弃一部分神经元:预测时不丢弃神经元,这里提到的不丢弃神经元是指预测时不丢弃 ...

最新文章

  1. 用ASP.NET建立一个在线RSS新闻聚合器(3)
  2. 三十、基本地址变换机构
  3. NTT DOCOMO将部署多供应商NFV技术
  4. RabbitMQ下载与安装(window版)
  5. Yii2.0 对数据库 查询的一些简单的操作(转载)
  6. linux下oracle 9204 soft only,linux 下oracle 9i的安装
  7. jvisualvm.exe远程连接tomcat
  8. NASM汇编语言与计算机系统04-实模式-屏幕显示不定长度的字符串(cmp/je)
  9. yolov5论文叫什么_熬夜写论文是一种怎样的体验
  10. python类中包含一个特殊的变量、它表示当前对象自身_知到APP教师职场礼仪第七单元章节测试网课答案大学课后答案...
  11. TypeScript算法专题 - blog3 - 对TypeScript链表实现中的一些问题总结与改进
  12. 这波疫情,中国会弯道超车么?
  13. 什么?吴宗宪在淘宝帮你买买买?
  14. dubbo实现两个系统之间的通信
  15. signature=fd45b8c9a90eebce5d855f07302ab4ee,Private Use Area
  16. 笔记-知识产权与标准化知识-中华人民共和国招标投标法实施条例
  17. 小学计算机教室培训心得,小学教师培训心得体会【通用版】
  18. itest软件测试工具,itest(爱测试)
  19. dxf解析python_Python 读取DXF文件
  20. 电子计算机X线体层摄影,X线计算机体层摄影.pdf

热门文章

  1. 格林函数(Green’s function)
  2. CIE (PCI Express) 1x, 4x, 8x, 16x总线端子说明
  3. 哪家的蓝牙耳机质量比较好?2022真无线蓝牙耳机排名
  4. opencv进行双目标定以及极线校正 python代码
  5. 常用的调度算法(包含实例)|操作系统
  6. 示波器实现全自动测试
  7. 学习mybatis plus
  8. Excel操作:使用日期函数
  9. 计算机二级试题操作题图文讲解,计算机二级Excel篇-实操真题详解24
  10. 创建glance镜像报错HTTP403