全连接神经网络

基本概念:

人工神经网络是根据生物神经网络构造的一种数据模型,每一层包含大量神经元。每两层神经元间的连接都存在一个初始参数,这个参数用来衡量神经元间相连接的重要程度。神经网络的每一层都具有多个节点,每个节点都与下层的所有节点相连,并且每一层的输出可以作为下一层的输入,每层神经网络中的节点只与其上一层和下一层的节点相连。

![这里写图片描述](https://img-blog.csdn.net/20170706103330829?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9sbGFh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 图1 神经网络结构

BP(Back Propagation)神经网络:

它是最常用的一种多层神经网络,它的训练过程由数据的前向传播和误差的反向传播构成。原始数据经过输入层、中间层和输出层后得到实际输出结果,若实际结果与预期结果不同,则需要残差反向传播。残差的反向传播过程就是模型的学习过程,通过不断缩小实际输出和预期输出的差值来优化BP神经网络中节点的参数,直到误差大小小于预先设置的阀值或学习次数,其中缩小误差的方法通常采用梯度下降法。BP神经网络的前向传播是先计算出输入向量与下层节点间参数的内积,计算结果经过下层节点的激活函数得到一个局部向量,然后再与下一层的参数算内积和激活函数,一直传递到最后的输出层。图1是典型的BP神经网络,该神经网络分为三层,第一层是输入层(Input Layer),中间层是隐藏层(Hidden Layer),最后一层是输出层(Output Layer),+1是偏置节点。输入层接受原始数据特征后,每个节点经过权值累加传递给下一层节点。中间层对数据特征进一步处理,中间层可设置单层或多层。最后隐藏层传递给输出层经过目标函数的运算得到实际输出结果。

神经网络分为前向传播和后向传播:

前向传播是神经元接受前一层的输入,经计算输出到下一层,直到输出层得出输出结果。而神经网络的训练需要误差的后向传播,若训练数据经过前向传播后与正确结果不同,根据结果误差对输出层进行参数调整并层层回退直到输入层,再继续测试模型,直到与预测结果的误差较小为止。
前向传播:


这里写图片描述

后向传播:

![这里写图片描述](https://img-blog.csdn.net/20170706103306687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9sbGFh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

其中,这里写图片描述表示输出层对最后输出结果的误差影响。这里写图片描述表示每一层各个节点对最终结果的误差影响。人工神经网络中每个节点都是独立运算,具有较强的并行计算能力且容错率较高,因此在近些年来发展迅速,在模式识别、预测估计、生物医学、经济金融等领域取得了突破性的进展,解决了大量人工无法解决的数据问题。

三层神经网络(输入、隐藏、输出)代码如下:

import numpy as np


def nonlin(x, deriv=False):
    if (deriv == True):
        return x * (1 - x)

    return 1 / (1 + np.exp(-x))


X = np.array([[0, 0, 1],
              [0, 1, 1],
              [1, 0, 1],
              [1, 1, 1]])

y = np.array([[0],
              [1],
              [1],
              [0]])

np.random.seed(1)

# randomly initialize our weights with mean 0
syn0 = 2 * np.random.random((3, 4)) - 1
syn1 = 2 * np.random.random((4, 1)) - 1

for j in range(60000):

    # Feed forward through layers 0, 1, and 2
    l0 = X
    l1 = nonlin(np.dot(l0, syn0))
    l2 = nonlin(np.dot(l1, syn1))

    # how much did we miss the target value?
    l2_error = y - l2

    if (j % 10000) == 0:
        print("Error:" + str(np.mean(np.abs(l2_error))))
        print(syn0,syn1)

    # in what direction is the target value?
    # were we really sure? if so, don't change too much.
    l2_delta = l2_error * nonlin(l2, deriv=True)

    # how much did each l1 value contribute to the l2 error (according to the weights)?
    l1_error = l2_delta.dot(syn1.T)

    # in what direction is the target l1?
    # were we really sure? if so, don't change too much.
    l1_delta = l1_error * nonlin(l1, deriv=True)

    syn1 += l1.T.dot(l2_delta)
    syn0 += l0.T.dot(l1_delta)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值