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如何发布自已pip项目的方法步骤

    下面将为您详细讲解Python如何发布自己的pip项目的方法步骤。 准备工作 在发布前,你需要确保以下事项: 你的项目已经在本地测试完毕,并且可以正常运行。 你已经安装了pip和twine这两个工具。 如果你还没有安装twine和pip,可以使用以下命令安装: pip install twine pip install wheel 步骤一:给你的项目打包 首…

    python 2023年5月14日
    00
  • Python ttkbootstrap的介绍与使用教程

    Python ttkbootstrap的介绍与使用教程 简介 ttkbootstrap是Python的一个扩展包,可用于使用Bootstrap 4主题来美化Tkinter GUI界面。它基于Python的标准GUI库Tkinter,提供了一组基于Bootstrap 4的Tkinter控件,使Tkinter GUI界面更美观,易于使用。 安装 要安装ttkbo…

    python 2023年6月13日
    00
  • python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程

    Python爬虫一键爬取淘宝天猫宝贝页面主图颜色图和详情图的教程 本文将详细讲解如何使用Python爬虫一键爬取淘宝天猫宝贝页面的主图颜色图和详情图。我们将使用Python中的requests、BeautifulSoup和urllib库来实现这个功能。 1. 获取宝贝页面的HTML源代码 首先,我们需要获取宝贝页面的HTML源代码。可以使用requests库…

    python 2023年5月15日
    00
  • python获得一个月有多少天的方法

    想要获得一个月有多少天,可以借助datetime库中的date类和calendar库中的monthrange函数。 首先导入需要的库: from datetime import date import calendar 然后定义一个日期变量,指定一个月和年份: year = 2022 month = 3 day = 1 my_date = date(year…

    python 2023年6月2日
    00
  • python操作excel之openpyxl模块读写xlsx格式使用方法详解

    简介 Openpyxl 是一个可以读取和编写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的Python库,在Python中操作 Excel 时非常有用。当我们需要读取或者操作 Excel 文件的时候,使用openpyxl会非常便捷,本文将介绍openpyxl的使用方法。 安装 安装方法:在命令行中运行 pip install open…

    python 2023年6月5日
    00
  • python list 合并连接字符串的方法

    在Python中,我们可以使用”+”运算符或extend()函数将两个或多个列表合并为一个列表。同时,我们也可以使用join()函数将多个字符串连接为一个字符串。下面是详细的讲解和示例说明。 合并列表 使用”+”运算符 要将两个或多个列表合并为一个列表,我们可以使用”+”运算符。例如: # 使用"+"运算符合并列表 list1 = [1,…

    python 2023年5月13日
    00
  • python保存文件方法小结

    Python保存文件方法小结 在Python中,保存文件是一项基本操作,本文将总结并介绍几种Python保存文件的方法。 1. 使用open函数新建文件并保存 使用Python内置函数open()可以创建一个新文件并进行写入,具体代码如下: with open(‘example.txt’, ‘w’) as f: f.write(‘Hello World!’)…

    python 2023年6月2日
    00
  • Python制作动态词频条形图的全过程

    下面详细讲解Python制作动态词频条形图的全过程。 环境准备 首先,需要准备好Python的开发环境。推荐采用Anaconda的发行版,它集成了常用的数据科学工具和库,方便我们进行数据处理和可视化。 需要用到的两个主要的库:matplotlib和wordcloud。其中,matplotlib用于绘制条形图,wordcloud用于生成词云图。 除此之外,还需…

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