轉發博客鏈接:https://www.jianshu.com/p/3855908b4c29
網上很多有關全連接層實現的代碼,大部分都還是傾向於自己構造權重矩陣W和偏移矩陣b,利用矩陣乘法實現全連接層。
而TensorFlow中封裝了全連接層函數tf.layers.dense(),但是官方文檔中並沒有解釋其詳細原理。網上有部分博客對此提及,但也少有涉及到內部實現原理的。於是今天自己動手做了個對比試驗,來探究一下tf.layers.dense()函數的詳細原理。
先貼結論:tf.layers.dense( input, units=k )會在內部自動生成一個權矩陣kernel和偏移項bias,各變量具體尺寸如下:對於尺寸為[m, n]的二維張量input, tf.layers.dense()會生成:尺寸為[n, k]的權矩陣kernel,和尺寸為[m, k]的偏移項bias。內部的計算過程為y = input * kernel + bias,輸出值y的維度為[m, k]。
以下是實驗代碼。
import tensorflow as tf # 1. 調用tf.layers.dense計算 input = tf.reshape(tf.constant([[1., 2.], [2., 3.]]), shape=[4, 1]) b1 = tf.layers.dense(input, units=2, kernel_initializer=tf.constant_initializer(value=2), # shape: [1,2] bias_initializer=tf.constant_initializer(value=1)) # shape: [4,2] # 2. 采用矩陣相乘的方式計算 kernel = tf.reshape(tf.constant([2., 2.]), shape=[1, 2]) bias = tf.reshape(tf.constant([1., 1., 1., 1., 1., 1., 1., 1.]), shape=[4, 2]) b2 = tf.add(tf.matmul(input, kernel), bias) with tf.Session()as sess: sess.run(tf.global_variables_initializer()) print(sess.run(b1)) print(sess.run(b2))
計算的結果如圖所示,兩種方法得到的結果相同。
