第6章 單個神經元

2021-09-26 13:29:36 字數 4550 閱讀 5666

部分知識點筆記:

正向傳播、反向傳播(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 將激勵值作為輸入,輸入到啟用函式,最後通過激勵函式的作用得到最後的響應 注意 這裡總共分為兩個過程,不能忽視最後啟用函式的作用。乙個線性分類器就可以看作...