TensorFlow知识图谱实战
上QQ阅读APP看书,第一时间看更新

2.2.1 全连接层的定义与实现

全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。由于其全相连的特性,一般全连接层的参数也是最多的。图2.11所示的是一个简单的全连接网络。

图2.11 全连接层

其推导过程如下:

将推导公式转化一下写法,具体如下:

可以看到,全连接的核心操作就是矩阵向量乘积:

下面举一个例子,使用TensorFlow自带的API实现一个简单的矩阵计算。

首先通过公式计算对数据做一个先行验证,按推导公式计算如下:

(1×1+1×1)+0.17=2.17

(2×1+2×1)+0.17=4.17

这样最终形成了一个新的矩阵[2.17,4.17],代码如下:

【程序2-9】

最终打印结果如下:

     tf.Tensor([[2.17] [4.17]], shape=(2, 1), dtype=float32)

最终计算出一个Tensor,大小为shape=(2, 1),类型为float32,其值为[[2.17] [4.17]]。

计算本身非常简单,全连接的计算方法相信读者也很容易掌握。现在回到代码中,请注意我们在定义参数和定义输入值的时候采用的不同写法:

     weight = tf.Variable([[1.],[1.]])
     input_xs = tf.constant([[1.,1.],[2.,2.]])

这里对参数的定义,使用的是Variable函数;对输入值的定义,采用的是constant函数,将其对应内容打印如下:

    <tf.Variable 'Variable:0' shape=(2, 1) dtype=float32, numpy=array([[1.], [1.]],
dtype=float32)>

input_xs打印如下:

     tf.Tensor([[1. 1.][2. 2.]], shape=(2, 2), dtype=float32)

通过对比可以看到,这里的weight被定义成一个可变参数Variable类型,供在后续的反向计算中进行调整。constant函数直接读取数据并将其定义成Tensor格式。