使用python-numpy实现一个简单神经网络

news2024/11/18 14:25:35

目录

前言

导入numpy并初始化数据和激活函数

初始化学习率和模型参数 

迭代更新模型参数(权重)

小彩蛋


前言

这篇文章,小编带大家使用python-numpy实现一个简单的三层神经网络,不使用pytorch等深度学习框架,来理解一下神经网络的原理和观察一下它内部的一些操作如反向传播,权重更新是如何实现的。

导入numpy并初始化数据和激活函数

# 三层神经网络
import numpy as np


def sigmoid(x, back=False):  # 激活函数
    if back:
        return x * (1 - x)  # 反向传播(求了个导)
    return 1 / (1 + np.exp(-x))  # 前向传播

x = np.array(
    [[0, 0, 1],
     [0, 1, 1],
     [1, 0, 1],
     [1, 1, 1],
     [0, 0, 1]]
)
print(x.shape)  # 构造出来五个样本,每个样本有三列特征
y = np.array(
    [[0],
     [1],
     [1],
     [0],
     [0]]
)
print(y.shape)  # 构造目标值,有监督学习

在这里我们先定义了一个激活函数,这里用sigmoid激活函数,激活函数用于加在每层网络的后面,使得神经网络可以进行非线性变换。

我们同时又用numpy创建了一个输入x和标签(输出)y,x为五个样本,每个样本有三个特征值,y是x对应五个样本的输出,在这里我们进行一个二分类,所以y中的值只有0或者1。

初始化学习率和模型参数 

np.random.seed(1)  # 指定随机种子,使得每次程序的随机数都一样
lr = 0.1 # 初始化学习率
w0 = 2 * np.random.random(size=(3, 4)) - 1  # 随机生成变换矩阵
w1 = 2 * np.random.random(size=(4, 1)) - 1  # 和w0相呼应,1是输出的意思,这里不是输出1就是输出0

在这里我们初始化学习率为0.1,这个数值是控制模型参数每次更新步长的超参数,学习率过大会使得模型震荡,学习率过小会使得模型收敛速度较慢。

w0和w1为模型参数,也是模型要学习的数值,通过不断迭代以最小化损失函数为目的会使得这两个数值不断更新。(使用深度学习框架编写神经网络时,权重的初始化会由框架实现,其是随机初始化)

此时我们的网络就是这个样子的

迭代更新模型参数(权重)

模型参数的更新主要有这几个过程:

1,通过x和随机的模型参数进行前向传播,得到预测的y。

2,通过预测得到的y和真实的y进行计算,获得损失函数。

3,通过损失函数反向传播,利用链式法则获得梯度,从而根据学习率和梯度去更新模型参数。

这几步为神经网络的核心,其旨在不断迭代,从而使得我们可以获得一组模型参数,通过这组模型参数,我们就可以使得输入x后得到的结果最大程度的接近真实的y值。

for j in range(60000):  # 神经网络计算
    # 前向传播
    l0 = x  # 定义神经网络第一层(输入层),直接等于x
    l1 = sigmoid(np.dot(l0, w0))  # 矩阵相乘(注意顺序),别忘了乘激活函数
    l2 = sigmoid(np.dot(l1, w1))
    l2_error = (l2 - y) ** 2 / 2  # 误差项(均方误差损失函数)

    # 反向传播
    l2_delta = (l2 - y) * sigmoid(l2, back=True)
    l1_error = np.dot(l2_delta, w1.T)
    l1_delta = l1_error * sigmoid(l1, back=True)

    # 更新权重
    w1 -= lr * np.dot(l1.T, l2_delta)
    w0 -= lr * np.dot(l0.T, l1_delta)

    # 验证误差
    if j % 10000 == 0:
        print('ERROR: '+str(np.mean(l2_error)))

这里附上运行结果和链式法则的图片

 其中,a为经过sigmoid激活函数得到的结果,图片中的w2为代码里的w0

小彩蛋

最后附上一个类比来更加形象的理解神经网络的运作原理与步骤。

我们可以将神经网络类比为去商场买衣服,那么为什么可以这么理解呢,小编在这里给出解释,括号里为对应的神经网络中的操作。

假设你去商场买衣服,那么你肯定想要一件合身且好看的衣服(在这里你为输入x,你的满意程度为输出y,而衣服就是中间的模型参数),那么你刚进商城,你肯定不知道那件衣服适合你,此时你就会根据初步的印象来选择一件衣服去试一下(初始化模型参数),你试过之后,你就会获得一个满意程度(获得损失函数),此时你也知道你试的这件是大了还是小了,你知道下一件试衣服是该试大的还是小的(根据损失函数反向传播),然后你会根据这个信息去试下一件(更新模型参数),而在这里比方说你试的衣服大了,那么你下一件肯定会去拿稍微小的衣服,但是具体小多少呢,这个在日常生活中应该会估计一下(在神经网络中,具体小多少这件事情就是学习率做的事),最后通过不断的试穿衣服,我们会找到最合适的那身最后买下(不断迭代使得损失函数最小化)。

那么还有一个疑问,损失函数去哪里了呢,损失函数可以理解为你换衣服的过程,比如这件你感觉很合适,但是试来试去你发现并不合你的身,那么此时你会去试其他不同的衣服(这在神经网络中就是损失函数的作用)。

视频讲解请查看:https://www.bilibili.com/video/BV1pK421C7xr/?spm_id_from=333.999.0.0&vd_source=ea64b940c4e46744da2aa737dca8e183

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

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

相关文章

【射影几何15】python双曲几何工具geometry_tools

目录 一、说明二、​环境问题:如何安装三、实现一个简单的例子四、绘制双曲组五、使用有限状态自动机加快速度六、资源和代码 一、说明 Geometry_tools 是一个 Python 包,旨在帮助您处理和可视化双曲空间和射影空间上的群动作。 该包主要构建在 numpy、…

【大厂AI课学习笔记】【1.5 AI技术领域】(10)对话系统

对话系统,Dialogue System,也称为会话代理。是一种模拟人类与人交谈的计算机系统,旨在可以与人类形成连贯通顺的对话,通信方式主要有语音/文本/图片,当然也可以手势/触觉等其他方式 一般我们将对话系统,分…

股价分布统计 100元能买股票吗?

A股的股价一般是多少?100元能买股票吗?能买多少? 一、买入交易规则: 沪深主板(包括中小板),股票代码以600,000,002开头,每次最低买100股,随后以100股为单位增加,也就是可以买100股&…

免费软件推荐-开源免费批量离线图文识别(OCR)

近期要批量处理图片转电子化,为了解决这个世纪难题,试了很多软件(华为手机自带OCR识别、 PandaOCR、天若OCR、Free OCR)等软件,还是选择了这一款,方便简单 一、什么是OCR? 光学字符识别(Opt…

《 Arm Compiler 5.06 》__ARM编译器官网下载、安装和使用说明(小白也能懂)

目录 一、前言 二、官方网站下载 三、我的资源 四、编译器安装在 Keil 软件上 五、Keil选择编译器V5 “ V5.06 update 7(build 960) ” 六、测试 (* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。 一、前言 【Keil MDK-Arm5.37】不再…

【大模型上下文长度扩展】LongQLoRA:单GPU(V100)环境下的语言模型优化方案

LongQLoRA 核心问题子问题1: 预定义的上下文长度限制子问题2: 训练资源的需求高子问题3: 保持模型性能分析不足 LongQLoRA方法拆解子问题1: 上下文长度限制子问题2: 高GPU内存需求子问题3: 精确量化导致的性能损失分析不足效果 总结 论文:https://arxiv.org/pdf/231…

波奇学Linux: 文件描述符

文件和操作系统的关系 操作系统控制进程,文件的打开是在进程中进行。意味着用来控制进程的PCB必然有文件的信息,操作系统通过控制PCB的信息来控制文件的读写。 Q1:如何证明文件打开是在进程中进行? 编写c文件调用fopen来操作文件…

拟合案例1:matlab积分函数拟合详细步骤及源码

本文介绍一下基于matlab实现积分函数拟合的过程。采用的工具是lsqcurvefit和nlinfit两个函数工具。关于包含积分运算的函数,这里可以分为两大类啊。我们用具体的案例来展示:一种是积分运算中不包含这个自变量,如下图的第一个公式,也就是说它这个积分运算只有R和Q这两个待定…

单片机学习笔记---蜂鸣器工作原理

目录 蜂鸣器介绍 蜂鸣器的驱动方式 ULN2003D芯片工作原理 实战预备知识:基础乐理 音名的分组 全音和半音的关系 音高的表示 五线谱中的符号定义 简谱上的符号定义 C调音符与频率对照表 相关计算 蜂鸣器介绍 蜂鸣器是一种将电信号转换为声音信号的器件&a…

fast.ai 深度学习笔记(五)

深度学习 2:第 2 部分第 10 课 原文:medium.com/hiromi_suenaga/deep-learning-2-part-2-lesson-10-422d87c3340c 译者:飞龙 协议:CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它,…

SpringBoot 接入讯飞星火大模型实现对话

申请地址 https://xinghuo.xfyun.cn/sparkapi?scrprice 免费申请200万Token 开发文档 https://www.xfyun.cn/doc/spark/Web.html#_1-接口说明 页面最下面有相关demo可以参考 介绍 接口是以套接字的形式分段返回,而且非http请求,比较繁琐,官…

基于JAVA的教学资源共享平台 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

Go语言每日一练——链表篇(八)

传送门 牛客面试笔试必刷101题 ----------------两个链表的第一个公共结点 题目以及解析 题目 解题代码及解析 解析 这一道题使用的还是双指针算法,我们先求出两个链表的长度差n,然后定义快慢指针,让快指针先走n步,最后快慢指…

苹果iOS设备备份管理神器imazing3中文版免费下载

如果您是一位资深果粉,那您对imazing这款iOS设备管理神器一定很熟悉。不过也有很多小伙伴只是听过这款软件的名字,不知道它具体是做什么的。今天就让小编跟大家说下imazing是什么软件,再给大家分享它最好用的两个功能。 imazing是什么&#x…

C语言之:编译和链接

目录 1. 翻译环境和运行环境翻译环境 2. 翻译环境:预编译编译汇编链接预处理(预编译)编译词法分析语法分析语义分析汇编链接运行环境 1. 翻译环境和运行环境 在ANSI C的任何一种实现中,存在两个不同的环境。 第一种是翻译环境&a…

Taro+ vue3 + template nut-ui 4.0 + pinia 的前端框架模板搭建

1.展示 目前我们有一个需要做H5 微信小程序的需求。当然我们可选的框架有很多,比如说:uni-app Taro京东框架 去做这些前端需求 2.介绍 Taro ①.项目的具体结构 Taro框架中 的目录结构 大体上都是一样的 page页面 store ② 项目的store 状态管理 状态管理使用的是pinia v…

Jumserver 安装

一、Jumserver 官网地址 Jumserver官网地址 二、Jumserver的基本概率 1、4a概率 首先,堡参机提供了运维安全审计的4A规范 Authentication: 身份鉴别,防止身份冒用和复用(开发10人,测试5人,运维2人) Authorizatton:授…

探索C语言的内存魔法:动态内存管理解析

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 1. 静态开辟内存 通过前面的学习,我们已经掌握了两种开辟内存的方…

“深度解析Java虚拟机:运行时数据区域、垃圾收集、内存分配与回收策略、类加载机制“

"深度解析Java虚拟机:运行时数据区域、垃圾收集、内存分配与回收策略、类加载机制" Java 虚拟机一、运行时数据区域程序计数器Java 虚拟机栈本地方法栈堆方法区运行时常量池直接内存 二、垃圾收集判断一个对象是否可被回收1. 引用计数算法2. 可达性分析算…

Python图形用户界面

目录 Python中的图形用户界面开发库 安装wxPython 第一个wxPython程序 自定义窗口类 在窗口中添加控件 事件处理 布局管理 盒子布局管理器 重构事件处理示例 盒子布局管理器嵌套示例 控件 文本输入控件 复选框和单选按钮 列表 静态图片控件 我们之前的程序运行结…