1初识神经网络
神经网络按层划分,中间部分为隐藏层,最后的层为输出层。每个层中有一个或者多个神经元。输入到layer中的数据是输入数据,从隐藏层输出的数据叫激活,从output layer输出的数据是最终获得的输出数据。
如下,以人脸识别为例子
中间隐藏层一层一层的对图片进行解析,并将激活输入到下一层,最终获得结果的可能性。
2神经网络的构建
2.1神经网络的网络层
神经网络的网络层实际就是隐藏层和输出层的总和,以下分别介绍隐藏层和输出层的大致运行内容
如上,实际每一层的神经元其实就是一个逻辑回归单元。输入的数据在逻辑回归单元的计算下,得到的概率,每个神经元都可以对输入的数据进行处理,从而得到了一个数据向量,就是该层输出的激活。然后将这个激活输入到下一层进行同样的操作
输出层也是如此,只是输出层一般情况只存在一个神经元。此外,如人脸识别的神经网络最终输出的都是是否,而非概率,这时可能要进行决策边界进行判断
2.2更复杂的神经网络
上述所举例的神经网络隐藏层只有一层,在实际的神经网络模型中隐藏层都是多层的。并且上一层的激活数据就是下一层的输入数据,如下图:
2.3神经网络的向前传递性
3神经网络搭建的代码实现
3.1简单神经网络层的实现
以上述简单的神经网络模型为例:
x = np.array([[200.0,17.0]])用一个二维数组定义一个1x2的矩阵,在后面实现神经网络所用的tensorflow在计算逻辑回归中的点成运算时,用的多是矩阵。一维数组所定义的看起来像1*n的矩阵,但实际上它只是一个一维数组,不能很好的适配方法库
layer_1 = Dense(units = 3, activation = 'sigmoid')表示第一层的定义,units = 3说明有三个神经元,activation = 'sigmoid'表示激活的输出使用的是逻辑回归的sigmoid函数计算。
a1 = layer_1(x)通过第一层计算得到的激活数据
和上述隐藏层的代码定义类似,这里输出层的代码定义也是如此。只是输入的数据是上述的激活数据。
3.2tensorflow中的数据格式
先从简单的矩阵的数据格式开始
正如之前所提到的,在使用numpy的array方法进行数组定义是,都是定义二维数组。尽管一维数组看起来很像一个矩阵向量,但它并不是一个真正的矩阵
以上一节隐藏层所得到的[0.2,0.7,0.3],通过Tensor函数将其转换为矩阵
3.3搭建一个神经网络
结合3.1简单搭建神经网络层的内容,在搭建layer_n的层之后,用函数将两层串联起来,并将数据输入,对其进行训练。
如果隐藏层的数量较多
4网络层的代码实现
4.1网络层的向上传播
(注:这里在计算输出层的输出数据时,出现了小问题。隐藏层输出的激活时一个三维向量,所以输出层这里参数特征向量也是三维的,不然无法点成)
4.2 向上传播的一般实现
和4.1 不同的是,4.1写的是每个神经元的计算流程。而这一节则是对层中神经元的计算进行了封装,也是前面搭建神经网络时经常看到的那个封装函数。
def dense(a_in,W,b,g):
units = W.shape[1]//w.shape函数获取的是该矩阵的行列数量,放在一个数组中,0下标代表 //行数量,1下标为列数量。所以这里获取到W矩阵的列数量为3,为神经元数量
a_out = np.zeros(units)
for j in range(units): //循环获取W矩阵的列向量,进行逻辑回归的计算
w = W[:,j] //获取第j列计算
z = np.dot(w,a_in)+b[j]
a_out[j] = g(z) //逻辑回归的计算
return a_out