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

实现一个三层神经网络

  • 引言
    • 测试数据
  • 代码

引言

今天我们实现一个简单的神经网络
俩个输入神经元 隐藏层两个神经元 一个输出神经元
激活函数我们使用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.rhkb.cn/news/291760.html

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

相关文章

python中pow()函数的使用

在Python中,pow() 函数用于计算指定数字的幂。它的语法如下: pow(x, y) 这个函数返回 x 的 y 次方。相当于 x**y。 pow() 函数也可以接受一个可选的第三个参数,用于指定一个取模值,即计算结果与该模值的余数。其语法如下&#…

JSQLParserException异常

前言 SQL中加入了租户字段&#xff0c;报这个错&#xff0c;可以查出数据&#xff0c;但是不多&#xff1b;SQL检查无问题 解决 原因一 引入新的SQL解析器检查解析SQL&#xff0c;与mybatis多租户无关 参考 <!--jsqlparser版本太低也无法解析&#xff0c;如2.0--> &…

java Web洗衣店管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 洗衣店管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使用…

Pillow教程05:NumPy数组和PIL图像的相互转化

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

集合(ArrayList,HashMap,HashSet)详解+ entrySet的应用

集合 例题引入——直线题意分析根据下面的参考代码&#xff0c;自己模仿的参考代码&#xff08;加一点点我的小tips&#xff09; 1.java集合引入2.为什么要使用集合&#xff1f;3.List、Set、Queue和Map的区别4.ListList——ArrayList&#xff08;&#xff01;&#xff01;实用…

24Compact模式启动

Compact模式启动 compact,是压缩的意思.顾名思义,这是一种压缩启动技术. Compact启动模式比wimboot出现得还要晚,是微软在Windows10中才引入的一种启动模式.相比于普通启动和wimboot,compact启动有以下几个优点: 1.减少占用C盘空间:compact把系统文件在C盘内直接进行压缩,从而达…

基于springboot的船舶维保管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

Java反序列化JDK动态代理的关系

Java代理模式 为什么要学习代理模式&#xff1f;了解开发原理&#xff0c;才能明白漏洞的产生。这不仅仅是SpringAOP的底层&#xff01; [SpringAOP 和 SpringMVC] 代理模式的分类&#xff1a; 静态代理动态代理 静态代理 角色分析&#xff1a; 抽象角色&#xff1a;一般会…

ElasticSearch、java的四大内置函数式接口、Stream流、parallelStream背后的技术、Optional类

第四周笔记 一、ElasticSearch 1.安装 apt-get install lrzsz adduser -m es 创建用户组&#xff1a; useradd *-m* xiaoming(用户名) *PS&#xff1a;追加参数-m* passwd xiaoming(用户名) passwd xiaoming 输入新的 UNIX 密码&#xff1a; 重新输入新的 UNIX 密码&…

帆软报表踩坑日记

最近公司项目要是使用报表&#xff0c;公司使用的是帆软这个国产软件&#xff0c;自己也是学习使用&#xff0c;在使用的过程中记一下问题以及解决方式 公司使用的是帆软8这个版本&#xff0c;比较老了。 首先是表格中的扩展&#xff0c;就是当我们根据数据库查询数据然后放到表…

Redis入门三(主从复制、Redis哨兵、Redis集群、缓存更新策略、缓存穿透、缓存击穿、缓存雪崩)

文章目录 一、主从复制1.单例redis存在的问题2.主从复制是什么&#xff1f;3.主从复制的原理4.主从搭建1&#xff09;准备工作2&#xff09;方式一3&#xff09;方式二 5.python中操作1&#xff09;原生操作2&#xff09;Django的缓存操作 二、Redis哨兵&#xff08;Redis-Sent…

Nginx负载均衡 ,6种常用方式。(新手必看)

nginx的负载均衡策略有六种&#xff1a; 1、轮询&#xff08;默认策略&#xff0c;nginx自带策略&#xff09;&#xff1a;我上面的例子就是轮询的方式&#xff0c;它是upstream模块默认的负载均衡默认策略。会将每个请求按时间顺序分配到不同的后端服务器。 http {upstream …

腾讯 tendis 替代 redis linux安装使用

下载地址 Tendis存储版 点击下载 linux 解压 tar -zxvf 安装包.tgz cd 解压安装包/scripts 启动 ./start.sh 停止 ./stop.sh 详细配置 修改 /scripts tendisplus.conf # tendisplus configuration for testing # 绑定本机IIP bind 192.168.31.112 port 51002 #设…

【CANN训练营笔记】Atlas 200I DK A2体验手写数字识别模型训练推理

环境介绍 开发板&#xff1a;Huawei Atals 200I DK A2 内存&#xff1a;4G NPU&#xff1a;Ascend 310B4 准备环境 下载编译好的torch_npu wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/wanzutao/torch_npu-2.1.0rc1-cp39-cp39-linux_aarch64.whl pip3 install …

简易TCP服务器通信、IO多路复用(select、poll、epoll)以及reactor模式。

网络编程学习 简单TCP服务器通信TCP三次握手和四次挥手三次握手&#xff08;如下图&#xff09;常见问题&#xff1f; 四次挥手 client和server通信写法server端client端 通信双方建立连接到断开连接的状态转换怎么应对多用户连接&#xff1f;缺点 IO多路复用select优缺点 poll…

游戏行业行业竞争越来越激烈,遇到DDoS攻击遭受严重损失该如何解决

近年来&#xff0c;我们见证了数字化的快速发展&#xff0c;随着这样的发展&#xff0c;网络的威胁也逐渐增多&#xff0c;在网络攻击门槛不断降低&#xff0c;行业竞争越来越激烈&#xff0c;游戏行业的DDoS攻击如雨点般密集&#xff0c;在整个DDoS攻击的份额中&#xff0c;游…

前端日期组件layui使用,月模式

初学前端&#xff0c;实战总结 概要 有一个日期组件&#xff0c;我的谷歌浏览器选完日期后&#xff0c;偶尔获取不到最新数据&#xff0c;有一个客户&#xff0c;是经常出不来数据。 日期组件是Wdate&#xff1a;调用的方法是WdatePicker onpicking&#xff0c;代码片段如下…

ubuntu 安装 cloudcompare(两种方法)

方法一 &#xff1a;从 snap 安装 &#xff08;推荐&#xff09; 安装简单&#xff0c;基本上功能都有&#xff08;读写保存las&#xff0c;pcd&#xff0c;标注等&#xff09; 安装&#xff1a; sudo apt-get update sudo apt install snap sudo snap install cloudcompare…

c++使用类的一些注意事项

前言&#xff1a; 本篇内容为前面的补充&#xff0c;介绍了我们使用类时需要注意些什么以及一些编译器的优化&#xff0c;可能有些理解不到位或者错误&#xff0c;请斧正。 目录 前言&#xff1a; 1.再谈构造函数 2.&#xff08;c98&#xff09;隐式类型转换中的编译器的优…

【并发】第二篇 ThreadLocal详解

导航 一. ThreadLocal 简介二. ThreadLocal 源码解析1. get2. set3 .remove4. initialValue三. ThreadLocalMap 源码分析1. 构造方法2. getEntry()3. set()4. resize()5. expungeStaleEntries()6. cleanSomeSlots()7. nextIndex()8. remove()9. 总结ThreadLocalMap四. 内存泄漏…