python深度学习入门-从零构建CNN和RNN

文章目录

  • 第1章 基本概念
    • 1.1. 导数
    • 1.2. 链式法则
    • 1.3. 多输入函数的导数
    • 1.4. 多输入向量函数的导数
    • 1.5. 向量函数及其导数: 再进一步
    • 1.6. 包含两个二维矩阵数据的计算图
  • 第2章 基本原理
    • 2.1. 监督学习概述
    • 2.2. 监督学习模型
    • 2.3. 线性回归
      • 2.3.1. 线性回归: 示意图
      • 2.3.2. 加入截距项
    • 2.4. 训练模型
      • 2.4.1. 计算梯度: 示意图
      • 2.4.2. 计算梯度: 数学和一些代码
      • 2.4.3. 使用梯度训练模型
    • 2.5. 评估模型: 训练集和测试集
    • 2.6. 从零开始构建神经网络
      • 2.6.1. 步骤一: 一系列线性回归
      • 2.6.2. 步骤二:一个非线性函数
      • 2.6.3. 步骤三: 另一个线性回归
      • 2.6.4. 示意图
      • 2.6.5. 神经网络: 后向传递
    • 2.7. 神经网络比简单的线性回归效果更好的原因
  • 第3章 从零开始深度学习
    • 3.1. operaion(运算)
    • 3.2. layer(层)
    • 3.3. 需要实现的operation及layer
    • 3.4. NeuralNetwork类和其它类
      • 3.4.1. Loss类
    • 3.5. 构建深度学习模型
    • 3.6. 优化器和训练器
    • 3.6.1. 优化器
    • 3.7. 训练器
    • 3.8. 整合
  • 第4章 扩展(优化方法)
    • 4.1. softmax交叉熵损失函数
    • 4.2. 动量
    • 4.3. 学习率衰减
    • 4.4. 权重初始化
    • 4.5. dropout
  • 第5章 CNN
  • 第6章 RNN
  • 第7章 PyTorch
  • REF

第1章 基本概念

本章说明如何将数据函数表示为一系列连接在一起构成计算图的运算,并演示如何利用这种表示方法和微积分的链式法则,来计算函数的输出相对于其输入的导数

1.1. 导数

d f d x ( a ) = lim ⁡ Δ → 0 f ( a + Δ ) − f ( a − Δ ) 2 ∗ Δ \frac{df}{dx}(a) = \lim_{\Delta \to 0} \frac{{f \left( {a + \Delta } \right) - f\left( a - \Delta \right)}}{2 * \Delta } dxdf(a)=Δ0lim2Δf(a+Δ)f(aΔ)

1.2. 链式法则

f 2 ( f 1 ( x ) ) = y f_2(f_1(x)) = y f2(f1(x))=y
f 1 ( x ) = u f_1(x) = u f1(x)=u
d f 2 d x ( x ) = d f 2 d u ( f 1 ( x ) ) ∗ d f 1 d x ( x ) \frac{df_2}{dx}(x) = \frac{df_2}{du}(f_1(x)) * \frac{df_1}{dx}(x) dxdf2(x)=dudf2(f1(x))dxdf1(x)

1.3. 多输入函数的导数

f ( x , y ) = s f(x, y) = s f(x,y)=s
a = a ( x , y ) = x + y a = a(x, y) = x + y a=a(x,y)=x+y
s = σ ( a ) s = \sigma(a) s=σ(a)
∂ f ∂ x = ∂ σ ∂ u ( a ( x , y ) ) ∗ ∂ a ∂ x ( ( x , y ) ) = ∂ σ ∂ u ( x + y ) ∗ ∂ a ∂ x ( ( x , y ) ) \frac{\partial f}{\partial x} = \frac{\partial \sigma}{\partial u}(a(x, y)) * \frac{\partial a}{\partial x}((x, y)) \ = \frac{\partial \sigma}{\partial u}(x + y) * \frac{\partial a}{\partial x}((x, y)) xf=uσ(a(x,y))xa((x,y)) =uσ(x+y)xa((x,y))

1.4. 多输入向量函数的导数

矩阵的导数实际上就是”矩阵中每个元素的导数“

X = [ x 11 x 12 x 13 ] X = \begin{bmatrix} x_{11} & x_{12} & x_{13} \\ \end{bmatrix} X=[x11x12x13]
W = [ w 11 w 21 w 31 ] W = \begin{bmatrix} w_{11} \\ w_{21} \\ w_{31} \\ \end{bmatrix} W= w11w21w31
v = X ∗ W v = X * W v=XW

d v d X = W T \frac{dv}{dX} = W^T dXdv=WT

1.5. 向量函数及其导数: 再进一步

向量函数及逐元素应用的函数嵌套的函数,进行求导运算

1.6. 包含两个二维矩阵数据的计算图

前面最多提到了向量,此处讨论的二维矩阵的导数
如果矩阵乘法作为一种”组合运算“包含在嵌套函数中时,求导的公式形式不变
d v d X = W T \frac{dv}{dX} = W^T dXdv=WT

假设矩阵 X 是 m 行 n 列,矩阵 W 是 n 行 p 列,F = XW。那么,F 对 X 的导数是一个四阶张量,其形状为 (m, n, m, p)。
但是,在许多实际应用中,我们通常对矩阵 F 的 Frobenius 范数(或者说,矩阵 F 的所有元素的平方和的平方根)的导数更感兴趣。记 L = ||F||_F^2 = trace(F^T F) = trace((XW)^T XW) = trace(W^T X^T XW)。对于这个 L,我们有:dL/dX = d(trace(W^T X^T XW))/dX = d(trace(W^T X^T XW) + trace(W^T W X^T dX))/dX = 2XWW^T所以,如果你对矩阵 F 的 Frobenius 范数的导数感兴趣,那么导数就是 2XWW^T。

第2章 基本原理

直接使用第一章中创建的构成要素来构建和训练模型,从而解决实际问题。具体来说,就是使用它们来构建线性回归模型和神经网络模型,并基于真是的数据集预测房间。通过比较得知,神经网络比起线性回归具有更好的性能。

2.1. 监督学习概述

监督学习是机器学习的子集,专门用于发现已测量的数据属性之间的关系

无监督学习(unsupervised learning) 是另一种机器学习,可以认为它是在已测量的事物可尚未测量的事物之间寻找关系

特征工程是将主观层面的(非正式的)观测结果的属性映射到特征的过程

监督学习概述:

在这里插入图片描述

2.2. 监督学习模型

用一个矩阵X表式数据,该矩阵有n行,每行代表一个具有k的特征的观测值。每一行的观测值将是以xi = [xi1, xi2, xi3]表示的向量, 这些观测值将相互堆叠在一起形成一个批次。例如,一下是一个大小为3的批次:
x b a t c h = [ x 11 x 12 x 13 . . . x 1 k x 21 x 22 x 23 . . . x 2 k x 31 x 32 x 33 . . . x 3 k ] x_{batch} = \begin{bmatrix} x_{11} x_{12} x_{13} ... x_{1k} \\ x_{21} x_{22} x_{23} ... x_{2k} \\ x_{31} x_{32} x_{33} ... x_{3k} \\ \end{bmatrix} xbatch= x11x12x13...x1kx21x22x23...x2kx31x32x33...x3k
每一批观测值都会有相应的一批目标,其中的每个元素都有对应观测值的目标数字。可以将他们表示为一维向量:
[ y 1 y 2 y 3 ] [y_{1} y_{2} y_{3}] [y1y2y3]

2.3. 线性回归

y i = β 0 + β 1 ∗ x 1 + . . . + β k ∗ x k + ϵ y_{i} = \beta_{0} + \beta_{1} * x_{1} +...+ \beta_{k} * x_{k} + \epsilon yi=β0+β1x1+...+βkxk+ϵ

2.3.1. 线性回归: 示意图

从加法和乘法的层面理解线性回归运算:
在这里插入图片描述

“训练”一个模型意味着什么呢?概括地讲,模型接受数据,并以某种方式将其与参数(parameter)进行组合,以生成预测结果 。例如,前面展示的线性回归模型接受数据X和参数W ,并使用矩阵乘法产生预测 P_batch
P b a t c h = [ P 1 P 2 P 3 ] P_{batch} = \begin{bmatrix} P_{1} \\ P_{2} \\ P_{3} \\ \end{bmatrix} Pbatch= P1P2P3
惩罚函数可以评估所做预测是否准确,以及其误差的程度,例如这里使用均方误差(mean squared error, MSE):
M S E ( p b a t c h , y b a t c h ) = ( y 1 − p 1 ) 2 + ( y 2 − p 2 ) 2 + ( y 3 − p 3 ) 2 3 MSE_{(p_{batch}, y_{batch})} = \frac{(y_{1} - p_{1})^2 + (y_{2} - p_{2})^2 + (y_{3} - p_{3})^2 }{3} MSE(pbatch,ybatch)=3(y1p1)2+(y2p2)2+(y3p3)2
将以上损失函数记为L(Loss)

2.3.2. 加入截距项

2.4. 训练模型

2.4.1. 计算梯度: 示意图

后向传递线性回归计算图:
在这里插入图片描述

我们只需向后退,计算每个组成函数的导数,算出函数在前向传递中输入处的导数,最后将这些导数相乘。

2.4.2. 计算梯度: 数学和一些代码

2.4.3. 使用梯度训练模型

训练既是重复以下步骤:

  1. 选择一批数据
  2. 执行前向传递
  3. 使用在前向传递中计算所得的信息执行后向传递
  4. 使用在后向传递中计算的梯度来更新权重

2.5. 评估模型: 训练集和测试集

解决方案就是将样本分为训练集(training set)和测试集(testing set)。使用训练集训练模型(迭代更新权重),然后在测试集上评估模型 的性能。
这里的逻辑在于,如果模型能够成功地从训练集泛化到样本的其余部分 (整个数据集),那么相同的“模型结构”将很可能从样本(整个数据 集)泛化到总体,这也是最终目标。

2.6. 从零开始构建神经网络

以下将把线性回归模型扩充到非线性模,核心思想就是,首先执行一系列线性回归,然后将结果输入到一个非线性函数,最终执行最后一个线性回归并做出预测

2.6.1. 步骤一: 一系列线性回归

什么是一系列线性回归? 也就是将W的维度由 [num_features, 1] 扩展到 [num_features, num_outputs]。 这样,对于每个观测值,都有原始特征的num_outputs个加权和。
可以将这些加权和视为”已学习到的特征“, 即原始特征的组合。

2.6.2. 步骤二:一个非线性函数

接下来把每个加权和输入到一个非线性函数中。我们要尝试的第一个函数是sigmod函数。
在这里插入图片描述

sigmod函数具有以下特点:

  1. 单调
  2. 非线性
  3. 导数可以用其自身表示,方便了计算

2.6.3. 步骤三: 另一个线性回归

最后将得到num_features个元素,其中每个元素都是原始特征的组合,当把他们输入到sigmod函数后,取值都在0和1之间。同时,将这些元素输入到 一个常规的线性回归模型中,使用它们的方式与之前使用原始特征的方式 相同。

2.6.4. 示意图

较为常见的神经网络表示法:
在这里插入图片描述

第一列13个圆圈表示13个原始特征。
第二列13个圆圈表示已学习到的13个特征。(第二列有13个原因是W的维度为[num_features, num_outputs], num_outputs取值为num_features, 也就是13)
最后一个圆代表最终预测结果。(由于每一个圆都用于最终结果预测,所以13个圆都要链接到最后一个圆圈)

2.6.5. 神经网络: 后向传递

在神经网络中,后向传递的原理与在简单的线性回归模型中的原理相同, 只不过步骤相对多一点。
主要涉及两个步骤:

  1. 计算每个运算的导数,并在其输入处进行求值。
  2. 将结果相乘。

在这里插入图片描述

2.7. 神经网络比简单的线性回归效果更好的原因

  1. 可以学习输入和输出之间的非线性关系(引入了sigmod函数)
  2. 除了单个特征,神经网络可以学习原始特征和目标之间的组合关系。(这是因为神经网络使用矩阵乘法来创建多个“已学习到的特征”, 每个特征都是所有原始特征的组合,本质上相当于在这些“已学习到的特 征”上应用另一个线性回归。)

第3章 从零开始深度学习

基于基本原理,构建深度学习模型更高层次的组件,即layer类、optimizer类等

3.1. operaion(运算)

可以分为两类,一类是进行矩阵运算,例如矩阵乘法,另一类是进行将某个操作作用于所有矩阵元素,例如sigmod
限制:
1. 输出梯度的形状必须与输出的形状相匹配
2. 后向传递期间向后发送的输入梯度,其形状必须与输入的形状相匹配
在这里插入图片描述

3.2. layer(层)

就operation类而言,层是一系列线性运算外加后边跟着的一个非线性运算。

  • 输入自己构成一层,称为输入层
  • 输出自己构成一层,称为输出层
  • 中间层,称为隐藏层

在这里插入图片描述

3.3. 需要实现的operation及layer

需要实现的operation: 权重乘法, 偏差项加法,sigmod

class WeightMultipy(ParamOperation):'''神经网络的权重乘法运算'''
class BiasAdd(ParamOperation):'''增加偏差项'''class Sigmod(ParamOperation):'''sigmod激活函数'''

需要实现的layer: 全连接层或者称为稠密层

class Dense(layer):'''全连接层'''

3.4. NeuralNetwork类和其它类

NeuralNetWorkt需要具备的功能:

  1. 获取输入X, 将其连续向前传递给每个Layer类
  2. 将prediction与y进行比较,计算损失梯度
  3. 将损失梯度一次向后传递,并将其存储到相应的Operation类中

3.4.1. Loss类

class Loss(object):'''神经网络的损失'''
class MeanSquaredError(Loss):'''均方误差'''

3.5. 构建深度学习模型

class NerralNeetwork(object):'''神经网络对应的类'''

3.6. 优化器和训练器

3.6.1. 优化器

class Optimizer(object):'''神经网络优化基类'''
class SGD(Optiomizer):'''随机梯度下降优化器'''

3.7. 训练器

需要具备的功能:

  • 训练模型
  • 将NeuralNetwork和Optimizer结合起来,进行参数矩阵的更新
class Trainer(object):
'''
训练神经网络
'''

3.8. 整合

deep_neural_network = NeuralNetwork(
layers=[Dense(neurons=13,activation=Sigmoid()),Dense(neurons=13,activation=Sigmoid()),Dense(neurons=1,activation=LinearAct())],loss=MeanSquaredError(),learning_rate=0.01
)optimizer = SGD(lr=0.01) 
trainer = Trainer(deep_neural_network, optimizer) 
trainer.fit(X_train, y_train, X_test, y_test, epochs = 50, eval_every = 10, seed=20190501)

第4章 扩展(优化方法)

优化神经网络的一些关键技术

4.1. softmax交叉熵损失函数

引入的原因是, 对于输入到神经网络的所有观测值,不仅每个值都应该位于0到1之间,而且概率向量之和应为1

  • softmax
    s o f t m a x ( [ x 1 x 2 x 3 ] ) = [ e x 1 e x 1 + e x 2 + e x 3 e x 2 e x 1 + e x 2 + e x 3 e x 3 e x 1 + e x 2 + e x 3 ] softmax(\begin{bmatrix} x_{1} \\ x_{2} \\ x_{3} \\ \end{bmatrix}) = \begin{bmatrix} \frac{e^{x_{1}}}{e^{x_{1}}+e^{x_{2}}+e^{x_{3}}} \\ \frac{e^{x_{2}}}{e^{x_{1}}+e^{x_{2}}+e^{x_{3}}} \\ \frac{e^{x_{3}}}{e^{x_{1}}+e^{x_{2}}+e^{x_{3}}} \\ \end{bmatrix} softmax( x1x2x3 )= ex1+ex2+ex3ex1ex1+ex2+ex3ex2ex1+ex2+ex3ex3
  • 交叉熵损失
    C E ( p i , y i ) = − y i × l o g ( p i ) − ( 1 − y i ) × l o g ( 1 − p i i ) CE(p_{i},y_{i}) = -y_{i} \times log(p_{i}) - (1 - y_{i}) \times log(1 - p_{i_{i}}) CE(pi,yi)=yi×log(pi)(1yi)×log(1pii)

4.2. 动量

每个时间步长的参数更新将是过去时间步长参数更新的加权平均值,其中权重呈指数衰减

u p d a t e = ∇ t + μ × ∇ t − 1 + μ 2 × ∇ t − 2 + . . . update=\nabla_{t}+\mu \times \nabla_{t-1} + {\mu}^2 \times \nabla_{t-2} + ... update=t+μ×t1+μ2×t2+...

4.3. 学习率衰减

随着训练的进行,越来越需要降低学习率。

4.4. 权重初始化

4.5. dropout

简单地在一层中随机选择一定比例的神经元p,并在每次前向传递训练中将他们设置为0。他可以改变神经网络的容量,并降低发生过拟合的可能性

第5章 CNN

卷积神经网络,专门用于理解图像的神经网络

第6章 RNN

先介绍了前几章所构架的神经网络并不能处理的网络情形,从而引出了自动微分架构。循环神经网络,专门用于理解数据点按顺序出现的数据,例如时间序列数据或自然语言数据。还介绍了RNN的两种变体GRU和LSTM的工作原理。

第7章 PyTorch

如何使用高性能的开源神经网络PyTorch

REF

python深度学习入门-从零构建CNN和RNN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/20854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[激光原理与应用-94]:电控 - 低噪声运放的原理

目录 一、什么是低噪声运放 1.1 什么是低噪声水平 1.2 什么是高增益 在电子工程中的应用 在通信领域的应用 在音频和视频处理中的应用 注意事项 1.3 什么是宽带宽 1.4 什么是低偏置电流 重要性 特点 解决方法 应用 二、低噪声运放的原理图 1. 基本构成 2. 设计…

HTML5新元素探索:重塑网页结构与功能的革新

随着互联网技术的飞速发展,HTML5作为新一代超文本标记语言标准,不仅增强了对多媒体内容的支持,还引入了一系列新元素,旨在使网页结构更加语义化、可访问性更强。本文将深入探讨几个核心的新元素,通过代码示例展示它们如…

22data 脚本语言基础——Python

横线为没讲到的。 1. 基础语法 变量:变量的声明和使用。 数据类型:整数(int)、浮点数(float)、字符串(str)、布尔值(bool)等。 运算符:算术运算符…

第五维度【百度之星】/二分

第五维度 二分 思路&#xff1a;看到题目是尽可能晚的情况下最早就应该想到贪心。 #include<bits/stdc.h> using namespace std; typedef long long ll; ll a[100005],b[100005]; ll n,m; bool check(ll t) {ll res0,big0;for(ll i0;i<n;i) {if(a[i]>t) continue…

JMeter工具介绍

Jmeter功能概要 JDK常用文件目录介绍 Bin目录&#xff1a;存放可执行文件和配置文件 Docs目录&#xff1a;是Jmeter的API文档&#xff0c;用于开发扩展组件 printable_docs目录&#xff1a;用户帮助手册 lib目录&#xff1a;存放JMeter依赖的jar包和用户扩展所依赖的Jar包 修…

HALCON-从入门到入门-读取图片保存图片

1.废话 视觉算法库的第一步。 读取图片&#xff1a; 看你是从哪里读取&#xff0c;从相机读取还是从本地硬盘中读取。 保存图片&#xff1a;就只有保存到本地了。 上面的截图显示我读取了一张图片 从相机中读取另开一篇来说&#xff0c;先说从本地磁盘读取哈。 怎么读取的…

创建maven 项目

一、groupId, artifactId When creating a Maven project in IntelliJ IDEA, "groupId" and "artifactId" are two essential elements of the projects metadata. groupId: This typically identifies your project uniquely across all projects. For e…

C语言程序设计第二讲:顺序程序设计

一、数据类型 1. 基本数据类型 C语言中提供了一些基本数据类型&#xff0c;用于表示各种不同类型的数据&#xff1a; 整数类型&#xff1a; int&#xff1a;表示整数&#xff0c;通常占用4个字节。short int&#xff1a;表示短整数&#xff0c;通常占用2个字节。long int&am…

Pycharm 的使用

使用文档&#xff1a; Getting started | PyCharm DocumentationPyCharm 中文指南 — PyCharm 中文指南(Win版) 2.0 documentation 在Ubuntu中安装并配置Pycharm教程&#xff08;安装 Pycharm&#xff09;Ubuntu安装pycharm及快速创建pycharm的快捷方式&#xff0c;便于使用&am…

数据结构复习指导之交换排序(冒泡排序,快速排序)

目录 交换排序 复习提示 1.冒泡排序 1.1基本思想 1.2算法代码 1.3性能分析 2.快速排序 2.1基本思想 2.2算法代码 2.3性能分析 交换排序 复习提示 所谓交换&#xff0c;是指根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。 基于交换的排序算法很…

链表逆序用哨兵位头节点

在C语言中实现链表的逆序&#xff0c;使用哨兵头节点是一种常见的做法。哨兵头节点可以简化代码逻辑&#xff0c;特别是当链表为空时&#xff0c;可以避免空指针异常。下面是一个使用哨兵头节点逆序单链表的C语言实现 示例&#xff1a; #include <stdio.h> #include &l…

富格林:应用正规技巧阻挠被骗

富格林悉知&#xff0c;随着如今入市现货黄金的朋友愈来愈多&#xff0c;不少投资者也慢慢开始重视起提高自身的正规投资技巧&#xff0c;希望能阻挠被骗更高效地在市场上获利。虽然目前黄金市场存在一定的受害风险&#xff0c;但只要投资者严格按照正规的交易规则来做单&#…

python解决flask启动的同时启动定时任务

业务场景描述&#xff1a;在常规的开发中&#xff0c;我们开发接口服务&#xff0c;一般会将数据放在数据库、文件等第三方文件&#xff0c;启动服务后&#xff0c;服务到后台数据库中加载数据&#xff0c;这样做的好处当然是开发会更加便利以及数据的可复用性较高&#xff0c;…

深度学习-03-函数的连续调用

深度学习-03-函数的连续调用 本文是《深度学习入门2-自製框架》 的学习笔记&#xff0c;记录自己学习心得&#xff0c;以及对重点知识的理解。如果内容对你有帮助&#xff0c;请支持正版&#xff0c;去购买正版书籍&#xff0c;支持正版书籍不仅是尊重作者的辛勤劳动&#xff0…

LLaMA-Factory推理实践

运行成功的记录 平台&#xff1a;带有GPU的服务器 运行的命令 git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory/ conda create -n py310 python3.10 conda activate py310由于服务器不能直接从huggingface上下载Qwen1.5-0.5B&#xff0c;但本地可…

51仿真器 PZ-51Tracker 未知设备

插上仿真器&#xff0c;右击我的电脑 等待一下&#xff0c;选择winUSB 此时在keil中选择仿真器会报错&#xff0c;需要安装如下我是win10) 安装好后退出再试&#xff0c;没有报错即可 这项也要选择 另外配置晶振

MYSQL之存储篇

MYSQL之存储篇 存储过程简介存储过程优点&#xff1a; MySQL的存储过程MySQL存储过程的创建1.格式2.声明分割符3.参数4.变量5.注释6.MySQL存储过程的调用7. MySQL存储过程的查询8.MySQL存储过程的修改9.MySQL存储过程的删除10. MySQL存储过程的控制语句11.MySQL存储过程的基本函…

mybatis配置环境流程

mybatis配置环境流程 为啥要用mybatis&#xff1a;通过Mybatis实现快速访问后端pgsql、mysql等数据库。 1.修改pom.xml&#xff0c;添加mybatis相关依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-s…

React + SpringBoot开发用户中心管理系统

用户中心项目搭建笔记 技术栈 前端技术栈 “react”: “^18.2.0”,ant-design-pro 后端技术栈 SpringBoot 2.6.x 项目源码地址 https://gitee.com/szxio/user-center 前端项目搭建 快速搭建一个后端管理系统项目框架 初始化 antDesignPro 官网&#xff1a; https://…

Spel表达式使用案例

package com.example.demo.api;import com.example.demo.model.User; import lombok.extern.slf4j.Slf4j;<