用numpy搭建自己的神经网络

news2024/12/23 11:23:03

搭建之前的基础与思考

构建模型的基本思想:
构建深度学习的过程:产生idea,将idea转化成code,最后进行experiment,之后根据结果修改idea,继续idea–>code–>experiment的循环,直到最终训练到表现不错的深度学习网络模型。

BP网络的搭建

BPNN v-0.1

目标:搭建一个有学习能力的BP神经网络。

目标完成情况:
●局限:只能计算固定大小的数据尺寸
●局限:只有一层,即为感知机或单层神经网络

有一定了解的可以直接看到代码,代码注释有思路。

idea

●神经元(单层感知机):接收n维列向量x(特征维度为n),输出y的估计。
在这里插入图片描述

多组输入x,可以按列堆叠形成矩阵。

●激活函数:Sigmoid、ReLU等

在这里插入图片描述

●损失函数:量化模型预测值与真实值的偏差,模型训练的目的是让Loss尽可能小。
例如:在这里插入图片描述

成本函数就是所有训练样本损失函数的平均。

●反向传播时的复合求导
在这里插入图片描述

反向传播时只需要计算每一层的导数,最后乘积即可。

整体复盘以及数据流向图

请添加图片描述

code

根据面向对象编程思想,有两种实现思路,以神经元为最小类或以神经网络为最小类。
这里为了有更清晰的层次选择以神经元为最小类。

自己早数据,假设数据是学生的身高体重,根据此二者预测学生性别。

# Define dataset,已经经过预处理,保留特征
data = np.array([
  [-2, -1],  # Alice
  [25, 6],   # Bob
  [17, 4],   # Charlie
  [-15, -6], # Diana
])
all_y_trues = np.array([
  1, # Alice
  0, # Bob
  0, # Charlie
  1, # Diana
])

代码:

import numpy as np

# 激活函数与激活函数的求导
def sigmoid(x):
    return 1/(1 + np.exp(-x))
def d_sigomid(x):
    return sigmoid(x) * (1 - sigmoid(x))

# 神经元
class Neuron:
    '''
    -神经元基本属性包括权重和偏置量
    -神经元方法前向计算和反向传递
    -神经元默认接收二维的输入
    '''
    #初始化,针对特定尺寸的数据集
    def __init__(self):
        self.weights = np.random.normal(size=(1, 2))
        self.bias = np.random.normal()
        
    #前向计算过程集成化,用于训练完成后一步输出预测值
    def feedforward(self, inputs):
        Z = np.dot(self.weights, inputs) + self.bias
        return sigmoid(Z)
        
    #训练函数
    def train_epoch(self, x_data, true_value):
        '''
        -迭代目的是更新权重参数和偏置参数,为了得到梯度需要知道导数
        为了计算导数需要知道前向计算过程中的一些值。
        训练时按照这个思路去计算需要的值,再更新权重就可以。
        '''
        #准备工作
        learn_rate = 0.1
        epochs = 100
        
        for epoch in range(epoch):
            for x, y_true in zip(x_data, ture_value):
                #前向计算
                z = np.dot(self.weight, inputs) + self.bias
                y = sigmoid(z)
                #损失函数采用平方差计算,求导较为容易
                #l = (y - true_value) ** 2  
                #只有需要查看效果的轮次才计算输出
                #一般只需要知道l关于y的导数即可,并不需要计算l的值
        
                #反向传播
                d_L_d_y = -2 * (y_true - y)
                d_y_d_z = d_sigmod(z)
                d_z_d_w1 = x1 
                d_z_d_w2 = x2 
                #实际计算可以合并很多步骤,这里分开写为了使过程更清晰
                
                dw1 = d_L_d_y * d_y_d_z * d_z_d_w1
                dw2 = d_L_d_y * d_y_d_z * d_z_d_w2
                db = d_L_d_y * d_y_d_z
                #体现了反向计算的复合过程
                
                #更新
                self.w[0] -= learn_rate * dw1
                self.w[1] -= learn_rate * dw2
                self.b -= learn_rate * db
                
        if epoch % 10 == 0:
            if epoch % 10 == 0:
                y_preds = np.apply_along_axis(self.feedforward, 1, data)
                loss = ((y_preds - y_true) ** 2).mean()
                print("Epoch %d loss %.3f" % (epoch, loss))
            
BPNN = Neuron()
BPNN.train(data, all_y_trues)

experiment

记录1

请添加图片描述请添加图片描述

尝试调参,没有效果
尝试输出一些中间值,发现预测结果是没问题的,只是loss的计算有问题

请添加图片描述

预测值是二维的列,真实值是一维的行,np广播相减直接出来一个4*4的矩阵。做减法时加一个转置就OK

记录2

请添加图片描述

原因很明显,问题过于简单且没有噪音。
增加了一些数据并加入少量噪音。
在这里插入图片描述

能明显看到loss的下降过程,说明实验成功。
请添加图片描述

BPNN v-0.2向量化

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

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

相关文章

前后端分离vue+nodejs高校体育运动会比赛系统08fv2-python-php-java

实现了一个完整的高校体育运动会比赛系统系统,其中主要有运动项目模块、学生模块、项目类型模块、用户表模块、token表模块、关于我们模块、收藏表模块、公告信息模块、留言板模块、运动论坛模块、配置文件模块、裁判员模块、比赛成绩模块、比赛报名模块、关于我们模…

Java网络通信TCP

目录 TCP两个核心类 服务端 1.用ServerSocker类创建对象并且手动指定端口号 2.accept阻塞连接服务端与客户端 3.给客户端提供处理业务方法 4.处理业务 整体代码 客户端 1.创建Socket对象,并连接服务端的ip与端口号 2.获取Socket流对象,写入数据…

uniapp 部署h5,pdf预览

1.hubuilderx 打包h5。 2.上传部署包到服务器。 解压部署包:unzip h5.zip 。 3.nginx配置。 user root; worker_processes 1; #worker_cpu_affinity 0001 0010 0100 1000; #error_log logs/error.log; #error_log logs/error.log notice; error_log /var/l…

C#/.NET/.NET Core优秀项目和框架2024年2月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学…

Java基础 - 6 - 面向对象(二)

Java基础 - 6 - 面向对象(一)-CSDN博客 二. 面向对象高级 2.1 static static叫做静态,可以修饰成员变量、成员方法 2.1.1 static修饰成员变量 成员变量按照有无static修饰,分为两种:类变量、实例变量(对象…

项目设计:基于Qt和百度AI的车牌识别系统(嵌入式ARM)

基于Qt和百度AI智能云实现的智能车牌识别系统,具体可实现为停车场管理系统、智能计费停车系统…等。 1.系统实现思路及框架 1.1实现思路 要实现一个车牌识别系统,有多种方法,例如用opencv图像算法实现,或用第三方算法接口&#x…

【每日一题】找到字符串中所有字母异位词

目录 题目:思路:暴力枚举:滑动窗口: 代码实现:一些优化:代码实现: 题目: 找到字符串中所有字母异位词 思路: 暴力枚举: 对于有关子串的题目我们使用暴力枚…

H12-821_113

113.如图所示是路由器现ATE输出的部分信息,以下关于这部分信息的描述,错误的是哪一项? A.display pim rp-info命令用来查看组播组对应的RP信息 B.RP地址是2.2.2.2 C.组地址是225.0.0.0 D.RP的优先级是0 答案:C 注释: …

C语言-柔性数组成员的使用

文章目录 摘要柔性数组成员基本使用细节探究 零长度数组-定长数组-变长数组 摘要 本文先介绍柔性数组成员(flexible array member)的基本使用,然后介绍其内存结构。最后,补充了一些数组相关的其他概念。 柔性数组成员 基本使用 参考: 【C语言内功修炼…

有趣的CSS - 一串乱码

大家好,我是 Just,这里是「设计师工作日常」,今天分享的是通过 css 来实现一段不停变化的 bug 乱码效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面…

AMDGPU KFD Test 编译使用

ROCT-Thunk-Interface是一个用于在ROCm软件堆栈中提供设备无关性的层。它是ROCm的一部分,允许不同的硬件平台(如AMD GPU和Intel CPU)使用相同的API进行计算。 要安装ROCT-Thunk-Interface,首先需要创建一个新的目录,并…

开源免费的文件互传工具,LocalSend软件推荐

怎么把手机里的文件传到电脑或电脑的文件传到手机? 在日常生活和工作中,我们经常需要在不同的设备间传输文件,比如照片、视频、文档等。如果你使用是统一的苹果设备Airdrop可以非常方便的共享文件,但是如果你要在不同操作系统的设…

css 鼠标移入放大的效果

效果 HTML <div class"img-wrap"><img class"img-item" src"../assets/1.png" alt"" srcset""></div> CSS <style lang"less" scoped> .img-wrap {/* 超出隐藏 */overflow: hidden;.img-…

开发环境热部署

为什么需要热部署 在实际开发中&#xff0c;经常要修改代码&#xff0c;然后重启服务&#xff0c;再验证代码是否生效。对于开发场景&#xff0c;随着项目的演进&#xff0c;微服务越来越多&#xff0c;等待重启的时间也会越来越多&#xff1b;对于联调场景&#xff0c;对一处…

代码随想录Day66 | 图的DFS与BFS

代码随想录Day66 | 图的DFS与BFS DFS797.所有可能的路径无向图和有向图的处理 BFS200.岛屿数量 DFS 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a; 状态 本质上就是回溯算法。 void dfs(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本节点所连接的…

for循环语句

语法格式&#xff1a; for (表达式1; 表达式2; 表达式3) { 若干语句;//循环体 } 执行规则 STEP1&#xff1a;计算“表达式1” &#xff0c;初始化。 STEP2&#xff1a; 判断“表达式2”的值&#xff0c;若 “表达式2”的值为true&#xff0c;则进行 STEP2&#xff0c;否则进行…

DevStack 基于 Ubuntu 部署 OpenStack

Devstack 简介 DevStack 是一系列可扩展的脚本&#xff0c;用于基于 git master 的最新版本快速调出完整的 OpenStack 环境。devstack 以交互方式用作开发环境和 OpenStack 项目大部分功能测试的基础。 devstack 透过执行 stack.sh 脚本&#xff0c;搭建 openstack 环境&…

ChatGPT最新功能“Text To Speech (TTS,文本转语音)”详细解读!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

32单片机基础:PWM驱动舵机,直流电机

PWM驱动舵机 接线图如上图所示。注意&#xff0c;舵机的5V 线不能接到面包板上的正极&#xff0c;面包板上的正极只有3.3V,是STM32提供的&#xff0c;所以要接到STLINK的5V, 我们如何驱动舵机呢&#xff1f;由之前我们介绍原理知道&#xff0c;要输出如下图对应的PWM波形才行…

【FPGA/IC】CRC电路的Verilog实现

前言 在通信过程中由于存在各种各样的干扰因素&#xff0c;可能会导致发送的信息与接收的信息不一致&#xff0c;比如发送数据为 1010_1010&#xff0c;传输过程中由于某些干扰&#xff0c;导致接收方接收的数据却成了0110_1010。为了保证数据传输的正确性&#xff0c;工程师们…