日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

解决神经网络过拟合问题—Dropout方法、python实现

發布時間:2025/3/12 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决神经网络过拟合问题—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_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_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实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。