• 神经网络的基本工作原理——机器学习


    目录

    ​编辑

    一、实验内容

    二、实验过程

    1、算法思想

    2、算法原理

    3、算法分析

    三、源程序代码

    四、运行结果及分析

     五、实验总结


    一、实验内容


    1. 掌握神经元细胞的数学模型;
    2. 理解并掌握神经网络的训练过程;
    3. 理解并掌握神经网络中的矩阵运算;
    4. 理解三大概念-反向传播,梯度下降,损失函数
    5. 理解神经网络的主要功能。

    二、实验过程


    1、算法思想


            人工神经网络是由简单神经元经过相互连接形成网状结构,通过调节各连接的权重值改变连接的强度,进而实现感知判断。

    2、算法原理


            神经元是神经网络的基本计算单元,也被称作节点或者单元。它可以接受来自其他神经元的输入或者是外部的数据,然后计算一个输出。

            每个输入值都有一个权重,权重的大小取决于这个输入相比于其他输入值的重要性。然后在神经元上执行一个特定的函数 f, 这个函数会该神经元的所有输入值以及其权重进行一个操作。

            传统神经网络结构比较简单,训练时随机初始化输入参数,并开启循环计算输出结果,与实际结果进行比较从而得到损失函数,并更新变量使损失函数结果值极小,当达到误差阈值时即可停止循环。算法原理是在外界输入样本的刺激下不断改变网络的连接权值。

    3、算法分析


            前馈神经网络是一种单向多层的网络结构,即信息是从输入层开始,逐层向一个方向传递,一直到输出层结束。

            所谓的“前馈”是指输入信号的传播方向为前向,在此过程不调整各层的权值参数

            而反传播时时将误差逐层向后传播,从而实现使用权值参数对特征的记忆,即通过反向传播(BP)算法来计算各层网络中神经元之间边的权重。BP算法具有非线性映射能力,理论上可以逼近任意连续函数,从而实现对模型的学习。

    三、源程序代码


    1. import numpy as np
    2. def sigmoid(x):
    3. # Sigmoid activation function: f(x) = 1 / (1 + e^(-x))
    4. return 1 / (1 + np.exp(-x))
    5. def deriv_sigmoid(x):
    6. # Derivative of sigmoid: f'(x) = f(x) * (1 - f(x))
    7. fx = sigmoid(x)
    8. return fx * (1 - fx)
    9. def mse_loss(y_true, y_pred):
    10. # y_true和y_pred是相同长度的numpy数组。
    11. return ((y_true - y_pred) ** 2).mean()
    12. class OurNeuralNetwork:
    13. '''
    14. A neural network with:
    15. - 2 inputs
    16. - a hidden layer with 2 neurons (h1, h2)
    17. - an output layer with 1 neuron (o1)
    18. *** 免责声明 ***:
    19. 下面的代码是为了简单和演示,而不是最佳的。
    20. 真正的神经网络代码与此完全不同。不要使用此代码。
    21. 相反,读/运行它来理解这个特定的网络是如何工作的。
    22. '''
    23. def __init__(self):
    24. # 权重,Weights
    25. self.w1 = np.random.normal()
    26. self.w2 = np.random.normal()
    27. self.w3 = np.random.normal()
    28. self.w4 = np.random.normal()
    29. self.w5 = np.random.normal()
    30. self.w6 = np.random.normal()
    31. # 截距项,Biases
    32. self.b1 = np.random.normal()
    33. self.b2 = np.random.normal()
    34. self.b3 = np.random.normal()
    35. def feedforward(self, x):
    36. # X是一个有2个元素的数字数组。
    37. h1 = sigmoid(self.w1 * x[0] + self.w2 * x[1] + self.b1)
    38. h2 = sigmoid(self.w3 * x[0] + self.w4 * x[1] + self.b2)
    39. o1 = sigmoid(self.w5 * h1 + self.w6 * h2 + self.b3)
    40. return o1
    41. def train(self, data, all_y_trues):
    42. '''
    43. - data is a (n x 2) numpy array, n = # of samples in the dataset.
    44. - all_y_trues is a numpy array with n elements.
    45. Elements in all_y_trues correspond to those in data.
    46. '''
    47. learn_rate = 0.1
    48. epochs = 1000 # 遍历整个数据集的次数
    49. for epoch in range(epochs):
    50. for x, y_true in zip(data, all_y_trues):
    51. # --- 做一个前馈(稍后我们将需要这些值)
    52. sum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1
    53. h1 = sigmoid(sum_h1)
    54. sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2
    55. h2 = sigmoid(sum_h2)
    56. sum_o1 = self.w5 * h1 + self.w6 * h2 + self.b3
    57. o1 = sigmoid(sum_o1)
    58. y_pred = o1
    59. # --- 计算偏导数。
    60. # --- Naming: d_L_d_w1 represents "partial L / partial w1"
    61. d_L_d_ypred = -2 * (y_true - y_pred)
    62. # Neuron o1
    63. d_ypred_d_w5 = h1 * deriv_sigmoid(sum_o1)
    64. d_ypred_d_w6 = h2 * deriv_sigmoid(sum_o1)
    65. d_ypred_d_b3 = deriv_sigmoid(sum_o1)
    66. d_ypred_d_h1 = self.w5 * deriv_sigmoid(sum_o1)
    67. d_ypred_d_h2 = self.w6 * deriv_sigmoid(sum_o1)
    68. # Neuron h1
    69. d_h1_d_w1 = x[0] * deriv_sigmoid(sum_h1)
    70. d_h1_d_w2 = x[1] * deriv_sigmoid(sum_h1)
    71. d_h1_d_b1 = deriv_sigmoid(sum_h1)
    72. # Neuron h2
    73. d_h2_d_w3 = x[0] * deriv_sigmoid(sum_h2)
    74. d_h2_d_w4 = x[1] * deriv_sigmoid(sum_h2)
    75. d_h2_d_b2 = deriv_sigmoid(sum_h2)
    76. # --- 更新权重和偏差
    77. # Neuron h1
    78. self.w1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w1
    79. self.w2 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w2
    80. self.b1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_b1
    81. # Neuron h2
    82. self.w3 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w3
    83. self.w4 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w4
    84. self.b2 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_b2
    85. # Neuron o1
    86. self.w5 -= learn_rate * d_L_d_ypred * d_ypred_d_w5
    87. self.w6 -= learn_rate * d_L_d_ypred * d_ypred_d_w6
    88. self.b3 -= learn_rate * d_L_d_ypred * d_ypred_d_b3
    89. # --- 在每次epoch结束时计算总损失
    90. if epoch % 100 == 0:
    91. y_preds = np.apply_along_axis(self.feedforward, 1, data)
    92. loss = mse_loss(all_y_trues, y_preds)
    93. print("Epoch %d loss: %.3f" % (epoch, loss))
    94. # 定义数据集
    95. data = np.array([
    96. [-2, -1], # Alice
    97. [25, 6], # Bob
    98. [17, 4], # Charlie
    99. [-15, -6], # Diana
    100. ])
    101. all_y_trues = np.array([
    102. 1, # Alice
    103. 0, # Bob
    104. 0, # Charlie
    105. 1, # Diana
    106. ])
    107. # 训练我们的神经网络!
    108. network = OurNeuralNetwork()
    109. network.train(data, all_y_trues)

    四、运行结果及分析


    可以看出损失值随着学习率而变化

     五、实验总结


            神经网络的主要工作是建立模型和确定权值,一般有前向型和反馈型两种网络结构。

            通常神经网络的学习和训练需要一组输入数据和输出数据对,选择网络模型和传递、训练函数后,神经网络计算得到输出结果,根据实际输出和期望输出之间的误差进行权值的修正,在网络进行判断的时候就只有输入数据而没有预期的输出结果。

            神经网络一个相当重要的能力是其网络能通过它的神经元权值和阈值的不断调整从环境中进行学习,直到网络的输出误差达到预期的结果。

  • 相关阅读:
    为解决bypy大文件上传报错—获取百度云文件直链并使用Aria2上传文件至服务器
    无法连接虚拟机,解决办法
    Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单
    如何解决两个不同服务器,不同账户下的虚拟环境的克隆问题
    最成熟的前端换肤方案
    JAVA-POI && easyEXCEL
    腾讯云Redis云数据库有哪些优势?适用于哪些场景?
    超详细的三星全系列机型线刷图文教程和相关注意操作常识 二
    href=“#“与href=“javascript:void(0)“的区别
    Android WebView中打开外部超链接无反应
  • 原文地址:https://blog.csdn.net/qq_50942093/article/details/128006173