Tensorflow 第一节:使用指南
- Tensorflow 安装
- 神经网络
- 一些基本概念
- 隐藏层和输出层:
- 神经元的输出公式
- Tensorflow 全连接层 Dense 与 顺序模型 Sequential
- Dense Layer
- Sequential Model
- 代码实现一个神经网络
- 实现方式一:手写神经网络
- * 实现方式二:Tensorflow
Tensorflow 安装
有关 Tensorflow/CUDA/cuDNN 安装,见博客:https://xu-hongduo.blog.csdn.net/article/details/129927665
神经网络
一些基本概念
- 上图中包含输入层、隐藏层、输出层;
- 其中输入层为 layer 0,输入到网络中的内容为 x ⃗ \vec{x} x;
- 其中隐藏层有三层,layer 1,layer 2,layer 3;
- 其中输出层为 layer 4,输出内容为 a ⃗ [ 4 ] \vec{a}^{[4]} a[4];
- 如果需要统计该神经网络有多少层,则统计为: 神经网络层数 = 隐藏层个数 + 输出层个数 = 3 + 1 = 4 神经网络层数 = 隐藏层个数 + 输出层个数 = 3 + 1 = 4 神经网络层数=隐藏层个数+输出层个数=3+1=4
隐藏层和输出层:
- 关于隐藏层 layer 1
- 隐藏层 layer 1 中包含四个神经元,其中每个神经元的输入为: x ⃗ \vec{x} x;
- 隐藏层 layer 1 的输出为 a ⃗ [ 1 ] \vec{a}^{[1]} a[1],一个包含四个元素的矩阵,分别为 layer 1 中四个神经元输出的结果;
- 关于隐藏层 layer 2
- 隐藏层 layer 2 中包含五个神经元,其中每个神经元的输入为: a ⃗ [ 1 ] \vec{a}^{[1]} a[1];
- 隐藏层 layer 2 的输出为 a ⃗ [ 2 ] \vec{a}^{[2]} a[2],一个包含五个元素的矩阵,分别为 layer 2 中五个神经元输出的结果;
- 关于隐藏层 layer 3
- 隐藏层 layer 3 中包含三个神经元,其中每个神经元的输入为: a ⃗ [ 2 ] \vec{a}^{[2]} a[2];
- 隐藏层 layer 3 的输出为 a ⃗ [ 3 ] \vec{a}^{[3]} a[3],一个包含三个元素的矩阵,分别为 layer 3 中三个神经元输出的结果;
- 关于输出层 layer 4
- 输出层 layer 4 中只有一个神经元,需要注意的是,输出层不限制神经元的个数,而是根据具体情况进行分析,从而规定神经元的数量。
- 输出层的输入为:一个包含三个元素的矩阵 a ⃗ [ 3 ] \vec{a}^{[3]} a[3];输出为一个值 a [ 4 ] a^{[4]} a[4],当 a [ 4 ] ≥ 0.5 a^{[4]}≥0.5 a[4]≥0.5 时,表示结果为真,否则为假;
神经元的输出公式
根据下图,思考:
- 输入层矩阵 x ⃗ \vec{x} x 是一个 ? ∗ ? ?*? ?∗? 的矩阵?
- 隐藏层 layer 1 输出的 a ⃗ [ 1 ] \vec{a}^{[1]} a[1] 是一个 ? ∗ ? ?*? ?∗? 的矩阵?
- 隐藏层 layer 1 的向量参数 w ⃗ \vec{w} w 是一个 ? ∗ ? ?*? ?∗? 的矩阵?
列举隐藏层 layer 1 的输出公式:
layer 1 中包含四个神经元:
- a 1 [ 1 ] = g ( w ⃗ 1 [ 1 ] ⋅ x ⃗ + b 1 [ 1 ] ) a_1^{[1]} = g(\vec{w}^{[1]}_1 · \vec{x} + b^{[1]}_1) a1[1]=g(w1[1]⋅x+b1[1])
- a 2 [ 1 ] = g ( w ⃗ 2 [ 1 ] ⋅ x ⃗ + b 2 [ 1 ] ) a_2^{[1]} = g(\vec{w}^{[1]}_2 · \vec{x} + b^{[1]}_2) a2[1]=g(w2[1]⋅x+b2[1])
- a 3 [ 1 ] = g ( w ⃗ 3 [ 1 ] ⋅ x ⃗ + b 3 [ 1 ] ) a_3^{[1]} = g(\vec{w}^{[1]}_3 · \vec{x} + b^{[1]}_3) a3[1]=g(w3[1]⋅x+b3[1])
- a 4 [ 1 ] = g ( w ⃗ 4 [ 1 ] ⋅ x ⃗ + b 4 [ 1 ] ) a_4^{[1]} = g(\vec{w}^{[1]}_4 · \vec{x} + b^{[1]}_4) a4[1]=g(w4[1]⋅x+b4[1])
layer 1 的输出为一个二维数组:
a
⃗
[
1
]
=
[
[
a
1
[
1
]
,
a
2
[
1
]
,
a
3
[
1
]
,
a
4
[
1
]
]
]
\vec{a}^{[1]} = [[a_1^{[1]}, a_2^{[1]}, a_3^{[1]}, a_4^{[1]}]]
a[1]=[[a1[1],a2[1],a3[1],a4[1]]]
根据上述内容,回答上述的三个问题【1】【2】【3】:
-
输入层 x ⃗ \vec{x} x 是一个 n ∗ m n*m n∗m 的矩阵,其中 n n n 是训练样本的个数, m m m 是样本的特征。样本的 m m m 个特征,影响着隐藏层 layer 1 的向量参数矩阵形状。
-
隐藏层 layer 1 输出的 a ⃗ [ 1 ] \vec{a}^{[1]} a[1] 是一个 1 ∗ 4 1*4 1∗4 的矩阵,内容为 layer 1 中四个神经元的结果;
-
隐藏层 layer 1 的向量参数 w ⃗ \vec{w} w 是一个 m ∗ 4 m*4 m∗4 的矩阵, m m m 代表输入的特征,根据这些输入的特征,我们输出 4 4 4 个值组成的 a ⃗ [ 1 ] \vec{a}^{[1]} a[1];
Tensorflow 全连接层 Dense 与 顺序模型 Sequential
下面内容我将围绕如何使用 tensorflow
代码实现上述的隐藏层以及诸多神经元:
Dense Layer
首先有请全连接层 Dense Layer
全连接层:
全连接层(Dense) 是深度神经网络中常用的一种层类型,也是最基本的层类型之一。全连接层将上一层(输入层或者前一层隐藏层)的每个神经元与本层的 每个神经元 都进行连接,形成一个完全连接的网络结构,因此也称为全连接层。
在全连接层中,每个神经元的输出值是上一层所有神经元的 加权和,然后再经过一个 非线性激活函数 进行处理。如果本层有 n n n 个神经元,上一层有 m m m 个神经元,那么全连接层的 权重矩阵 ( w ⃗ \vec{w} w)就是一个形状为 ( m , n ) (m, n) (m,n) 的矩阵,而偏置向量( b b b)的长度为 n n n。
Sequential Model
Sequential model 是一种按顺序堆叠各种深度学习层的简单模型。在 Sequential model 中,每一层的输出都成为下一层的输入,这些层按照 顺序连接 在一起形成一个深度学习模型,故称为:顺序模型;
代码实现一个神经网络
实现方式一:手写神经网络
本节内容只是为了知识引入,完整的一个 Minst 判断手写 0/1 项目链接如下:
xxxxxx
def my_dense(a_in, W, b, g):
units = W.shape[1]
a_out = np.zeros(units)
for i in range(units):
w = W[:,i]
z = np.dot(w, a_in) + b[i]
a_out[i] = g(z)
return(a_out)
简化上述代码,方案:通过 np.matmul()
在进行矩阵乘法计算时,np.matmul()
会自动识别输入的数组的维度,并根据矩阵乘法的规则进行计算。
e
.
g
.
e.g.
e.g. 假设我们有两个矩阵
A
A
A 和
B
B
B,它们的形状分别为
(
m
,
n
)
(m, n)
(m,n) 和
(
n
,
p
)
(n, p)
(n,p),那么它们的乘积矩阵
C
C
C 的形状为
(
m
,
p
)
(m, p)
(m,p);
def my_dense_v(A_in, W, b, g):
Z = np.matmul(A_in,W)+b
A_out = g(Z)
return(A_out)
* 实现方式二:Tensorflow
本节内容只是为了知识引入,完整的一个 Minst 判断手写 0/1 项目链接如下:
xxxxxx
model = Sequential(
[
tf.keras.Input(shape=(400,)),
Dense(units = 25, activation='sigmoid'),
Dense(units = 15, activation='sigmoid'),
Dense(units = 1, activation='sigmoid')
], name = "my_model"
)
上述代码中,我们引入了三个全连接层:
Dense(units = 25, activation = 'sigmoid')
- 该层(隐藏层)包含 25 个神经元,采用 sigmoid 作为激活函数;
- 参数的总个数为:400 * 25 + 25 = 10025;
Dense(units = 15, activation = 'sigmoid')
- 该层(隐藏层)包含 15 个神经元,采用 sigmoid 作为激活函数
- 参数的总个数为:25 * 15 + 15 = 390;
Dense(units = 1, activation = 'sigmoid')
- 该层(输出层)包含 1 个神经元,采用 sigmoid 作为激活函数
- 参数的总个数为:15 * 1 + 1 = 16;
完整的一个 Minst 判断手写 0/1 项目链接如下:
xxxxxx