当前位置: 首页 > news >正文

【人工智能-初级】第10章 用Python从零构建简单的神经网络

文章目录

    • 一、引言
    • 二、神经网络的基本结构
    • 三、神经网络的工作原理
      • 3.1 前向传播
      • 3.2 反向传播
      • 3.3 损失函数
    • 四、用Python实现一个简单的神经网络
      • 4.1 导入必要的库
      • 4.2 初始化网络参数
      • 4.3 定义激活函数
      • 4.4 前向传播
      • 4.5 定义损失函数
      • 4.6 反向传播
      • 4.7 训练神经网络
    • 五、总结
      • 5.1 学习要点
      • 5.2 练习题

一、引言

神经网络是现代人工智能的核心之一,其应用广泛,包括图像识别、自然语言处理、语音识别等领域。在本篇文章中,我们将通过从零开始构建一个简单的神经网络,帮助您深入理解神经网络的工作原理和训练过程。我们会从最基本的概念出发,用 Python 实现一个三层的神经网络,并通过直观的代码演示,深入讲解各个知识点。

二、神经网络的基本结构

神经网络由多个层次的“神经元”组成,主要包括以下几种类型的层:

  1. 输入层:接收输入数据,不进行任何计算。
  2. 隐藏层:对输入数据进行加权运算和激活,用来提取数据的特征。
  3. 输出层:将隐藏层的输出进行进一步的处理,得到最终结果。

一个简单的神经网络通常由一个输入层、一个隐藏层和一个输出层组成。我们将通过这种三层结构的网络来展示神经网络的工作原理。

三、神经网络的工作原理

在神经网络中,数据从输入层开始,通过每一层的加权运算和激活函数传递到输出层。整个过程称为前向传播(Forward Propagation)。在前向传播之后,神经网络会计算预测值和真实值之间的误差,并通过反向传播(Backpropagation)调整每个权重的值,以最小化误差。

3.1 前向传播

前向传播的过程是从输入层开始,将输入数据通过每一层的计算传播到输出层。每一层的输出通过激活函数引入非线性,使得神经网络可以学习到更复杂的特征。

3.2 反向传播

反向传播是通过最小化损失函数来调整网络参数的过程。它使用梯度下降法来计算损失函数相对于每个权重的偏导数,并逐层地将误差反向传播,以更新每一层的权重。

3.3 损失函数

损失函数用于衡量模型预测值与真实值之间的差异。常用的损失函数有均方误差(Mean Squared Error, MSE)和交叉熵损失(Cross-Entropy Loss)。在训练神经网络时,我们的目标是通过最小化损失函数来优化模型。

四、用Python实现一个简单的神经网络

接下来,我们将用 Python 从零实现一个简单的三层神经网络,包括前向传播、损失计算和反向传播的步骤。

4.1 导入必要的库

首先,我们需要导入一些必要的库:

import numpy as np
  • numpy:用于数值计算,帮助我们实现矩阵运算。

4.2 初始化网络参数

我们将构建一个三层神经网络,包含输入层、隐藏层和输出层。假设输入层有2个神经元,隐藏层有3个神经元,输出层有1个神经元。

# 设置随机种子以确保结果可重复
np.random.seed(42)# 初始化权重和偏置
input_size = 2
hidden_size = 3
output_size = 1W1 = np.random.randn(input_size, hidden_size)  # 输入层到隐藏层的权重
b1 = np.random.randn(hidden_size)              # 隐藏层的偏置W2 = np.random.randn(hidden_size, output_size) # 隐藏层到输出层的权重
b2 = np.random.randn(output_size)              # 输出层的偏置
  • W1, b1:表示输入层到隐藏层的权重和偏置。
  • W2, b2:表示隐藏层到输出层的权重和偏置。
  • np.random.randn:用于生成标准正态分布的随机数,初始化权重和偏置。

4.3 定义激活函数

在隐藏层和输出层,我们将使用 ReLU 和 Sigmoid 作为激活函数。

def sigmoid(x):return 1 / (1 + np.exp(-x))def relu(x):return np.maximum(0, x)
  • sigmoid(x):Sigmoid 激活函数,用于将输入映射到 (0, 1) 之间。
  • relu(x):ReLU 激活函数,将负数映射为 0,保留正数。

4.4 前向传播

接下来,我们实现前向传播函数,将输入数据通过网络计算输出。

def forward(X):# 输入层到隐藏层z1 = np.dot(X, W1) + b1a1 = relu(z1)# 隐藏层到输出层z2 = np.dot(a1, W2) + b2output = sigmoid(z2)return output, z1, a1, z2
  • forward(X):计算输入 X 经过神经网络的输出。
  • np.dot(X, W1) + b1:计算输入层到隐藏层的线性变换。
  • relu(z1):对隐藏层的输出应用 ReLU 激活函数。
  • sigmoid(z2):对输出层的输出应用 Sigmoid 激活函数。

4.5 定义损失函数

我们使用均方误差(MSE)作为损失函数。

def mse_loss(y_true, y_pred):return np.mean((y_true - y_pred) ** 2)
  • mse_loss(y_true, y_pred):计算预测值和真实值之间的均方误差。

4.6 反向传播

反向传播用于计算每个权重的梯度,并进行参数更新。为了实现反向传播,我们需要对损失函数关于每个参数求导,并使用这些梯度来更新参数。

def backward(X, y_true, z1, a1, z2, y_pred, learning_rate=0.01):# 输出层的梯度dL_dy = -(y_true - y_pred)  # 损失函数对预测值的导数dy_dz2 = y_pred * (1 - y_pred)  # Sigmoid 的导数dz2_dW2 = a1dz2_db2 = 1dL_dz2 = dL_dy * dy_dz2dL_dW2 = np.dot(dz2_dW2.T, dL_dz2)dL_db2 = np.sum(dL_dz2, axis=0)# 隐藏层的梯度dz2_da1 = W2dL_da1 = np.dot(dL_dz2, dz2_da1.T)da1_dz1 = np.where(z1 > 0, 1, 0)  # ReLU 的导数dz1_dW1 = Xdz1_db1 = 1dL_dz1 = dL_da1 * da1_dz1dL_dW1 = np.dot(dz1_dW1.T, dL_dz1)dL_db1 = np.sum(dL_dz1, axis=0)# 更新权重和偏置global W1, b1, W2, b2W2 -= learning_rate * dL_dW2b2 -= learning_rate * dL_db2W1 -= learning_rate * dL_dW1b1 -= learning_rate * dL_db1
  • backward:实现反向传播,计算损失函数对各参数的导数。
  • learning_rate:学习率,用于控制每次更新参数的步长。
  • np.dotnp.sum:用于计算梯度,更新权重和偏置。

4.7 训练神经网络

最后,我们实现训练循环,通过多次迭代前向传播和反向传播来优化网络参数。

# 训练数据(逻辑与操作)
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [0], [0], [1]])  # AND 操作# 训练神经网络
epochs = 1000
learning_rate = 0.01for epoch in range(epochs):# 前向传播y_pred, z1, a1, z2 = forward(X)# 计算损失loss = mse_loss(y, y_pred)# 反向传播backward(X, y, z1, a1, z2, y_pred, learning_rate)# 每100次迭代打印一次损失if epoch % 100 == 0:print(f"Epoch {epoch}, Loss: {loss:.4f}")
  • epochs:训练的轮数。
  • forwardbackward:在每一轮中执行前向传播和反向传播。
  • loss:每100轮打印一次损失,帮助我们跟踪训练进度。

五、总结

通过从零实现一个简单的三层神经网络,我们了解了神经网络的基本结构和工作原理。神经网络的核心在于前向传播和反向传播,前向传播用于计算模型的输出,而反向传播用于计算梯度并更新参数,从而优化模型性能。本文中的神经网络结构虽然简单,但其基本思想与现代深度学习模型一致,掌握这些基本概念对于理解更复杂的神经网络模型是非常重要的。

5.1 学习要点

  1. 神经网络的基本结构:输入层、隐藏层、输出层。
  2. 前向传播与反向传播:理解神经网络的学习过程。
  3. Python 实现:通过 Python 从零实现简单神经网络,掌握各个步骤的实现细节。

5.2 练习题

  1. 修改神经网络的结构,将隐藏层神经元数量从 3 改为 5,观察训练效果的变化。
  2. 使用不同的激活函数(例如 Tanh)替代 ReLU,观察对训练效果的影响。
  3. 实现一个多分类神经网络,并使用 Softmax 激活函数作为输出层的激活函数。

希望本文能帮助您更好地理解神经网络的基本概念和实现方法。下一篇文章将为您介绍更复杂的神经网络模型以及如何在实际应用中利用深度学习。如果有任何问题,欢迎在评论中讨论!


http://www.mrgr.cn/news/54588.html

相关文章:

  • 外贸企业如何应对网络卡顿与网页打不开的问题
  • SqlUtils 使用
  • TCP/IP 协议【四次挥手】简要说明
  • Android常用C++特性之std::piecewise_construct
  • SSM框架实战小项目:打造高效用户管理系统 day3
  • 【电商项目】1分布式基础篇
  • 能够免费剪辑音频的工具有哪些?试试这4款!
  • JS闭包的特性和应用场景
  • Kubernetes GPU 调度和 Device Plugin、CDI、NFD、GPU Operator 概述
  • FastDFS单节点部署
  • 《欢乐饭米粒儿》第九季热播中,今晚精彩继续!
  • PUBG报错:吃鸡请重新安装软件MSVCP140.dll的必备修复方法
  • C#中实现事务
  • 2024130读书笔记|《不确定的我》——我们奔走、挣扎抗拒着,又热切地期盼着
  • 车载软件架构---汽车电子软件 A-B分区
  • 提示词高级阶段学习day1
  • LLAMA2入门(二)-----Transformer基础知识
  • 基于SSM果蔬经营系统的设计
  • 函数指针和指针函数
  • 一套开源轻量级的新零售快消进销存管理系统,使用.Net7 + Angular4开发(附私活源码)
  • 腾讯云技术深度解析:构建高效云原生应用与数据安全管理
  • 爬虫+数据保存
  • Maven 的使用:在 IDEA 中配置 Maven 的超详细步骤
  • centOS部署Jenkins实现项目可持续自动化部署
  • LLM | Hugging Face | 如何利用几句代码实现强大的AI效果(pipeline)?
  • Java 方法引用详解