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

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

时间:2022-11-18 12:03:32浏览次数:47  
标签:ypred sigmoid h2 self h1 算法 神经网络 实验 np

【实验目的】

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

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

【实验内容】

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))#f(x)=1/(1+exp(-x))
def deriv_sigmoid(x):
    fx=sigmoid(x)
    return fx*(1-fx)#f'(x)=f(x)*(1-f(x))
def mse_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()
        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)
                #Neuron o1
                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)
                #Neuron h1
                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)
                #Neuron h2
                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)
                #Neuron h1
                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
                #Neuron h2
                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
                #Neuron o1
                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=mse_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],
])
#类别:Apf 1, Af 0
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))
#如果概率大于0.5则类型为Apf,小于0.5则类型为Af
for i in [test1,test2,test3]:
    if network.feedforward(i)>0.5:
        print("test类型:Apf")
    else:
        print("test类型:Af")

神经网络的应用场景

图像和物体识别,电子游戏,语音生成和识别,艺术和风格的模仿,各种预测

信息领域中的应用:信息处理、模式识别、数据压缩等常见的神经网络结构。自动化领域:系统辨识、神经控制器、智能检测等。工程领域:汽车工程、军事工程、化学工程、水利工程等。

在医学中的应用:生物信号的检测与分析、生物活性研究、医学专家系统等。经济领域的应用:市场价格预测、风险评估等。此外还有很多应用,比如交通领域的应用,心理学领域的应用等等。

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

相关文章

  • Python算法题库(入门)
    1. 字符串最后一个单词长度str=input("输入一串字符串:")strList=str.split('')[-1]print(len(strList)) 2. 计算某字符出现的次数str=input("请输入:").......
  • letcode算法--21.螺旋矩阵 II
    给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 nxn 正方形矩阵 matrix 。示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]]......
  • Tarjan算法求强连通分量
    \(Tarjan\)——强连通分量首先了解几个概念:强连通,强连通图,强连通分量强连通:在一个有向图\(G\)中,两个点\(a,b\),\(a\)可以走到\(b\),\(b\)可以走到\(a\),我们就说\((a,b)\)......
  • 实验四:神经网络算法实验
    【实验目的】理解神经网络原理,掌握神经网络前向推理和后向传播方法;掌握神经网络模型的编程实现方法。【实验内容】1.1981年生物学家格若根(W.Grogan)和维什(W.Wirth)发现了......
  • 实验四:神经网络算法实验
    【实验目的】理解神经网络原理,掌握神经网络前向推理和后向传播方法;掌握神经网络模型的编程实现方法。【实验内容】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):......