这里写目录标题
前言
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