【tensorflow】全连接层函数tf.layers.dense()原理

TensorFlow全连接层函数tf.layers.dense()原理 - jian shu https://www.jianshu.com/p/3855908b4c29

最近在用TensorFlow实现CNN网络时用到了全连接层,在网上看了很多有关全连接层实现的代码,发现相当一部分人都还是倾向于自己构造权重矩阵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)) 

计算的结果如图所示,两种方法得到的结果相同。
【tensorflow】全连接层函数tf.layers.dense()原理_第1张图片

——————————————————————
以上为转载他人博客
——————————————————————

tf.layers.dense()参数及其含义:

tf.layers.dense用于添加一个全连接层
函数如下:

tf.layers.dense(
    inputs,					#层的输入
    units,					#该层的输出维度
    activation=None,		#激活函数
    use_bias=True,			
    kernel_initializer=None,  	# 卷积核的初始化器
    bias_initializer=tf.zeros_initializer(),  # 偏置项的初始化器
    kernel_regularizer=None,    # 卷积核的正则化
    bias_regularizer=None,    	# 偏置项的正则化
    activity_regularizer=None, 
    kernel_constraint=None,
    bias_constraint=None,
    trainable=True,
    name=None,  # 层的名字
    reuse=None  # 是否重复使用参数
)

参数的详细解释见如下网址:
TensorFlow函数:tf.layers.Dense_w3cschool https://www.w3cschool.cn/tensorflow_python/tensorflow_python-rn6a2tps.html

参数:

  • units:整数或长整数,输出空间的维数.
  • activation:激活功能(可调用),将其设置为“None”以保持线性激活.
  • use_bias:Boolean,表示该层是否使用偏差.
  • kernel_initializer:权重矩阵的初始化函数;如果为None(默认),则使用tf.get_variable使用的默认初始化程序初始化权重.
  • bias_initializer:偏置的初始化函数.
  • kernel_regularizer:权重矩阵的正则化函数.
  • bias_regularizer:正规函数的偏差.
  • activity_regularizer:输出的正则化函数.
  • kernel_constraint:由Optimizer更新后应用于内核的可选投影函数(例如,用于实现层权重的范数约束或值约束).该函数必须将未投影的变量作为输入,并且必须返回投影变量(必须具有相同的形状).在进行异步分布式训练时,使用约束是不安全的.
  • bias_constraint:由Optimizer更新后应用于偏置的可选投影函数.
  • trainable:Boolean,如果为True,还将变量添加到图集合GraphKeys.TRAINABLE_VARIABLES中(请参阅参考资料tf.Variable).
  • name:String,图层的名称;具有相同名称的图层将共享权重,但为了避免错误,在这种情况下,我们需要reuse=True.
  • reuse:Boolean,是否以同一名称重用前一层的权重.

你可能感兴趣的:(tensorflow,深度学习,python)