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

目录

前言

导入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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索设计模式的魅力:代理模式揭秘-软件世界的“幕后黑手”

设计模式专栏:http://t.csdnimg.cn/U54zu 目录 引言 一、魔法世界 1.1 定义与核心思想 1.2 静态代理 1.3 动态代理 1.4 虚拟代理 1.5 代理模式结构图 1.6 实例展示如何工作(场景案例) 不使用模式实现 有何问题 使用模式重构示例 二、…

【Rust日报】2024-02-08 Loungy:使用 Rust 和 GPUI 开发的 MacOS 启动器

Mira Screenshare:基于 Rust 和 WebRTC 的高性能屏幕分享工具 一群大学生宣布推出了他们的期末项目:Mira Screenshare,一个开源、高性能的屏幕共享工具,由 Rust 和 WebRTC 构建。此项目支持 4k 60 FPS 和 110ms 端到端延迟的屏幕…

CS50x 2024 - Lecture 2 - Arrays

00:00:00 - Introduction 00:01:01 - Story Time 00:06:03 - Compiling make本身并不是编译器,实际上是一个自动运行编译器的程序,如c语言的clang clang -o hello hello.csrc/ $ clang -o hello hello_world.c /usr/bin/ld: /tmp/hello_world-67f51…

Oracle 面试题 | 19.精选Oracle高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

你的立身之本是什么?

去年发生的一切,大到疫情、政治经济形势、行业的萎靡和震荡,小到身边的跳槽、裁员、公司倒闭……似乎都在告诉我们: 当冲击到来的时候,它是不会提前跟你打招呼的。 接下来的10年,我们所面临的不确定性,比起…

Linux 软件管理(YUM RPM)

1 YUM yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次…

fps cf游戏,一键断网辅助工具

一键断网瞬移 工具特色:一改常规断网操作(断网开启,所有人都卡住,使得还原后找不到人的问题 ),不影响任何人移动,开启断网跟着别人一起走,其他人无任何异常卡顿。 工具功能&…

Linux应用程序几种参数传递方式

大家好,今天给大家介绍Linux应用程序几种参数传递方式,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 在Linux中,应用程序可以通过多种方式接收参数。以下…

文心一言 VS 讯飞星火 VS chatgpt (198)-- 算法导论14.3 6题

六、用go语言,说明如何来维护一个支持操作MIN-GAP的一些数的动态集Q,使得该操作能给出Q中两个最接近的数之间的差值。例如,Q(1,5,9,15,18,22),则MIN-GAP返回18-153&#…

【EAI 011】SayCan: Grounding Language in Robotic Affordances

论文标题:Do As I Can, Not As I Say: Grounding Language in Robotic Affordances 论文作者:Michael Ahn, Anthony Brohan, Noah Brown, Yevgen Chebotar, Omar Cortes, Byron David, Chelsea Finn, Chuyuan Fu, Keerthana Gopalakrishnan, Karol Hausm…

【正式】今年第一篇CSDN(纯技术教学)

一、文件上传简介 文件上传漏洞是指用户上传了一个可执行的脚本文件(木马、病毒、恶意脚本、webshell等),并通过此脚本文件获得了执行服务器端命令的能力。上传点一般出现在头像、导入数据、上传压缩包等地方,由于程序对用户上传…

C语言笔试题之求出二叉树的最大深度(递归解决)

实例要求: 1、给定一个二叉树 root ,返回其最大深度;2、二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数; 案例展示: 实例分析: 1、判断根节点是否为空;2、分别递归处理左…

物联网数据隐私保护技术

在物联网(IoT)的世界中,无数的设备通过互联网连接在一起,不断地收集、传输和处理数据。这些数据有助于提高生产效率、优化用户体验并创造新的服务模式。然而,随着数据量的剧增,数据隐私保护成为了一个不能忽…

【java苍穹外卖项目实战二】苍穹外卖环境搭建

文章目录 1、前端环境搭建2、后端环境搭建1、项目结构搭建2、Git版本控制3、数据库创建 开发环境搭建主要包含前端环境和后端环境两部分。 前端的页面我们只需要导入资料中的nginx, 前端页面的代码我们只需要能看懂即可。 1、前端环境搭建 前端运行环境的nginx&am…

《MySQL 简易速速上手小册》第7章:MySQL监控和日志分析(2024 最新版)

文章目录 7.1 配置和使用 MySQL 监控工具7.1.1 基础知识7.1.2 重点案例:使用 Python 和 Prometheus 监控 MySQL 性能7.1.3 拓展案例 1:自动化 MySQL 慢查询日志分析7.1.4 拓展案例 2:实时警报系统 7.2 解读 MySQL 日志文件7.2.1 基础知识7.2.…

【Spring】Bean 的实例化方式

Spring 为 Bean 提供了多种实例化方式,通常包括4种方式 也就是说在 Spring 中为 Bean 对象的创建准备了多种方案,目的是:更加灵活 第一种:通过构造方法实例化 第二种:通过简单工厂模式实例化 第三种:通过…

【第二届 Runway短视频创作大赛】——截至日期2024年03月01日

短视频创作大赛 关于AI Film Festival竞赛概况参加资格报名期间报名方法 提交要求奖品附录 关于AI Film Festival 2022年成立的AIFF是一个融合了最新AI技术于电影制作中的艺术和艺术家节日,让我们得以一窥新创意时代的风采。从众多参赛作品中…

求职|基于Springboot的校园求职招聘系统设计与实现(源码+数据库+文档)

校园求职招聘系统目录 目录 基于Springboot的校园求职招聘系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、企业信息管理 3、公告类型管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选…

Android:Volley框架使用

3.15 Volley框架使用 Volley框架主要作为网络请求,图片加载工具。当应用数据量小、网络请求频繁,可以使用Volley框架。 框架Github地址:https://github.com/google/volley Volley框架的简单使用,创建项目Pro_VolleyDemo。将Github上下载Volley框架源代码,volley-master.zi…

华为机考入门python3--(11)牛客11-数字颠倒

分类:字符串 知识点: int转字符串 str int(num) 对字符串进行逆序 my_str str[::-1] 题目来自【牛客】 def reverse_integer(n): # 将整数转换为字符串 str_n str(n) # 使用[::-1]来反转字符串 reversed_str str_n[::-1] return reversed…