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日

相关文章

  • 如何安装 Redis-Python?

    安装 Redis-Python 是使用 Python 连接 Redis 数据库的必要步骤。Redis-Python 是 Redis 官方提供的 Python 客户端,它提供了一组简单易用的 API,可以方便地连接 Redis 数据库,并进行数据的读写操作。以下是如何安装 Redis-Python 的完整使用攻略。 步骤1:安装 Redis-Python 在 …

    python 2023年5月12日
    00
  • 使用Python脚本提取基因组指定位置序列

    针对“使用Python脚本提取基因组指定位置序列”的完整攻略,我给出以下实现步骤: 步骤一:准备基因组序列数据 首先需要准备基因组序列数据,可以从NCBI等公共数据库中下载或使用自己实验室的测序数据。在本文中,我们以基因组fasta文件为例,文件名为genome.fasta,且放置在与脚本同级的目录中。 步骤二:安装biopython库 在Python脚本中…

    python 2023年6月2日
    00
  • python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)

    下面是Python中pandas.DataFrame的简单操作方法的攻略,包括创建、索引、增添与删除。 创建DataFrame 在Python中,我们可以使用Pandas库中的DataFrame类来创建数据表格。创建DataFrame通常可以从以下方式开始: import pandas as pd # 通过字典创建DataFrame,键为列名,值为列数据 d…

    python 2023年5月13日
    00
  • python使用calendar输出指定年份全年日历的方法

    下面是详细的攻略: 1. 概述 calendar是Python内置模块,提供了一些与日历操作相关的函数,包括输出指定年份全年的日历。使用calendar模块输出指定年份全年日历的方法非常简单,只需要调用calendar模块中的Calendar类或TextCalendar类中的相应方法即可。 2. 使用Calendar类输出指定年份全年的日历 Calendar…

    python 2023年6月2日
    00
  • 使用 bash 执行 python 脚本

    【问题标题】:executing python script using bash使用 bash 执行 python 脚本 【发布时间】:2023-04-03 03:18:02 【问题描述】: 我试图执行一个 bash 启动停止脚本,但是我得到了错误 nohup: 运行命令 `python2.7 失败 /home/shopStart.py’: 没有这样的文件…

    Python开发 2023年4月8日
    00
  • python copy模块中的函数实例用法

    Python中的copy模块提供了许多函数,用于复制对象。这些函数可帮助您复制可能无法按预期方式进行复制的对象。copy模块中的函数实例包括:copy, deepcopy, error等。 copy函数 copy函数可以浅复制一个对象。当您需要复制一个对象并且不想影响原始对象时,copy函数非常有用。 import copy original_list = …

    python 2023年6月3日
    00
  • 解析python高级异常和运算符重载

    解析Python高级异常和运算符重载 异常 在Python中,异常是处理程序运行过程中出现错误的一种机制。当程序出现错误时,解释器会抛出一个异常对象(Exception),如果没有特别处理,该对象将导致程序的终止。 异常处理模块 Python中提供了一些内置的异常类,如NameError、ValueError、TypeError等,可以用来支持程序的异常处理…

    python 2023年5月13日
    00
  • 《流畅的Python》第二版上市了,值得入手么?

    《Fluent Python》第一版在 2015 年出版,简体中文版《流畅的Python》在 2017 年出版。从那时起,它就成为了所有 Python 程序员的必读之书。如果一份面向中高级 Python 开发者的书单里不包含这本书,那这份书单肯定不合格! 《Fluent Python》第二版在 2022 年出版,最近,简体中文版《流畅的Python》也隆重上…

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