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

news2024/11/22 11:40:02

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_bias
    hidden_layer_output = sigmoid(hidden_layer_activation)

    output_layer_activation = np.dot(hidden_layer_output, output_weights)
    output_layer_activation += output_bias
    predicted_output = sigmoid(output_layer_activation)

    # 计算误差
    error = expected_output - predicted_output
    error_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_rate
    output_bias += np.sum(d_predicted_output, axis=0, keepdims=True) * learning_rate
    hidden_weights += inputs.T.dot(d_hidden_layer) * learning_rate
    hidden_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() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, 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_bias
    hidden_layer_output = sigmoid(hidden_layer_activation)
    output_layer_activation = np.dot(hidden_layer_output, output_weights) + output_bias
    predicted_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 np

class 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.bias1
        self.hidden_layer_output = self.sigmoid(self.hidden_layer_input)
        self.output_layer_input = np.dot(self.hidden_layer_output, self.weights2) + self.bias2
        self.output = self.sigmoid(self.output_layer_input)
        return self.output
    
    def backward_pass(self, X, y, output):
        self.output_error = y - output
        self.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 = 2
    hidden_size = 3
    output_size = 1
    
    nn = 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.coloradmin.cn/o/1847662.html

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

相关文章

微型操作系统内核源码详解系列五(3):cm3下调度的开启

系列一:微型操作系统内核源码详解系列一:rtos内核源码概论篇(以freertos为例)-CSDN博客 系列二:微型操作系统内核源码详解系列二:数据结构和对象篇(以freertos为例)-CSDN博客 系列…

大语言模型-Transformer

目录 1.概述 2.作用 3.诞生背景 4.历史版本 5.优缺点 5.1.优点 5.2.缺点 6.如何使用 7.应用场景 7.1.十大应用场景 7.2.聊天机器人 8.Python示例 9.总结 1.概述 大语言模型-Transformer是一种基于自注意力机制(self-attention)的深度学习…

AI通用大模型不及垂直大模型?各有各的好

​​​​​​​AI时代,通用大模型和垂直大模型,两者孰优孰劣,一直众说纷纭。 通用大模型,聚焦基础层,如ChatGPT、百度文心一言,科大讯飞星火大模型等,都归属通用大模型,它们可以解答…

nginx出现504 Gateway Time-out错误的原因分析及解决

nginx出现504 Gateway Time-out错误的原因分析及解决 1、查看公网带宽是否被打满 2、查看网络是否有波动(可以在nginx上ping后端服务,看是否有丢包情况) 3、查看服务器资源使用情况(cpu、内存、磁盘、网络等) 4、查看nginx日志,具体到哪个服务的哪个…

美创科技入选“2024年度浙江省工业信息安全服务支撑单位”

近日,浙江省经济和信息化厅公布“2024年度浙江省工业信息安全服务支撑单位”名单。 经单位自愿申报、各市经信主管部门初审推荐、专家评审等环节,凭借在工业数据安全领域长期深耕和产品服务实力,美创科技成功入选! “2024年度浙江…

Java数据类型与运算符

1. 变量和类型 变量指的是程序运行时可变的量,相当于开辟一块空间来保存一些数据。 类型则是对变量的种类进行了划分,不同类型的变量具有不同的特性。 1.1 整型变量(重点) 基本语法格式: int 变量名 初始值;代码示…

Vue70-路由的几个注意点

一、路由组件和一般组件 1-1、一般组件 1-2、路由组件 不用写组件标签。靠路由规则匹配出来,由路由器渲染出来的组件。 1-3、注意点1 一般组件和路由组件,一般放在不同的文件夹,便于管理。 一般组件放在components文件夹下。 1-4、注意点…

五十四、openlayers官网示例LineString Arrows解析——在地图上绘制箭头

官网demo地址: LineString Arrows 这篇介绍了在地图上绘制箭头。 创建一个矢量数据源,将其绑定为draw的数据源并展示在矢量图层上。 const source new VectorSource();const vector new VectorLayer({source: source,style: styleFunction,});map.ad…

mac赛车竞速游戏:弯道卡丁车车手 for Mac 中文版下载

《弯道卡丁车车手》是一款刺激的卡丁车竞速游戏,玩家扮演的是赛道上的卡丁车车手,需要在曲线崎岖的赛道上驾驶卡丁车,与其他车手展开激烈的竞速比赛。 游戏中有多种赛道可以选择,每个赛道都有不同的难度和特点,玩家需…

“打造智能售货机系统,基于ruoyi微服务版本开源项目“

目录 # 开篇 售货机术语 1. 表设计说明 2. 页面展示 2.1 区域管理页面 2.2 合作商管理页面 2.3 点位管理页面 3. 建表资源 3.1 创建表的 SQL 语句(包含字段备注) 1. Region 表 2. Node 表 3. Partner 表 4. 创建 tb_vending_machine 表的 S…

【python数据可视化】利用Python爬取天气数据并实现数据可视化,绘制天气轮播图

用Python爬虫抓取全年天气数据并绘制天气轮播图 一、运行结果: 二、代码展示: 由csv文件生成↓ 接下来是绘制天气轮播图 运行结果: 完整代码请看这里↓👇 提醒制作这个项目你需要执行以下几个步骤: 确定数据源&#x…

TIM: A Time Interval Machine for Audio-Visual Action Recognition

标题:TIM:一种用于视听动作识别的时间间隔机器 源文链接:openaccess.thecvf.com/content/CVPR2024/papers/Chalk_TIM_A_Time_Interval_Machine_for_Audio-Visual_Action_Recognition_CVPR_2024_paper.pdfhttps://openaccess.thecvf.com/cont…

Java用文件流mask文本文件某些特定字段

思路 在Java中,如果你想要掩码(mask)文本文件中的某些特定字段,你可以按照以下步骤进行: 读取文本文件内容。找到并识别需要掩码的字段。用特定的掩码字符(如星号*)替换这些字段。将修改后的内…

如何恢复未格式化分区数据?看这里!

什么是未格式化分区? 未格式化或RAW文件系统的分区无法被Windows操作系统识别和挂载,因此,Windows会提示你进行格式化以创建新的文件系统。注意,不要进行格式化。通常,文件系统变为未格式化或RAW会出现以下常见错误消…

C语言练习03-字符串

一、遍历字符 #include<stdio.h>int main() {char str[100];//录入字符串printf("请输入一串字符&#xff1a;\n");scanf("%s",str);//遍历字符串char* p str;while(1){char c *p;if(c \0){//如果遍历到结束标记&#xff0c;则循环结束break;}//…

Android开发系列(六)Jetpack Compose之Box

Box是一个用来组合和控制子元素布局的组件。它可以在一个矩形区域内排列一个或多个子元素&#xff0c;并根据所提供的参数来控制它们的位置、大小和样式。 Box的功能类似传统的FrameLayout。 下面通过示例了解Box的使用方法&#xff0c;首先看一个最简单的示例&#xff0c;如下…

PyMuPDF 操作手册 - 05 PDF的OCR识别等

文章目录 六、PyMuPDF的OCR识别6.1 使用 Tesseract进行OCR6.2 使用MuPDF进行OCR6.3 使用 Python 包easyocr进行OCR识别6.4 使用 Python ocrmypdf包进行OCR识别6.5 将图像批量OCR并转换为PDF七、PDF附加、嵌入、批注等7.1 附加文件7.2 嵌入文件7.3 从文档中获取所有批注六、PyMu…

使用Python selenium爬虫领英数据,并进行AI岗位数据挖掘

随着OpenAI大火&#xff0c;从事AI开发的人趋之若鹜&#xff0c;这次使用Python selenium抓取了领英上几万条岗位薪资数据&#xff0c;并使用Pandas、matplotlib、seaborn等库进行可视化探索分析。 但领英设置了一些反爬措施&#xff0c;对IP进行限制封禁&#xff0c;因此会用到…

英文字母表

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 英文字母表 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){foreach (var item in panel1.Controls){if (item ! null)…

最新五款加密软件推荐(加密软件哪个最好用)

随着信息技术的飞速发展&#xff0c;数据安全问题变得愈发重要。加密软件作为保障数据安全的关键工具&#xff0c;能够有效防止未经授权的访问和数据泄露。在众多加密软件中&#xff0c;如何选择一款合适的软件成为了许多企业和个人的关注焦点&#xff0c;本文将介绍几款目前市…