網站首頁 編程語言 正文
前言
神經網絡在設置的神經網絡足夠復雜的情況下,可以無限逼近一段非線性連續函數,但是如果神經網絡設置的足夠復雜,將會導致過擬合(overfitting)的出現,就好像下圖這樣。
看到這個藍色曲線,我就知道:
很明顯藍色曲線是overfitting的結果,盡管它很好的擬合了每一個點的位置,但是曲線是歪歪曲曲扭扭捏捏的,這個的曲線不具有良好的魯棒性,在實際工程實驗中,我們更希望得到如黑色線一樣的曲線。
tf.nn.dropout函數介紹
tf.nn.dropout是tensorflow的好朋友,它的作用是為了減輕過擬合帶來的問題而使用的函數,它一般用在每個連接層的輸出。
Dropout就是在不同的訓練過程中,按照一定概率使得某些神經元停止工作。也就是讓每個神經元按照一定的概率停止工作,這次訓練過程中不更新權值,也不參加神經網絡的計算。但是它的權重依然存在,下次更新時可能會使用到它。
def dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
x 一般是每一層的輸出
keep_prob,保留keep_prob的神經元繼續工作,其余的停止工作與更新
在實際定義每一層神經元的時候,可以加入dropout。
def add_layer(inputs,in_size,out_size,n_layer,activation_function = None,keep_prob = 1):
layer_name = 'layer%s'%n_layer
with tf.name_scope(layer_name):
with tf.name_scope("Weights"):
Weights = tf.Variable(tf.random_normal([in_size,out_size]),name = "Weights")
tf.summary.histogram(layer_name+"/weights",Weights)
with tf.name_scope("biases"):
biases = tf.Variable(tf.zeros([1,out_size]) + 0.1,name = "biases")
tf.summary.histogram(layer_name+"/biases",biases)
with tf.name_scope("Wx_plus_b"):
Wx_plus_b = tf.matmul(inputs,Weights) + biases
#dropout一般加載每個神經層的輸出
Wx_plus_b = tf.nn.dropout(Wx_plus_b,keep_prob)
#看這里看這里,dropout在這里。
tf.summary.histogram(layer_name+"/Wx_plus_b",Wx_plus_b)
if activation_function == None :
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
tf.summary.histogram(layer_name+"/outputs",outputs)
return outputs
但需要注意的是,神經元的輸出層不可以定義dropout參數。因為輸出層就是輸出的是結果,在輸出層定義參數的話,就會導致輸出結果被dropout掉。
例子
本次例子使用sklearn.datasets,在進行測試的時候,我們只需要改變最下方keep_prob:0.5的值即可,1代表不進行dropout。
代碼
import tensorflow as tf
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
digits = load_digits()
X = digits.data
y = digits.target
y = LabelBinarizer().fit_transform(y)
X_train,X_test,Y_train,Y_test = train_test_split(X,y,test_size = 500)
def add_layer(inputs,in_size,out_size,n_layer,activation_function = None,keep_prob = 1):
layer_name = 'layer%s'%n_layer
with tf.name_scope(layer_name):
with tf.name_scope("Weights"):
Weights = tf.Variable(tf.random_normal([in_size,out_size]),name = "Weights")
tf.summary.histogram(layer_name+"/weights",Weights)
with tf.name_scope("biases"):
biases = tf.Variable(tf.zeros([1,out_size]) + 0.1,name = "biases")
tf.summary.histogram(layer_name+"/biases",biases)
with tf.name_scope("Wx_plus_b"):
Wx_plus_b = tf.matmul(inputs,Weights) + biases
Wx_plus_b = tf.nn.dropout(Wx_plus_b,keep_prob)
tf.summary.histogram(layer_name+"/Wx_plus_b",Wx_plus_b)
if activation_function == None :
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
tf.summary.histogram(layer_name+"/outputs",outputs)
return outputs
def compute_accuracy(x_data,y_data,prob = 1):
global prediction
y_pre = sess.run(prediction,feed_dict = {xs:x_data,keep_prob:prob})
correct_prediction = tf.equal(tf.arg_max(y_data,1),tf.arg_max(y_pre,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
result = sess.run(accuracy,feed_dict = {xs:x_data,ys:y_data,keep_prob:prob})
return result
keep_prob = tf.placeholder(tf.float32)
xs = tf.placeholder(tf.float32,[None,64])
ys = tf.placeholder(tf.float32,[None,10])
l1 = add_layer(xs,64,100,'l1',activation_function=tf.nn.tanh, keep_prob = keep_prob)
l2 = add_layer(l1,100,100,'l2',activation_function=tf.nn.tanh, keep_prob = keep_prob)
prediction = add_layer(l1,100,10,'l3',activation_function = tf.nn.softmax, keep_prob = 1)
with tf.name_scope("loss"):
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=ys,logits = prediction),name = 'loss')
tf.summary.scalar("loss",loss)
train = tf.train.AdamOptimizer(0.01).minimize(loss)
init = tf.initialize_all_variables()
merged = tf.summary.merge_all()
with tf.Session() as sess:
sess.run(init)
train_writer = tf.summary.FileWriter("logs/strain",sess.graph)
test_writer = tf.summary.FileWriter("logs/test",sess.graph)
for i in range(5001):
sess.run(train,feed_dict = {xs:X_train,ys:Y_train,keep_prob:0.5})
if i % 500 == 0:
print("訓練%d次的識別率為:%f。"%((i+1),compute_accuracy(X_test,Y_test,prob=0.5)))
train_result = sess.run(merged,feed_dict={xs:X_train,ys:Y_train,keep_prob:0.5})
test_result = sess.run(merged,feed_dict={xs:X_test,ys:Y_test,keep_prob:0.5})
train_writer.add_summary(train_result,i)
test_writer.add_summary(test_result,i)
keep_prob = 0.5
訓練結果為:
訓練1次的識別率為:0.086000。
訓練501次的識別率為:0.890000。
訓練1001次的識別率為:0.938000。
訓練1501次的識別率為:0.952000。
訓練2001次的識別率為:0.952000。
訓練2501次的識別率為:0.946000。
訓練3001次的識別率為:0.940000。
訓練3501次的識別率為:0.932000。
訓練4001次的識別率為:0.970000。
訓練4501次的識別率為:0.952000。
訓練5001次的識別率為:0.950000。
這是keep_prob = 0.5時tensorboard中的loss的圖像:
keep_prob = 1
訓練結果為:
訓練1次的識別率為:0.160000。
訓練501次的識別率為:0.754000。
訓練1001次的識別率為:0.846000。
訓練1501次的識別率為:0.854000。
訓練2001次的識別率為:0.852000。
訓練2501次的識別率為:0.852000。
訓練3001次的識別率為:0.860000。
訓練3501次的識別率為:0.854000。
訓練4001次的識別率為:0.856000。
訓練4501次的識別率為:0.852000。
訓練5001次的識別率為:0.852000。
這是keep_prob = 1時tensorboard中的loss的圖像:
可以明顯看出來keep_prob = 0.5的訓練集和測試集的曲線更加貼近。
原文鏈接:https://blog.csdn.net/weixin_44791964/article/details/96972541
相關推薦
- 2022-05-25 詳解C++類的成員函數做友元產生的循環依賴問題_C 語言
- 2022-05-12 Kotlin generateSequence 迭代器 從1開始產生1000個素數 take 得介紹
- 2022-11-19 Linux下定時自動備份Docker中所有SqlServer數據庫的腳本_docker
- 2022-12-08 Matlab實現獲取文件夾下所有指定后綴的文件_C 語言
- 2022-12-04 React?Native自定義Android的SSL證書鏈校驗_React
- 2022-05-28 使用Docker部署ASP.NET?Core程序_基礎應用
- 2022-07-22 UC瀏覽器兼容問題
- 2022-05-05 Python實現蟻群算法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支