深度学习入门简单实现一个神经网络

实现一个三层神经网络

  • 引言
    • 测试数据
  • 代码

引言

今天我们实现一个简单的神经网络
俩个输入神经元 隐藏层两个神经元 一个输出神经元
激活函数我们使用sigmoid
优化方法使用梯度下降

在这里插入图片描述

我们前期准备是需要把这些神经元的关系理清楚
x1:第一个输入
x2:第二个输入
w11_1:第一层的第一个神经元在第一个输入上的权重
w12_1:第一层的第二个神经元在第一个输入上的权重
b1_1:第一层第一个神经元的偏置项(截距)
z1_1:第一层第一个神经元的线性函数
a1_1:第一层第一个神经元的激活函数
w21_1:第一层的第一个神经元在第一个输入上的权重
w22_1:第一层的第一个神经元在第一个输入上的权重
b2_1:第一层第二个神经元的偏置项(截距)
z1_1:第一层第二个神经元的线性函数
a1_1:第一层第二个神经元的激活函数
w11_2:第二层的第一个神经元在第一个输入上的权重
w21_2:第二层的第二个神经元在第一个输入上的权重
b1_2:第二层第一个神经元的偏置项(截距)
z1_1:第二层第一个神经元的线性函数
a1_1:第二层第一个神经元的激活函数
e:损失函数

测试数据

dataset 可以使用西瓜书89页的西瓜数据集3.0α

代码

import numpy as np
import sympy
import dataset
from matplotlib import pyplot as pltdef sigmod(b):return 1 / (1 + np.exp(-b))xs, ys = dataset.get_beans(100)  # 获取数据
plt.title("Size-Toxicity Funciton", fontsize=12)  # 设置图片的标题
plt.xlabel("Bean Size")  # 设置行标签
plt.ylabel("Toxicity")  # 设置列标签plt.scatter(xs, ys)  # 画散点图"""
命名规则
下划线后面的数字表示被输入的神经元所在的层数
字母后面的数字表示第一个数字表示第几个输入
第二个数字表示被输入的神经元在他所在层数的位置
"""
# 第一层
# 第一个神经元
w11_1 = np.random.rand()
b1_1 = np.random.rand()
# 第二个神经元
w12_1 = np.random.rand()
b2_1 = np.random.rand()
# 第二层
w11_2 = np.random.rand()
w21_2 = np.random.rand()
b1_2 = np.random.rand()# 前向传播 代价函数 y0 = 1/(1+e^(-(wx+b)))
def forward_propgation(xs):z1_1 = w11_1 * xs + b1_1a1_1 = sigmod(z1_1) # 第一层第一个神经元的代价函数值z2_1 = w12_1 * xs + b2_1a2_1 = sigmod(z2_1)  # 第一层第二个神经元的代价函数值z1_2 = w11_2 * a1_1 + w21_2 * a2_1 + b1_2a1_2 = sigmod(z1_2)   # 第二层第一个神经元的代价函数值return a1_2, z1_2, a2_1, z2_1, a1_1, z1_1a1_2, z1_2, a2_1, z2_1, a1_1, z1_1 = forward_propgation(xs)
# plt.plot(xs, a1_2)
# plt.show()# 随机梯度下降
for j in range(5000):for i in range(100):x = xs[i]y = ys[i]# 先来一次前向传播a1_2, z1_2, a2_1, z2_1, a1_1, z1_1 = forward_propgation(x)# 开始反向传播# 误差代价函数e"""z1_1 = w11_1 * xs + b1_1a1_1 = sigmod(z1_1) # 第一层第一个神经元的代价函数值z2_1 = w12_1 * xs + b2_1a2_1 = sigmod(z2_1)  # 第一层第二个神经元的代价函数值z1_2 = w11_2 * a1_1 + w21_2 * a2_1a1_2 = sigmod(z1_2)   # 第二层第一个神经元的代价函数值"""e = (y - a1_2) ** 2  # 误差e = (y - 最后一个神经元得出的值)^2deda1_2 = -2*(y - a1_2)  # 对a1_2 第二层的第一个神经元的函数求导da1_2dz1_2 = a1_2 * (1 - a1_2)  # da1_2对dz1_2求导数dz1_2dw11_2 = a1_1  # dz1_2对w11_2求导数dz1_2dw21_2 = a2_1  # dz1_2对dw21_2求导dedw11_2 = deda1_2 * da1_2dz1_2 * dz1_2dw11_2  # de对dw11_2求偏导dedw21_2 = deda1_2 * da1_2dz1_2 * dz1_2dw21_2  # de对dw21_2求偏导dz1_2db1_2 = 1  # z1_2对db1_2求偏导dedb1_2 = deda1_2 * da1_2dz1_2 * dz1_2db1_2  # de对db1_2求偏导dz1_2da1_1 = w11_2  # dz1_2对da1_1求偏导da1_1dz1_1 = a1_1 * (1 - a1_1)  # da1_1对dz1_1 求偏导dz1_1dw11_1 = x  # dz1_1对dw11_1求偏导dedw11_1 = deda1_2 * da1_2dz1_2 * dz1_2da1_1 * da1_1dz1_1 * dz1_1dw11_1  # e对w11_1求导dz1_1db1_1 = 1  # z1_1对b1_1求导dedb1_1 = deda1_2 * da1_2dz1_2 * dz1_2da1_1 * da1_1dz1_1 * dz1_1db1_1  # e对b1_1求导dz1_2da2_1 = w21_2  # z1_2 对a2_1 求导da2_1dz2_1 = a2_1 * (1 - a2_1)  # a2_1 对z2_1求导dz2_1dw12_1 = x  # z2_1对w12_1dedw12_1 = deda1_2 * da1_2dz1_2 * dz1_2da1_1 * da2_1dz2_1 * dz2_1dw12_1  # e对w12_1求导dz2_1db2_1 = 1  # z2_1 对 b2_1求导dedb2_1 = deda1_2 * da1_2dz1_2 * dz1_2da1_1 * da2_1dz2_1 * dz2_1db2_1  # e 对 b2_1求导alpha = 0.03w11_2 = w11_2 - alpha * dedw11_2  # 调整w11_2w21_2 = w21_2 - alpha * dedw21_2  # 调整21_2b1_2 = b1_2 - alpha * dedb1_2  # 调整b1_2w12_1 = w12_1 - alpha * dedw12_1  # 调整w12_1b2_1 = b2_1 - alpha * dedb2_1  # 调整 b2_1w11_1 = w11_1 - alpha * dedw11_1  # 调整 w11_1b1_1 = b1_1 - alpha * dedb1_1  # 调整b1_1if j % 100 == 0:plt.clf()  # 清空窗口plt.scatter(xs, ys)a1_2, z1_2, a2_1, z2_1, a1_1, z1_1 = forward_propgation(xs)plt.plot(xs, a1_2)plt.pause(0.01)  # 暂停0.01秒

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

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

相关文章

C#手术麻醉系统源码 大型医院手麻系统4大需求是什么?

C#手术麻醉系统源码 大型医院手麻系统4大需求是什么? 手术麻醉临床信息系统有着完善的临床业务功能,能够涵盖整个围术期的工作,能够采集、汇总、存储、处理、展 现所有的临床诊疗资料。通过该系统的实施,能够规范手麻科的工作流程…

Matlab-写入mhd和raw医学图像处理格式文件

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 mhd和raw是什么? MHD(MetaImage)和RAW(Raw Image Data)是用于医学图像…

【测试工具】JMeter接口测试的简单使用

事先声明:博主的JMeter是3.3版本的,可能和最新版本的操作有些许差别 测试前的准备工作 1、先添加一个线程组:右击“测试计划”,点击“添加”—》“Threads(Users)”—》“线程组” 2、再添加一个HTTP请求,右击“线程…

基于Hive大数据分析springboot为后端以及vue为前端的的民宿系

标题基于Hive大数据分析springboot为后端以及vue为前端的的民宿系 本文介绍了如何利用Hive进行大数据分析,并结合Spring Boot和Vue构建了一个民宿管理系统。该民民宿管理系统包含用户和管理员登陆注册的功能,发布下架酒店信息,模糊搜索,酒店详情信息展示,收藏以及对收藏的…

Pillow教程03:图像处理的基本步骤+分离split+合并merge+混合blend+composite遮罩

--------------Pillow教程集合--------------- Python项目18:使用Pillow模块,随机生成4位数的图片验证码 Python教程93:初识Pillow模块(创建Image对象查看属性图片的保存与缩放) Pillow教程02:图片的裁剪…

烫烫烫手的结构体大小计算来咯,很烫哦,慢慢消化。自定义类型(一)

emmm,在这炎热的夏天在宿舍吹着空调写着博客也是一件不错的事呢,今天就来来好好盘一下C语言中的自定义类型。 常常会回顾努力的自己,所以要给自己的努力留下足迹。 为今天努力的自己打个卡,留个痕迹吧 2024.03.29 小闭 目录 …

C++项目——集群聊天服务器项目(九)客户端异常退出业务

服务器端应检测到客户端是否异常退出,因此本节来实现客户端异常退出,项目流程见后文 一、客户端异常退出业务流程 (1)在业务模块定义处理客户端异常退出的函数 (2)集群聊天服务器项目(八)提到…

为什么在Python中总是使用【字典】这种类型呢?

你好,我是安然无虞。 文章目录 创建字典新增字典元素update 方法 删除字典元素pop 方法popitem 方法 查找字典元素in 和 in not 操作符get 方法thisdict[key] 修改字典元素遍历字典元素for循环遍历keys方法values方法items方法 合并字典字典中的key 字典常用接口汇…

网际协议 - IP

文章目录 目录 文章目录 前言 1 . 网际协议IP 1.1 网络层和数据链路层的关系 2. IP基础知识 2.1 什么是IP地址? 2.2 路由控制 3. IP地址基础知识 3.1 IP地址定义 3.2 IP地址组成 3.3 IP地址分类 3.4 子网掩码 IP地址分类导致浪费? 子网与子网掩码 3.5 CIDR与…

自己动手用ESP32手搓一个智能机器人:ESP32-CAM AI Robot

目录 介绍 硬件需求 软件需求 步骤 总结 源码下载 介绍 ESP32-CAM是一款集成了Wi-Fi和蓝牙功能的微控制器模块,同时还集成了摄像头接口,使其成为一个非常适合构建智能机器人的选择。在本项目中,我将向您展示如何使用ESP32-CAM模块构建…

数据运营分析-详解

一、指标与指标体系 指标体系就是业务逻辑的框架,也是思考业务逻辑的第一步 案例: 老板,我负责的用户活跃,主要考察每天启动产品的注册用户数量,整体来看,每月活跃保持7.3%的增长,是因为渠道团队的拉新活动带来很多新增注册用户,占每月活跃用户的40%,新一年会继续沿…

消息队列的七种经典应用场景

在笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客。 在职业生涯中,笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。 这篇文章,笔者结合自己的真实经历,和大家分享…

Linux项目自动化构建工具-make/ makefile及其应用:多文件编写第一个linux程序:进度条(懒人学习必备博文!!!)

目录 1.前言--make/makefile的引入 2.快速上手make/makefile---自动化构建 3.关于依赖关系和依赖方法 4.自动化清理 为什么我们执行编译的时候,make一下就好,清理却要使用make clean? 5. make/makefile是如何知道当前目录下可执行文件是否为最新 6.文件…

express实现用户登录和注册接口

目录 1 创建数据库2 连接数据库3 集成ORM库4 创建业务逻辑5 创建路由7 测试接口总结 我们在编写后端接口的时候操作数据库是一种常见的功能需求,express本身并不提供直接操作数据库的能力,需要借助第三方库来操作数据库,本篇讲解一下软件开发…

【二叉树】Leetcode 543. 二叉树的直径【简单】

二叉树的直径 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例1: 输入:root [1,2…

基于SpringBoot + Vue实现的在线装修管理系统设计与实现+毕业论文

介绍 系统包含用户、装修队、管理员三个角色 管理员: 管理员管理:管理其他管理员的账号和权限,确保系统管理的层次化和安全性。 装修队管理:审核装修队的资质,管理装修队的人员信息,监控工程进度&#xff…

elementUI this.$msgbox msgBox自定义 样式自定义 富文本

看这个效果是不是很炫?突出重点提示内容,对于用户交互相当的棒! 下来说说具体实现: let self = this const h = self.$createElement; this.$msgbox({title: null,message: h("p", {style: "margin-top:10px"}, [h("i", {class: "el-i…

命名空间【C++】(超详细)

文章目录 命名空间的概念命名空间的定义命名空间定义的位置作用域每一个命名空间都是一个独立的域作用域符:: 编译器找一个变量/函数等的定义,寻找域的顺序为什么要有命名空间?1.解决库与程序员定义的同名的重定义问题2.解决程序员…

【氮化镓】p-GaN栅极退化的温度和结构相关性

论文总结: 本文献深入研究了带有p-GaN栅极的正常关断型(normally-off)高电子迁移率晶体管(GaN-HEMTs)在恒定电压应力下的时序退化行为。通过直流特性分析和温度依赖性分析,研究了故障时间(TTF)与应力温度和器件几何结构的依赖性。结果显示,p…

FME学习之旅---day17

我们付出一些成本,时间的或者其他,最终总能收获一些什么。 【FME-HOW-TO系列】28 栅格邻域函数 RasterConvolver转换器说明: 接受包含栅格几何对象的输入要素,并在对所有波段应用卷积滤波 器后输出要素。 本人对栅格数据处理的较…