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

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

时间:2022-11-20 20:00:31浏览次数:43  
标签:ypred sigmoid h2 self h1 算法 神经网络 实验 sum

【实验目的】

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

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

【实验内容】

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库;
代码规范化:命名规则、注释;
查阅文献,讨论神经网络的应用场景。

答:

代码图:

 

 

 

 

 

 

代码:

import numpy as np
def sigmoid(x):
return 1/ (1+np.exp(-x))
def deriv_sigmoid(x):
fx = sigmoid(x)
return fx*(1-fx)
def mes_loss(y_true,y_pred):
return ((y_true - y_pred)**2).mean()
class OurNeuralNetwork:
def __init__(self):
#权重
self.w1 = np.random.normal()
self.w2 = np.random.normal()
self.w3 = np.random.normal()
self.w4 = np.random.normal()
self.w5 = np.random.normal()
self.w6 = np.random.normal()
#b
self.b1 = np.random.normal()
self.b2 = np.random.normal()
self.b3 = np.random.normal()
def feedforward(self,x):
h1 = sigmoid(self.w1 * x[0] + self.w2 * x[1] + self.b1)
h2 = sigmoid(self.w3 * x[0] + self.w4 * x[1] + self.b2)
o1 = sigmoid(self.w5 *h1 +self.w6 *h2 +self.b3)
return o1
def train(self,data,all_y_trues):
learn_rate = 0.1
epochs = 1000
for epoch in range(epochs):
for x,y_true in zip(data,all_y_trues):
sum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1
h1 = sigmoid(sum_h1)
sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2
h2 = sigmoid(sum_h2)
sum_o1 = self.w5 *h1 +self.w6 *h2 +self.b3
o1 = sigmoid(sum_o1)
y_pred = o1
d_L_d_ypred = -2 * (y_true - y_pred)

d_ypred_d_w5 = h1*deriv_sigmoid(sum_o1)
d_ypred_d_w6 = h2*deriv_sigmoid(sum_o1)
d_ypred_d_b3 = deriv_sigmoid(sum_o1)
d_ypred_d_h1 = self.w5*deriv_sigmoid(sum_o1)
d_ypred_d_h2 = self.w6*deriv_sigmoid(sum_o1)

d_h1_d_w1 = x[0] * deriv_sigmoid(sum_h1)
d_h1_d_w2 = x[1] * deriv_sigmoid(sum_h1)
d_h1_d_b1 = deriv_sigmoid(sum_h1)

d_h2_d_w3 = x[0] * deriv_sigmoid(sum_h2)
d_h2_d_w4 = x[1] * deriv_sigmoid(sum_h2)
d_h2_d_b2 = deriv_sigmoid(sum_h2)

self.w1 -= learn_rate* d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w1
self.w2 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w2
self.b1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_b1

self.w3 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w3
self.w4 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w4
self.b2 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_b2

self.w5 -= learn_rate * d_L_d_ypred * d_ypred_d_w5
self.w6 -= learn_rate * d_L_d_ypred * d_ypred_d_w6
self.b3 -= learn_rate * d_L_d_ypred * d_ypred_d_b3

if epoch % 10==0:
y_preds=np.apply_along_axis(self.feedforward,1,data)
loss=mes_loss(all_y_trues,y_preds)
print("Epoch %d loss:%.3f" % (epoch,loss))

data=np.array([
[1.78,1.14],
[1.96,1.18],
[1.86,1.20],
[1.72,1.24],
[2.00,1.26],
[2.00,1.28],
[1.96,1.30],
[1.74,1.36],
[1.64,1.38],
[1.82,1.38],
[1.90,1.38],
[1.70,1.40],
[1.82,1.48],
[1.82,1.54],
[2.08,1.56],
])

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

network=OurNeuralNetwork()
network.train(data,all_y_trues)

#预测
test1=np.array([1.24,1.80])
test2=np.array([1.28,1.84])
test3=np.array([1.40,2.04])
print("test1: %.3f" % network.feedforward(test1))
print("test2: %.3f" % network.feedforward(test2))
print("test3: %.3f" % network.feedforward(test3))
for i in (test1,test2,test3):
if network.feedforward(i)>0.5:
print("test类型是:Apf")
else:
print("test类型是:Af")

 

 

结果:

 

标签:ypred,sigmoid,h2,self,h1,算法,神经网络,实验,sum
From: https://www.cnblogs.com/xiongwenhao/p/16909346.html

相关文章

  • C语言实验手册
    在三位整数(100~999)中寻找符合条件的整数,并以此从小到大存到数组当中,它既是完全平方数,又是两位数字相同,例如144,676等。#include<stdio.h>#include<math.h>intisSquare......
  • 二叉树交换左右子树递归以及非递归算法
    递归方式基本思想:1、当待处理节点非空时,判断其左右孩子是否不同时为空:若是,转到2、否则分别递归调用左右子树进行操作。2、新建一个辅助结点,执行交换操作。3、递归调用......
  • 十大排序算法的各种编程语言的实现
    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排......
  • 实验四:神经网络算法实验
    importnumpyasnpdefsigmoid(x):return1/(1+np.exp(-x))#f(x)=1/(1+exp(-x))defderiv_sigmoid(x):fx=sigmoid(x)returnfx*(1-fx)#f'(x)=f(x)*(1-f(......
  • 路径规划算法
    路径规划算法BFS广度优先遍历广度优先遍历与最短路径|菜鸟教程(runoob.com)5.1GraphTraversals-BFS&DFS-BreadthFirstSearchandDepthFirstSearch-Y......
  • 博弈论扩展 CFR算法 一 基本概念
    扩展扩展性博弈与CFR算法目录扩展扩展性博弈与CFR算法CFR算法的发展算法应用强化学习的结合学习资料:扩展型博弈——知识回顾表示形式——博弈树信息集informati......
  • 实验四:神经网络算法实验
    【实验目的】理解神经网络原理,掌握神经网络前向推理和后向传播方法;掌握神经网络模型的编程实现方法。【实验内容】1.1981年生物学家格若根(W.Grogan)和维什(W.Wirth)发现了......
  • 实验四:神经网络算法实验
    【实验目的】理解神经网络原理,掌握神经网络前向推理和后向传播方法;掌握神经网络模型的编程实现方法。【实验内容】1.1981年生物学家格若根(W.Grogan)和维什(W.Wirth)发现了......
  • tcp的拥塞控制算法reno与bbr
    拥塞的指证超时---拥塞收到三个冗余的ACK---轻微拥塞发送方如何控制向网络中发送的速率发送方在对方未经确认的情况下,可以向网络中发送多少字节:min(发送方拥塞窗......
  • 强化学习代码实战-09 SAC 算法
    离线学习算法:A3C,PPO,TRPO在线学习算法:DDPG,训练不稳定,容易陷入局部最优SAC:离线策略,随机策略,最大化累积奖励的同时最大化策略的熵(更好地探索环境,熵值越高,策略越随机,目......