深度学习--神经网络)

神经网络

人工的神经的网络是在模仿自然的神经网络才搭建的,这里我们向介绍一下自然界中的神经元,对两者对象对比学习

神经元

生物学神经元简单介绍

1904 年生物学家就已经知晓了神经元的组成结构
在这里插入图片描述
1.每个神经元都是一个信息的处理单元,且具有多输入单输出的特性
2.神经元的输入可以分为兴奋性输入和抑制性输入两种类型
3.神经元阈值特性: 当细胞体膜内外电位差(由突触输入信号总和)超过阈值时产生脉冲,神经细胞进入兴奋状态。
4.信号在突触结构的传递存在延迟,神经元的输入和输出之间也具有一定的延时
###突触
在这里插入图片描述
突触是由突触前膜,突触间隙,突触后膜三部分构成,一个神经元的轴突末梢经过多次分支,最后每一小支的末端膨大呈杯状或球状,叫做突触小体。这些突触小体可以与多个神经元的细胞体或树突相接触而形成突触(一个神经元可以与多个突触小体进行连接)

化学突触指的是突触前膜借助化学信号(递质)将信号传送到突触后细胞,而电突触则借助电信号。化学突触和电突触都又相应的被分为兴奋性突触和抑制性突触。使下一个神经元产生兴奋效应的为兴奋性突触和抑制性突触。使下一个神经元产生抑制效应的为抑制性突触。因此看来突触的主要作用是在神经元细胞之间传递信息

人工神经网络

接下来我们仿照神经元模型建立一个人工神经网络,简称神经网络或连接模型。这是一种模仿动物神经元网络行为特征,进行分布式信息处理的数学算法模型,本质就是按照生物神经元的结构和工作原理构造出来的一个抽象和简化了的数学模型

这个模型不需要模拟生物神经元的所有属性和行为,但是要足以模拟它的执行计算过程,回想一下神经原在受到刺激的时候电位信号的概念是不是就可以用0和1来表示。为了达到简易处理的目的,我们忽略了不太相关的复杂因素。我们的人工神经网络模型是一个包含输入,输出和计算功能的模型,输出与计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。

下图是一个典型的神经元模型:包含两个输入,一个阈值,一个输出,以及两个计算功能。这些线称为连接。每个上有一个“权值”
在这里插入图片描述
对于某一个神经元,他可能同时接收了多个输入信号(输出1,2),神经元之间靠形成突触的方式构成神经网络,但是各个突触的结构的性质与连接强度不尽相同,具体表示时相同的输入可能对不同的神经元有不同的影响。引入权重值的目的就是为了模拟突触的这种表现,其征途代表了生物神经元中突出的兴奋或抑制,其大小则表示突触间的不同连接强度。

考虑到神经元的累加性,我们对全部的输入信号进行累加整合,相当于生物神经元中膜电位的变化总量,其值可以用下述公式表示
在这里插入图片描述
生物神经元的激活与否取决于输入信号与某一阈值电平的比较。在神经元模型中也是类似的,只有当其输入总和超过阈值b时才会被激活,否者神经元不会被激活,说的简单一些就是老王给老刘一巴掌如果打的不恨老刘就不会怎么疼。当处于激活后,可以计算出y值

之后会再进行一个非线性变换。在深度学习中,常用的激活函数主要有,sigmid,tanh,ReLu,这个在我们的另一篇博客中有详细说明,有兴趣的可以去看一下。

神经网络的基本结构

简单的神经网络可能分为三层,分别是输入层,输出层,以及中间的隐藏层在这里插入图片描述
输入层有三个输入单元,隐藏层有4个单元,输出层有两个单元。

  1. 设计一个神经网络时,输入层与输出层的节点数往往是固定的,中间层则可以只有指定
  2. 神经网络结构图中的拓扑与箭头代表着预测过程时的数据流向,跟训练时的数据流有一定的区别。
  3. 结构图里的关键不是圆圈(代表“神经元”),而是连接线(代表“神经元”之间的连接)。每个连接线对应一个不同的权重(其值称为权值),这是需要训练得到的。

神经网络的训练过程

  1. 整理输入和输出
    我们有一组样本数据,每个样本有三个输入特征与一个输出结果。我们需要做的就是通过三个输入特征值预测输出。
  2. 模型搭建与训练
    依据设计号的神经网络结果,为每一层输出分配权重,完成神经网络正向结构搭建。基于正向传播计算样本预测输出。根据已知训练样本,设计损失函数,基于反向传播不断迭代更新每一层的权重参数使损失函数值向最低点快速收敛。
  3. 预测
    使用训练号的一组权重,对未知输出的输入结果进行结果预测。

正向传播(FP-Forward Propagation)

在这里插入图片描述
正向传播的推导过程如下
l a y e r 0 = X layer_0 = X \\
根据第一层权重计算第一层结果:
l a y e r 1 = s i g m o i d ( l a y e r 0 × W 1 ) layer_1 = sigmoid(layer_0 \times W_1)
注W1就是上图中国的w矩阵
根据第二层权重计算当前样本的预测输出
l a y e r 2 ( o u t ) = s i g m o i d ( l a y e r 1 × W 2 ) ) = y layer_2(out) = sigmoid(layer_1 \times W_2)) = y'
注:在处理y‘的时候需要运用导数求导的链式法则

反向传播(BP - Backward Propagation)

根据预测结果与实际结果的误差设计损失函数,对损失函数求偏导,随着迭代次数的不断增加。从而从后向前更新权重的过程称为反向传播在这里插入图片描述

代码实现

1.设计神经网络结构,按照已定的结构训练神经网络分类业务

"""
神经网络
"""
import numpy as np
import random


# sigmiod 函数
def active(x):
    return 1 / (1 + np.exp(-x))


# sigmoid函数导函数
def backward(x):
    return x * (1 - x)


# 单层网络前项传播
def forward(x, w):
    return np.dot(x, w)  # 做矩阵乘法


# 自定义数据--x数据里面相当于坐标x坐标>y坐标是0类别,x坐标<y坐标是1类别
x = np.array([
    [3, 1],
    [2, 5],
    [1, 8],
    [6, 4],
    [5, 2],
    [3, 5],
    [4, 7],
    [4, -1]
])
y = np.array([0, 1, 1, 0, 0, 1, 1, 0]).reshape(-1, 1)

# 随机初始化权重[-1,1) 识别选取一个范围都可以
w0 = 2 * np.random.random((2, 4)) - 1  # 2行4列的随机权重
w1 = 2 * np.random.random(((4, 1))) - 1  # 4行1列的随机权重
# 学习率
lrate = 0.01

for j in range(500000):
    l0 = x
    l1 = active(forward(l0, w0))
    l2 = active(forward(l1, w1))
    # 损失
    l2_error = y - l2
    if (j % 100) == 0:
        print("Error:" + str(np.mean(np.abs(l2_error))))
    # 反向传播更新权重
    # 需要用到矩阵求导的数学知识
    l2_delta = l2_error * backward(l2)
    # 更新w1
    w1 += l1.T.dot(l2_delta * lrate)
    l1_error = l2_delta.dot(w1.T)
    l1_delta = l1_error * backward(l1)
    # 更新w0
    w0 += l0.T.dot(l1_delta * lrate)

# 预测函数
def predict(x):
    l0 = x
    l1 = active(forward(l0, w0))
    l2 = active(forward(l1, w1))
    result = np.zeros_like(l2)
    result[l2 > 0.5] = 1
    return result

# 随机生成测试数据
test_data = []
for i in range(50):
    test_data.append([random.randint(1,100),random.randint(1,100)])
test_data = np.array(test_data)
result = predict(test_data)
# 打印出预测结果
for i in range(len(result)):
    data = test_data[i]
    result_class = result[i]
    print(data , "的类别是" , result_class)
    
out:
Error:0.4877517049449124
Error:0.03363682609747165
Error:0.022754124826907834
Error:0.018257549407942497
Error:0.015658226038811965
Error:0.013916323121846479
Error:0.012646203632883423
Error:0.011667887456157114
Error:0.010884716533443615
Error:0.010239571457678589
Error:0.00969626256592914
Error:0.009230609385757852
Error:0.008825763586183134
Error:0.008469580116759719
Error:0.00815305490824363
Error:0.007869352996065065
Error:0.007613180388132375
Error:0.007380364713442302
Error:0.007167567336235029
Error:0.0069720808691301935
Error:0.006791683687538755
Error:0.006624533410859292
Error:0.006469087592622835
Error:0.006324043772854693
Error:0.0061882935454266345
Error:0.006060886927264033
Error:0.00594100440664712
Error:0.005827934789091811
Error:0.005721057471769453
Error:0.0056198281372822545
Error:0.005523767113916035
Error:0.005432449834451289
Error:0.005345498960718542
Error:0.005262577840893239
Error:0.005183385041023989
Error:0.00510764974845924
Error:0.0050351278875568435
Error:0.004965598820849328
Error:0.00489886253419051
Error:0.004834737224175436
Error:0.0047730572216281
Error:0.004713671197219194
Error:0.004656440605015804
Error:0.004601238327566014
Error:0.004547947492397241
Error:0.004496460434883569
Error:0.004446677786562709
Error:0.004398507671364526
Error:0.004351864994975042
Error:0.004306670814849616
[1 7] 的类别是 [1.]
[66 22] 的类别是 [0.]
[92 67] 的类别是 [0.]
[82 24] 的类别是 [0.]
[80 53] 的类别是 [0.]
[89 35] 的类别是 [0.]
[31 91] 的类别是 [1.]
[17  2] 的类别是 [0.]
[42 66] 的类别是 [1.]
[67 98] 的类别是 [1.]
[94 89] 的类别是 [0.]
[36 44] 的类别是 [1.]
[4 1] 的类别是 [0.]
[70  8] 的类别是 [0.]
[84 88] 的类别是 [1.]
[26 19] 的类别是 [0.]
[28 80] 的类别是 [1.]
[11 12] 的类别是 [1.]
[65 16] 的类别是 [0.]
[74 69] 的类别是 [0.]
[83 52] 的类别是 [0.]
[66 10] 的类别是 [0.]
[35 47] 的类别是 [1.]
[61 22] 的类别是 [0.]
[30 99] 的类别是 [1.]
[69 50] 的类别是 [0.]
[37 71] 的类别是 [1.]
[42 33] 的类别是 [0.]
[76  9] 的类别是 [0.]
[42 73] 的类别是 [1.]
[40 82] 的类别是 [1.]
[73 54] 的类别是 [0.]
[80 48] 的类别是 [0.]
[90 75] 的类别是 [0.]
[29 81] 的类别是 [1.]
[87 11] 的类别是 [0.]
[ 9 65] 的类别是 [1.]
[56 59] 的类别是 [1.]
[57 20] 的类别是 [0.]
[97 85] 的类别是 [0.]
[97 83] 的类别是 [0.]
[43 66] 的类别是 [1.]
[92 30] 的类别是 [0.]
[94 76] 的类别是 [0.]
[87 24] 的类别是 [0.]
[46 50] 的类别是 [1.]
[74 18] 的类别是 [0.]
[77 18] 的类别是 [0.]
[41  1] 的类别是 [0.]
[43 74] 的类别是 [1.]

大家可能对预测有点困惑,可以去看看这篇文章:https://cloud.tencent.com/developer/news/451005

发布了62 篇原创文章 · 获赞 33 · 访问量 3493

猜你喜欢

转载自blog.csdn.net/python_LC_nohtyp/article/details/103552598