部分知識點筆記:
正向傳播、反向傳播(bp演算法)
啟用函式:
sigmoid函式、tanh函式、relu函式、swish函式
softmax演算法——處理分類問題(伴隨的分類標籤都為one_hot編碼)
損失函式:
描述模型**值與真實值的差距大小(常用的演算法:均值平方差和交叉熵),交叉熵 **輸入樣本屬於某一類的概率。交叉熵也是值越小,代表**結果越準。
損失函式的選取:如果輸入的是實數、無界的值,損失函式使用平方差;如果輸入標籤是位向量(分類標誌),使用交叉熵會更合適。
常見的交叉熵函式有:
sigmoid交叉熵;softmax交叉熵;sparse交叉熵;加權sigmoid交叉熵。
梯度下降,用負梯度方向為搜尋方向,沿著梯度下降方向求解極小值。
常用的梯度下降方法:
批量梯度下降,隨機梯度下降,小批量梯度下降。
通常在程式中使用tf.train.***optimizer()來進行訓練。
設定學習率的大小,在精度和速度之間找到乙個平衡:學習率較大,訓練速度會提公升,精度不夠;學習率較小,精度提公升,耗費時間增加。
學習率衰減:當訓練剛開始時使用大的學習率加快速度,訓練到一定程度後使用小的學習率來提高精度。
learning_rate= tf.train.exponential_decay(starter_learning_rate,global_step,100000,0.96)
這種方式定義的學習率就是退化學習率,他的意思是當前迭代到global_step步,學習率每一步都按照每10萬步縮小到0.96%的速度衰退。
6.1 softmax應用
假設有乙個標籤labels和乙個網路輸出值logits
(1)兩次softmax實驗
(2)兩次交叉熵
(3)自建公式,將做兩次softmax的值放到公式中得到正確的值
**:
import tensorflow as tf
# 交叉熵實驗
labels = [[0,0,1],[0,1,0]]
logits = [[2,0.5,6],[0.1,0,3]]
logits_scaled = tf.nn.softmax(logits)
logits_scaled2 = tf.nn.softmax(logits_scaled) # 進行第二次softmax操作
result1 = tf.nn.softmax_cross_entropy_with_logits(labels=labels,logits = logits)
result2 = tf.nn.softmax_cross_entropy_with_logits(labels=labels,logits = logits_scaled)
result3 = -tf.reduce_sum(labels*tf.log(logits_scaled),1)
with tf.session() as sess:
print("scaled=",sess.run(logits_scaled))
print("scaled2=",sess.run(logits_scaled2))
# 經過第二次的softmax後,分布概率會有變化
print("rell=",sess.run(result1),"\n") #正確的開啟方式
print("rel2 = ",sess.run(result2),"\n")
# 如果將softmax變換完的值放進去會,就相當於第二次softmax的loss。所以會出錯
print("rel3=",sess.run(result3))
# ont_hot實驗
# 標籤總概率為1
labels = [[0.4,0.1,0.5],[0.3,0.6,0.1]]
result4 = tf.nn.softmax_cross_entropy_with_logits(labels=labels,logits = logits)
with tf.session() as sess:
print("rel4 =",sess.run(result4),"\n")
# 交叉熵的應用
# sparse標籤
labels = [2,1] # 表明labels中總共分為3個類:
# 0、1、2.[2,1]等價於onehot編碼中的001和010
result5 = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels,logits=logits)
with tf.session() as sess:
print("rel5=",sess.run(result5),"\n")
# 計算loss值
loss = tf.reduce_sum(result1)
with tf.session() as sess:
print("loss=",sess.run(loss))
labels = [[0,0,1],[0,1,0]]
loss2 = -tf.reduce_sum(labels * tf.log(logits_scaled))
with tf.session() as sess:
print("loss2=",sess.run(loss2)) # 計算出的loss1和loss2的值相同
結果:
scaled= [[0.01791432 0.00399722 0.97808844]
[0.04980332 0.04506391 0.90513283]]
scaled2= [[0.21747023 0.21446465 0.56806517]
[0.2300214 0.22893383 0.5410447 ]]
rell= [0.02215516 3.0996735 ]
rel2 = [0.56551915 1.4743223 ]
rel3= [0.02215518 3.0996735 ]
rel4 = [2.1721554 2.7696736]
rel5= [0.02215516 3.0996735 ]
loss= 3.1218286
loss2= 3.1218288
6.3 退化學習率
learning_rate= tf.train.exponential_decay(starter_learning_rate,global_step,100000,0.96)
這種方式定義的學習率就是退化學習率,他的意思是當前迭代到global_step步,學習率每一步都按照每10萬步縮小到0.96%的速度衰退。
程式:
import tensorflow as tf
global_step = tf.variable(0,trainable=false)
initial_learning_rate = 0.1
learning_rate = tf.train.exponential_decay(initial_learning_rate,
global_step=global_step,
decay_steps=10,decay_rate=0.9)
opt = tf.train.gradientdescentoptimizer(learning_rate)
add_global = global_step.assign_add(1) # 定義乙個op,令global_step+1完成計步
with tf.session() as sess:
tf.global_variables_initializer().run()
print(sess.run(learning_rate))
for i in range(20):
g,rate = sess.run([add_global,learning_rate])
# 迴圈20步,將每步的學習率列印出來
print(g,rate)
結果:
0.1
1 0.1
2 0.09895193
3 0.09688862
4 0.095873155
5 0.094868325
6 0.094868325
7 0.09387404
8 0.092890166
9 0.09191661
10 0.089999996
11 0.08905673
12 0.08812335
13 0.087199755
14 0.08628584
15 0.08628584
16 0.0853815
17 0.08360115
18 0.08272495
19 0.08272495
20 0.08185793
單個人工神經元的實現
人工神經元 神經元是構成神經網路的最基礎單元 網路結構 人工神經網路由神經元模型構成,這種由許多神經元組成的資訊處理網路具有並行分布結構。輸入資料採用二維陣列data儲存,輸入4組輸入資料 0,0 0,1 1,0 1,1 計算人工神經元的程式的處理步驟如下 單個人工神經元對於輸入訊號計算輸出值的計算...
人工神經元
神經元是構成神經網路的最基本單位,構造乙個人工神經網路系統的首要任務就是構造人工神經網路模型。1 人工神經元的基本構成 我們希望人工神經元可以模擬生物神經元的一階特性 輸入訊號的加權和。對於每乙個人工神經元來說,可以接受一組來自系統中其他神經元的輸入訊號,每個輸入對應乙個權,所有輸入的加權,所有輸入...
神經元細節
單個神經元的模型如下圖所示 在右圖中,神經元的激勵反應可分為兩大部分 1 神經元接受刺激,並對所有的刺激進行加權求和,然後加上偏置,得到激勵值 2 將激勵值作為輸入,輸入到啟用函式,最後通過激勵函式的作用得到最後的響應 注意 這裡總共分為兩個過程,不能忽視最後啟用函式的作用。乙個線性分類器就可以看作...