逻辑回归的前向传播(正向传播) 作者:马育民 • 2019-10-23 14:02 • 阅读:10130 # 概述 本文介绍逻辑回归的前向传播,也叫正向传播 一句话解释:将神经网络正向走一遍 ``` 输入层—->隐藏层—->输出层 ``` # 案例 为了便于观察,这里建立2个全连接层,1层有4个神经元,2层有1个神经元,激活函数时sigmoid,如下图: [![](https://www.malaoshi.top/upload/0/0/1EF4ItpvXONd.png)](https://www.malaoshi.top/upload/0/0/1EF4ItpvXONd.png) 样本demo如下: | |特征x1(父母平均身高) |孩子是否超过1.8 | |--------| ------------ | ------------ | |样本1 |1.7 |0 | |样本2 |1.8 |1 | |样本3 |1.9 |1 | # 计算第1层 这里主要讲解 h1 的计算 ### 初始化权重和偏置量 在keras中的全连接网络中: - 权重 默认初始化的方式是 **随机的** - 偏置量 默认为0 为了方便计算,手动设置 权重和偏置量,如下 |权重 w1 |偏置量 b1| | ------------ | ------------ | |0.1 |0 | **注意:** 运算后的结果 与 样本真实值 会有误差 ### 计算公式 ``` h1结果=x1*w1+b1 ``` x表示特征,即父母平均身高 ### 偏置量b1的转换 为了让公式更加统一,将 **b1** 理解成 ```x0*w1_0```,如下: ``` h1结果=x0*w1_0+x1*w1_1 ``` **注意:** - x0永远为1 - 在初始化时,b1值是0,x0永远为1,所以此时w0是0 - **特征多了一个** ### 转成矩阵运算(3个样本,神经元h1) 由于有很多个样本,用循环计算复杂,通过 **矩阵** 计算更加简单,转换公式如下: [![](https://www.malaoshi.top/upload/0/0/1EF4ItiqQ2PS.png)](https://www.malaoshi.top/upload/0/0/1EF4ItiqQ2PS.png) **注意:** - 样本矩阵,**行是样本,列是特征** - 样本中的特征只有1个,但将偏置量b理解成```x0*w1_0```,所以 **特征多了一个** ### 转成矩阵运算(3个样本,神经元h1 h2 h3 h4) [![](https://www.malaoshi.top/upload/0/0/1EF4Itl8x8JX.png)](https://www.malaoshi.top/upload/0/0/1EF4Itl8x8JX.png) ### 最终结果如下 代入3个样本,4个神经元,最终结果如下: [![](https://www.malaoshi.top/upload/0/0/1EF4IblfMKg9.png)](https://www.malaoshi.top/upload/0/0/1EF4IblfMKg9.png) 第1行的4列是样本1.7 与 4个神经元运算的结果 第2行的4列是样本1.8 与 4个神经元运算的结果 第3行的4列是样本1.9 与 4个神经元运算的结果 ### keras 代码验证 上述是理论,接下来我们要通过keras代码,查看输出的结果 实现思路,建立好模型后,需要手动设置权重为0.1,直接调用predict()方法进行预测,就会以权重(0.1)和偏置量(0)进行计算 ``` import tensorflow as tf import numpy as np x=[1.7,1.8,1.9] model=tf.keras.Sequential() model.add(tf.keras.layers.Dense(4,input_shape=(1,),kernel_initializer=tf.initializers.Constant(0.1))) model.summary() out_result = model.predict(x) out_result ``` 执行结果如下: ``` [[0.17 0.17 0.17 0.17 ] [0.17999999 0.17999999 0.17999999 0.17999999] [0.19 0.19 0.19 0.19 ]] ``` ### numpy 代码验证 ``` import numpy as np import math x=np.array([ [1,1.7], [1,1.8], [1,1.9] ]) w=np.array([ [0,0,0,0], [0.1,0.1,0.1,0.1], ]) result=x.dot(w) ``` 执行结果如下: ``` [[0.17 0.17 0.17 0.17] [0.18 0.18 0.18 0.18] [0.19 0.19 0.19 0.19]] ``` # 计算第2层 第2层只有一个神经元,分成2个步骤进行运算 ### 初始化权重和偏置量 同上,为了方便计算,手动设置 **权重** 和** 偏置量**,如下 |权重 w5_1 |权重 w5_2 |权重 w5_3 |权重 w5_4 |偏置量 b5| | ------------ | ------------ | ------------ | ------------ | |0.1 |0.1 |0.1 |0.1 |0 | **注意:** 运算后的结果 与 样本真实值 会有误差 ### 计算步骤1 以样本1为例,**样本1** 经过 **第1层** 的 **4个神经元** 计算后,得到4个结果,将这 **4个结果作为特征**,进行第2层的计算 公式如下: ``` h1*w5_1+h2*w5_2+h3*w5_3+h4*w5_4+b5 ``` 为了让公式更加统一,将 **b5** 理解成 ```h0*w5_0```,如下: ``` h0*w5_0+h1*w5_1+h2*w5_2+h3*w5_3+h4*w5_4 ``` **注意:** - h0永远为1 - 在初始化时,b5值是0,h0永远为1,所以此时 **w5_0是0** - **特征多了一个** ### 计算步骤1 - 转成矩阵运算(1个样本) 用循环计算复杂,通过 **矩阵** 计算更加简单,如下: [![](https://www.malaoshi.top/upload/0/0/1EF4IuFdNKWw.png)](https://www.malaoshi.top/upload/0/0/1EF4IuFdNKWw.png) ### 计算步骤1 - 转成矩阵运算(3个样本) 由于有很 **多个样本**,用循环计算复杂,通过 **矩阵** 计算更加简单,如下: [![](https://www.malaoshi.top/upload/0/0/1EF4IuG2GMvz.png)](https://www.malaoshi.top/upload/0/0/1EF4IuG2GMvz.png) **注意:** - 第一个矩阵是 第1层 的输出结果,**行是样本,列是1个样本在4个神经元的计算结果** ### 计算步骤1 - 结果如下 ``` array([[0.068], [0.072], [0.076]]) ``` ### 计算步骤2 - sigmoid 计算步骤1的结果,是线性计算的结果,范围是 **负无穷** 到 **正无穷**。 为了实现分类,就需要对这个结果再次进行计算,将范围 **映射到 0-1之间**。 这样,大于等于0.5(即 50%)的,就认为是1,小于等于0.5(即 50%)的,就认为是0,这样就实现了二分类 计算公式: [![](https://www.malaoshi.top/upload/0/0/1EF3xWjgkbzo.png)](https://www.malaoshi.top/upload/0/0/1EF3xWjgkbzo.png) x表示 **上一步骤** 的结果 将上一步骤的样本1结果0.068,代入公式,结果:0.516993452360945 样本2的结果0.072,代入公式,结果:0.5179922280289649 样本3的结果0.076,代入公式,结果:0.5189908599459256 ### keras 代码验证 上述是理论,接下来我们要通过keras代码,查看输出的结果 实现思路,建立好模型后,需要手动设置权重为0.1,直接调用predict()方法进行预测,就会以权重(0.1)和偏置量(0)进行计算 ``` import tensorflow as tf import numpy as np x=[1.7,1.8,1.9] model=tf.keras.Sequential() model.add(tf.keras.layers.Dense(4,input_shape=(1,),kernel_initializer=tf.initializers.Constant(0.1))) model.add(tf.keras.layers.Dense(1,activation="sigmoid",kernel_initializer=tf.initializers.Constant(0.1))) model.summary() out_result = model.predict(x) out_result ``` 执行结果如下: ``` [[0.51699346] [0.5179922 ] [0.5189909 ]] ``` # o1输出层 将h2的结果输出 ``` [[0.51699346] [0.5179922 ] [0.5189909 ]] ``` ### numpy验证 ``` import numpy as np import math h=np.array([[1,0.17, 0.17, 0.17, 0.17], [1,0.18, 0.18, 0.18, 0.18], [1,0.19, 0.19, 0.19, 0.19]]) w5=np.array([[0],[0.1],[0.1],[0.1],[0.1]]) result=h.dot(w5) result ``` 定义sigmoid函数 ``` def sigmoid(x): return 1/(1+math.e**x) sigmoid(result) ``` 执行结果如下: ``` array([[0.51699345], [0.51799223], [0.51899086]]) ``` 原文出处:http://malaoshi.top/show_1EF4Ibnp3zyC.html