应用读者请求,小编提前带大家进行实战
我们将在下一篇回归基础的知识点介绍
本篇内容:神经网络的实战运用
第二次世界大战如火如荼,ZR两国正进行情报战
特工A交给特工B一张表,没有告诉他数据的规律
于是特工B决定搭建一个神经网络模型来预测.......
好吧,小编编不下去了.........
输入的每一个样本有三个特征值
比如第三行 1 0 1
它对应的结果值为 0
这是一个没有中间层的神经网络
(其实就是逻辑回归)
神经网络输入三个输入值
结合权重运算的值代入激活函数
Sigmoid后得到一个预测值
对真实值进行梯度下降来拟合
通过多组样本完成训练
(逻辑回归的概念见第四篇)
这样做其实有很大的弊端
因为逻辑回归能够“学习”的规律不能太复杂
比如这样
甚至是这样
逻辑回归在分类问题上有很大优势
之所以我们之前的分类器识别猫可以奏效
是因为它本质上还是分类问题
我们输入了猫的像素值图片后
逻辑回归像上图一样“划线分类”
根据色差“画出”猫的形状并判断
逻辑回归进行物体识别准确率其实非常低
目前业内最流行的方法是
卷积神经网络RNN图像识别
(后面会慢慢介绍)
为了让模型可以“学习”更加复杂的内容
科学家们推出了神经网络
可以通过证明得到:
三层以上的神经网络可以拟合几乎任何函数
由于很多基础知识没有介绍完
这里不做详细讲述(限于篇幅)
这是个简单的完整的神经网络算法的代码
感兴趣的同学可以测试一下代码
import numpy as np # 导入Numpy库(矩阵运算)
def sigmoid(x): # Sigmoid函数(激活函数)
return 1/(1+np.exp(-x))
def sigmoid_(x): # Sigmoid导数(Sigmoid的偏微分)(反向传播)
return x*(1-x)
X = np.array([[0,0,1], # 样本特征值(神经网络的输入值)
[0,1,1],
[1,0,1],
[1,1,1]])
y = np.array([[1], # 样本结果值(神经网络要拟合的值)
[0],
[1],
[0]])
# 随机初始化对于神经网络来说至关重要!
theta0 = 2*np.random.random((3,4)) - 1 # (随机初始化)第一层到第二层的 权重
theta1 = 2*np.random.random((4,1)) - 1 # (随机初始化)第二层到第三层的 权重
for i in range(50000): # 反复模型训练,调整参数
a0=X # 第一层输入样本的特征
a1=sigmoid(np.dot(a0,theta0)) # 前向传播得到第二层
a2=sigmoid(np.dot(a1,theta1)) # 前向传播得到第三层
a2_error=y-a2 # 计算输出层误差
a2_delta=a2_error*sigmoid_(a2) # 反向传播计算
a1_error=a2_delta.dot(theta1.T) # 反向传播计算
a1_delta=a1_error*sigmoid_(a1) # 反向传播计算
theta1+=a1.T.dot(a2_delta) # 更新 权重
theta0+=a0.T.dot(a1_delta) # 更新 权重
if (i% 10000 == 0):
print ("\n第"+str(i)+"次训练的误差:")
print (abs(a2_error))
print ("权重")
print (theta0)
print (theta1)