从参数数量视角理解深度学习神经网络算法 DNN, CNN, RNN, LSTM 以python为工具

news2024/9/23 9:24:31

从参数数量视角理解深度学习神经网络算法 DNN, CNN, RNN, LSTM 以python为工具

文章目录

  • 1. 神经网络数据预处理
    • 1.1 常规预测情景
    • 1.2 文本预测场景
  • 2.全连接神经网络 DNN
  • 3.卷积神经网络CNN
  • 4.循环神经网络 RNN
  • 5.长短期记忆神经网络 LSTM

在这里插入图片描述


      ʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞ

1. 神经网络数据预处理

使用python写神经网络算法前,通常需要先对数据进行预处理,使得数据称为符合算法要求的形式。这不限于归一化和特征提取。特征和标签的形式常常是初学者容易糊涂的。
常见的情况可以分为两种,一种是常规的预测场景,另一种则是文本预测场景。


1.1 常规预测情景

在常规的预测场景下,输入数据的shape可以分为三维情景和二维情景。

若为三维情景,输入数据的shape为(a,b,c),其中c>1。即表示,共有a条样本,b个特征。每个特征的特征值的维度为c。(其中c=1时效果等同于二维情景,但设定方式有一定区别)
API中对应的参数:
input_shape=(c,b)
input_length=b
input_dim=c

若为二维情景,设输入数据的shape是(a,b),则input_shape=(b,)
二维情景下的input_shape=(b,)相当于三维情境下的input_shape=(1,b)。
           在这里插入图片描述

对于输出层,无论是分类问题还是回归问题,根据输出值个数,即每个标签值的维度来设定输出层神经元的数量。
如,对于对每个样本只输出一个一个数值的回归问题,则输出层只需要一个神经元,对于每个样本输出两个或多个回归值的问题,则在输出层可以设置多个神经元,每个神经元对应其中一个预测的输出。
对于分类问题,在输出层设定一个神经元即可以实现一般的二分类问题;对于二个类别以上的分类问题,则可以先对输入的数据进行预处理:假设有[0,1,2]三类,0类则可以改写为[1,0,0],1类则则可以改写为[0,1,0],2类则可以改写为[0,0,1]。然后在输出层设置3个神经元,每个神经元则负责输出一个数字,输出的3个数字组成一个形如[x1,x2,x3]的长度为3的一维数组。其中x1是预测出的该样本标签为0类的概率,x2是预测出的该样本标签为1类的概率,x3是预测出的该样本标签为2的概率。得到预测结果后,[x1,x2,x3]其中最大的数字对应的索引,即为预测出该样本可能的类别。需要进一步去转换。


1.2 文本预测场景

对于文本预测场景,则在数据预处理阶段有着一套相对成熟的编码思路。
文本预测场景的数据形式通常都是三维形式,一般不再有二维形式。输入数据的shape为(a,b,c),则表示a条样本数据,使用前b个字符,预测下一个或多个字符。c则等于训练样本中所有可能的种类的数量。
将每个特征的特征值都转化为形如:[0 0 … 0 1 0 0 … 0 ]的矩阵形式。其中该矩阵的每个位置,都表示一个字符,0表示否,1表示是该字符。该矩阵长度则为c。
相应的,标签数据也需要转化为这种形式。若只预测后边一个数据,则设置c个神经元,其余逻辑同上述多维情景。

    在这里插入图片描述


2.全连接神经网络 DNN

对全连接神经网络,
首先以一个简单的神经网络结构为例:一个中间层,一个输出层。中间层设定5个神经元,输出层设定1个神经元。

全连接神经网络的每层参数的数量可以总结为,该层输入特征数据的数量(input_length)乘以该层神经元的数量,再加上该层神经元的数量。

代码示例如下

from keras.models import Sequential
from keras.layers import Dense

model1 = Sequential()
# 中间层 (或 隐藏层)
# 使用Dense()方法直接写第一个隐藏层,而不用写输入层时,要设定input_shape参数
model1.add(Dense(units = 5,   
                input_shape=(10,)     
                )  
           )  
# 输出层 1个神经元
model1.add(Dense(1))
model1.summary()

        在这里插入图片描述
其中中间层有55个参数,即输入的10个特征,乘以5个神经元的数量,加上5个神经元对应着5个偏置参数。10×5+5=55。
5个神经元有5个输出值,即下一个Dense,即输出层的输入维度为5,而输出层神经元数量为1,且也对应着一个偏置,所以输出层的参数数量为5×1+1=6个。两个层一共有61个参数。

模型图示如下:

from keras.utils import plot_model  
plot_model(model1, show_shapes=True)  

            在这里插入图片描述


如果输入的是三维数据,(n,10,3)为例,则在传入参数时,一定要注意,input_shape=(3,10),而不能写成(10,3)。

参数的个数与输入数据的维度input_dim无关(上边的数字3)。

model2 = Sequential()
model2.add(Dense(units = 5,   
                input_shape=(3,10)     
                )  
           )  


model2.add(Dense(1))
model2.summary()

输出结果:
          在这里插入图片描述

from keras.utils import plot_model  
plot_model(model2, show_shapes=True)     

模型图示如下:
            在这里插入图片描述
输入数据的是二维数据或三维数据,并不影响参数个数。


3.卷积神经网络CNN

这里建议选择使用Conv2D接口。(相对的是Conv1D)

设定卷积层神经元个数为32,即卷积层输出32个特征映射。
滤波核大小设定为3×3,输入数据的shape为(50,50,3),可以理解为高50像素,宽50像素,且有3个色彩通道的图片,也可以理解为,每个样本初始数据有50×50个特征,每个特征的特征值shape为(3,)。

池化层使用2维最大池化。

输出层只设定一个神经元。

则卷积层的参数个数 = (卷积核长×卷积核宽×色彩通道数量+1)× 卷积层神经元个数
其中1指的是一个偏置参数。(卷积核长×卷积核宽×色彩通道数量+1) 衡量的是每个特征映射对应的参数数量。

池化层没有参数。

输出层参数数量为,输入数据的维度×输出层神经元个数 + 1

代码示例如下

from keras.models import Sequential
from keras import layers


model3 = Sequential()
# 卷积层  100个特征映射,卷积核大小为7*7,(400,300,3)为输入数据的shape
model3.add(layers.Conv2D(100, (7, 7), input_shape=(400, 300, 3)))
# 最大池化层 3×3池化(也称池化步幅为3) 该层只做特征提取,没有参数
model3.add(layers.MaxPooling2D(3, 3))
# 展平层 该层也无参数
model3.add(layers.Flatten())
# 输出层 一个神经元
model3.add(layers.Dense(1))

model3.summary()

卷积层参数数量=(7×7×3+1)×100=14800。
         在这里插入图片描述

from keras.utils import plot_model  
plot_model(model3, show_shapes=True)   

模型图示如下:
          在这里插入图片描述


4.循环神经网络 RNN

每个RNN层有一个循环核。一个循环核有多个记忆体。

time_step不影响参数的个数。

设 RNN层 输入向量的维度 为input_dim
RNN层神经元个数 为 units

则RNN层的参数个数为 i n p u t _ d i m × u n i t s + + u n i t s 2 + u n i t s input\_dim×units++units^2+units input_dim×units++units2+units。输出层的参数数量计算方法还是常规思路。

为了更直观,特在下图示例中标出。 
以输入数据维度为5,记忆体个数为3,输出数据维度为5为例。神经网络包含一个隐藏层和一个输出层。

在这里插入图片描述


代码如下:

time_step = 10 # time_step不影响参数数量
input_dim = 5
units=3 # RNN层的神经元个数,也是记忆体的个数
output_dim = 5


model4 = Sequential()
# RNN层 5个神经元 输入数据维度为5
model4.add(layers.SimpleRNN(units=units, input_shape=(time_step,input_dim),activation='relu'))
# 输出层 一个神经元 输出数据维度为5
model4.add(layers.Dense(output_dim))

model4.summary()

         在这里插入图片描述
模型图示及代码:

from keras.utils import plot_model  
plot_model(model4, show_shapes=True)     

            在这里插入图片描述


5.长短期记忆神经网络 LSTM

LSTM模型的核心是三个门和一个记忆细胞,LSTM层的参数数量为相同参数RNN模型的RNN层参数数量的4倍(单层的4倍,而非整个模型参数数量的4倍)。
输入门,遗忘门,记忆细胞,输出门的公式依次如下:

 输入门: i t = σ ( W i x t + U i h t − 1 + b i ) i_t=\sigma(W_ix_t+U_ih_{t-1}+b_i) it=σ(Wixt+Uiht1+bi)

 遗忘门: f t = σ ( W f x t + U f h t − 1 + b f ) f_t=\sigma(W_fx_t+Ufh_{t-1}+b_f) ft=σ(Wfxt+Ufht1+bf)

 内部记忆单元: c t ′ = t a n h ( W c x t + U c h t − 1 ) c'_t=tanh(W_cx_t+U_ch_{t-1}) ct=tanh(Wcxt+Ucht1)

         c t = f t c t − 1 + i t c t ′ c_t=f_tc_{t-1}+i_tc'_t ct=ftct1+itct

 输出门: o t = σ ( W o x t + U o h t − 1 + b o ) o_t=\sigma(W_ox_t+U_oh_{t-1}+b_o) ot=σ(Woxt+Uoht1+bo)

      h t = o t t a n h ( c t ) h_t=o_ttanh(c_t) ht=ottanh(ct)
从上边公式可以看出,相比于上边RNN中的 W x h , b h , W h h W_{xh},b_{h},W_{hh} Wxh,bh,Whh三个参数矩阵中的参数,LSTM神经网络在每个门中都多了一组 W , U , b W,U,b W,U,b参数。一共多了三组,所以是4倍数量的参数。

from keras.models import Sequential
from keras.layers import Dense,LSTM

time_step = 10
input_dim = 5
units=3 # RNN层的神经元个数,也是记忆体的个数
output_dim = 5

model5 = Sequential()
# LSTM层
model5.add(LSTM(units=units,input_shape=(time_step,input_dim),activation='relu'))
# 添加输出层 
model5.add(Dense(units=output_dim, activation='softmax'))

model5.summary()

代码执行结果如下:
         在这里插入图片描述
LSTM层参数数量为108,为RNN层27的四倍。加上输出层后总计有128个参数。


模型结构:

from keras.utils import plot_model  
plot_model(model5, show_shapes=True)     

          在这里插入图片描述


🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ

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

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

相关文章

【数据结构】详解空间复杂度

Yan英杰的博客 悟已往之不谏 知来者之可追 目录 空间复杂度 ​案例1:计算BubbleSort的空间复杂度? 案例2:计算斐波那契额数列的前N项的空间复杂度 案例3:计算阶乘递归Fac的空间复杂度? 案例4:F1和F2两函数是否使用的同一块空间 案例5:计算该…

git团队合作 - branch分支的使用、主分支合并、冲突处理方案

情景例子开发部3人,组长man, 组员devA,devB;1)组长man负责代码合并、冲突处理、检查代码、合并代码到master主分支;2)组员devA负责开发3)组员devB负责开发git仓库主次分支安排1&…

windows下qt creator 配置编译环境gcc,g++,gdb,cmake

MSVC:即Microsoft Visual C Compiler,即微软自己的编译器 MinGW:我们都知道GNU在Linux下面鼎鼎大名的gcc/g,MinGW则是指Minimalist GNU for Windows的缩写 这里我们选择MinGW,至于Qt中,这两种模式的区别&…

Python入门自学进阶-Web框架——34、富文本编辑器KindEditor、爬虫初步

KindEditor是一个轻量级的富文本编辑器,应用于浏览器客户端。一、首先是下载:http://kindeditor.net/down.php,如下图下载后是解压缩后:红框选中的都可以删除到,这些主要是针对不同的语言编写的示例,因为我…

一文教会你如何简单使用Fegin进行远程服务调用

文章目录1、fegin的基本介绍2、fegin的基本使用步骤3、项目中的实际运用4、测试前言在分布式微服务中,少不了会进行不同服务之间的相互调用,比如A服务要调用B服务中的接口,如何简单方便的实现呢?fegin可以来帮助。 1、fegin的基本…

如何禁止删除或修改RAR压缩包里的文件?很多人不知道这个功能

你是否有过这样的需求?把文件压缩成RAR格式后,需要对压缩包里的文件进行保护,以防别人或者自己误删文件,或者不小心修改了文件内容。 有些小伙伴可能会给压缩包里的文件都设置上“限制编辑”,这虽然也能防止随意更改内…

Stable Diffusion 个人推荐的各种模型及设置参数、扩展应用等合集(不断更新中)

一、说明 | 表示或者 表示 以上 二、模型 适用风景、房子、车子等漫画类风格 模型的VAE不要用模型附带的,好像就是naifu的官方vae,很老了,用 vae-ft-mse-840000-ema-pruned.ckpt 或者是 kl-f8-anime2.ckpt; 嵌入模型要下载作者…

免费集装箱箱号识别API,人工智能企业CIMCAI集装箱识别检测人工智能平台全球4千企业用户,支持API集成二次开发人工智能企业

免费集装箱箱号识别API,人工智能企业CIMCAI集装箱识别检测人工智能平台全球4千企业用户,支持API集成二次开发。箱信息识别及铅封号识别功能免费,顶尖AI集装箱识别率99.98%,全球No.1集装箱人工智能企业CIMCAI打造。中国上海人工智能…

chrome如何查看和修改除了密码,付款方式,地址意外的自动填充表单内容

这种自动填写的内容似乎无法设置。 软件地址:https://sqlitebrowser.org/dl/ 去这里查看地址 https://chromium.googlesource.com/chromium/src//master/docs/user_data_dir.md 比如我是windows,则地址为:C:\Users\用户名\AppData\Local\Go…

【Java】SpringBoot中实现异步编程

前言 首先我们来看看在Spring中为什么要使用异步编程,它能解决什么问题? 什么是异步? 首先我们先来看看一个同步的用户注册例子,流程如下: 异步的方式如下: 在用户注册后将成功结果返回,…

java:UUID和雪花生成算法

目录 UUID生成不重复命名方法 在实际项目中的运用 UUID算法的缺点 什么是雪花算法? UUID生成不重复命名方法 我们在做项目的时候可能需要用到全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID UUID可以自动生成唯一的id。是java.util中自…

面朝大海,春暖花开丨2023年Kaadas凯迪仕全国经销商大会成功召开

3月8日,We——2023年Kaadas凯迪仕全国经销商大会将在中国青岛星光岛会议中心隆重举行,盛会汇聚了超过1000名优秀合作伙伴,规模空前。Kaadas凯迪仕品牌创始人&集团总裁苏志勇先生、集团董事长苏祺云先生以及各高层领导均莅临现场。 大会伊…

万字长文:Stable Diffusion 保姆级教程

万字长文:Stable Diffusion 保姆级教程 2022年绝对是人工智能爆发的元年,前有 stability.ai 开源 Stable Diffusion 模型,后有 Open AI 发布 ChatGPT,二者都是里程碑式的节点事件,其重要性不亚于当年苹果发布iPhone&a…

蓝库云|告诉你传统产业该如何进行数字化转型

在后疫情时代下,企业该如何在面临生存危机的情形下,投入「数字化转型」、提升公司竞争力,已成为许多公司的当务之急,但到底什么是数字化转型呢?传统产业又如何着手进行数位转型? 数字化转型是什么&#xf…

Uipath Excel 自动化系列13-ForEachExcelSheet(遍历Sheet)

活动描述 ForEachExcelSheet(遍历Sheet):遍历Excel中的工作表,可以对 Excel 工作簿中的每个工作表重复一个或多个活动,该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 使用场景:当处理包含多张工作表的 Excel 文件,…

项目管理工具DHTMLX Gantt灯箱元素配置教程:如何验证

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求,具备完善的甘特图图表库,功能强大,价格便宜,提供丰富而灵活的JavaScript API接口,与各种服务器端技术&am…

【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

前言:本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器与分频器 ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片 配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度 存储器&#…

做自媒体真的能赚到钱吗?真的能赚到几十万吗?

自媒体在当今社会已经成为一个热门话题,越来越多的人开始尝试做自媒体,希望能够通过自媒体赚到钱。但是,做自媒体真的能赚到钱吗?能赚到几十万吗?下面我们来一一解答。 首先,做自媒体确实可以赚到钱。随着互…

硬件语言 Verilog HDL 学习 day02 数据流建模,行为级建模,结构化建模

1.数据流建模 1.含义:在电路规校较小的清况下,由于包含的门数比较少,设计者可以逐个地引用逻辑门实例把它 们互相连接起来, 因此使用门级建换进行设计是很合适的。对于具有数字逻辑电路设计基本知识的用户来讲,门级建模…

Java性能调优杀手锏JMH

JMH简介 JMH(Java Microbenchmark Harness)由 OpenJDK/Oracle 里面那群开发了 Java编译器的大牛们所开发,是一个功能强大、灵活的工具,它可以用于检测和评估Java应用程序的性能,主要目的是测量Java应用程序的性能,尤其是在多线程…