理解和实现简单的XOR神经网络

news2024/9/20 0:49:05

本文介绍了神经网络的基本知识,并以实现一个简单的XOR神经网络为例,详细解释了神经网络的工作原理和关键概念。我们将利用Python编写的代码来逐步理解并实现这个神经网络。
神经网络是一种模仿生物神经系统的计算模型,用于处理复杂的输入数据。本文将通过实现一个简单的多层感知器(MLP)神经网络,帮助读者理解神经网络的基本原理和关键概念。

神经网络基本构成

一个神经网络由多个层组成,每一层都包含若干神经元。这些层可以分为输入层、隐藏层和输出层。输入层接收输入数据,隐藏层负责处理数据,输出层生成最终结果。在我们的例子中,我们将实现一个具有2个输入节点、1个隐藏层(包含2个节点)和1个输出节点的神经网络。

激活函数

激活函数是神经元的关键组成部分,用于将神经元的输入值映射到一个特定的输出值。本例中,我们使用Sigmoid函数作为激活函数。Sigmoid函数将输入值映射到0到1之间的输出值。

反向传播算法

反向传播算法(Backpropagation)是训练神经网络的核心算法。在训练过程中,神经网络通过调整权重和偏置来学习输入数据与目标输出之间的映射关系。反向传播算法的关键思想是通过计算损失函数对权重和偏置的梯度,然后根据梯度来更新权重和偏置。

损失函数

损失函数用于衡量神经网络的输出与目标输出之间的误差。在本例中,我们使用均方误差作为损失函数。神经网络的目标是最小化损失函数。

代码实现

我们的代码实现了一个简单的XOR神经网络。首先,我们定义了激活函数及其导数。然后,我们初始化了神经网络的权重和偏置。接下来,我们使用一个循环进行训练,每次迭代中都使用反向传播算法更新权重和偏置。
本代码实现的XOR神经网络涵盖了以下知识点:

代码含有下列知识点:

  • 神经网络的基本结构(输入层、隐藏层和输出层)
  • 激活函数(Sigmoid函数)
  • 反向传播算法
  • 损失函数(均方误差)
  • Python代码实现

在训练过程中,我们记录了每个迭代步骤的损失值。训练完成后,我们使用matplotlib库绘制损失值与迭代次数的折线图。

import numpy as np

# 定义激活函数和它的导数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def sigmoid_derivative(x):
    return x * (1 - x)

# XOR输入和输出
X = np.array([[1, 0],
              [0, 1],
              [0, 0],
              [1, 1]])

y = np.array([[1],
              [1],
              [0],
              [0]])

# 初始化神经网络超参数
input_nodes = 2
hidden_nodes = 2
output_nodes = 1
learning_rate = 0.5
iterations = 10000
import matplotlib.pyplot as plt

# 初始化权重和偏置
np.random.seed(0)
weights_input_hidden = 2*np.random.rand(input_nodes, hidden_nodes)-1
weights_hidden_output = 2*np.random.rand(hidden_nodes, output_nodes)-1
bias_hidden = 2*np.random.rand(hidden_nodes, 1)-1
bias_output = 2*np.random.rand(output_nodes, 1)-1

# 在初始化权重和偏置之后添加此行
loss_values = []

# 训练神经网络
for i in range(iterations):
    # 前向传播
    hidden_layer = sigmoid(np.dot(X, weights_input_hidden) + bias_hidden.T)
    output_layer = sigmoid(np.dot(hidden_layer, weights_hidden_output) + bias_output.T)

    # 计算输出层误差
    output_error = y - output_layer
    output_delta = output_error * sigmoid_derivative(output_layer)

    # 计算隐藏层误差
    hidden_error = np.dot(output_delta, weights_hidden_output.T)
    hidden_delta = hidden_error * sigmoid_derivative(hidden_layer)

    # 更新权重和偏置
    weights_hidden_output += learning_rate * np.dot(hidden_layer.T, output_delta)
    weights_input_hidden += learning_rate * np.dot(X.T, hidden_delta)
    bias_hidden += learning_rate * np.sum(hidden_delta, axis=0).reshape(-1, 1)
    bias_output += learning_rate * np.sum(output_delta, axis=0).reshape(-1, 1)

    # 在训练神经网络的循环中,更新权重和偏置之后添加此行
    loss_values.append(np.mean(np.square(output_error)))

# 测试神经网络
print("测试结果:")
test_result = sigmoid(np.dot(sigmoid(np.dot(X, weights_input_hidden) + bias_hidden.T), weights_hidden_output) + bias_output.T)
print(np.round(test_result))

# 在测试神经网络之后添加以下内容
plt.figure()
plt.plot(range(1, iterations + 1), loss_values)
plt.xlabel('Epochs')
plt.ylabel('Loss Value')
plt.title('Loss Value vs. Epochs')
plt.show()

# 打印测试神经网络
print("打印测试结果:")
test_result = sigmoid(np.dot(sigmoid(np.dot(X, weights_input_hidden) + bias_hidden.T), weights_hidden_output) + bias_output.T)
rounded_test_result = np.round(test_result)

for i in range(X.shape[0]):
    print(f"For input {X[i]} output is {rounded_test_result[i][0]}")

输出结果如下:
在这里插入图片描述
通过本文的介绍和代码实现,我们了解了神经网络的基本原理和关键概念。我们实现了一个简单的XOR神经网络,展示了如何使用神经网络进行数据处理和预测。尽管这个例子较为简单,但它涵盖了神经网络的基本概念,有助于读者建立对神经网络的初步认识。

在实际应用中,神经网络可以处理更复杂的问题和数据。为了解决更高级的问题,我们可以增加隐藏层的数量、调整激活函数或者使用不同的优化算法。神经网络在诸如图像识别、自然语言处理和语音识别等领域有广泛的应用。通过深入学习和实践,我们可以利用神经网络解决更多实际问题。

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

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

相关文章

生产上的一次慢查询SQL优化

一、背景 MySQL版本5.6.16&#xff0c;InnoDB 生产上有个业务场景&#xff0c;需要每日拉取还款计划表里某些产品编号的所有状态为0&#xff0c;1数据的借据号和产品编号&#xff0c;SQL如下 select distinctloan_no,product_codefrom repay_plan<where>status in (0,1…

银行数字化转型导师坚鹏:银行业务数字化创新工作坊(简版)

银行业务数字化创新工作坊&#xff08;简版&#xff09; 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚如何进行业务数字化创新&#xff1f; 不知道如何开展银行数字化营销工作&#xff1f; 不知道零售业务数字化创新成功案例&#xff1f; 学员收获&a…

Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例

目录 Filter 过滤器 Filter 过滤器说明 过滤器介绍 4. 应用场景 Filter 过滤器基本原理 代码示例 login.jsp LoginCLServlet.java admin.jsp ManageFilter.java xml配置 Filter 过滤器 url-pattern Filter 过滤器生命周期 ● Filter 生命周期图 FilterConfig ●…

RabbitMQ-后台使用

1、首先本地启动rabbitMQ,登录网址 http://localhost:15672/ 默认账号与密码都是gust 2、使用 user:创建用户 virtual-host:创建某个项目单独使用一个单独host和用户 3、命令添加用户与授权 添加用户 rabbitmqctl add_user admin admin 设置permissions rabbitmqctl set_…

Oracle系列之九:一文搞懂Oracle常用函数

Oracle常用系统函数 1. 字符串函数2. 数学函数3. 日期函数4. 聚合函数5. 其他 Oracle是一种关系型数据库管理系统&#xff0c;它提供了许多内置函数&#xff0c;以便用户可以更轻松地处理数据。 1. 字符串函数 &#xff08;1&#xff09;lengthb/length 计算字符串长度 len…

Linux常用命令整理

Linux常用命令整理 1. cat显示2. reboot 重启3. cd切换目录4. ls目录查看5. mkdir创建目录6. rm 删除文件7. mv目录修改8. cp拷贝9. find查找10. touch新建文件11. vi/vim修改文件12. chmod改变权限13. tar -zcvf 打包文件14. tar -xvf 解压文件15. grep文本搜索16. su, sudo17…

数据库学习总结(MySQL)

一.为什么要使用数据库? 在我们平时存储数据的时候,往往采用文件存储即可,所以,为什么要使用数据库呢? 原因在于,文件存储数据有以下缺点: 文件的安全性问题 文件不利于数据查询和管理 文件不利于存储海量数据 文件在程序中控制不方便 为了解决上述问题,我们创造了更适合…

Revit构件显隐:参数和插件控制构件显隐性操作

一、如何通过参数来控制族中不同构件的显隐性? 在这里&#xff0c;将它分享给大家~ 首先&#xff0c;我们在项目中任意绘制一道墙&#xff0c;然后任意布置一个带有门把手的门&#xff0c;如下图&#xff1a; 接着&#xff0c;我们【双击】进入这个门族的编辑界面&#xff0c;…

C++ 互斥锁原理以及实际使用介绍

兄弟姐妹们&#xff0c;我又回来了&#xff0c;今天带来实际开发中都需要使用的互斥锁的内容&#xff0c;主要聊一聊如何使用互斥锁以及都有哪几种方式实现互斥锁。实现互斥&#xff0c;可以有以下几种方式&#xff1a;互斥量&#xff08;Mutex&#xff09;、递归互斥量&#x…

掌握虚拟专用网络配置

目录 一、防火墙的IPSEC VPN 二、DSVPN 一、防火墙的IPSEC VPN 总体拓扑如下&#xff1a;实现PC间的加密通信。 FW1的配置&#xff1a;划分接口配置地址。 定义感兴趣流&#xff1a; 注&#xff1a;什么是感兴趣流&#xff1f;答&#xff1a;感兴趣流是VPN的术语&#xff0…

银行数字化转型导师坚鹏:数字化思维创新与金融业转型升级

数字化思维创新与金融业转型升级 课程背景&#xff1a; 很多金融机构存在以下问题&#xff1a; 金融机构的员工不知道需要具备什么样的数字化思维 不清楚数字化思维对金融机构转型升级的重要影响&#xff1f; 不清楚数字化背景下如何进行金融机构转型升级&#xff1f; …

Linux 块设备 EMMC 驱动介绍

目录: 高质量文章导航-持续更新中 前置:硬件接口 EMMC(Embedded Multi-Media Card)是一种用于存储和传输数据的嵌入式存储器(芯片),通常用于移动设备和嵌入式设备中。Linux内核提供了一个通用的EMMC驱动框架,可以支持各种不同的EMMC设备。 EMMC总线采用了典型的主从…

通过Python的PIL库给图片添加图片水印

文章目录 前言一、素材准备1.原图2.水印图 二、使用PIL库给图片添加图片水印1.引入库2.定义图片路径3.打开原图4.打开水印图片5.计算水印图片大小6.计算原图大小7.调整水印图片大小7.1调整前7.2调整后 8.计算水印图片位置8.1左上8.2左下8.3右上8.4右下8.5中间 9.添加水印10.保存…

Windows11台式机连接Type-C触摸屏显示器

我的设备是GoBiggerR便携触控屏&#xff0c;有1个mini-HDMI和2个USB-C接口。家用的是台式机&#xff0c;玩一些游戏用触控比较方便&#xff0c;于是想把触控屏利用上。 先说结论&#xff0c;我的方案是使用arpara VR DisplayPort 1.4数据线。 arpara 5K VR头显配件3.5米数据线…

U-Boot 初次编译

1.在 Ubuntu 中创建存放 uboot 的目录 &#xff0c;比如我的是/home/hsj/linux/IMX6ULL/uboot,然后在此目录 下新建一个名为“alientek_uboot”的文件夹用于存放 uboot 源码。alientek_uboot 文件夹创建成功以后使用 FileZilla 软件将正点原子提供的 uboot 源码拷贝到此目录中.…

Docker 部署 MySQL 一主多从

服务器规划&#xff1a;使用docker方式创建&#xff0c;主从服务器IP一致&#xff0c;端口号不一致 主服务器&#xff1a;容器名 mysql-master&#xff0c;端口 3306从服务器&#xff1a;容器名 mysql-slave1&#xff0c;端口 3307从服务器&#xff1a;容器名 mysql-slave2&am…

springboot+vue幼儿园管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的幼儿园管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌…

删除Android手机自带应用

目录 1、下载手机adb插件 2、进入开发者模式 3、删除应用 4、之后记得关闭手机usb及开发模式 1、下载手机adb插件 Downloads - ADB Shell 之后路径行输入cmd&#xff0c;或者winr&#xff0c;进入该目录&#xff1a; 2、进入开发者模式 设置--系统--关于手机--快速多次点…

YOLOv7+双目实现三维跟踪(python)

YOLOv7双目实现三维跟踪&#xff08;python&#xff09; 1. 目标跟踪2. 测距模块2.1 测距原理2.2 添加测距 3. 细节修改&#xff08;可忽略&#xff09;4. 实验效果 相关链接 1. YOLOV5 双目测距&#xff08;python&#xff09; 2. YOLOV7 双目测距&#xff08;python&#x…

快速发展、持续领跑,软件顶级盛会第二届中国国际软件发展大会成功召开

2023年4月18日&#xff0c;第二届中国国际软件发展大会在北京国家会议中心召开&#xff0c;工业和信息化部党组成员、副部长王江平出席大会并致辞。 王江平副部长表示&#xff0c;党的十八大以来&#xff0c;我国软件产业快速发展&#xff0c;核心技术持续突破&#xff0c;产业…