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

news2024/11/18 7:33:23

目录

​编辑

一、实验内容

二、实验过程

1、算法思想

2、算法原理

3、算法分析

三、源程序代码

四、运行结果及分析

 五、实验总结


一、实验内容


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

二、实验过程


1、算法思想


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

2、算法原理


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

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

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

3、算法分析


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

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

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

三、源程序代码


import numpy as np
 
 
def sigmoid(x):
    # Sigmoid activation function: f(x) = 1 / (1 + e^(-x))
    return 1 / (1 + np.exp(-x))
 
 
def deriv_sigmoid(x):
    # Derivative of sigmoid: f'(x) = f(x) * (1 - f(x))
    fx = sigmoid(x)
    return fx * (1 - fx)
 
 
def mse_loss(y_true, y_pred):
    # y_true和y_pred是相同长度的numpy数组。
    return ((y_true - y_pred) ** 2).mean()
 
 
class OurNeuralNetwork:
    '''
    A neural network with:
      - 2 inputs
      - a hidden layer with 2 neurons (h1, h2)
      - an output layer with 1 neuron (o1)
    *** 免责声明 ***:
      下面的代码是为了简单和演示,而不是最佳的。
      真正的神经网络代码与此完全不同。不要使用此代码。
      相反,读/运行它来理解这个特定的网络是如何工作的。
    '''
 
    def __init__(self):
        # 权重,Weights
        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()
 
        # 截距项,Biases
        self.b1 = np.random.normal()
        self.b2 = np.random.normal()
        self.b3 = np.random.normal()
 
    def feedforward(self, x):
        # X是一个有2个元素的数字数组。
        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):
        '''
        - data is a (n x 2) numpy array, n = # of samples in the dataset.
        - all_y_trues is a numpy array with n elements.
          Elements in all_y_trues correspond to those in data.
        '''
        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
 
                # --- 计算偏导数。
                # --- Naming: d_L_d_w1 represents "partial L / partial w1"
                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
 
            # --- 在每次epoch结束时计算总损失
            if epoch % 100 == 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([
    [-2, -1],  # Alice
    [25, 6],  # Bob
    [17, 4],  # Charlie
    [-15, -6],  # Diana
])
all_y_trues = np.array([
    1,  # Alice
    0,  # Bob
    0,  # Charlie
    1,  # Diana
])
 
# 训练我们的神经网络!
network = OurNeuralNetwork()
network.train(data, all_y_trues)

四、运行结果及分析


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

 五、实验总结


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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Neo4j入门实战

1.介绍 2.实战 Neo4j的sql语句 1.创建多个节点 CREATE (:student {name:小张,age:20}),(:student {name:彭莎丽,age:18})2.匹配节点将节点删除 这样删除是将student中的条件节点删除——>会变成空白节点 match (m:student {name:"Fairy同学"}) remove m:stu…

Docker数据管理

目录 一、数据卷 二、数据卷容器 三、容器互联 管理 Docker容器中数据主要有两种方式: 数据卷(Data Volumes)数据卷容器(DataVolumes Containers) 一、数据卷 数据卷是一个供容器使用的特殊目录,位于容…

设计模式之美——基于接口编程

抽象类在被继承时体现的是 is-a 关系,接口在被实现时体现的是 can-do 关系 例如,Plane can fly. Bird can fly,应该把 fly 定义成一个接口。 – 参考 《码出自效Java 开发手册》 函数的命名不能暴露任何实现细节。比如, uploadT…

集合类ArrayList的扩容机制详解

ArrayList类的内部对构造方法进行了重载,提供了无参构造和有参构造两种构造方法。在ArrayList类的内部维护了一个elementData数组用来存放添加的对象。(关于transient关键字:该关键字修饰的属性,不会进行串行化、序列化)。 目录 无参构造扩容…

胡编乱造的自我介绍

写在前面:这篇文章的内容纯属胡编乱造 切勿信以为真。 一、 姓:(Black) 布莱克 名:(Sirius) 天狼星 中间名:(Orion) 奥莱恩 结束! 二、于 2022年3月 入读清华大学信息技术系硕士 ! 结…

harbor 安装

harbor 安装一.离线安装helm1.下载安装包,上传到服务器2.解压4.验证二.安装harbor1.导入 Harbor源2.下载 Harbor Helm目录3.解压缩4.修改 Harbor Values文件5.部署 Harbor6.访问 Harbor7.验证8.修改daemon.json9.登录Harbor、并push镜像验证10.登录Harbor页面验证是…

基站交直流配电多回路无线智能电量采集监控装置

【摘要】介绍了安科瑞两款多回路无线智能电量采集监控装置,可应用于基站的交直流配电监控、低压出线开关柜集中监控、末端配电箱等集成电力参数监测、电能计量、环境温湿度监测以及无线传输的各类应用场景。 【关键词】无线监控;多回路监控;铁…

OpenFeign源码2-Bean注册过程和调用过程

0. 环境 nacos版本:1.4.1Spring Cloud : Hoxton.SR9(没用2020.0.2版本后面说明)Spring Boot :2.4.4Spring Cloud alibaba: 2.2.5.RELEASESpring Cloud openFeign 2.2.2.RELEASE 测试代码:github.com/hsfxuebao/s… 20…

深入理解java虚拟机:虚拟机类加载机制(1)

文章目录1. 类加载的时机2. 类加载的过程2.1 加载2.2 验证2.3 准备2.4 解析2.5 初始化1. 类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了: 加载(Loading)验证(Verif…

计算机网络-应用层(文件传输协议(FTP协议),电子邮件系统(SMTP协议,MIME,POP3,IMAP协议))

文章目录1. 文件传输协议2. 电子邮件系统1. 文件传输协议 文件传输协议: 文件传送协议FTP:提供不同种类主机系统(硬、软件体系等都可以不同)之间的文件传输能力。简单文件传送协议TFTP:使用于UDP环境,代码…

MyBatis-Plus入门案例

MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提供效率。 开发方式 基于MyBatis使用MyBatisPlus基于Spring使用MyBatisPlus基于SpringBoot使用MyBatisPlus SpringBoot它能快速构建Spring开发环境用以整合其…

设计模式之美——看似面向对象,实则面向过程

常见的编程范式或者说编程风格有三种,面向过程编程、面向对象编程、函数式编程,而面向对象编程又是这其中最主流的编程范式。现如今,大部分编程语言都是面向对象编程语言,大部分软件都是基于面向对象编程这种编程范式来开发的。 …

《Redis设计与实现》笔记

第二章:简单动态字符串 1.Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串( simple dynamic string,SDS)的抽象类型,并将SDS用作 Redis的默认字符串表示。 Redis里面,C字符串只会作为字符串…

操作系统第三章习题及答案(汤子瀛第四版)

第三章 1.高级调度与低级调度的主要任务是什么?为什么要引入中级调度? 答:高级调度的主要任务是根据某种算法,把外存上处于后备队列中的那些作业调入内存。低级调度是保存处理机的现场信息,按某种算法先取…

【UE4】打包失败 Failed to build UATTempProj.proj

我抄我自己之 https://zhuanlan.zhihu.com/p/586117443 前两天编 UE4.27 源码内存和CPU直接全是100%爆满,甚至还报错:c1060, the compiler is out of heap,设置虚拟内存也不不好使,发现16GB内存不配编 UE,火速换了64G之…

Kotlin或将超越Go?

知名软件行业分析公司 RedMonk 发布了 2022 年 6 月(第三季度)编程语言排行榜。 RedMonk 编程语言排行榜通过追踪编程语言在 GitHub 和 Stack Overflow 上的代码使用情况与讨论数量,统计分析后进行排序,其旨在深入了解潜在的语言…

你真的知道Spring Security安全框架吗?

1、什么是安全管理框架? 解决系统安全问题的框架。如果没有安全框架,我们需要手动处理每个资源的访问控制,非常麻烦。使 用安全框架,我们可以通过配置的方式实现对资源的访问限制。 安全框架,简单说是对访问权限进行控…

Android Material Design之MaterialButton(一)

按规矩先上效果图 资源引入 implementation com.google.android.material:material:1.4.0关键属性 属性描述app:backgroundTint背景着色app:backgroundTintMode着色模式app:strokeColor描边颜色app:strokeWidth描边宽度app:cornerRadius圆角大小app:rippleColor按压水波纹颜色…

【Java八股文总结】之计算机网络

文章目录计算机网络一、基础1、网络体系结构2、HTTP协议、TCP协议、UDP协议比较3、网络协议4、WebSocket和Socket的区别?5、常见的端口及其对应的服务?6、从浏览器输入URL到页面展示发生了什么?(★★★★★)1、DNS域名…

MySQL纯代码复习(下)

前言 本文章的语言描述会比上篇多一些 数据库的创建修改与删除 标识符命名规则 数据库名、表名不得超过30个字符,变量限制为29个必须只能包含A-Z,a-z,0-9,_等63个字符数据库名、表名、字段名等对象名中间不要包含空格同一个My…