ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

机器学习 Dropout方法

2022-04-05 14:31:16  阅读:390  来源: 互联网

标签:机器 Dropout 学习 train test ratio dropout self


解决神经网络过拟合问题—Dropout方法

    • 一、what is Dropout?如何实现?
    • 二、使用和不使用Dropout的训练结果对比

 

一、what is Dropout?如何实现?

如果网络模型复杂,L2范数权值衰减方法就难以对付过拟合。这种情况下,用Dropout方法。

Dropout是一种在学习过程中随机删除神经元的方法。

训练时,随机选出隐藏层神经元,然后将其删除。每传递一次数据,就会随机选择要删除的神经元。

测试时,对各个神经元的输出,要成上训练时的删除比例。

实现代码:

每次正向传播,self.mask以False形式保存要删除的神经元。

self.mask = np.random.rand(*x.shape) > self.dropout_ratio

self.mask随机生成和x形状相同数组,将值大于dropout_ratio元素设为True。

每次反向传播,如果正向传播时候传递了信号的神经元,反向传按原样传,反之不传。

class Dropout:
    """
    http://arxiv.org/abs/1207.0580
    """
    def __init__(self, dropout_ratio=0.5):
        self.dropout_ratio = dropout_ratio
        self.mask = None

    def forward(self, x, train_flg=True):
        if train_flg:
            self.mask = np.random.rand(*x.shape) > self.dropout_ratio
            return x * self.mask
        else:
            return x * (1.0 - self.dropout_ratio)

    def backward(self, dout):
        return dout * self.mask

二、使用和不使用Dropout的训练结果对比

从MNIST数据集里只选出来300个数据,然后增加网络复杂幅度用7层网络,每层100个神经元,激活函数ReLU。

# coding: utf-8
import os
import sys
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.multi_layer_net_extend import MultiLayerNetExtend
from common.trainer import Trainer

(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)

# 为了再现过拟合,减少学习数据
x_train = x_train[:300]
t_train = t_train[:300]

# 设定是否使用Dropuout,以及比例 ========================
use_dropout = True  # 不使用Dropout的情况下为False
dropout_ratio = 0.2
# ====================================================

network = MultiLayerNetExtend(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100],
                              output_size=10, use_dropout=use_dropout, dropout_ration=dropout_ratio)
trainer = Trainer(network, x_train, t_train, x_test, t_test,
                  epochs=301, mini_batch_size=100,
                  optimizer='sgd', optimizer_param={'lr': 0.01}, verbose=True)
trainer.train()

train_acc_list, test_acc_list = trainer.train_acc_list, trainer.test_acc_list

# 绘制图形==========
markers = {'train': 'o', 'test': 's'}
x = np.arange(len(train_acc_list))
plt.plot(x, train_acc_list, marker='o', label='train', markevery=10)
plt.plot(x, test_acc_list, marker='s', label='test', markevery=10)
plt.xlabel("epochs")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
plt.legend(loc='lower right')
plt.show()

下图是使用Dropout的情况

在这里插入图片描述

下图是不使用Dropout的情况。

在这里插入图片描述

对比得出,使用Dropout,训练数据和测试数据的识别精度的差距变小了,并且训练数据也没有到100%识别。

标签:机器,Dropout,学习,train,test,ratio,dropout,self
来源: https://www.cnblogs.com/jiangyiming/p/16102279.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有