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

yizhihongxing

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调用百度OCR实现图片文字识别的示例代码

    以下是Python调用百度OCR实现图片文字识别的详细攻略: 一、准备工作 1.1 注册百度云账户并创建应用 在百度云官网(https://cloud.baidu.com/)上注册一个账户,然后创建一个OCR应用。 1.2 安装Python SDK 百度云提供了Python SDK,我们可以通过pip下载并安装。 pip install baidu-aip …

    python 2023年5月18日
    00
  • 基于Python3.6+splinter实现自动抢火车票

    下面是详细讲解基于Python3.6+splinter实现自动抢火车票的完整攻略。 1. 前置要求 在开始实现前,需要先安装好以下工具: Python3.6及以上版本 splinter包 Chrome浏览器 2. 实现步骤 2.1 安装splinter 安装splinter需要使用pip进行安装,具体的安装方法如下: pip install splinter…

    python 2023年5月18日
    00
  • python中字符串前面加r的作用

    当在Python中使用字符串时,可以在字符串前面加上r来创建Raw字符串(Raw字符串就是不含有转义字符的字符串)。那么,字符串前面加r的作用是什么?下面我将提供完整的攻略,包括原理和示例说明。 1. 原理 在Python中,如果您在字符串中使用了反斜杠“\”,Python将解释它是一个特殊字符,比如换行、制表符等。例如: s = "Hello\n…

    python 2023年6月5日
    00
  • 如何通过Python的pyttsx3库将文字转为音频

    当我们需要将文字转换为音频的时候,可以使用Python中的pyttsx3库。下面将介绍如何在Python中使用pyttsx3库进行文本转音频的操作。 第一步:安装pyttsx3库 pyttsx3库可以使用pip工具进行安装,打开终端或命令提示符,输入以下命令即可安装: pip install pyttsx3 安装完成后,我们就可以使用pyttsx3库了。 第…

    python 2023年5月19日
    00
  • 用python爬取豆瓣前一百电影

    用Python爬取豆瓣前100电影的完整攻略 在本攻略中,我们将介绍如何使用Python爬取豆瓣前100电影,并提供两个示例。 步骤1:分析网页 在使用Python爬取豆瓣前100电影之前,我们需要先分析网页。我们可以使用Chrome浏览器的开发者工具分析网页。 以下是分析网页的步骤: 打开Chrome浏览器,进入豆瓣电影排行榜页面。 点击开发者工具,进入开…

    python 2023年5月15日
    00
  • 使用Numpy对特征中的异常值进行替换及条件替换方式

    使用 Numpy 库对特征中的异常值进行替换及条件替换方式的操作在数据处理中非常常见。下面是一些基本的攻略: 对特征中的异常值进行替换 假设我们有一个包含 100 个元素的 Numpy 数组,并且其中有一些异常值。您可以使用Numpy的函数 np.where 来找出数组中所有的异常值,并将其替换为我们想要的值。下面是一个示例代码: import numpy …

    python 2023年5月13日
    00
  • Python实现读取excel中的图片功能

    下面我将为你详细讲解如何用Python读取Excel中的图片,并给出完整的实例教程。 1. 安装依赖库 在使用Python读取Excel中的图片之前,我们需要安装一些必要的依赖库,包括openpyxl和Pillow。openpyxl用于读取和写入Excel文件,而Pillow则用于处理图片。你可以使用以下命令安装它们: pip install openpyx…

    python 2023年5月13日
    00
  • python输出当前目录下index.html文件路径的方法

    要输出当前目录下index.html文件路径,可以使用Python的os库和glob库。以下是两个示例,可以输出当前目录下index.html文件路径的方法: 示例1:使用os库和glob库输出当前目录下index.html文件路径 步骤1:导入必要的库 在使用os库和glob库输出当前目录下index.html文件路径之前,我们需要先导入必要的库。以下是需…

    python 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部