首页 > 编程语言 >实验四:神经网络算法实验

实验四:神经网络算法实验

时间:2022-11-18 10:13:19浏览次数:58  
标签:loss ypred Epoch h2 self h1 算法 神经网络 实验

【实验目的】

理解神经网络原理,掌握神经网络前向推理和后向传播方法;

掌握神经网络模型的编程实现方法。

【实验内容】

1.1981年生物学家格若根(W.Grogan)和维什(W.Wirth)发现了两类蚊子(或飞蠓midges),他们测量了这两类蚊子每个个体的翼长和触角长,数据如下:

翼长 触角长 类别
1.78 1.14 Apf
1.96 1.18 Apf
1.86 1.20 Apf
1.72 1.24 Apf
2.00 1.26 Apf
2.00 1.28 Apf
1.96 1.30 Apf
1.74 1.36 Af
1.64 1.38 Af
1.82 1.38 Af
1.90 1.38 Af
1.70 1.40 Af
1.82 1.48 Af
1.82 1.54 Af
2.08 1.56 Af

现有三只蚊子的相应数据分别为(1.24,1.80)、(1.28,1.84)、(1.40,2.04),请判断这三只蚊子的类型。

【实验报告要求】

建立三层神经网络模型,编写神经网络训练的推理的代码,实现类型预测;
对照实验内容,撰写实验过程、算法及测试结果,程序不得使用sklearn库;
代码规范化:命名规则、注释;
查阅文献,讨论神经网络的应用场景。

小知识

设计一个神经网络时,输入层与输出层的节点数往往是固定的,中间层则可以自由指定;

神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;

结构图里的关键不是圆圈(代表“神经元”),而是连接线(代表“神经元”之间的连接)。每个连接线对应一个不同的权重(其值称为权值),这是需要训练得到的。 

作用

神经元模型的使用可以这样理解:

我们有一个数据,称之为样本。样本有四个属性,其中三个属性已知,一个属性未知。我们需要做的就是通过三个已知属性预测未知属性。

具体办法就是使用神经元的公式进行计算。三个已知属性的值是a1,a2,a3,未知属性的值是z。z可以通过公式计算出来。

这里,已知的属性称之为特征,未知的属性称之为目标。假设特征与目标之间确实是线性关系,并且我们已经得到表示这个关系的权值w1,w2,w3。那么,我们就可以通过神经元模型预测新样本的目标。

前向推理

1     def forward(self,x):
2         h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1
3         h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2
4         out = sigmoid(self.w5 *h1 +self.w6 *h2 +self.b3)
5         return out

神经网络模型

  1 import numpy as np
  2 def sigmoid(x):
  3     return 1 / (1 + np.exp(-x))
  4 def sigmoid_2(x):
  5     return sigmoid(x)*(1-sigmoid(x))
  6 def mes_loss(x,y):
  7     return ((x-y)**2).mean()
  8 class NeuralNetwork():
  9     def __init__(self):
 10         #初始化参数s
 11         self.w1 = np.random.normal()
 12         self.w2 = np.random.normal()
 13         self.w3 = np.random.normal()
 14         self.w4 = np.random.normal()
 15         self.w5 = np.random.normal()
 16         self.w6 = np.random.normal()
 17         self.b1 = np.random.normal()
 18         self.b2 = np.random.normal()
 19         self.b3 = np.random.normal()
 20     def forward(self,x):
 21         h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1
 22         h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2
 23         out = sigmoid(self.w5 *h1 +self.w6 *h2 +self.b3)
 24         return out
 25 
 26     def train(self,data,all_y_trues):
 27         learn_rate = 0.1
 28         epochs = 1000
 29         for epoch in range(epochs):
 30             for x,y_true in zip(data,all_y_trues):
 31                 sum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1
 32                 h1 = sigmoid(sum_h1)
 33                 sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2
 34                 h2 = sigmoid(sum_h2)
 35                 sum_o1 = self.w5 *h1 +self.w6 *h2 +self.b3
 36                 o1 = sigmoid(sum_o1)
 37                 y_pred = o1
 38                 d_L_d_ypred = -2 * (y_true - y_pred)
 39                 
 40                 d_ypred_d_w5 = h1*sigmoid_2(sum_o1)
 41                 d_ypred_d_w6 = h2*sigmoid_2(sum_o1)
 42                 d_ypred_d_b3 = sigmoid_2(sum_o1)
 43                 d_ypred_d_h1 = self.w5*sigmoid_2(sum_o1)
 44                 d_ypred_d_h2 = self.w6*sigmoid_2(sum_o1)
 45                 
 46                 d_h1_d_w1 = x[0] * sigmoid_2(sum_h1)
 47                 d_h1_d_w2 = x[1] * sigmoid_2(sum_h1)
 48                 d_h1_d_b1 = sigmoid_2(sum_h1)
 49                 
 50                 d_h2_d_w3 = x[0] * sigmoid_2(sum_h2)
 51                 d_h2_d_w4 = x[1] * sigmoid_2(sum_h2)
 52                 d_h2_d_b2 = sigmoid_2(sum_h2)
 53                 
 54                 self.w1 -= learn_rate* d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w1
 55                 self.w2 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w2
 56                 self.b1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_b1
 57                 
 58                 self.w3 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w3
 59                 self.w4 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w4
 60                 self.b2 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_b2
 61                 
 62                 self.w5 -= learn_rate * d_L_d_ypred * d_ypred_d_w5
 63                 self.w6 -= learn_rate * d_L_d_ypred * d_ypred_d_w6
 64                 self.b3 -= learn_rate * d_L_d_ypred * d_ypred_d_b3
 65                 
 66                 if epoch % 10==0:
 67                     y_preds=np.apply_along_axis(self.forward,1,data)
 68                     loss=mes_loss(all_y_trues,y_preds)
 69                     print("Epoch %d loss:%.3f" % (epoch,loss))
 70                     
 71 
 72     data=np.array([
 73     [1.78,1.14],
 74     [1.96,1.18],
 75     [1.86,1.20],
 76     [1.72,1.24],
 77     [2.00,1.26],
 78     [2.00,1.28],
 79     [1.96,1.30],
 80     [1.74,1.36],
 81     [1.64,1.38],
 82     [1.82,1.38],
 83     [1.90,1.38],
 84     [1.70,1.40],
 85     [1.82,1.48],
 86     [1.82,1.54],
 87     [2.08,1.56],
 88 ])
 89 label = np.array([
 90     1,
 91     1,
 92     1,
 93     1,
 94     1,
 95     1,
 96     1,
 97     0,
 98     0,
 99     0,
100     0,
101     0,
102     0,
103     0,
104     0,
105 ])
106 network=NeuralNetwork()
107 network.train(data,label)
108 
109 #预测
110 test1=np.array([1.24,1.80])
111 test2=np.array([1.28,1.84])
112 test3=np.array([1.40,2.04])
113 print("test1: %.3f" % network.forward(test1))
114 print("test2: %.3f" % network.forward(test2))
115 print("test3: %.3f" % network.forward(test3))
116 for i in (test1,test2,test3):
117     if network.forward(i)>0.5:
118         print("test类型是:Apf")
119     else:
120         print("test类型是:Af")

结果

Epoch 0 loss:0.336
Epoch 0 loss:0.343
Epoch 0 loss:0.349
Epoch 0 loss:0.355
Epoch 0 loss:0.360
Epoch 0 loss:0.366
Epoch 0 loss:0.371
Epoch 0 loss:0.365
Epoch 0 loss:0.358
Epoch 0 loss:0.351
Epoch 0 loss:0.345
Epoch 0 loss:0.338
Epoch 0 loss:0.332
Epoch 0 loss:0.326
Epoch 0 loss:0.320
Epoch 10 loss:0.302
Epoch 10 loss:0.308
Epoch 10 loss:0.314
Epoch 10 loss:0.320
Epoch 10 loss:0.327
Epoch 10 loss:0.334
Epoch 10 loss:0.340
Epoch 10 loss:0.334
Epoch 10 loss:0.327
Epoch 10 loss:0.321
...
test3: 0.000
test类型是:Af
test类型是:Af
test类型是:Af

神经网络的应用场景

神经网络可以用于模式识别、信号处理、知识工程、专家系统、优化组合、机器人控制等

标签:loss,ypred,Epoch,h2,self,h1,算法,神经网络,实验
From: https://www.cnblogs.com/jiangshi-1/p/16902033.html

相关文章

  • 实验四:神经网络算法实验
    【实验目的】理解神经网络原理,掌握神经网络前向推理和后向传播方法;掌握神经网络模型的编程实现方法。【实验内容】1.1981年生物学家格若根(W.Grogan)和维什(W.Wirth)发现了......
  • 每日算法之跳台阶扩展问题
    JZ71跳台阶扩展问题描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。数据范围:1\len\l......
  • 代码随想录算法训练营第二天| 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩
    977.有序数组的平方题目建议:本题关键在于理解双指针思想题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/文章讲解:https://programmercarl.com/09......
  • 洗牌算法
    洗牌算法   点评:上面即为洗牌算法的思想,其本质是对数组元素进行随机重排。数组中每个元素经过洗牌算法后落在数组某个位置上的概率是相等的,洗牌算法在......
  • 十六、二叉树(二叉链表)遍历算法
    一、二叉树的遍历遍历二叉树(Traversingbinarytree)是指按某条搜索路径巡访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。先序遍历(根左右)中序遍历......
  • 排序算法Python
    冒泡排序defbubbleSort(nums):iflen(nums)<=1:returnnumsforiinrange(len(nums)-1):forjinrange(len(nums)-i-1):......
  • 实验2:Open vSwitch虚拟交换机实践
    一、实验目的能够对OpenvSwitch进行基本操作;能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;能够通过Mininet的Python代码运行OVS命令,控制网络拓扑中的Open......
  • 实验7
    .生成拓扑sudomn--topo=single,3--controller=remote,ip=127.0.0.1,port=6633--switchovsk,protocols=OpenFlow13启动OpenDaylight:./../distribution-karaf-0.4.4......
  • 算法导论笔记
    CUMT算法导论课程课本:计算机算法设计与分析(王晓东)本blog代码为Java实现第二章分治与递归递归直接或间接调用算法自身。全排列问题求出n个元素的全排列,可以......
  • 代码随想录算法训练营Day02|977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵
    代码随想录算法训练营Day02|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II977.有序数组的平方题目链接:977.有序数组的平方首先还是仔细审题,题目给出的数......