tensorflow4 代价函数、dropout、优化器
這次扔使用上次的mnist數(shù)據(jù)集分類的簡(jiǎn)單版本程序,使用不同的代價(jià)函數(shù)做計(jì)算
二次代價(jià)函數(shù)
激活函數(shù)
使用二次代價(jià)函數(shù)的運(yùn)行結(jié)果
# 使用二次代價(jià)函數(shù)的結(jié)果-精度 # loss=tf.reduce_mean(tf.square(y-prediction)) # 0.8322 # 0.8698 # 0.8818 # 0.8882 # 0.8935 # 0.8965 # 0.8999 # 0.9017 # 0.9039 # 0.9054 # 0.9062 # 0.9074 # 0.9081 # 0.9095 # 0.9099 # 0.91 # 0.9108 # 0.9125 # 0.9132 # 0.9132 # 0.9136-
問(wèn)題所在:
-
需求情況:
?距離目標(biāo)越近,調(diào)整越慢,越遠(yuǎn)則調(diào)整越快
交叉熵代價(jià)函數(shù)
- 這個(gè)怎么來(lái)的?
因?yàn)閟igmoid函數(shù)的公式:
計(jì)算得到(自己求導(dǎo)試試)
信息熵的文章
熵其實(shí)是信息量的期望值,它是一個(gè)隨機(jī)變量的確定性的度量。熵越大,變量的取值越不確定,反之就越確定。
–>與二次代價(jià)函數(shù)相比的優(yōu)勢(shì)所在。
越接近邁越小的步子
-
S形函數(shù)
?比如:sigmoid函數(shù) -
優(yōu)勢(shì)
?調(diào)整的比較合理,速度快
使用交叉熵的結(jié)果
# # 交叉熵代價(jià)函數(shù) # loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction)) # 0.8334 # 0.895 # 0.9024 # 0.9057 # 0.9091 # 0.9108 # 0.912 # 0.913 # 0.9159 # 0.9162 # 0.9169 # 0.9191 # 0.9183 # 0.9203 # 0.9197 # 0.9201 # 0.9204 # 0.9206 # 0.9218 # 0.9215 # 0.9218對(duì)數(shù)似然代價(jià)函數(shù)
似然最大估計(jì)
擬合
-
回歸
-
欠擬合
-
正確擬合
-
過(guò)擬合:(未知數(shù)過(guò)多而已有的公式過(guò)少)
-
分類
防止過(guò)擬合
n是訓(xùn)練集的大小,λ是一個(gè)參數(shù)可以調(diào)節(jié)正則項(xiàng)的重要性,w是權(quán)值,C是誤差
- dropout:
如果一個(gè)神經(jīng)元的參數(shù)幾乎都等于0的話,那么多少乘以0都還是0,所以可以認(rèn)為這個(gè)神經(jīng)元不存在,將之刪除。
這樣可以簡(jiǎn)化神經(jīng)網(wǎng)絡(luò)的
在執(zhí)行過(guò)程中,可以只讓部分神經(jīng)元工作,而另一部分不工作,如右圖所示。實(shí)線神經(jīng)元為工作的神經(jīng)元,虛線則為不工作的神經(jīng)元
demo2dropout
-
加一個(gè)中間層
-
初始化為0,并不是好的初始化方式,一般使用隨機(jī)數(shù)初始化。
# 加一個(gè)中間層keep_prob=tf.placeholder(tf.float32)# 創(chuàng)建一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò),直接784投影到10上W1=tf.Variable(tf.truncated_normal([784,2000],stddev=0.1))# tf.truncated_normal(shape, mean, stddev) :shape表示生成張量的維度,mean是均值,stddev是標(biāo)準(zhǔn)差.正態(tài)分布b1=tf.Variable(tf.zeros([2000])+0.1)L1=tf.nn.tanh(tf.matmul(x,W1)+b1)L1_drop=tf.nn.dropout(L1,keep_prob)W2=tf.Variable(tf.truncated_normal([2000,2000],stddev=0.1))# tf.truncated_normal(shape, mean, stddev) :shape表示生成張量的維度,mean是均值,stddev是標(biāo)準(zhǔn)差.正態(tài)分布b2=tf.Variable(tf.zeros([2000])+0.1)L2=tf.nn.tanh(tf.matmul(L1_drop,W2)+b2)L2_drop=tf.nn.dropout(L2,keep_prob)#實(shí)際上用不著這么多層,這么多個(gè)神經(jīng)元,這里是故意整這么多的,會(huì)出現(xiàn)過(guò)擬合情況(未知數(shù)過(guò)多而已有的公式過(guò)少)W3=tf.Variable(tf.truncated_normal([2000,1000],stddev=0.1))# tf.truncated_normal(shape, mean, stddev) :shape表示生成張量的維度,mean是均值,stddev是標(biāo)準(zhǔn)差.正態(tài)分布b3=tf.Variable(tf.zeros([1000])+0.1)L3=tf.nn.tanh(tf.matmul(L2_drop,W3)+b3)L3_drop=tf.nn.dropout(L3,keep_prob)# keep_prob-->設(shè)置他有多少個(gè)神經(jīng)元是工作的:0-1.1:100%工作。0.5:一半是在工作的W4=tf.Variable(tf.truncated_normal([1000,10],stddev=0.1))b4=tf.Variable(tf.zeros([10]))#b的形狀依據(jù)每個(gè)批次的形狀而定,在中間層時(shí),每個(gè)批次未必是一行n列,也可能變換成多行多列,此時(shí)b隨之改變。prediction=tf.nn.softmax(tf.matmul(L3_drop,W4)+b4)#(形狀(100,10)
不使用dropout
sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.0})
100%的神經(jīng)元都工作的情況下
使用dropout
70%神經(jīng)元工作情況下的訓(xùn)練結(jié)果
測(cè)試時(shí)仍有100%在工作,收斂速度很快,但后來(lái)上不去了,而且測(cè)試精度與訓(xùn)練精度相差很大
收斂速度變慢了,但三十次所達(dá)到的還不是極限,這個(gè)精度還能上升,并且,測(cè)試精度和訓(xùn)練精度相差不大
優(yōu)化器Optimizer
訓(xùn)練時(shí)間:標(biāo)準(zhǔn)>批量>隨機(jī)
噪音:標(biāo)準(zhǔn)<批量<隨機(jī)
批量用的多
W:要訓(xùn)練的參數(shù)
J(W):代價(jià)函數(shù)
對(duì)W的梯度
gt同上,是梯度。
效果
星:全局最小
速度:adadelta最快,SGD最慢。momentum很快,但是路徑繞,NAG相當(dāng)于聰明版本的momentum
鞍頂問(wèn)題
除了adaelta和adagrad外,都在窩里來(lái)回晃悠。后來(lái)除了SGD以外的才晃悠出來(lái),如下
- SGD:慢,而且鞍頂也無(wú)法逃離,那是不是不用了?
每種優(yōu)化器都有其適用范圍,新的都快,但是SGD準(zhǔn)確率高。
不知道哪個(gè)優(yōu)化器最后的結(jié)果準(zhǔn)確率最高,這個(gè)說(shuō)不準(zhǔn),可能都要測(cè)試一次
優(yōu)化器的比較:
https://blog.csdn.net/fengchao03/article/details/78208414
https://blog.csdn.net/weixin_40170902/article/details/80092628
https://www.jianshu.com/p/ee39eca29117
優(yōu)化demo1
總結(jié)
以上是生活随笔為你收集整理的tensorflow4 代价函数、dropout、优化器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Memcached 使用 及.NET客户
- 下一篇: 知识表示与知识图谱--介绍