- out = f(X@W + b) 線性轉換
- out = relu(X@W + b) 非線性轉換
1、X@W + b
h = relu(X@W + b),最后得到的值h00和h01是prob,比較prob的大小將樣本歸分為該類別。relu函數是將小於0的數等於0,大於0的數不變。通過全連接層網絡逐漸實現對輸入樣本的降維,如最初的輸入樣本是784維,而最終需要將樣本分為10類,所以需要將輸出設置為10維,即最終會將樣本降為10維,每一維是一個概率,通過比較10個概率的大小,選出最大的概率即可得到樣本的分類。
2、多層連接
第一層稱為輸入層,中間的稱為隱藏層,最后的稱為輸出層,每一層包括該層與權值的乘積和加上偏置bais,全連接是指每一層的輸入和該層的每一個節點都有線條進行連接。
3、全連接層代碼
(1)一層實現
1 #建立兩層的全連接層 2 x = tf.random.normal([4,784]) 3 net = tf.keras.layers.Dense(512) #建立網路,第二層(輸出層)512 4 out = net(x) #out結果直接使用全連接層模型實例化得到結果 5 print(out.shape) #(4, 512) 6 # 在模型中自動創建w(kernel)和b(bias) 7 print(net.kernel.shape) #(784, 512) 8 print(net.bias.shape) #(512,)
使用net.build( )后自動創建w和b,此外build可以使用多次對輸入進行形狀的改變。一般來講只需要build一次,w和b就會創建。
1 net = tf.keras.layers.Dense(10) 2 # print(net.kernel.shape) #'Dense' object has no attribute 'kernel' 3 # 在聲明keras.layers.Dense時,並沒用完成w和b參數的創建,使用net.build輸入一個input_shape時會創建w和b 4 net.build(input_shape=[None,4]) 5 print(net.kernel.shape, net.bias.shape) #(4, 10) (10,)
(2)多層實現,通過容器Sequential([ layer1, layer1, layer1])實現模型的搭建和數據的前向流動。
1 # 多層實現 2 x = tf.random.normal([2,3]) 3 model = Sequential([ #設置每一層的大小 4 layers.Dense(2,activation='relu'), 5 layers.Dense(2,activation='relu'), 6 layers.Dense(2,) 7 ]) 8 9 model.build(input_shape=[None,3]) 10 model.summary() 11 12 for p in model.trainable_variables: #trainable_variables返回一個list[w1,b1,w2,b2.w3.b3] 13 print(p.name, p.shape)
輸出:
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) multiple 8 _________________________________________________________________ dense_1 (Dense) multiple 6 _________________________________________________________________ dense_2 (Dense) multiple 6 ================================================================= Total params: 20 Trainable params: 20 Non-trainable params: 0 _________________________________________________________________ dense/kernel:0 (3, 2) dense/bias:0 (2,) dense_1/kernel:0 (2, 2) dense_1/bias:0 (2,) dense_2/kernel:0 (2, 2) dense_2/bias:0 (2,)