tensorflow4 代价函数、dropout、优化器
這次扔使用上次的mnist數據集分類的簡單版本程序,使用不同的代價函數做計算
二次代價函數
激活函數
使用二次代價函數的運行結果
# 使用二次代價函數的結果-精度 # 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-
問題所在:
-
需求情況:
?距離目標越近,調整越慢,越遠則調整越快
交叉熵代價函數
- 這個怎么來的?
因為sigmoid函數的公式:
計算得到(自己求導試試)
信息熵的文章
熵其實是信息量的期望值,它是一個隨機變量的確定性的度量。熵越大,變量的取值越不確定,反之就越確定。
–>與二次代價函數相比的優勢所在。
越接近邁越小的步子
-
S形函數
?比如:sigmoid函數 -
優勢
?調整的比較合理,速度快
使用交叉熵的結果
# # 交叉熵代價函數 # 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對數似然代價函數
似然最大估計
擬合
-
回歸
-
欠擬合
-
正確擬合
-
過擬合:(未知數過多而已有的公式過少)
-
分類
防止過擬合
n是訓練集的大小,λ是一個參數可以調節正則項的重要性,w是權值,C是誤差
- dropout:
如果一個神經元的參數幾乎都等于0的話,那么多少乘以0都還是0,所以可以認為這個神經元不存在,將之刪除。
這樣可以簡化神經網絡的
在執行過程中,可以只讓部分神經元工作,而另一部分不工作,如右圖所示。實線神經元為工作的神經元,虛線則為不工作的神經元
demo2dropout
-
加一個中間層
-
初始化為0,并不是好的初始化方式,一般使用隨機數初始化。
# 加一個中間層keep_prob=tf.placeholder(tf.float32)# 創建一個簡單的神經網絡,直接784投影到10上W1=tf.Variable(tf.truncated_normal([784,2000],stddev=0.1))# tf.truncated_normal(shape, mean, stddev) :shape表示生成張量的維度,mean是均值,stddev是標準差.正態分布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是標準差.正態分布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)#實際上用不著這么多層,這么多個神經元,這里是故意整這么多的,會出現過擬合情況(未知數過多而已有的公式過少)W3=tf.Variable(tf.truncated_normal([2000,1000],stddev=0.1))# tf.truncated_normal(shape, mean, stddev) :shape表示生成張量的維度,mean是均值,stddev是標準差.正態分布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-->設置他有多少個神經元是工作的:0-1.1:100%工作。0.5:一半是在工作的W4=tf.Variable(tf.truncated_normal([1000,10],stddev=0.1))b4=tf.Variable(tf.zeros([10]))#b的形狀依據每個批次的形狀而定,在中間層時,每個批次未必是一行n列,也可能變換成多行多列,此時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%的神經元都工作的情況下
使用dropout
70%神經元工作情況下的訓練結果
測試時仍有100%在工作,收斂速度很快,但后來上不去了,而且測試精度與訓練精度相差很大
收斂速度變慢了,但三十次所達到的還不是極限,這個精度還能上升,并且,測試精度和訓練精度相差不大
優化器Optimizer
訓練時間:標準>批量>隨機
噪音:標準<批量<隨機
批量用的多
W:要訓練的參數
J(W):代價函數
對W的梯度
gt同上,是梯度。
效果
星:全局最小
速度:adadelta最快,SGD最慢。momentum很快,但是路徑繞,NAG相當于聰明版本的momentum
鞍頂問題
除了adaelta和adagrad外,都在窩里來回晃悠。后來除了SGD以外的才晃悠出來,如下
- SGD:慢,而且鞍頂也無法逃離,那是不是不用了?
每種優化器都有其適用范圍,新的都快,但是SGD準確率高。
不知道哪個優化器最后的結果準確率最高,這個說不準,可能都要測試一次
優化器的比較:
https://blog.csdn.net/fengchao03/article/details/78208414
https://blog.csdn.net/weixin_40170902/article/details/80092628
https://www.jianshu.com/p/ee39eca29117
優化demo1
總結
以上是生活随笔為你收集整理的tensorflow4 代价函数、dropout、优化器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Memcached 使用 及.NET客户
- 下一篇: 知识表示与知识图谱--介绍