隱含層振诬,指除輸入蹭睡、輸出層外,的中間層赶么。輸入肩豁、輸出層對(duì)外可見(jiàn)。隱含層對(duì)外不可見(jiàn)辫呻。理論上清钥,只要隱含層節(jié)點(diǎn)足夠多,只有一個(gè)隱含層放闺,神經(jīng)網(wǎng)絡(luò)可以擬合任意函數(shù)祟昭。隱含層越多,越容易擬合復(fù)雜函數(shù)怖侦。擬合復(fù)雜函數(shù)篡悟,所需隱含節(jié)點(diǎn)數(shù),隨隱含層數(shù)量增多指數(shù)下降匾寝。
過(guò)擬合搬葬,模型預(yù)測(cè)準(zhǔn)確率在訓(xùn)練集上升,在測(cè)試集下降旗吁。泛化性不好踩萎,模型記憶當(dāng)前數(shù)據(jù)特征停局,不具備推廣能力很钓。參數(shù)太多。Hinton教授團(tuán)隊(duì)董栽,Dropout码倦。隨便丟棄部分輸出數(shù)據(jù)節(jié)點(diǎn)。創(chuàng)造新隨機(jī)樣本锭碳,增大樣本量袁稽,減少特征數(shù)量,防止過(guò)擬合擒抛。bagging方法推汽,對(duì)特征新種采樣补疑。
SGD參數(shù)難調(diào)試,SGD設(shè)置不同學(xué)習(xí)速率歹撒,結(jié)果可能差異巨大莲组。神經(jīng)網(wǎng)絡(luò)很多局部最優(yōu)解可以達(dá)到比較好分類效果,全局最優(yōu)反而容易過(guò)擬合暖夭。Adagrad锹杈、Adam、Adadelta自適應(yīng)方法迈着,減輕調(diào)試參數(shù)負(fù)擔(dān)竭望。SGD需要調(diào)試學(xué)習(xí)速率、Momentum裕菠、Nesterov參數(shù)咬清。
梯度彌散(Gradient Vanishment)。Sigmoid函數(shù)具有限制性奴潘,輸出數(shù)值在0?1,最符合概率輸出定義枫振。非線性Sigmoid函數(shù),信號(hào)特征空間映射萤彩,中央?yún)^(qū)信號(hào)增益大粪滤,兩側(cè)區(qū)信息增益小。中央?yún)^(qū)像神經(jīng)元興奮態(tài)雀扶,兩側(cè)區(qū)像神經(jīng)元抑制態(tài)杖小。訓(xùn)練時(shí),重要特征放中央?yún)^(qū)愚墓,非重要特征放兩側(cè)區(qū)予权。Sigmoid比最初期線性激活函數(shù)y=x,階梯激活函數(shù)y=-1(x<0)|y=1(x>=0)浪册、y=0(x<0)|y=1(x>=0)好扫腺。Sigmoid函數(shù)反向傳播梯度值在多層傳遞指級(jí)急劇減小,根據(jù)訓(xùn)練數(shù)據(jù)反饋更新神經(jīng)網(wǎng)絡(luò)參數(shù)非常緩慢村象,不起訓(xùn)練作用笆环。
ReLU,非線性函數(shù)y=max(0,x)厚者,坐標(biāo)軸上折線躁劣,當(dāng)x<=0,y=0,x>0,y=x。人腦閾值響應(yīng)機(jī)制库菲,信號(hào)超過(guò)某個(gè)閾值账忘,神經(jīng)元興奮激活狀態(tài),平時(shí)抑制狀態(tài)。ReLU很好傳遞梯度鳖擒,多層反向傳播溉浙,梯度不會(huì)大幅縮小,適合很深神經(jīng)網(wǎng)絡(luò)蒋荚,不需要無(wú)監(jiān)督逐層初始化權(quán)重放航。ReLU變化,單側(cè)抑制圆裕,相對(duì)寬閣興奮邊界广鳍,稀疏激活性。神經(jīng)元同時(shí)激活1~4%吓妆,選擇性響應(yīng)很少部分輸入信號(hào)赊时,屏蔽大量不相關(guān)信號(hào),更高效提取重要特征行拢。傳統(tǒng)Sigmoid函數(shù)接近一半神經(jīng)元被激活祖秒。Softplus,單側(cè)抑制舟奠,沒(méi)有稀疏激活性竭缝。ReLU及變種(EIU,PReLU,RReLU)為最注流激活函數(shù)。輸出層一般用Sigmoid函數(shù)沼瘫,最接近概率輸出分布抬纸。
隱含層可以解決XOR問(wèn)題,用曲線劃分兩類樣本耿戚。隱含層越多湿故,原有特征越抽象變換。是多層神經(jīng)網(wǎng)絡(luò)(多層感知機(jī) MLP)功能膜蛔。
網(wǎng)絡(luò)神經(jīng)加上隱含層坛猪,使用Dropout、自適應(yīng)學(xué)習(xí)速率Adagrad,解決梯度彌散激活函數(shù)ReLU皂股。
載入TensorFlow墅茉,加載MNIST數(shù)據(jù)集,創(chuàng)建Interactive Session呜呐。
隱含層參數(shù)設(shè)置Variable初始化就斤。in_units輸入節(jié)點(diǎn)數(shù),h1_units隱含層輸出節(jié)點(diǎn)數(shù)設(shè)300(200?1000區(qū)別不大)卵史。W1隱含層權(quán)重初始化截?cái)嗾龖B(tài)分布標(biāo)準(zhǔn)差0.1战转,b1偏置設(shè)0搜立。模型激活函數(shù)ReLU以躯,正態(tài)分布給參數(shù)加噪聲,打破完全對(duì)稱避免0梯度。偏置賦小非零值避免dead neuron(死亡神經(jīng)元)忧设。最后輸出層Softmax刁标,權(quán)重W2偏置b2初始化0。Sigmoid址晕,0附近最敏感膀懈,梯度最大。
訓(xùn)練和預(yù)測(cè)谨垃,Dropout比率keep_prob(保留節(jié)點(diǎn)概率)不同启搂。訓(xùn)練小于1。預(yù)測(cè)等于1刘陶。Dropout比率為計(jì)算圖輸入胳赌,定義placeholder。
定義模型結(jié)構(gòu)匙隔。tf.nn.relu(tf.matmul(x,W1+b1))疑苫,實(shí)現(xiàn)激活函數(shù)為ReLU的hidden1隱含層,y=relu(W1x+b1)纷责。tf.nn.dropout實(shí)現(xiàn)Dropout捍掺,隨機(jī)置0分部節(jié)點(diǎn)。keep_prob參數(shù)再膳,保留數(shù)據(jù)不置為0比例挺勿,訓(xùn)練應(yīng)小于1,制造隨機(jī)性,防止過(guò)擬合喂柒,預(yù)測(cè)等于1,用全部特征預(yù)測(cè)樣本類別满钟。輸出層Softmax。
定義算法公式胳喷,神經(jīng)網(wǎng)絡(luò)forward計(jì)算湃番。定義損失函數(shù)(交叉信息熵)和選擇優(yōu)化器(自適應(yīng)優(yōu)化器Adagrad),優(yōu)化loss吭露,學(xué)習(xí)速率0.3,使用tf.train.AdagradOptimizer 吠撮。Adadelta、Adam優(yōu)化器讲竿。
訓(xùn)練泥兰,keep_prob計(jì)算圖輸入,訓(xùn)練時(shí)設(shè)0.75,保留75%節(jié)點(diǎn)题禀,其余25%置0鞋诗。越復(fù)雜越大規(guī)模神經(jīng)網(wǎng)絡(luò),Dropout效果越顯著迈嘹。隱含層削彬,需要更多訓(xùn)練迭代優(yōu)化模型參數(shù)全庸。3000個(gè)bacth,每個(gè)bacth100條樣本融痛,30萬(wàn)樣本壶笼。相當(dāng)全數(shù)據(jù)集5輪epoch迭代。增大循環(huán)次數(shù)雁刷,準(zhǔn)確率略有提高覆劈。
準(zhǔn)確率評(píng)測(cè),加入keep_prob輸入沛励,等于1责语。
沒(méi)有隱含層Softmax Regression,直接從圖像像素推斷是哪個(gè)數(shù)字目派,沒(méi)有特征抽象過(guò)程鹦筹。多層神經(jīng)網(wǎng)絡(luò)隱含層,組合高階特征或組件址貌,再組合成數(shù)字铐拐,實(shí)現(xiàn)精準(zhǔn)匹配分類。隱含層輸出高階特征組件可以復(fù)用练对,每一類判別遍蟋、概率輸出共享。
全連接神經(jīng)網(wǎng)絡(luò)(Fully Connected Network,FCN,MLP的另一種說(shuō)法)局限螟凭,很深網(wǎng)絡(luò)虚青,很多隱藏節(jié)點(diǎn),很大迭代輪數(shù)螺男,也難達(dá)到99%以上準(zhǔn)確率棒厘。
# Create the model
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
sess = tf.InteractiveSession()
in_units = 784
h1_units = 300
W1 = tf.Variable(tf.truncated_normal([in_units, h1_units], stddev=0.1))
b1 = tf.Variable(tf.zeros([h1_units]))
W2 = tf.Variable(tf.zeros([h1_units, 10]))
b2 = tf.Variable(tf.zeros([10]))
x = tf.placeholder(tf.float32, [None, in_units])
keep_prob = tf.placeholder(tf.float32)
hidden1 = tf.nn.relu(tf.matmul(x, W1) + b1)
hidden1_drop = tf.nn.dropout(hidden1, keep_prob)
y = tf.nn.softmax(tf.matmul(hidden1_drop, W2) + b2)
# Define loss and optimizer
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.AdagradOptimizer(0.3).minimize(cross_entropy)
# Train
tf.global_variables_initializer().run()
for i in range(3000):
batch_xs, batch_ys = mnist.train.next_batch(100)
train_step.run({x: batch_xs, y_: batch_ys, keep_prob: 0.75})
# Test trained model
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))
參考資料:
《TensorFlow實(shí)戰(zhàn)》
歡迎付費(fèi)咨詢(150元每小時(shí)),我的微信:qingxingfengzi