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

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))

🍉总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1. 基础设计流程(以时钟分频器的设计为例)

1. 准备工作 1. 写有vcs编译命令的run_vcs.csh的shell脚本 2. 装有timescale,设计文件以及仿真文件的flish.f(filelist文件,用于VCS直接读取) vcs -R -full64 -fsdb -f flist.f -l test.log 2. 写代码(重点了解代码…

【Kafka】Kafka Broker工作流程、节点服役与退役、副本、文件存储、高效读写数据-08

【Kafka】Kafka Broker工作流程、节点服役与退役、副本、文件存储、高效读写数据 1. Kafka Broker 工作流程1.1 Zookeeper 存储的 Kafka 信息1.2 Kafka Broker总体工作流程1.2.1 Controller介绍 1.3 Broker 重要参数 2. 节点服役与退役3. Kafka副本 1. Kafka Broker 工作流程 …

找不到d3dx9_43.dll无法继续执行代码的几种解决方法

在工作或生活使用电脑都会遇到丢失dll文件应用无法启动的情况,比如你安装完一款你最喜欢的游戏在启动的时候提示系统缺少d3dx9_39.dll、d3dx9_40.dll、d3dx9_41.dll、d3dx9_42.dll、d3dx9_43.dll、xinput1_3.dll 文件而无法正常游戏,或你在工作的时候安装…

每日练题(py,c,cpp).6_19,6_20

检验素数 from math import sqrt a int(input("请输入一个数:")) for i in range(2,int(sqrt(a))):if a%i 0:print("该数不是素数")breakelse: print("该数是素数")# # 1既不是素数也不是合数 # #可以用flag做标志位 # b int(…

思聪私生女能继位吗?王健林表态,家族不会亏待

黄一鸣坚称:这绝对是王思聪的骨肉!常言道,常在河边走,哪能不湿鞋。换女友如换装的王思聪,这次终于跌入了陷阱!他的网红女友们如繁星点点,但选择标准始终如一——年轻、美丽。在金钱上&#xff0…

CARIS HIPS and SIPSv12 是专业的多波束水深数据和声呐图像处理软件

CARIS HIPS and SIPS是专业的多波束水深数据和声呐图像处理软件。CARIS HIPS and SIPS适用于海洋应用需求。其可靠性和可用性对多波束水深数据处理和声呐图像都是很重要的。CARIS HIPS用于处理多波束水深数据,CARIS SIPS用于处理侧扫声呐图像和多波束背向散射回波数…

Ascend C Add算子样例代码详解

核函数定义 核函数(Kernel Function)是Ascend C算子设备侧实现的入口。在核函数中,需要为在一个核上执行的代码规定要进行的数据访问和计算操作,当核函数被调用时,多个核都执行相同的核函数代码,具有相同的…

stable diffusion 模型融合

【抛砖引玉】GhostMixV2.0的制作过程及关于Checkpoint模型融合的一点经验 - 知乎大家好,我是Ghost_Shell,也是GhostMix的作者。本来想写一篇文章整体介绍一下模型,一些你们可能没察觉到,但我非常固执的理念,也算是模型的特性。结果发现写太长了,就分开两部分,第一部分是…

技术驱动会展:展位导航系统的架构与实现

随着会展行业的快速发展,大型会展中心面临着如何提升参展者体验、提高招商效率的挑战。针对客户反馈的展馆面积大、展位查找困难等问题,维小帮提出一套智慧会展导航解决方案,旨在通过先进的室内导航技术提升会展中心的运营效率和参展者的满意…

后端实现预览pdf,mp4,图片

PDF预览 /*** pdf预览* param response*/RequestMapping(value "/preview")public void showPdf(HttpServletResponse response) {try {//String filePath this.getClass().getClassLoader().getResource("../../static/pdf/readme.pdf").getPath();Stri…

cad批量打印pdf怎么弄?介绍三种打印方法

cad批量打印pdf怎么弄?在CAD设计领域,批量打印PDF文件是一项常见且至关重要的任务。面对大量的CAD图纸,如何高效地进行转换和打印,成为了设计师们亟待解决的问题。今天,我们就来推荐三款能够批量打印PDF的CAD软件&…

2024年6月15日 (周六) 叶子游戏新闻

期刊杂志: 聚合读者、意林、知音、故事会、花火以及国内各大知名报纸电子版,无需付费即可观看各种免费资源 中医自学宝典: 集合了中医医案,医经,方剂 药材知识的app,更方便的免费学习中医知识 《赛博朋克2077》被取消DLC泄露&…

基于语音识别的智能电子病历(五)电子病历编辑器

前言 首先我们要明确一个概念:很多电子病历的编辑器,在输入文字的地方,有个麦克风按钮,点击一下,可以进行录音,然后识别的文字会自动输入到电子病历中,这种方式其实不能称为“基于语音识别的智…

WPF/C#:数据绑定到方法

在WPF Samples中有一个关于数据绑定到方法的Demo&#xff0c;该Demo结构如下&#xff1a; 运行效果如下所示&#xff1a; 来看看是如何实现的。 先来看下MainWindow.xaml中的内容&#xff1a; <Window.Resources><ObjectDataProvider ObjectType"{x:Type local…

湖南科技大学24计算机考研情况,软工学硕考数二,分数线290分,录取均分321分!

湖南科技大学&#xff08;Hunan University of Science and Technology&#xff09;坐落在伟人故里、人文圣地湘潭&#xff0c;处于长株潭核心区域&#xff0c;比邻湘潭九华经济技术开发区&#xff08;国家级&#xff09;&#xff0c;是应急管理部、国家国防科技工业局与湖南省…

全面国产化之路-信创

概叙 信创&#xff0c;即信息技术应用创新产业&#xff0c;这个词儿最早来源于“信创工委会”&#xff08;全称是信息技术应用创新工作委员会&#xff09;&#xff0c;是在2016年由24家专业从事软硬件关键技术研究及应用的国内单位共同发起成立的一个非营利性社会组织。后…

vulnhub靶场之FunBox-11

一.环境搭建 1.靶场描述 As always, its a very easy box for beginners. Add to your /etc/hosts: funbox11 This works better with VirtualBox rather than VMware. 2.靶场下载 https://www.vulnhub.com/entry/funbox-scriptkiddie,725/ 3.靶场启动 二.信息收集 1.寻找靶…

Python文件与面向对象知识点

目录 文件的基本概念 文件的读取 文件的追加 文件的写入 with语句 知识总结 面向对象的基本概念 类和实例 对象的属性和方法 类属性与方法 面向对象的三大特性 知识总结 文件的基本概念 文件的读取 文件的追加 文件的写入 with语句 知识总结 面向对象的基本概念 …

vue项目build 打包之后如何本地访问

vue项目build 打包之后如何本地访问 注意&#xff1a;vue项目build打包后 如果想实现本地访问 不能直接打开访问dist文件中的HTML文件&#xff08;因为页面带会报错打不开。&#xff09;&#xff0c;需要启一个服务&#xff0c;通过服务来访问&#xff1a; 具体操作过程如下&am…

Avalonia:一个.NET跨平台UI框架

概述 Avalonia是一个强大的框架&#xff0c;使开发人员能够使用. NET创建跨平台应用程序。它使用自己的渲染引擎来绘制UI控件&#xff0c;确保在各种平台上保持一致的外观和行为&#xff0c;包括Windows&#xff0c;macOS&#xff0c;Linux&#xff0c;Android&#xff0c;iOS…