前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第九篇:《机器学习之神经网络(实战篇)》

第九篇:《机器学习之神经网络(实战篇)》

作者头像
ACM算法日常
发布2018-12-05 18:13:15
2240
发布2018-12-05 18:13:15
举报
文章被收录于专栏:ACM算法日常ACM算法日常

应用读者请求,小编提前带大家进行实战

我们将在下一篇回归基础的知识点介绍

本篇内容:神经网络的实战运用

第二次世界大战如火如荼,ZR两国正进行情报战

特工A交给特工B一张表,没有告诉他数据的规律

于是特工B决定搭建一个神经网络模型来预测.......

好吧,小编编不下去了.........

输入的每一个样本有三个特征值

比如第三行 1 0 1

它对应的结果值为 0

这是一个没有中间层的神经网络

(其实就是逻辑回归)

神经网络输入三个输入值

结合权重运算的值代入激活函数

Sigmoid后得到一个预测值

对真实值进行梯度下降来拟合

通过多组样本完成训练

(逻辑回归的概念见第四篇)

这样做其实有很大的弊端

因为逻辑回归能够“学习”的规律不能太复杂

比如这样

甚至是这样

逻辑回归在分类问题上有很大优势

之所以我们之前的分类器识别猫可以奏效

是因为它本质上还是分类问题

我们输入了猫的像素值图片后

逻辑回归像上图一样“划线分类”

根据色差“画出”猫的形状并判断

逻辑回归进行物体识别准确率其实非常低

目前业内最流行的方法是

卷积神经网络RNN图像识别

(后面会慢慢介绍)

为了让模型可以“学习”更加复杂的内容

科学家们推出了神经网络

可以通过证明得到:

三层以上的神经网络可以拟合几乎任何函数

由于很多基础知识没有介绍完

这里不做详细讲述(限于篇幅)

这是个简单的完整的神经网络算法的代码

感兴趣的同学可以测试一下代码

代码语言:javascript
复制
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)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ACM算法日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档