神经网络基础概念—入门教程,并给出一个简单的实例

news/2025/2/12 2:29:04/

文章目录

  • 神经网络基础概念入门教程
    • 神经网络是什么?
    • 神经网络的基本结构
    • 构建神经网络
    • 神经网络的训练
        • 前向传播
        • 反向传播
        • 激活函数
    • 总结
    • 实例

神经网络基础概念入门教程

神经网络是什么?

神经网络是一类由多个简单的神经元单元组成的结构,用于学习输入和输出之间的映射关系。神经网络是一种机器学习算法,被广泛应用于图像识别、自然语言处理和预测问题等领域。

神经网络的基本结构

神经网络由输入层、隐藏层和输出层组成,每个层由多个神经元单元组成。输入层接收输入数据,输出层给出神经网络的输出结果,隐藏层则进行中间计算。

每个神经元单元接收一组输入,并产生一个输出。输入和输出通过激活函数进行转换,而权重则用于确定输入对输出的影响程度。

构建神经网络

构建神经网络的步骤通常包括定义网络结构、初始化权重和选择损失函数等。可以使用现有的深度学习框架(如TensorFlow、Keras和PyTorch)来简化构建过程。

神经网络的训练

神经网络的训练过程包括前向传播和反向传播。前向传播指数据在神经网络中的正向流动,反向传播则是根据损失函数计算误差梯度,并用反向传播算法更新权重。

为了获得最佳的训练结果,需要选择适当的损失函数、学习速率和优化器。

前向传播

前向传播是神经网络的一种计算方式,它将输入数据从第一层传递到最后一层输出。下面是一些基本步骤:

  1. 将输入数据作为网络的第一层。
  2. 对于每一层,计算其输出值(通过运用该层的权重和激活函数)。
  3. 将上一层的输出值作为下一层的输入值,重复2直到最后一层。

反向传播

反向传播是神经网络的一种学习算法,它能够调整网络中的权重和偏差,以使其输出结果更加接近真实结果。下面是一些基本步骤:

  1. 计算代价函数(即损失函数),它可以衡量模型输出的错误程度。
  2. 计算代价函数对每个权重和偏差的偏导数,即损失函数对权重和偏差的梯度。
  3. 使用梯度下降法沿着梯度负方向调整权重和偏差,以降低代价函数。

激活函数

每个神经元都有一个激活函数,用于将其输入值转换为输出值。下面是一些常用的激活函数:

  • sigmoid函数:将输入值映射到0到1之间的范围。σ(z)=11+e−z\sigma(z)=\dfrac{1}{1+e^{-z}}σ(z)=1+ez1
  • ReLU函数:在输入为正时返回输入值,在输入为负时返回0。ReLU(z)=max⁡(0,z)ReLU(z)=\max(0,z)ReLU(z)=max(0,z)
  • tanh函数:将输入值映射到-1到1之间的范围。tanh⁡(z)=ez−e−zez+e−z\tanh(z)=\dfrac{e^z-e^{-z}}{e^z+e^{-z}}tanh(z)=ez+ezezez

总结

神经网络是一种数学模型,它模拟了生物神经系统的基本工作原理。我们可以使用神经网络来学习进行各种各样的任务,如图像识别、语音识别、自然语言处理等。在训练过程中,我们需要使用前向传播来计算神经网络的输出,然后使用反向传播来优化神经网络的权重和偏置项。最终,我们得到了一个优化过的神经网络模型,可以用于预测新数据的输出。

本教程介绍了神经网络的基本概念、构建和训练过程。神经网络是一种强大的机器学习算法,在很多领域都得到了广泛应用。希望本教程能够帮助初学者入门神经网络,并为更深入的学习打下基础。

实例

下面是一个简单的使用Python构建神经网络的示例:

import numpy as np# 定义sigmoid函数
def sigmoid(z):return 1 / (1 + np.exp(-z))# 定义神经网络类
class NeuralNetwork:# 初始化神经网络def __init__(self, input_size, hidden_size, output_size):self.input_size = input_sizeself.hidden_size = hidden_sizeself.output_size = output_size# 初始化网络权重self.W1 = np.random.randn(hidden_size, input_size)self.b1 = np.random.randn(hidden_size, 1)self.W2 = np.random.randn(output_size, hidden_size)self.b2 = np.random.randn(output_size, 1)# 前向传播def forward(self, X):# 输入层self.X = X# 隐藏层self.z1 = np.dot(self.W1, X) + self.b1self.a1 = sigmoid(self.z1)# 输出层self.z2 = np.dot(self.W2, self.a1) + self.b2self.a2 = sigmoid(self.z2)return self.a2# 反向传播def backward(self, y):# 计算代价函数对输出层的偏导数dZ2 = self.a2 - y# 计算代价函数对输出层权重和偏差的偏导数dW2 = np.dot(dZ2, self.a1.T)db2 = np.sum(dZ2, axis=1, keepdims=True)# 计算代价函数对隐藏层的偏导数dZ1 = np.dot(self.W2.T, dZ2) * sigmoid(self.z1) * (1 - sigmoid(self.z1))# 计算代价函数对隐藏层权重和偏差的偏导数dW1 = np.dot(dZ1, self.X.T)db1 = np.sum(dZ1, axis=1, keepdims=True)# 更新权重和偏差self.W2 -= learning_rate * dW2self.b2 -= learning_rate * db2self.W1 -= learning_rate * dW1self.b1 -= learning_rate * db1# 训练数据
X = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]]).T
y = np.array([[0, 1, 1, 0]])# 初始化神经网络
input_size = 3
hidden_size = 4
output_size = 1
nn = NeuralNetwork(input_size, hidden_size, output_size)# 训练模型
num_iterations = 60000
learning_rate = 0.1
for i in range(num_iterations):# 前向传播y_pred = nn.forward(X)# 反向传播nn.backward(y)# 输出代价函数cost = np.mean(np.square(y_pred - y))if i % 10000 == 0:print(f"Iteration {i}: cost = {cost}")# 测试模型
X_test = np.array([[1, 1, 0], [0, 1, 0], [1, 0, 0], [0, 0, 0]]).T
y_test = np.array([[0, 1, 1, 0]])
y_pred_test = nn.forward(X_test)
print(f"Test cost: {np.mean(np.square(y_pred_test - y_test))}")

该示例使用三层神经网络(一个输入层、一个隐藏层和一个输出层)来解决异或问题。您可以更改输入数据和隐藏层大小以测试不同的情况。


http://www.ppmy.cn/news/44554.html

相关文章

有趣的数学之回文数

“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等,最有名的莫过于“上海自来水来自海上,人过大佛寺佛大过人 ”。你们知道吗,在数学中也有这样一类…

5年测试被裁,恶补3个月上岸字节28K,面试差点被问哭···

我的个人背景非常简单,也可以说丝毫没有亮点。 学历普通,计算机专业二本毕业,毕业后出来就一直在一家小公司,岁月如梭细,算了下至今从事软件测试已经5年了,也点点点了五年,每天都是重复的工作&…

在 Ubuntu 使用SQL Server创建 Go 应用程序

在 Ubuntu 使用SQL Server创建 Go 应用程序一、设置环境1.1、安装 SQL Server1.2、安装 GoLang1.3、安装 ODBC 驱动程序和 SQL 命令行实用工具 SQL 服务器二、使用 SQL 服务器创建 Go 应用程序2.1、创建连接到 SQL Server 并执行查询的 Go 应用2.2、创建一个使用 GORM 连接到 S…

《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》

一、架构图 如下图所示: 二、环境信息 主机名K8S版本系统版本内核版本IP地址备注k8s-master-621.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.62master节点k8s-worker-631.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63worker节点k8s-worker-641…

Nacos 客户端服务注册源码分析-篇三

Nacos 客户端服务注册源码分析-篇三 版本说明: 源码版本 nacos-1.4.2 Nacos 的核心功能点 服务注册: Nacos Client 会通过发送 REST 请求的方式向 Nacos Server 注册自己的服务,提供自身的元数据,比如 ip 地址以及端口等信息。Na…

【云原生Docker】11-Docker镜像仓库

【云原生|Docker】11-Docker Registry(官方仓库) 文章目录【云原生|Docker】11-Docker Registry(官方仓库)前言docker registry简介操作示例hyper/docker-registry-web前言 ​ 前面我们所有的docker操作,使用的镜像都是在docker官方的镜像仓库下载,当然这…

itop-3568开发板驱动学习笔记(20)中断线程化

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录中断线程化简介中断线程化 API中断线程化实验中断线程化简介 中断线程化也是中断下文的一种方式,与工作队列和软中断不同的是,中断线程只用于这个中断,当发生中断的时候&a…

Spring入门案例--IOC入门案例

IOC入门案例思路分析 (1)Spring是使用容器来管理bean对象的,那么管什么? 主要管理项目中所使用到的类对象,比如(Service和Dao) (2)如何将被管理的对象告知IOC容器? 使用配置文件 (3)被管理的对象交给IOC容器,要想从容器中获取对象&…