解决神经网络过拟合问题—Dropout方法、python实现
生活随笔
收集整理的這篇文章主要介紹了
解决神经网络过拟合问题—Dropout方法、python实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解決神經網絡過擬合問題—Dropout方法
- 一、what is Dropout?如何實現?
- 二、使用和不使用Dropout的訓練結果對比
一、what is Dropout?如何實現?
如果網絡模型復雜,L2范數權值衰減方法就難以對付過擬合。這種情況下,用Dropout方法。
Dropout是一種在學習過程中隨機刪除神經元的方法。
訓練時,隨機選出隱藏層神經元,然后將其刪除。每傳遞一次數據,就會隨機選擇要刪除的神經元。
測試時,對各個神經元的輸出,要成上訓練時的刪除比例。
實現代碼:
每次正向傳播,self.mask以False形式保存要刪除的神經元。
self.mask = np.random.rand(*x.shape) > self.dropout_ratioself.mask隨機生成和x形狀相同數組,將值大于dropout_ratio元素設為True。
每次反向傳播,如果正向傳播時候傳遞了信號的神經元,反向傳按原樣傳,反之不傳。
class Dropout:"""http://arxiv.org/abs/1207.0580"""def __init__(self, dropout_ratio=0.5):self.dropout_ratio = dropout_ratioself.mask = Nonedef forward(self, x, train_flg=True):if train_flg:self.mask = np.random.rand(*x.shape) > self.dropout_ratioreturn x * self.maskelse: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方法、python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯基础练习1-15(python)
- 下一篇: supervisor 子进程退出_用su