当前位置: 首页 > news >正文

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

目录

前言

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

初始化学习率和模型参数 

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

小彩蛋


前言

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

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

# 三层神经网络
import numpy as npdef 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  # 定义神经网络第一层(输入层),直接等于xl1 = 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

相关文章:

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

目录 前言 导入numpy并初始化数据和激活函数 初始化学习率和模型参数 迭代更新模型参数(权重) 小彩蛋 前言 这篇文章,小编带大家使用python-numpy实现一个简单的三层神经网络,不使用pytorch等深度学习框架,来理解…...

CSS定位装饰

网页常见布局方式 标准流 块级元素独占一行---垂直布局 行内元素/行内块元素一行显示多个----水平布局 浮动 可以让原本垂直布局的块级元素变成水平布局 定位 可以让元素自由的摆放在网页的任意位置 一般用于盒子之间的层叠情况 使用定位步骤 设置定位方式 属性名&am…...

java之jvm详解

JVM内存结构 程序计数器 Program Counter Register程序计数器(寄存器) 程序计数器在物理层上是通过寄存器实现的 作用:记住下一条jvm指令的执行地址特点 是线程私有的(每个线程都有属于自己的程序计数器)不会存在内存溢出 虚拟机栈(默认大小为1024kb) 每个线…...

vue3学习——集成sass

安装 pnpm i sass sass-loader -D在vite.config.ts文件配置: export default defineConfig({css: {preprocessorOptions: {scss: {javascriptEnabled: true,additionalData: import "./src/styles/variable.scss";,},},},} }创建三个文件 src/styles/index.scss //…...

开关电源学习之Boost电路

如果我们需要给一个输入电压为5V的芯片供电,而我们只有一个3.3V的电源,那怎么办? 我们能不能把3.3V的电压升到5V? 一、电感的简介 而在升压的电路设计方案中,使用到一个重要的元器件:电感。 电感的特性…...

QRegExp的学习

【QT学习】QRegExp类正则表达式(一文读懂)-CSDN博客 [ ]:匹配括号内输入的任意字符 例:[123]:可以是1或2或3 {m,n}表达式至少重复m次,至多重复n次。 例:"ba{1,3}"可以匹配 "ba"或&…...

28.Stream流

Stream流 1. 概述2. 方法2.1 开始生成方法2.1.1 概述2.1.2 方法2.1.3 代码示例 2.2 中间操作方法2.2.1 概述2.2.2 方法2.2.3 代码示例 2.3 终结操作方法2.3.1 概述2.3.2 方法2.3.3 代码示例 2.4 收集操作方法2.4.1 概述2.4.2 方法2.4.3 代码示例 3. 代码示例14. 代码示例25. 代…...

大数据应用对企业的价值

目录 一、大数据应用价值 1.1 大数据技术分析 1.2 原有技术场景的优化 1.2.1 数据分析优化 1.2.2 高并发数据处理 1.3 通过大数据构建新需求 1.3.1 智能推荐 1.3.2 广告系统 1.3.3 产品/流程优化 1.3.4 异常检测 1.3.5 智能管理 1.3.6 人工智能和机器学习 二、大数…...

【51单片机】LED点阵屏(江科大)

9.1LED点阵屏 1.LED点阵屏介绍 LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。 2.LED点阵屏工作原理 LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已。原理图如下 每一行的阳极连在一起,每一列…...

Microsoft OneNote 图片文字提取

Microsoft OneNote 图片文字提取 1. 文件 -> 新建 -> 我的电脑 -> 名称 -> 位置 -> 创建笔记本2. 插入图片​​​3. 复制图片中的文本References 1. 文件 -> 新建 -> 我的电脑 -> 名称 -> 位置 -> 创建笔记本 ​ 2. 插入图片 ​​​3. 复制图片…...

Linux系统安全——iptables相关总结

在使用iptables时注意要先关闭firewalld(systemctl stop firewalld.service) 1.查看iptables规则 iptables -vnL 选项含义-v查看时显示更多详细信息-n所有字段以数字形式显示-L查看规则列表 例,拒绝来自192.168.241.22的源地址 直接丢弃 …...

深度学习(14)--x.view()详解

在torch中,常用view()函数来改变tensor的形状 查询官方文档: torch.Tensor.view — PyTorch 2.2 documentationhttps://pytorch.org/docs/stable/generated/torch.Tensor.view.html#torch.Tensor.view示例 1.创建一个4x4的二维数组进行测试 x torch.…...

最新wordpress外贸主题

日用百货wordpress外贸主题 蓝色大气的wordpress外贸主题,适合做日用百货的外贸公司搭建跨境电商网站使用。 https://www.jianzhanpress.com/?p5248 添加剂wordpress外贸建站主题 橙色wordpress外贸建站主题,适合做食品添加剂或化工添加剂的外贸公司…...

Spring Cloud Gateway:使用RestController动态更新路由

相关类介绍 动态路由(自己控制,非注册中心控制)涉及两个很重要的Bean: RouteDefinitionWriter:用于添加、修改、删除路由规则。RouteDefinitionLocator:用于查询路由规则。 以及一个相关事件&#xff1a…...

用Python动态展示排序算法

文章目录 选择冒泡插入排序归并排序希尔排序 经常看到这种算法可视化的图片,但往往做不到和画图的人心灵相通,所以想自己画一下,本文主要实现归并排序和希尔排序,如果想实现其他算法可参考这篇 C语言实现各种排序算法[选择&#x…...

vscode代码快捷键

1、 log console.log()2、edf export default (first)>{ second } 或者 export default function(params)>{ }可以使用tab键切换修改项 3、ednf export default function first(second) {third}4、! 生成html模板 5、div#app <div id"app"></di…...

深入了解C++:形参、内联、重载、引用、const和指针、new和delete

形参带默认值的函数 1.给默认值的时候从右向左给。 2.定义出可以给形参默认值&#xff0c;声明也可以给形参默认值。 3.形参默认值只能出现一次。 4.参数调用的效率问题 #sum(10,20)对应了五条汇编指令 mov eax,dword ptr[ebp-8] push eax mov ecx dword ptr[ebp-4] push …...

Linux 目录结构结构

Linux 目录结构结构 概念 Linux 没有 C、D、E...盘符&#xff0c;只有一个目录树。通过挂载&#xff0c;将不同的磁盘挂载到目录树下&#xff0c;通过目录访问磁盘。 ‍ 不同目录的作用 目录存放内容/作用​/​根目录&#xff0c;目录树的起点&#xff0c;存放所有文件。​…...

C++基础入门:掌握核心概念(超全!)

C作为一门广泛使用的编程语言&#xff0c;以其高性能和灵活性在软件开发领域占据重要地位。无论是游戏开发、系统编程还是实时应用&#xff0c;C都是一个不可或缺的工具。本博客旨在为初学者提供C编程语言的核心概念&#xff0c;帮助你建立坚实的基础。 C关键字 C关键字是编程…...

Linux第47步_安装支持linux的第三方库和mkimage工具

安装支持linux的第三方库和mkimage工具&#xff0c;做好移植前的准备工作。 编译linux内核之前&#xff0c;需要先在 ubuntu上安装“lzop库”和“libssl-dev库”&#xff0c;否则内核编译会失败。 mkimage工具会在zImage镜像文件的前面添加0x40个字节的头部信息,就可以得到uI…...

如何快速掌握哔哩下载姬Downkyi:面向新手的完整使用指南

如何快速掌握哔哩下载姬Downkyi&#xff1a;面向新手的完整使用指南 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&…...

从U盘启动OpenWRT:零门槛打造你的x86软路由实验平台

1. 为什么选择U盘启动OpenWRT软路由&#xff1f; 去年我帮朋友改造旧笔记本时&#xff0c;偶然发现用U盘跑OpenWRT简直是个宝藏方案。相比直接刷入硬盘&#xff0c;U盘启动有三大不可替代的优势&#xff1a;零成本实验、无损体验和随身携带。你完全可以用吃灰的旧U盘&#xff0…...

别只盯着SQL注入了!聊聊SRC挖掘中那些被忽视的‘低垂果实’:XSS与弱口令实战复盘

别只盯着SQL注入了&#xff01;聊聊SRC挖掘中那些被忽视的‘低垂果实’&#xff1a;XSS与弱口令实战复盘 在安全圈摸爬滚打几年后&#xff0c;我发现一个有趣的现象&#xff1a;80%的新手挖洞者会像发现新大陆一样扑向SQL注入&#xff0c;却对触手可得的XSS和弱口令视而不见。这…...

用AI Agent + 亚马逊实时数据API打破大卖家数据垄断:架构设计与完整实现

Tags: Amazon API AI Agent LangChain Python 电商数据 实时数据 难度&#xff1a; 中级 | 阅读时长&#xff1a; 15分钟背景与问题 亚马逊大卖家&#xff08;年GMV 1000万&#xff09;的核心竞争优势之一是实时数据能力&#xff1a;每15-30分钟采样竞品BSR、价格、库存&#x…...

从“消融”到“流动岩浆”:用Unity Shader的Tilling和Offset玩转动态纹理(URP/HDRP通用)

从“消融”到“流动岩浆”&#xff1a;用Unity Shader的Tilling和Offset玩转动态纹理&#xff08;URP/HDRP通用&#xff09; 想象一下&#xff1a;你的游戏场景中&#xff0c;炽热的岩浆在地表缓缓流动&#xff0c;水面泛起涟漪般的波纹&#xff0c;或是能量屏障表面流淌着神秘…...

5分钟精通英雄联盟信息修改:LeaguePrank新手完全使用指南

5分钟精通英雄联盟信息修改&#xff1a;LeaguePrank新手完全使用指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否曾在英雄联盟中羡慕别人的华丽段位边框&#xff0c;却苦于自己的段位不够理想&#xff1f;你是否想要…...

Overleaf实战:利用multicol宏包实现LaTeX文档的灵活分栏布局

1. 为什么需要分栏布局&#xff1f; 第一次用LaTeX写论文时&#xff0c;我被期刊模板要求"双栏排版"整懵了。单栏文档写得好好的&#xff0c;突然要在同一页并排显示两列内容&#xff0c;还要处理图片表格的跨栏问题。传统\twocolumn命令虽然简单&#xff0c;但调整…...

终极指南:如何在macOS上轻松安装KLayout版图设计软件

终极指南&#xff1a;如何在macOS上轻松安装KLayout版图设计软件 【免费下载链接】klayout KLayout Main Sources 项目地址: https://gitcode.com/gh_mirrors/kl/klayout 想要在macOS上安装专业级的集成电路版图设计工具KLayout吗&#xff1f;&#x1f60a; 作为一款功能…...

别再复制粘贴了!深度优化你的TM1640驱动代码:效率与可维护性实战

TM1640驱动代码重构实战&#xff1a;从能用走向工业级 在嵌入式开发中&#xff0c;我们常常会遇到这样的场景&#xff1a;项目初期为了快速验证功能&#xff0c;直接从网上复制一段"能用就行"的驱动代码。但随着项目规模扩大&#xff0c;这些代码逐渐暴露出可维护性差…...

Android MediaCodec 编码实战:从 Camera 采集到 ByteBuffer 编码,生成 MP4 文件

1. Android Camera数据采集与YUV格式解析 在Android平台上使用Camera API采集视频数据是编码流程的第一步。我遇到过不少开发者在这一步就卡壳&#xff0c;主要问题集中在Camera2 API的复杂配置和YUV数据格式的理解上。这里分享几个实战经验&#xff1a; Camera2 API的基本工作…...