- TensorFlow知识图谱实战
- 王晓华
- 463字
- 2022-07-27 17:22:24
2.2.1 全连接层的定义与实现
全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。由于其全相连的特性,一般全连接层的参数也是最多的。图2.11所示的是一个简单的全连接网络。
![](https://epubservercos.yuewen.com/281CEB/23721624209516806/epubprivate/OEBPS/Images/Figure-P56_4509.jpg?sign=1739120178-VKRSjBoKjYiqP0xrSAniueofX5cbpw1y-0-cfc7b9969fc1753dc3b27a62a17210d2)
图2.11 全连接层
其推导过程如下:
![](https://epubservercos.yuewen.com/281CEB/23721624209516806/epubprivate/OEBPS/Images/Figure-P57_8322.jpg?sign=1739120178-lTG3BGSlZzX5tN4CI3kuiS8h8QO2M10B-0-678a448b4061579fecea4d430a6ffbaf)
将推导公式转化一下写法,具体如下:
![](https://epubservercos.yuewen.com/281CEB/23721624209516806/epubprivate/OEBPS/Images/Figure-P57_8323.jpg?sign=1739120178-gvFdBjntS7zFHu2dguHxMqrk4eu06M1e-0-5d74cd31c04b0a27f51a3175b62f7443)
可以看到,全连接的核心操作就是矩阵向量乘积:。
下面举一个例子,使用TensorFlow自带的API实现一个简单的矩阵计算。
![](https://epubservercos.yuewen.com/281CEB/23721624209516806/epubprivate/OEBPS/Images/Figure-P57_8324.jpg?sign=1739120178-x7wYJim9KvBZXldKmvAMActKsOVDv1uS-0-10d6aa8fccf35a8a3e9facb41f1c2a70)
首先通过公式计算对数据做一个先行验证,按推导公式计算如下:
(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=1739120178-2OzTj546AF2YxDjsa0OjFMH2LJOuGexm-0-bc7d6e2591142c9ccdffafa96cbd2110)
最终打印结果如下:
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格式。