python深度学习人工智能BackPropagation链式法则

Python深度学习人工智能BackPropagation链式法则

BackPropagation(反向传播)是深度学习中最常用的优化算法之一,它主要作用是通过代的方式,不断调整神经网络的权重和偏置,使得神经网络的损失函数最小化。本文将详细讲解BackPropagation的原理及Python实现,以及两个示例说明。

BackPropagation原理

BackPropagation算法的基本思想是通过不断调整神经网络的权重和偏置,使得神经网络的损失函数最小化。具体来说,算法的步骤如下:

  1. 随机初始化神经网络的权重和偏置;
  2. 前向传播计算神经网络的输出;
  3. 计算神经网络的损失函数;
  4. 反向传播计算损失函数对神经网络的权重和置的梯度;
  5. 根据梯度调整神经网络的权重和偏置;
  6. 重复步骤2-5,直到损失函数收敛或达到最大迭代数。

其中,步骤4是BackPropagation算法的核,它的目的计算损失函数对神经网络的权重和偏置的梯度,以根据度调整神经网络的权重和置。具体来说,对于一个神经元的权重 $w_i$,它的梯度可以为:

$$\frac{\partial J}{\partial w_i} = \frac{\partial J}{\partial z} \cdot \frac{\partial z}{\partial w_i}$$

其中,$J$ 表示神经网络的损失函数,$z$ 表示神经的输入。

在计算梯度,我们可以使用链式法则将损失函数的梯度表示为各个神经元的输入的偏导数之积。具体来说,对于一个多元函数 $f(x_1, x_2, ..., x_n)$,它的偏导数可以:

$$\frac{\partial}{\partial x_i} = \frac{\partial f}{\partial x_{i+1}} \cdot \frac{\partial x_{i+1}}{\partial x_i}$$

通过不断使用链式法则,我们可以将损失函数的梯度表示为各个神经元的输入的偏导数积,从而计算出神经网络的权重和偏置的梯度。

BackPropagation Python实现

在Python中,我们可以使用NumPy库实现BackPropagation算法。下面是一个简单的示例代码,用于对一个三层神经网络进行训练。

import numpy as np

# 定义sigmoid函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 定义sigmoid函数的导数
def sigmoid_derivative(x):
    return sigmoid(x) * (1 - sigmoid(x))

# 加载数据
data = np.loadtxt('data.csv', delimiter=',')
X = data[:, :-1]
y = data[:, -1]

# 随机初始化神经网络的权重和偏置
np.random.seed(1)
w1 = np.random.randn(2, 3)
b1 = np.random.randn(1, 3)
w2 = np.random.randn(3, 1)
b2 = np.random.randn(1, 1)

# 设置学习率和迭代次数
alpha = 0.1
num_iters = 10000

# 运行BackPropagation算法
for i in range(num_iters):
    # 前向传播
    z1 = X.dot(w1) + b1
    a1 sigmoid(z1)
    z2 = a1.dot(w2) + b2
    y_pred = sigmoid(z2)

    # 计算损失函数
    J = -np.sum(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred))

    # 反向传播
    dz2 = y_pred - y
    dw2 = a1.T.dot(dz2)
    db2 = np.sum(dz2, axis=0, keepdims=True)
    dz1 = dz2.dot(w2.T) * sigmoid_derivative(z1)
    dw1 = X.T.dot(dz1)
    db1 = np.sum(dz1, axis=0)

    # 根据梯度调整神经网络的权重和偏置
    w2 -= alpha * dw2
    b2 -= alpha * db2
    w1 -= alpha * dw1
    b -= alpha * db1

    # 输出损失函数的历史记录
    if i % 1000 == 0:
        print('Iteration:', i, 'Loss:', J)

在这个示例中,我们首先定义了函数和sigmoid函数的导数。然后,我们使用NumPy库加载数据,并随机初始化神经网络的权重和偏置。接下来,我们设置学习率和迭代次数,并使用BackPropagation算法对神经网络进行训练。最后,我们输出损失函数的历史记录。

示例1:XOR问题

在这个示例中,我们将使用BackPropagation算法对一个三层神经网络进行训练,以便解决XOR问题。

import numpy as np

# 定义sigmoid函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 定义sigmoid函数的导数
def sigmoid_derivative(x):
    return sigmoid(x) * (1 - sigmoid(x))

# 加载数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])

# 随机初始化神经网络的权重和偏置
np.random.seed(1)
w1 = np.random.randn(2, 3)
b1 = np.random.randn(1, 3)
w2 = np.random.randn(3, 1)
b2 = np.random.randn(1, 1)

# 设置学率和迭代次数
alpha = 0.1
num_iters = 10000

# 运行BackPropagation算法
for i in range(num_iters):
    # 前向传播
    z1 = X.dot(w1) + b1
    a = sigmoid(z1)
    z2 = a1.dot(w2) + b2
    y = sigmoid(z)

    # 计算损失函数
    J = -np.sum(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred))

    # 反向传播
    dz2 = y_pred - y
    dw2 = a1.T.dot(dz2)
    db2 = np.sum(dz2, axis=0 keepdims=True)
    dz1 = dz2.dot(w2.T) * sigmoid_derivative(z1)
    dw1 = X.T.dot(dz1)
    db1 = np.sum(dz1, axis=0)

    # 根据梯度调整经网络的权重和偏置
    w2 -= alpha * dw2
    b2 -= alpha * db2
    w1 -= alpha * dw1
    b1 -= alpha * db1

    # 输出损失函数的历史记录
    if i % 10000:
        print('Iteration:', i, 'Loss:', J)

# 输出预测结果
print('Predictions:', y_pred)

在这个示例中,我们首先定义了sigmoid函数和sigmoid函数的导数。然后,我们NumPy库加载数据,并随初始化神经网络的权重和偏置。接下来,我们设置学习率和迭代次数,并使用BackPropagation算法对神经网络进行训练。最后,我们输出预测结果。

示例2:手写数字识别

在这个示例中,我们将使用BackPropagation算对一个三层神网络进行训练,以便识别手写数字。

import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split

# 定义sigmoid函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 定义sigmoid函数的导数
def sigmoid_derivative(x):
    return sigmoid(x) * (1 - sigmoid(x))

# 加载数据
digits = load_digits()
X = digits.data
y = digits.target

# 将标签转换为独编码
y_one_hot = np.zeros((len(y), 10))
for i in range(len(y)):
    y_one_hot[i][y[i]] = 1

# 划分训练集测试集
X_train, X_test, y_train y_test = train_test_split(X, y_one_hot, test_size=0.2, random_state=1)

# 随机初始化神经网络的权重和偏置
np.random.seed(1)
w1 = np.random.randn(64, 128)
b1 = np.random.randn(1, 128)
w2 = np.random.randn(128, 10)
b2 = np.random.randn(1, 10)

# 设置学习率和迭代次数
alpha = 0.1
num_iters = 10000

# 运行BackPropagation算法
for i in range(num_iters    # 前向传播
    z1 = X_train.dot(w1) + b1
    a1 = sigmoid(z1)
    z2 = a1.dot(w2) + b2
    y_pred = sigmoid(z2)

    # 计算损失
    J = -np.sum(y_train * np.log(y_pred) + ( - y_train) * np.log(1 - y_pred))

    # 反向传播
    dz2 = y_pred - y_train
    dw = a1.T.dot(dz2)
    db2 = np.sum(dz2, axis=0, keepdims=True)
    dz1 = dz2.dot(w2.T) * sigmoid_derivative(z1)
    dw1 = X_train.T.dot(dz1)
    db1 = np.sum(dz1, axis=0)

    # 根据梯度整神经网络的权重和置
    w2 -= alpha * dw2
    b2 -= alpha * db2
    w1 -= alpha * dw1
    b1 -= alpha * db1

    # 输出损失函数的历史记录
    if i % 1000 ==0:
        print('Iteration:', i, 'Loss:', J)

# 在测试集上评估模型
z1 = X_test.dot(w1) + b1
a1 = sigmoid(z1)
z2 = a1.dot(w2) + b2
y_pred = sigmoid(z2)
y_pred = np.argmax(y, axis=1)
y_test = np.argmax(y_test, axis=1)
accuracy = np.mean(y_pred == y_test)
print('Accuracy:', accuracy)

在这个示例中,我们首先定义了sigmoid函数和sigmoid函数的导数。然后我们使用ikit-learn库手写数字数据集,并将标签转换为独热编码。接下来,我们划分训练集和测试集,并随机初始化神经网络的权重和偏置。然后,设置学习率和迭代次数,并使用BackPropagation算法对神经网络进行训练。最后,我们在集上评估模型的准确率。

总结

本文详细讲解了BackPropagation算法的原理及Python实现,以及两个示例说明。BackPropagation算法是深度学习中最常用的优化算法之一,它的主要作用通过迭代的方式,不断调整神经网络的权重和偏置,使得神经网络的损失函数最小化。在际应中,我们可以根据具体的需求选择不同的损失函数和学习率,并结合其他优化算法进行综合处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python深度学习人工智能BackPropagation链式法则 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python小工具之消耗系统指定大小内存的方法

    当我们需要测试 Python 程序的性能时,可以通过消耗系统指定大小的内存来模拟处理大数据的场景,并测试程序的稳定性和性能。本文将详细讲解 Python 小工具之消耗系统指定大小内存的方法,具体如下: 1. 通过分配大量字符串来消耗内存 可以通过分配大量的字符串来消耗系统指定大小内存。以下是示例代码: def consume_memory(size): &q…

    python 2023年6月3日
    00
  • python异步实现定时任务和周期任务的方法

    当我们使用 Python 编写 Web 应用或者其他需要接受或传递大量请求的程序时,异步编程已经变得越来越重要。异步编程可以同时处理多个请求,提高程序运行效率,并且还可以实现定时任务和周期任务。 前置知识 在学习 Python 异步编程之前,需要先了解以下基础知识: 常用的 Python 异步库:asyncio,aiohttp,asyncpg。 async/…

    python 2023年6月3日
    00
  • 详解python实现数据归一化处理的方式:(0,1)标准化

    详解Python实现数据归一化处理的方式:(0,1)标准化 在数据处理中,数据归一化是一项非常重要的任务。数据归一化可以将数据缩放到特定的范围内,以便更好地进行分析和处理。本文将介绍如何使用Python实现数据归一化处理的方式:(0,1)标准化。我们将介绍(0,1)标准化的原理和实现步骤,并提供两个示例,分别演示如何使用Python实现简单和复杂的数据归一化…

    python 2023年5月14日
    00
  • Python Http发送请求浅析

    以下是关于Python Http发送请求浅析的攻略: Python Http发送请求浅析 在Python中,我们可以使用多种方式发送Http请求,如urllib、httplib、requests等。以下是Python Http发送请求浅析的攻略。 使用urllib发送请求 使用Python的urllib库发送Http请求时,可以使用urlopen()方法。以…

    python 2023年5月15日
    00
  • Python3查找列表中重复元素的个数的3种方法详解

    Python3查找列表中重复元素的个数的3种方法详解 在Python中,有多种方法可以查找列表中重复元素的个数。本文将介绍3种常用的方法,包括使用Counter()函数、使用set()函数和使用字典。下面将详细讲解这3种方法的实现原理和使用方法。 使用Counter()函数 Counter()函数是Python中的一个内置函数,用于统计列表中元素的个数。Co…

    python 2023年5月13日
    00
  • python 接口_从协议到抽象基类详解

    什么是Python接口和协议? Python的接口和协议提供了一种定义类之间交互的规范。接口是一个抽象类,它定义了类应该遵循的方法和属性。协议是一个特定的接口,它规定了一个类必须实现的特定方法和属性。 在Python中,接口通常是通过抽象基类(Abstract Base Classes)的方式实现的。它们提供了一种检查子类是否实现了父类方法的方法。 抽象基类…

    python 2023年5月14日
    00
  • Python利用Selenium实现网站自动签到功能

    以下是Python利用Selenium实现网站自动签到功能的完整攻略: 准备工作 安装Python环境和pip包管理器。 安装selenium包用于自动化测试。 下载相应浏览器的webdriver,例如ChromeDriver或FirefoxDriver等。 实现步骤 导入必要的库文件。 from selenium import webdriver from…

    python 2023年5月19日
    00
  • 详解Python 指定记忆化

    Python 中的记忆化技术可以用来解决那些需要大量递归调用及重复计算的问题,通过将已经计算过的结果缓存起来,避免重复计算,从而提高运行效率。但是,如果不指定缓存策略,可能会带来一些不必要的问题,如内存泄漏等。 因此,指定记忆化策略是十分必要的。以下是Python 指定记忆化的完整攻略: 1.使用functools模块 Python 内置的 functool…

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部