![TensorFlow知识图谱实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/115/44510115/b_44510115.jpg)
上QQ阅读APP看书,第一时间看更新
2.2.1 全连接层的定义与实现
全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。由于其全相连的特性,一般全连接层的参数也是最多的。图2.11所示的是一个简单的全连接网络。
![](https://epubservercos.yuewen.com/281CEB/23721624209516806/epubprivate/OEBPS/Images/Figure-P56_4509.jpg?sign=1739582609-dbMK0I4y5rMFDN9ey51FMDpyMKWca52g-0-366be4c43a7427e5ee4b6574238f3d91)
图2.11 全连接层
其推导过程如下:
![](https://epubservercos.yuewen.com/281CEB/23721624209516806/epubprivate/OEBPS/Images/Figure-P57_8322.jpg?sign=1739582609-ghxCILoiIfavFAeXq0s7i4g7I1F5RDFL-0-19e37f62409015fc701493071577f29f)
将推导公式转化一下写法,具体如下:
![](https://epubservercos.yuewen.com/281CEB/23721624209516806/epubprivate/OEBPS/Images/Figure-P57_8323.jpg?sign=1739582609-DfQn0PKu0unbjJubP7BJk5abofowYtpG-0-8253404ca260bb62e9d271cfed2906e3)
可以看到,全连接的核心操作就是矩阵向量乘积:。
下面举一个例子,使用TensorFlow自带的API实现一个简单的矩阵计算。
![](https://epubservercos.yuewen.com/281CEB/23721624209516806/epubprivate/OEBPS/Images/Figure-P57_8324.jpg?sign=1739582609-XGeHkEmxory1fsxAVGmYF8bFBlgNRhDD-0-c0d7997b14f4c3a10cd6037ae0caf006)
首先通过公式计算对数据做一个先行验证,按推导公式计算如下:
(1×1+1×1)+0.17=2.17
(2×1+2×1)+0.17=4.17
这样最终形成了一个新的矩阵[2.17,4.17],代码如下:
【程序2-9】
![](https://epubservercos.yuewen.com/281CEB/23721624209516806/epubprivate/OEBPS/Images/Figure-P57_8331.jpg?sign=1739582609-b5kcEcWXvWPqwun0mkFYLB0vJiUMgm2q-0-aa69d65e24927e7c7389e6064440da2c)
最终打印结果如下:
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格式。