人工智能--搭建人工神经网络

2a20c54b85e042bfa2440367ae4807e9.gif

欢迎来到 Papicatch的博客

文章目录

🍉引言

🍉神经元与感知器

🍈神经元(Neuron) 

🍈感知器

🍉损失函数与梯度下降算法

🍈损失函数

🍈梯度下降算法

🍉多层感知器与神经网络

🍈多层感知器(MLP)

🍈激活函数

🍈反向传播算法

🍉实例

🍈手工搭建神经网络

🍉总结


2a20c54b85e042bfa2440367ae4807e9.gif

🍉引言

      人工神经网络(Artificial Neural Networks, ANN)是一种受生物神经系统启发的计算模型,能够学习和执行复杂的非线性映射任务。本文将深入探讨神经元、感知器、损失函数、梯度下降算法、多层感知器(MLP)、激活函数、反向传播算法,并通过实例展示如何手工搭建一个神经网络。

🍉神经元与感知器

🍈神经元(Neuron) 

神经元是神经网络的基本单元,模仿生物神经元的结构和功能。它接收来自其他神经元或外部输入的信号,通过加权求和和激活函数转换后输出结果。

一个简单的神经元模型如下:

其中,𝑥𝑖xi​ 是输入信号,𝑤𝑖wi​ 是对应的权重,𝑏b 是偏置项,𝜎σ 是激活函数,如 sigmoid、ReLU 等。

🍈感知器

感知器模型结构:

🍈感知器实现and函数

逻辑运算and的真值表

x1

x2

y(and运行结果)
0(假)0(假)0(假)
0(假)1(真)0(假)
1(真)0(假)0(假)
1(真)1(真)1(真)

🍈代码实现

# 定义AND运算的函数
def AND(a, b):return a & b# 真值表的输入组合
inputs = [(0, 0),(0, 1),(1, 0),(1, 1)
]# 打印真值表
print("A | B | A AND B")
print("---|---|-------")
for a, b in inputs:result = AND(a, b)print(f" {a} | {b} |   {result}")

    感知器(Perceptron)是最简单的神经网络形式,包含一个单层神经元,直接将输入映射到输出,通常用于二分类问题。

🍉损失函数与梯度下降算法

🍈损失函数

        损失函数(Loss Function)衡量神经网络预测值与实际标签之间的差异。

常见的损失函数包括:

  • 均方误差(Mean Squared Error, MSE):适用于回归问题。
  • 交叉熵损失函数(Cross-Entropy Loss):适用于分类问题。

🍈梯度下降算法

        梯度下降算法通过最小化损失函数来优化神经网络的参数。核心思想是沿着损失函数梯度的反方向更新权重和偏置,从而逐步改进模型的预测能力。

具体步骤如下:

  • 计算损失函数的梯度:使用反向传播算法计算每个参数对损失函数的影响。
  • 更新权重和偏置:通过学习率(learning rate)控制更新步长,减小损失函数值。

🍉多层感知器与神经网络

        异或(XOR)问题是经典的逻辑运算问题,感知器不能拟合出一条直线将结果分开。要将二者分开,必须采用封闭式的曲线才行。多层感知器可以实现。

异或(XOR)真值表

A𝐵B𝐴 XOR 𝐵A XOR B
000
011
101
110
import numpy as np
import matplotlib.pyplot as plt# 定义激活函数(sigmoid)及其导数
def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(x):return x * (1 - x)# 输入数据和目标输出
inputs = np.array([[0, 0],[0, 1],[1, 0],[1, 1]])expected_output = np.array([[0],[1],[1],[0]])# 初始化参数
input_layer_neurons = inputs.shape[1]
hidden_layer_neurons = 2
output_neurons = 1# 初始化权重和偏置
hidden_weights = np.random.uniform(size=(input_layer_neurons, hidden_layer_neurons))
hidden_bias = np.random.uniform(size=(1, hidden_layer_neurons))
output_weights = np.random.uniform(size=(hidden_layer_neurons, output_neurons))
output_bias = np.random.uniform(size=(1, output_neurons))# 设置学习率和迭代次数
learning_rate = 0.1
epochs = 10000
error_history = []# 训练神经网络
for epoch in range(epochs):# 前向传播hidden_layer_activation = np.dot(inputs, hidden_weights)hidden_layer_activation += hidden_biashidden_layer_output = sigmoid(hidden_layer_activation)output_layer_activation = np.dot(hidden_layer_output, output_weights)output_layer_activation += output_biaspredicted_output = sigmoid(output_layer_activation)# 计算误差error = expected_output - predicted_outputerror_history.append(np.mean(np.abs(error)))d_predicted_output = error * sigmoid_derivative(predicted_output)# 反向传播error_hidden_layer = d_predicted_output.dot(output_weights.T)d_hidden_layer = error_hidden_layer * sigmoid_derivative(hidden_layer_output)# 更新权重和偏置output_weights += hidden_layer_output.T.dot(d_predicted_output) * learning_rateoutput_bias += np.sum(d_predicted_output, axis=0, keepdims=True) * learning_ratehidden_weights += inputs.T.dot(d_hidden_layer) * learning_ratehidden_bias += np.sum(d_hidden_layer, axis=0, keepdims=True) * learning_rate# 打印结果
print("Final hidden weights: ", hidden_weights)
print("Final hidden bias: ", hidden_bias)
print("Final output weights: ", output_weights)
print("Final output bias: ", output_bias)
print("Predicted output: ", predicted_output)# 绘制误差下降图
plt.plot(error_history)
plt.title('Error History')
plt.xlabel('Epoch')
plt.ylabel('Error')
plt.show()# 绘制神经网络预测结果图
def plot_decision_boundary(X, y, model, title):x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),np.arange(y_min, y_max, 0.1))Z = model(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, alpha=0.8)plt.scatter(X[:, 0], X[:, 1], c=y.flatten(), s=40, edgecolor='k')plt.title(title)plt.show()# 定义预测函数
def predict(X):hidden_layer_activation = np.dot(X, hidden_weights) + hidden_biashidden_layer_output = sigmoid(hidden_layer_activation)output_layer_activation = np.dot(hidden_layer_output, output_weights) + output_biaspredicted_output = sigmoid(output_layer_activation)return np.round(predicted_output)# 绘制决策边界
plot_decision_boundary(inputs, expected_output, predict, 'XOR Decision Boundary')

🍈多层感知器(MLP)

        多层感知器(MLP)是一种前向结构的神经网络,由多个全连接隐藏层和至少一个输出层组成。

每个神经元在每层中执行以下步骤:

  • 线性变换:计算加权输入的和。
  • 非线性变换(激活函数):通过激活函数如 sigmoid、ReLU 将结果映射到非线性空间。

🍈激活函数

        激活函数是神经网络中每个神经元的非线性映射函数,常见的有:

Sigmoid 函数:将输入值压缩到0到1之间。

ReLU 函数:对于正数输入,返回输入值本身;对于负数输入,返回0。

🍈反向传播算法

        反向传播算法是训练神经网络的核心技术,通过链式法则计算损失函数相对于每个参数的梯度,并将梯度传播回网络以更新权重和偏置。

🍉实例

三层神经网络结构

🍈手工搭建神经网络

        以下是一个简单的 Python 示例代码,演示如何手工实现一个包含单隐藏层的多层感知器,并训练它解决 XOR 问题。

import numpy as npclass NeuralNetwork:def __init__(self, input_size, hidden_size, output_size):self.weights1 = np.random.randn(input_size, hidden_size)self.bias1 = np.zeros((1, hidden_size))self.weights2 = np.random.randn(hidden_size, output_size)self.bias2 = np.zeros((1, output_size))def sigmoid(self, x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(self, x):return x * (1 - x)def forward_pass(self, X):self.hidden_layer_input = np.dot(X, self.weights1) + self.bias1self.hidden_layer_output = self.sigmoid(self.hidden_layer_input)self.output_layer_input = np.dot(self.hidden_layer_output, self.weights2) + self.bias2self.output = self.sigmoid(self.output_layer_input)return self.outputdef backward_pass(self, X, y, output):self.output_error = y - outputself.output_delta = self.output_error * self.sigmoid_derivative(output)self.hidden_layer_error = np.dot(self.output_delta, self.weights2.T)self.hidden_layer_delta = self.hidden_layer_error * self.sigmoid_derivative(self.hidden_layer_output)self.weights2 += np.dot(self.hidden_layer_output.T, self.output_delta)self.bias2 += np.sum(self.output_delta, axis=0, keepdims=True)self.weights1 += np.dot(X.T, self.hidden_layer_delta)self.bias1 += np.sum(self.hidden_layer_delta, axis=0, keepdims=True)def train(self, X, y, epochs):for epoch in range(epochs):output = self.forward_pass(X)self.backward_pass(X, y, output)if epoch % 1000 == 0:print(f'Epoch {epoch}, Loss: {np.mean(np.square(y - output))}')if __name__ == "__main__":input_size = 2hidden_size = 3output_size = 1nn = NeuralNetwork(input_size, hidden_size, output_size)X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])y = np.array([[0], [1], [1], [0]])nn.train(X, y, epochs=10000)print('Final predictions:')print(nn.forward_pass(X))

🍉总结

        本文详细讲解了人工神经网络的核心组成部分和关键技术。从神经元、感知器到多层感知器的演进,再到损失函数、梯度下降算法和反向传播算法的实际应用,读者可以全面理解神经网络的工作原理及其在实际问题中的应用。通过手工搭建神经网络的示例,读者不仅能够加深对神经网络内部运作的理解,还能够通过修改和扩展代码来探索更复杂的神经网络结构和任务。神经网络作为深度学习的基础,对于理解和实践现代机器学习技术具有重要意义。

希望能给大家提供一些帮助!!!

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

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

相关文章

【绝对有用】C++ vector排序

在 C 中&#xff0c;有多种方法可以对向量&#xff08;即 std::vector&#xff09;进行排序。最常用的方法是使用标准库中的 std::sort 函数。以下是一些例子&#xff1a; 使用 std::sort 函数 std::sort 函数是标准库 <algorithm> 中的一个函数&#xff0c;可以对向量…

cd 命令特殊路径符 mkdir命令

cd 特殊路径符 cd . 表示当前目录&#xff0c;比如 cd ./Desktop表示切换到当前目录下的Desktop目录内&#xff0c;和 cd Desktop效果一致。cd … 表示上一级目录&#xff0c;比如 cd … 即可切换到上一级目录&#xff0c;cd…/…切换到上二级目录。cd ~ 表示 HOME 目录&#…

快速又不失灵活性的JeecgBoot框架

简介JeecgBoot 开源界 "小普元" 超越传统商业平台。引领低代码开发模式 (OnlineCoding-> 代码生成器 -> 手工 MERGE)&#xff0c;低代码开发同时又支持灵活编码&#xff0c; 可以帮助解决 Java 项目 70% 的重复工作&#xff0c;让开发更多关注业务。既能快速提…

C++ 智能指针:unique_ptr

深刻理解一个原理的方法之一就是去自我实现一个&#xff0c;上代码&#xff1a; 1 自定义unique_ptr #include <iostream> #include <utility>template<typename T> class unique_ptr { private:T * ptr_resource nullptr;public:explicit unique_ptr(T* …

面试官:JavaScript执行机制中的闭包?

前言 JavaScript 中的闭包指的是一个函数以及其捆绑的周边环境状态的引用的组合。闭包可以让开发者从内部函数访问外部函数的作用域&#xff0c;即使外部函数已经执行完毕 今天我们通过JavaScript执行机制来聊聊闭包 正文 首先来分析这段代码的执行机制&#xff0c;这段代码…

详细解读“找不到mfc140u.dll无法继续执行代码”问题

当你打开某个软件或者运行游戏&#xff0c;系统提示mfc140u.dll丢失&#xff0c;此时这个软件或者游戏根本无法运行。其实&#xff0c;mfc140u.dll是动态库文件&#xff0c;它是VS2010编译的软件所产生的&#xff0c;如果电脑运行程序时提示缺少mfc140u.dll文件&#xff0c;程序…

PHP 8.4有哪些新功能值得关注

属性钩子&#xff08;Property Hooks&#xff09; 允许开发者为每个属性定义自己的get和set钩子&#xff0c;以在属性访问前后添加自定义逻辑。属性钩子通过__get()和__set()方法实现&#xff0c;类似于其他编程语言&#xff08;如Kotlin、C#和Swift&#xff09;中的属性访问器…

C++标准库:STL以及输入输出库,IO库,Cmath库,时间库,智能指针库与并发库等简介

标准库 C 标准库是 C 编程语言的核心部分&#xff0c;提供了丰富的功能和组件&#xff0c;包括容器、算法、迭代器、函数对象、智能指针、输入输出操作等。C 标准库主要包括以下几个组件&#xff1a; STL&#xff08;Standard Template Library&#xff09;&#xff1a;STL 是…

复分析——第6章—— Γ 函数和 ζ 函数(E.M. Stein R. Shakarchi)

第6章 Γ函数和Ζ函数(The Gamma and Zeta Functions) 毫不夸张地说&#xff0c;Γ函数和Ζ函数是数学中最重要的非初等函数之一。Γ函数在自然界中无处不在。它出现在大量计算中&#xff0c;并以分析中出现的大量恒等式为特征。对此的部分解释可能在于Γ函数的基本结构特性&…

游戏心理学Day21

玩家情绪与暴力攻击 情绪 情绪的分类 情绪是一种经常波动的东西&#xff0c;我们既体验过骄傲激动和开心&#xff0c;也体验过羞怯内疚和沮丧。我们的感受高度依赖于情境。研究者区分出至少三种途径来考察作为一种相对固定的人格特征的情绪&#xff0c;即为情感性&#xff0…

lock_wait_timeout

lock_wait_timeout 是 MySQL 中的一个重要参数&#xff0c;它用于控制当一个 MySQL 会话在等待锁时的等待时间。以下是关于 lock_wait_timeout 的详细解释&#xff1a; 定义与功能 定义&#xff1a;lock_wait_timeout 是一个会话或线程级别的参数&#xff0c;用于指定 MySQL …

python20 函数的定及调用

函数的定及调用 函数是将一段实现功能的完整代码&#xff0c;使用函数名称进行封装&#xff0c;通过函数名称进行调用。以此达到一次编写&#xff0c;多次调用的目的 用 def 关键字来声明 函数 格式&#xff1a; def 函数名(参数列表):函数体[:return 返回值是可选的&#xff0…

小白如何如何理解滑动窗口最大值问题python

文章目录 题目描述思路什么时候弹出元素什么时候加入元素 代码示例和解释 题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 举例&#xff1a; 输…

命令行脚本批量转换工具说明

O N C E &#xff0c; ONCE&#xff0c; ONCE&#xff0c;EACH&#xff0c;$0都是NimbleText的关键字 O N C E : 任何 在 ′ ONCE:任何在 ONCE:任何在′ONCE’关键字之后的文本将只输出一次&#xff0c;不管有多少行&#xff0c;到’$EACH’关键字或者到文件末尾为止。 E A C…

《沃趣 分手后霸道少爷宠爆我》盛大开机典礼

南京五聚文化传媒有限公司自豪地宣布&#xff0c;引人入胜的2024年度短剧巨作——《沃趣 分手后霸道少爷宠爆我》——今日正式开拍&#xff01;在星辰下的华丽舞台上&#xff0c;我们汇集了业界的精英力量&#xff0c;准备讲述一个关于爱、错位与重生的故事。 典礼精彩亮点 1.…

0621熟悉项目

1、store:全局状态管理器。共享给各组件的数据。 2、首页组件组成&#xff1a;layout组件下的index为入口。左侧菜单栏SidebarNew&#xff08;大概意思是遍历数组生成菜单&#xff09;&#xff0c;右侧菜单栏app-mai&#xff08;主体内容&#xff09; main-tags-view&#xff0…

数据治理工程师CDGA备考心得、时间安排、题库资源

1.写在前面 之前做一些数据质量控制、元数据、主数据相关工作&#xff0c;一直忙于工作&#xff0c;没有去往考证的方面想&#xff0c;去年年底心血来潮就决定考一考&#xff0c;证多不压身嘛&#xff08;也有部分学生向我咨询&#xff09;&#xff0c;资源在文章结尾&#xff…

逻辑学中的蕴涵式:SQL开发者必备知识

逻辑学中的蕴涵式&#xff1a;SQL开发者必备知识 在逻辑学中&#xff0c;蕴涵式&#xff08;Implication&#xff09;是一种常见的逻辑关系&#xff0c;用于描述两个命题之间的条件关系。在SQL开发中&#xff0c;理解蕴涵式的概念和真值规则对编写复杂查询语句非常有帮助。本文…

onnx转openvino模型(2022版本和2024版本)

网上很多方法都是用openvino自带的mo_onnx.py来转的&#xff0c;但个人下载的2022和2024版都没见到这些文件。所以使用不了 &#xff08;1&#xff09;2022版openvino&#xff1a;python需要安装对应版本的openvino库(以2022.3.0为例&#xff09; pip install openvino2022.3…

软件测试——稳定性测试:adb Monkey

Monkey 1. Monkey1.1 Monkey 是什么1.2 Monkey 测试场景1.3 Monkey 特点1.4 Monkey 在哪里1.5 测试准备事项1.6 Monkey 参数列表 2. 基本命令3. 常用参数4. 事件类型5. 调试参数6. 日志管理7. 日志错误定位8. Monkey测试可以发现的问题 1. Monkey 1.1 Monkey 是什么 Monkey是一…