numpy实现神经网络

numpy实现神经网络

首先讲述的是神经网络的参数初始化与训练步骤

随机初始化

任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。

我们通常初始参数为正负ε之间的随机值

训练神经网络一般步骤

  1. 参数的随机初始化
  2. 利用正向传播方法计算所有的 h θ ( x ) h_{\theta}(x) hθ(x)
  3. 编写计算代价函数 J J J 的代码
  4. 利用反向传播方法计算所有偏导数
  5. 利用数值检验方法检验这些偏导数
  6. 使用优化算法来最小化代价函数

激活函数和参数初始化

sigmoid函数
在这里插入图片描述
relu函数:
在这里插入图片描述

import numpy as np

# sigmoid激活函数
def sigmoid(x):
    return 1/(1+np.exp(-x))

# relu激活函数
def relu(x):
    return np.maximum(0, x)

# sigmoid反向传播函数
def sigmoid_back(x):
    return x*(1-x)

# relu反向传播函数
def relu_back(x):
    return np.where(x > 0, 1, 0)


#初始化参数
def initialize(input_size,hidden_size,output_size):
    '''
    input_size 输入层列数
    hidden_size 隐藏层列数
    output_size 输出层列数
    '''
    np.random.seed(42)
    input_hidden_weights=np.random.randn(input_size,hidden_size)
    input_hidden_bias=np.zeros((1,hidden_size))
    hidden_out_weights=np.random.randn(hidden_size,output_size)
    hidden_out_bias=np.zeros((1,output_size))
    
    return input_hidden_weights,input_hidden_bias,hidden_out_weights,hidden_out_bias
    

前向传播和反向传播函数

# 前向传播
def forward(inputs,input_hidden_weights,input_hidden_bias,hidden_out_weights,hidden_out_bias):
    hidden_input=np.dot(inputs,input_hidden_weights)+input_hidden_bias
    hidden_output=relu(hidden_input)
    final_input=np.dot(hidden_output,hidden_out_weights)+hidden_out_bias
    final_output=sigmoid(final_input)
    return hidden_output,final_output

# 后向传播
def backward(inputs,hidden_output,final_output,target,hidden_out_weights):
    output_error = target - final_output
    output_delta = output_error * sigmoid_back(final_output)
    hidden_error = output_delta.dot(hidden_out_weights.T)
    hidden_delta = hidden_error * relu_back(hidden_output)
    return output_delta,hidden_delta

更新参数

# 更新参数
def update(inputs, hidden_output, output_delta, hidden_delta, input_hidden_weights, input_hidden_bias,
                      hidden_output_weights, hidden_output_bias, learning_rate):
    hidden_output_weights =hidden_output_weights+ hidden_output.T.dot(output_delta) * learning_rate
    hidden_output_bias = hidden_output_bias+ np.sum(output_delta, axis=0, keepdims=True) * learning_rate
    input_hidden_weights = input_hidden_weights+ inputs.T.dot(hidden_delta) * learning_rate
    input_hidden_bias = input_hidden_bias+ np.sum(hidden_delta, axis=0, keepdims=True) * learning_rate
    return input_hidden_weights,input_hidden_bias,hidden_output_weights,hidden_output_bias

训练及预测模型

#训练模型
def train(inputs, target, input_size, hidden_size, output_size, learning_rate, epochs):
    input_hidden_weights,input_hidden_bias,hidden_output_weights,hidden_output_bias=initialize(input_size,hidden_size,output_size)
    # 梯度下降优化模型
    for epoch in range(epochs):
        hidden_output,final_output=forward(inputs,input_hidden_weights,input_hidden_bias,hidden_output_weights,hidden_output_bias)
        output_delta,hidden_delta=backward(inputs,hidden_output,final_output,target,hidden_output_weights)
        input_hidden_weights,input_hidden_bias,hidden_output_weights,hidden_output_bias=update(inputs,hidden_output,output_delta,hidden_delta,
                    input_hidden_weights,input_hidden_bias,hidden_output_weights,hidden_output_bias,learning_rate)
         # 计算损失
        loss = np.mean(np.square(targets - final_output))
        if epoch % 100 == 0:
            print(f"Epoch {epoch}: Loss {loss}")
    return input_hidden_weights,input_hidden_bias,hidden_output_weights,hidden_output_bias

# 预测模型
def predict(inputs, input_hidden_weights, input_hidden_bias, hidden_output_weights,hidden_output_bias):
    _, result = forward(
        inputs, input_hidden_weights, input_hidden_bias, hidden_output_weights, hidden_output_bias)
    return [1 if y_hat>0.5 else 0  for y_hat in result]

检验模型

# 定义训练数据和目标
inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
target = np.array([[0], [1], [1], [0]])

# 定义神经网络参数
input_size = 2
hidden_size = 4
output_size = 1
learning_rate = 0.1
epochs = 1000

# 训练神经网络
parameters = train(inputs, target, input_size, hidden_size, output_size, learning_rate, epochs)

# 预测
predictions = predict(inputs, *parameters)
print("预测结果:")
print(predictions)

最终结果

在这里插入图片描述

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

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

相关文章

如何学习 Spring ?学习 Spring 前要学习什么?

整理了一下Spring的核心概念BeanDefinitionBeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。比如:class,表示Bean类型scope,表示Bean作用域,单例或原型等lazyInit:表示Be…

解码 SQL:深入探索 Antlr4 语法解析器背后的奥秘

探寻SQL的背后机制 前言 在数据领域,SQL(Structured Query Language)是一门广泛使用的语言,用于查询和处理数据。你可能已经使用过诸如MySQL、Hive、ClickHouse、Doris、Spark和Flink等工具来编写SQL查询。 每一种框架都提供了…

阅读软件OmniReader Pro mac功能特色

OmniReader Pro mac是一款文字识别和阅读软件,它可以将印刷体和手写体的文字转换为数字文本,并将其朗读出来。该软件适用于视力受损、阅读困难、语言障碍等用户,可以帮助他们更加轻松地获取信息和阅读文本。 OmniReader Pro具有简洁直观的用户…

csapp-linklab之第5阶段“输出编码后的学号”(补齐残缺的重定位表)

实验内容 修改补充phase5.o重定位节中被清零的重定位记录,使其与main.o链接后能够正确输出学号编码后的字符串: $ gcc -o linkbomb main.o phase5.o $ ./linkbomb $学号编码后字符串 实验提示 仅需修改重定位节的内容。 不允许修改.text节内容。 给出…

python+Appium自动化:python多线程多并发启动appium服务

Python启动Appium 服务 使用Dos命令或者bat批处理来手动启动appium服务,启动效率低下。如何将启动Appium服务也实现自动化呢? 这里需要使用subprocess模块,该模块可以创建新的进程,并且连接到进程的输入、输出、错误等管道信息&…

系统托盘区句柄研究和C#基本托盘编程

因为我的系统托盘区小图标有时候会不可见,在还是在; 研究一下系统托盘区的句柄,是否每个小图标是一个单个窗口,就像form的button一样; 下图句柄工具,把问号拖动到窗口上,就会显示该窗口的句柄和窗口类等信息; 拖到系统托盘区看一下;拖到任何一个小图标上面,都只显示…

人工智能学习4(特征选择)

编译工具:PyCharm 有些编译工具在绘图的时候不需要写plt.show()或者是print就可以显示绘图结果或者是显示打印结果,pycharm需要(matplotlib.pyplot) 文章目录 编译工具:PyCharm 特征选择嵌入法特征选择练习&#xff…

训练自己的YOLOv8姿态估计模型

在不断发展的计算机视觉领域,姿态估计作为一项关键创新脱颖而出,改变了我们理解视觉数据以及与视觉数据交互的方式。 Ultralytics YOLOv8 处于这一转变的最前沿,提供了一个强大的工具来捕捉图像中物体方向和运动的微妙之处。 NSDT工具推荐&am…

使用Visual Studio创建第一个C代码工程

文章目录 2019创建C工程创建C文件运行 上一节我们使用记事本编辑C代码,在命令行运行文件,这种方式只是作为对编译器的了解,实际的开发中一般使用集成开发环境比较多,因为 集成开发环境操作比较简单,通常可编辑&#x…

工作几年了,你真的懂 Redis 嘛?

大家好,我是伍六七。一个专注于输出 AI 编程内容的在职大厂资深程序员,全国最大 AI 付费社群破局初创合伙人,关注我一起破除 35 诅咒。 Redis 基本上是大部分技术公司都会使用的缓存框架,但是我发现很多程序员其实并不懂 Redis。 …

canvas 轮廓路径提取效果

前言 微信公众号:前端不只是切图 轮廓 对内容做border效果,可以先看下代码运行的效果 内容是黑线构成的五角星,其轮廓就是红线的部分,本文主要介绍如何在canvas中实现这种效果 Marching Square 这里运用到的是marching square算法…

Gradio库的安装和使用教程

目录 一、Gradio库的安装 二、Gradio的使用 1、导入Gradio库 2、创建Gradio接口 3、添加接口到Gradio应用 4、处理用户输入和模型输出 5、关闭Gradio应用界面 三、Gradio的高级用法 1、多语言支持 2、自定义输入和输出格式 3、模型版本控制 4、集成第三方库和API …

边缘与云或边缘加云:前进的方向是什么?

边缘计算使数据处理更接近数据源,以及由此产生的行动或决策的对象。通过设计,它可以改变数十亿物联网和其他设备存储、处理、分析和通信数据的方式。 边缘计算使数据处理更接近数据源,以及由此产生的行动或决策的对象。这与传统的体系结构形成…

L1-016:查验身份证

题目描述 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2&#xf…

站群优化工具,站群优化方案策略

站群优化,作为网络推广的一项重要策略,站群的构建和优化对于提升网站在搜索引擎中的排名、吸引目标流量、增加用户粘性等方面有着不可忽视的作用。 站群优化方案 站群优化并非简单的堆积大量网站,更要注重质量和策略。在构建站群时&#xff…

VMware下载安装教程

目录 一.下载二.安装 一.下载 官网地址:官网 下载的时候选择Workstation Player,这个是免费的,当然你也可以选择下载Workstation Pro。 二.安装 下载完成之后点击安装包按照需要安装即可。 安装之后启动,可以看到这个能够免费使…

CPU标高load标高;linux故障日志排查

一般情况下,服务器不太会出问题。但是遇到特别诡异的情况,多半是服务器本身的问题。遇到问题,我们不能一味的去排查应用,中间件。更应该想到服务器的问题。否则很容易出现南辕北辙的情况。 这次分享的是一次服务器故障&#xff0c…

【小沐学Python】Python实现Web服务器(Flask+celery,生产者-消费者)

文章目录 1、简介2、安装和下载2.1 flask2.2 celery2.3 redis 3、功能开发3.1 创建异步任务的方法3.1.1 使用默认的参数3.1.2 指定相关参数3.1.3 自定义Task基类 3.2 调用异步任务的方法3.2.1 app.send_task3.2.2 Task.delay3.2.3 Task.apply_async 3.3 获取任务结果和状态 4、…

Java LeetCode篇-深入了解关于栈的经典解法(栈实现:中缀表达式转后缀)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 中缀表达式转后缀说明 1.1 实现中缀表达式转后缀思路 2.0 逆波兰表达式求值 2.1 实现逆波兰表达式求值思路 3.0 有效的括号 3.1 实现有效的括号思路 4.0 栈的压…

一文读懂MongoDB的全部知识点(1),惊呆面试官。

文章目录 01、mongodb是什么?02、mongodb有哪些特点?03、你说的NoSQL数据库是什么意思?NoSQL与RDBMS直接有什么区别?为什么要使用和不使用NoSQL数据库?说一说NoSQL数据库的几个优点?04、NoSQL数据库有哪些类型?05、M…