Rust实现基础全连接神经网络

这里写目录标题

前言

AI人工智能如今火了起来,大部分的神经网络底层框架都是基于Python来实现的,最近在研究Rust想试试看能不能通过Rust实现一个最基本的神经网络,网上也参考了许多大佬们的Python代码实现,可以说现在这版完全是从一位大佬的代码中抄过来的,所以想看Python版实现的话,下面是这位大佬的原文: Python实现神经网络(零基础篇) 主要基本原理就不多说了,下面直接附上源代码,供大家参考学习

依赖

# 创建新项目
cargo new my_neural_network
# 进入项目目录
cd my_neural_network
# 添加ndarray rand库, ndarray相当于Python的numpy库, 用于科学计算, rand库是用来生成随机数的, 用于初始化权重和偏置
cargo add ndarray rand
# 本人使用的vscode作为开发工具, 所以直接用vscode打开项目
code .

代码

/// main.rs

use ndarray::{
   array, Array1, Array2};
use rand::{
   thread_rng, Rng};

// 激活函数
pub fn sigmoid(x: f64) -> f64 {
   
    1.0 / (1.0 + (-x).exp())
}

// 激活函数导数
pub fn deriv_sigmoid(x: f64) -> f64 {
   
    let sig_x = sigmoid(x);
    sig_x * (1.0 - sig_x)
}

// 均方误差
fn mean_squared_error(y_true: &Array1<f64>, y_pred: &Array1<f64>) -> f64 {
   
    let diff = y_true - y_pred;
    let squared_error = diff.mapv(|x| x * x);
    let sum_squared_error = squared_error.sum();
    let num_samples = y_true.len() as f64;
    sum_squared_error / num_samples
}

/// 神经网络
/// 输入层 x1, x2
/// 隐藏层 h1, h2
/// 输出层 o1
/// ```mermaid
/// graph LR
/// A[x1] --*w1--> C((+b1))
/// A --*w2--> D((+b2))
/// B[x2] --*w4--> D
/// B --*w3--> C
///
/// C --> E[h1] --(sigmoid|relu|tanh|softmax)--> F[h1f]
/// D --> G[h2] --(sigmoid|relu|tanh|softmax)--> H[h2f]
///
/// F --*w5--> I((+b3)) --> J[o1]
/// H --*w6--> I
///
/// J --(sigmoid|relu|tanh|softmax)--> K[o1f]
///
/// ```
/// h1 = w1 * x1 + w3 * x2 + b1, h1f = sigmoid(h1)
/// h2 = w2 * x1 + w4 * x2 + b2, h2f = sigmoid(h2)
/// o1 = w5 * h1f + w6 * h2f + b3, o1f = sigmoid(o1)
#[derive(Debug)]
pub struct NeuralNetwork {
   
    // 权重 weights
    pub w1: f64,
    pub w2: f64,
    pub w3: f64,
    pub w4: f64,
    pub w5: f64,
    pub w6: f64,
    // 偏置 bias
    pub b1: f64,
    pub b2: f64,
    pub b3: f64,
}

impl NeuralNetwork {
   
    pub fn new() -> Self {
   
        let mut rng = thread_rng();
        let nn = NeuralNetwork {
   
            w1: rng.gen(),
            w2: rng.gen(),
            w3: rng.gen(),
            w4: rng.gen(),
            w5: rng.gen(),
            w6: rng.gen(),
            b1: rng.gen(),
            b2: rng.gen(),
            b3: rng.gen(),
        };
        println!("new NeuralNetwork: {:#?}", nn);
        nn
    }

    pub fn feedforward(&self, x: &Array1<f64>) -> (f64, f64, f64, f64, f64, f64) {
   
        let h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1;
        let h1f = sigmoid(h1);

        let h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ez小辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值