首页 > 编程语言 >机器学习算法原理实现——神经网络反向传播,链式求导核心

机器学习算法原理实现——神经网络反向传播,链式求导核心

时间:2023-09-10 22:34:15浏览次数:51  
标签:plt return sigmoid pred np 神经网络 链式 求导 true

记得先看之前的梯度下降文章!

 

 

 链式求导的核心来了,就高中数学知识:

 

代码实现:

import numpy as np
import matplotlib.pyplot as plt

# Sigmoid 激活函数及其导数
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def sigmoid_derivative(z):
    return sigmoid(z) * (1 - sigmoid(z))

# 前向传播
def forward(x, w, b):
    z = w * x + b
    return sigmoid(z), z

# 反向传播
def backward(y_pred, y_true, z, x):
    dz = (y_pred - y_true) * sigmoid_derivative(z)
    dw = dz * x
    db = dz
    return dw, db

# 初始化参数
w = 2
b = 1
# 生成数据:在真实函数上加入噪声
np.random.seed(42)
x = np.linspace(0, 5, 100)
y_true = 1 / (1 + np.exp(-(2 * x + 1))) # 这是我们的真实函数
y_true = y_true + np.random.normal(0, 0.02, len(x)) # 加入噪声

alpha = 0.1
epochs = 1000

losses = []

# 训练过程
for epoch in range(epochs):
    total_loss = 0
    for i in range(len(x)):
        y_pred, z = forward(x[i], w, b)
        error = y_true[i] - y_pred
        total_loss += error ** 2
        dw, db = backward(y_pred, y_true[i], z, x[i])
        
        # 更新参数
        w = w - alpha * dw
        b = b - alpha * db
    
    # 保存每个 epoch 的损失值
    losses.append(total_loss / len(x))
    if epoch % 100 == 0:
        print(f"Epoch {epoch}/{epochs} - Loss: {total_loss / len(x)}")


# 绘制预测值与实际值对比
y_preds = [forward(i, w, b)[0] for i in x]
plt.plot(x, y_true, 'ro', label="True values")
plt.plot(x, y_preds, 'bo', label="Predicted values")
plt.title("Predicted vs True values")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()

plt.tight_layout()
plt.show()

  

看看输出:

 

 

 

 

 

 

 

 

标签:plt,return,sigmoid,pred,np,神经网络,链式,求导,true
From: https://www.cnblogs.com/bonelee/p/17692157.html

相关文章

  • 线性表——链式存储
    单链表(有头结点)#include<stdlib.h>//定义typedefstructLNode{intdata;//数据域structLNode*next;//指针域指向下一个结点,所以是structLNode类型}LNode,*LinkList;//*LinkList用于表示这是一个指向structLNode类型的指针//初始......
  • 彻底理解什么是反函数以及反函数的求导
    我们经常听到的是“求解反函数之前先把x和y互换”,其实这样的说法掩盖了反函数的本质。同时,为什么y=arcsinx的反函数是x=siny,但有时候我们也说反函数是y=sinx,以及反函数的导数怎么计算,全部都在下面这篇文章中哦: 求解反函数的导数,你真的会吗?(首先需要知道什么是反函......
  • 支持 range-based for 循环的链式前向星模板
    众所周知,OI中图的存储主要有两种方式:使用std::vector实现的邻接表,以及链式前向星。前者的常数较大,有时候会出现卡不过去的情况,但是支持range-basedfor循环,遍历的时候代码更简洁。可不可以在使用链式前向星的同时,使用range-basedfor循环呢?如以下代码所示:Graphgraph;int......
  • ICML 2023 | 神经网络大还是小?Transformer模型规模对训练目标的影响
    前言 本文研究了Transformer类模型结构(configration)设计(即模型深度和宽度)与训练目标之间的关系。结论是:token级的训练目标(如maskedtokenprediction)相对更适合扩展更深层的模型,而sequence级的训练目标(如语句分类)则相对不适合训练深层神经网络,在训练时会遇到over-smoothin......
  • 循环神经网络--基于pytorch框架
    importmatplotlib.pyplotaspltimportmathimporttorchfromtorchimportnnfromtorch.nnimportfunctionalasffromd2limporttorchasd2lbatch_size,num_steps=32,35train_iter,vocab=d2l.load_data_time_machine(batch_size,num_steps)print(f.......
  • Paddle图神经网络训练-PGLBox代码阅读笔记
    图存储部分paddle/fluid/framework/fleet/heter_psgraph_gpu_wrapper.hGPU图主入口graph_gpu_ps_table.hGPU图的主要存储结构,neighbor采样等都在这里完成gpu_graph_node.h节点,边,邻居等数据结构定义paddle/fluid/distributed/ps/table/common_graph_tabl......
  • 深度神经网络中基于卷积操作的自适应学习算法研究
    本文提出了一种基于卷积操作的自适应学习算法,用于深度神经网络中。该算法通过引入复杂的数学公式和高阶张量操作,实现了对复杂模式的准确建模和学习。我们通过对网络架构的改进和参数的优化,提高了模型的泛化能力和性能表现。实验结果表明,我们的算法在多个基准数据集上取得了优于现有......
  • 将Python深度神经网络转换成C++
     项目方案:将Python深度神经网络转换成C++项目概述本项目旨在将使用Python编写的深度神经网络模型转换为C代码,以便在C环境中部署和运行。通过将模型从Python转换为C++,可以提高模型的性能和效率,并扩展模型在不同平台和设备上的应用。技术方案1.选择转换工具我们可以使用以下两种......
  • 【机哥】基于神经网络的图像去噪器
    鱼弦:全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)基于神经网络的图像去噪器是一种利用深度学习技术来降低图像噪声的方法。它通过训练一个神经网络模型,将含有噪声的图像作为输入,输出一张更......
  • 队列——链式存储
    #include<stdio.h>#include<stdlib.h>//定义typedefstructLinkNode{intdata;structLinkNode*next;}LinkNode;typedefstruct{LinkNode*rear,*front;}LinkQueue;//初始化——带头结点voidInitQueue(LinkQueue&Q){Q.front=Q.rear=......