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.mfbz.cn/a/670626.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jupyter notebook更改位置

1.找到jupyer的配置文件 一般在c盘用户的.jupter文件夹下 2. 用记事本打开这个配置文件,定位到c.NotebookApp.notebook_dir /path_to_your_directory 替换你的位置 3.找到jupyer图标的位置,打开属性 添加要存放的位置在目标文件的末尾,重新…

童梦奇缘,味你而来 —— 蒙自源六一儿童节特别活动

在六月的暖阳下,孩子们的欢笑声如同最美妙的乐章,奏响了夏日的序曲。在这个充满童真与梦想的季节,蒙自源精心策划了一场别开生面的六一儿童节特别活动,邀请每一位小朋友和大朋友,一同踏上一段奇妙的味蕾之旅。 从5月25…

数据库(16)——DQL执行顺序

DQL的执行顺序 这是DQL的编写顺序。 而实际的执行顺序为

企业级win10电脑下同时存在Python3.11.7Python3.6.6,其中Python3.6.6是后装的【过程与踩坑复盘】

背景: 需要迁移原始服务器的上的Python3.6.6Flask项目到一个新服务器上, 新服务器上本身存在一个Python3.11.7, 所以这涉及到了一个电脑需要装多个Python版本的问题 过程: 1-确定新电脑版本【比如是32还是64位】 前面开发人员存留了两个…

读人工智能时代与人类未来笔记19_读后总结与感想兼导读

1. 基本信息 人工智能时代与人类未来 (美)亨利基辛格,(美)埃里克施密特,(美)丹尼尔胡滕洛赫尔 著 中信出版社,2023年6月出版 1.1. 读薄率 书籍总字数145千字,笔记总字数39934字。 读薄率39934145000≈27.5% 1.2. 读厚方向 千脑智能 脑机穿越 未来呼啸而来 …

golang的http客户端封装

简介 net/http 是 Go 语言标准库的一部分,它提供了创建 HTTP 客户端和服务器的能力。这个包通过简化与 HTTP 协议的交互,让开发者能够方便地构建 HTTP 请求和响应,以及处理路由等任务。 本文以 net/http 包作为底层,封装一个包含…

解决VIvado编程中遇到的bug 5

解决VIvado编程中遇到的bug 5 语言 :Verilg HDL EDA工具: Vivado、quartus2 、modelsim 解决VIvado编程中遇到的bug 5一、引言二、问题、分析及解决方法1. vivado编译时报错(1)错误(2)分析(3&am…

HTML标签(超链接、锚、表格、表单)

HTML的标签2 超链接标签:锚链接:表格标签:表单:输入输出: 超链接标签: 超链接标签:a ​ 属性: ​ href - 链接地址 ​ target - 跳转目标(_self在当前卡…

基于单片机的病床呼叫系统设计研究

摘要:随着无线技术的快速发展,无线应用技术已经运用到人们生产生活中的多个领域,运用无线技术来设计病床呼叫系统能够实现无线信号的远距离传输,减少材料耗费,使医患之间的沟通更加便捷,该系统运用单片机作…

VSCode界面Outline只显示类名和函数名,隐藏变量名

参考链接 https://blog.csdn.net/Zjhao666/article/details/120523879https://blog.csdn.net/Williamcsj/article/details/122401996 VSCode中界面左下角的Outline能够方便快速跳转到文件的某个类或函数,但默认同时显示变量,导致找某个函数时很不方便。…

【传知代码】多视图3D目标检测位置嵌入变换(论文复现)

前言:三维目标检测技术正逐渐成为计算机视觉领域的重要研究方向。特别是在自动驾驶、增强现实(AR)、虚拟现实(VR)以及机器人导航等应用中,对三维空间内目标的精准检测与定位显得尤为重要。然而,…

virtualbox虚拟机、centos7安装增强工具

文章目录 1. virtualBox语言设置2. 设置终端启动快捷键3. 添加virtualbox 增强工具4. 设置共享文件夹 1. virtualBox语言设置 virtualbox -> file -> perferences -> language ->选择对应的语言 -> OK virtualbox -> 管理 -> 全局设定 -> 语言 -> …

点赋科技:建设智能饮品高地,打造数字化产业先锋

在当今数字化时代的浪潮中,点赋科技以其敏锐的洞察力和卓越的创新能力,致力于建设智能饮品高地,打造数字化产业先锋。 点赋深知智能饮品机对于推动社会进步和满足人们日益增长的需求的重要性。因此,他们投入大量资源和精力&#x…

[AI Google] 三种新方法利用 Gemini 提高 Google Workspace 的生产力

Workspace 侧边栏中的 Gemini 现在将使用 Gemini 1.5 Pro,新的 Gemini for Workspace 功能即将登陆 Gmail 移动应用,等等。 Gemini for Google Workspace 帮助个人和企业更好地利用 Google 应用——从在 Gmail 中撰写邮件到在 Sheets 中组织项目计划。过…

echarts学习: 图表自适应

1.实现基本功能 我最近在研究如何封装echarts组件,几乎每个相关的文章都会给组件添加图表自适应的功能。其原理也很简单,就是通过侦听window的resize事件,当事件触发时就调用chartInstance.resize方法重置图表尺寸。 基本代码如下: // 重置…

如何快速上手Python,成为一名数据分析师

目录 写在前面 推荐图书 推荐理由 粉丝福利 写在最后 写在前面 520快乐!喜欢Python的小伙伴有福啦,本期博主给大家推荐一本入门Python的热门书籍,快来看看吧~ 推荐图书 《Python数据分析快速上手》(王靖,商艳红&#xff0…

基础数学内容重构(后缀0个数)

今天也是参加了一下宁波大学的校赛,其中有一道题是求后缀0的个数,题意是让我们求一下式子的后缀0个数: 看上去比较复杂,但是通过化简我们可以知道以上式子就是求(n 1)!,这里化简的过…

【学习笔记】Vue3(Ⅰ)

Vue3(Ⅰ) 1、 概述 1.1、概述 1.2、使用 Vite 创建工程 1.2.1 Vite 介绍 1.2.2 创建工程 1.3、项目文件结构2、 基础 2.1、setup 2.1.1 初识 setup 2.1.2 setup 的返回值 2.1.3 setup 的触发时机…

Matlab2010安装注册+激活(保姆级教程)

目录 一、软件安装 二、软件激活 三、软件测试 Matlab2010压缩包: 链接:https://pan.baidu.com/s/1bX4weZ0nC-4zlDLUiSKcRQ?pwdxljj 提取码:xljj 一、软件安装 1.解压所给压缩包,目录双击setup.exe打开. (如果用户名为中文则会遇到这个…

HCIP-Datacom-ARST自选题库__BGP/MPLS IP VPN判断【10道题】

1.部署BGP/MPLSIP VPN时,当两个VPN有共同的站点,则该共同站点一定不能与两个VPN其他站点使用重叠的地址空间。 2.如图所示,运营商BGP/MPLSIP VPN骨干网通过LDP构建LSP,若想实现用户X两个站点之间通过BGP/MPLSIP VPN网络互通,则PE1和PE2之间必…