cnn lstm pytorch_pytorch怎么用

cnn lstm pytorch_pytorch怎么用LSTM模型结构1、LSTM模型结构2、LSTM网络3、LSTM的输入结构4、Pytorch中的LSTM4.1、pytorch中定义的LSTM模型4.2、喂给LSTM的数据格式4.3、LSTM的output格式5、LSTM和其他网络组合1、LSTM模型结构BP网络和CNN网络没有时间维,和传统的机器学习算法理解起来相差无几,CNN在处理彩色图像的3通道时,也可以理解为叠加多层,图形的三维矩阵当做空间的切片即可理解,写代码的时候照着图形一层层叠加即可。如下图是一个普通的BP网络和CNN网络。图中的隐

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1、LSTM模型结构

BP网络和CNN网络没有时间维,和传统的机器学习算法理解起来相差无几,CNN在处理彩色图像的3通道时,也可以理解为叠加多层,图形的三维矩阵当做空间的切片即可理解,写代码的时候照着图形一层层叠加即可。如下图是一个普通的BP网络和CNN网络。
在这里插入图片描述
在这里插入图片描述
图中的隐含层、卷积层、池化层、全连接层等,都是实际存在的,一层层前后叠加,在空间上很好理解,因此在写代码的时候,基本就是看图写代码,比如用keras就是:

# 示例代码,没有实际意义
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu'))  # 添加卷积层
model.add(MaxPooling2D(pool_size=(2, 2)))         # 添加池化层
model.add(Dropout(0.25))                          # 添加dropout层

model.add(Conv2D(32, (3, 3), activation='relu'))  # 添加卷积层
model.add(MaxPooling2D(pool_size=(2, 2)))         # 添加池化层
model.add(Dropout(0.25))                          # 添加dropout层

....   # 添加其他卷积操作

model.add(Flatten())                            # 拉平三维数组为2维数组
model.add(Dense(256, activation='relu'))        添加普通的全连接层
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

....  # 训练网络

2、LSTM网络

当我们在网络上搜索看LSTM结构的时候,看最多的是下面这张图:
在这里插入图片描述
这是RNN循环神经网络经典的结构图,LSTM只是对隐含层节点A做了改进,整体结构不变,因此本文讨论的也是这个结构的可视化问题。

中间的A节点隐含层,左边是表示只有一层隐含层的LSTM网络,所谓LSTM循环神经网络就是在时间轴上的循环利用,在时间轴上展开后得到右图。

看左图,很多同学以为LSTM是单输入、单输出,只有一个隐含神经元的网络结构,看右图,以为LSTM是多输入、多输出,有多个隐含神经元的网络结构,A的数量就是隐含层节点数量。

WTH?思维转不过来啊。这就是传统网络和空间结构的思维。

实际上,右图中,我们看Xt表示序列,下标t是时间轴,所以,A的数量表示的是时间轴的长度,是同一个神经元在不同时刻的状态(Ht),不是隐含层神经元个数。

我们知道,LSTM网络在训练时会使用上一时刻的信息,加上本次时刻的输入信息来共同训练。
举个简单的例子:在第一天我生病了(初始状态H0),然后吃药(利用输入信息X1训练网络),第二天好转但是没有完全好(H1),再吃药(X2),病情得到好转(H2),如此循环往复直到病情好转。因此,输入Xt是吃药,时间轴T是吃多天的药,隐含层状态是病情状况。因此我还是我,只是不同状态的我。

实际上,LSTM的网络是这样的:
在这里插入图片描述
上面的图表示包含2个隐含层的LSTM网络,在T=1时刻看,它是一个普通的BP网络,在T=2时刻看也是一个普通的BP网络,只是沿时间轴展开后,T=1训练的隐含层信息H,C会被传递到下一个时刻T=2,如下图所示。上图中向右的五个常常的箭头,所的也是隐含层状态在时间轴上的传递。
在这里插入图片描述
注意,图中H表示隐藏层状态,C是遗忘门,后面会讲解它们的维度。

3、LSTM的输入结构

为了更好理解LSTM结构,还必须理解LSTM的数据输入情况。仿照3通道图像的样子,在加上时间轴后的多样本的多特征的不同时刻的数据立方体如下图所示:
在这里插入图片描述
右边的图是我们常见模型的输入,比如XGBOOST,lightGBM,决策树等模型,输入的数据格式都是这种(NF)的矩阵,而左边是加上时间轴后的数据立方体,也就是时间轴上的切片,它的维度是(NT*F),第一维度是样本数,第二维度是时间,第三维度是特征数,如下图所示:
在这里插入图片描述
这样的数据立方体很多,比如天气预报数据,把样本理解成城市,时间轴是日期,特征是天气相关的降雨风速PM2.5等,这个数据立方体就很好理解了。在NLP里面,一句话会被embedding成一个矩阵,词与词的顺序是时间轴T,索引多个句子的embedding三维矩阵如下图所示:
在这里插入图片描述

4、Pytorch中的LSTM

4.1、pytorch中定义的LSTM模型

pytorch中定义的LSTM模型的参数如下:

class torch.nn.LSTM(*args, **kwargs)
参数有:
    input_size:x的特征维度
    hidden_size:隐藏层的特征维度
    num_layers:lstm隐层的层数,默认为1
    bias:False则bihbih=0和bhhbhh=0. 默认为True
    batch_first:True则输入输出的数据格式为 (batch, seq, feature)
    dropout:除最后一层,每一层的输出都进行dropout,默认为: 0
    bidirectional:True则为双向lstm默认为False

结合前面的图形,我们一个个看。

(1)input_size:x的特征维度,就是数据立方体中的F,在NLP中就是一个词被embedding后的向量长度,如下图所示:
在这里插入图片描述
2)hidden_size:隐藏层的特征维度(隐藏层神经元个数),如下图所示,我们有两个隐含层,每个隐藏层的特征维度都是5。注意,非双向LSTM的输出维度等于隐藏层的特征维度。
在这里插入图片描述
(3)num_layers:lstm隐层的层数,上面的图我们定义了2个隐藏层。

(4)batch_first:用于定义输入输出维度,后面再讲。

(5)bidirectional:是否是双向循环神经网络,如下图是一个双向循环神经网络,因此在使用双向LSTM的时候我需要特别注意,正向传播的时候有(Ht, Ct),反向传播也有(Ht’, Ct’),前面我们说了非双向LSTM的输出维度等于隐藏层的特征维度,而双向LSTM的输出维度是隐含层特征数2,而且H,C的维度是时间轴长度2。
在这里插入图片描述

4.2、喂给LSTM的数据格式

pytorch中LSTM的输入数据格式默认如下:

input(seq_len, batch, input_size)
参数有:
    seq_len:序列长度,在NLP中就是句子长度,一般都会用pad_sequence补齐长度
    batch:每次喂给网络的数据条数,在NLP中就是一次喂给网络多少个句子
    input_size:特征维度,和前面定义网络结构的input_size一致。

前面也说到,如果LSTM的参数 batch_first=True,则要求输入的格式是:

input(batch, seq_len, input_size)

刚好调换前面两个参数的位置。其实这是比较好理解的数据形式,下面以NLP中的embedding向量说明如何构造LSTM的输入。

之前我们的embedding矩阵如下图:
在这里插入图片描述
如果把batch放在第一位,则三维矩阵的形式如下:
在这里插入图片描述
其转换过程如下图所示:
在这里插入图片描述
LSTM的另外两个输入是 h0 和 c0,可以理解成网络的初始化参数,用随机数生成即可。

h0(num_layers * num_directions, batch, hidden_size)
c0(num_layers * num_directions, batch, hidden_size)
参数:
    num_layers:隐藏层数
    num_directions:如果是单向循环网络,则num_directions=1,双向则num_directions=2
    batch:输入数据的batch
    hidden_size:隐藏层神经元个数

注意,如果我们定义的input格式是:

input(batch, seq_len, input_size)

则H和C的格式也是要变的:

h0(batch, num_layers * num_directions,  hidden_size)
c0(batch, num_layers * num_directions,  hidden_size)

4.3、LSTM的output格式

LSTM的输出是一个tuple,如下:

output,(ht, ct) = net(input)
    output: 最后一个状态的隐藏层的神经元输出
    ht:最后一个状态的隐含层的状态值
    ct:最后一个状态的隐含层的遗忘门值

output的默认维度是:

output(seq_len, batch, hidden_size * num_directions)
ht(num_layers * num_directions, batch, hidden_size)
ct(num_layers * num_directions, batch, hidden_size)

和input的情况类似,如果我们前面定义的input格式是:

input(batch, seq_len, input_size)

则ht和ct的格式也是要变的:

ht(batc,num_layers * num_directions, h, hidden_size)
ct(batc,num_layers * num_directions, h, hidden_size)

说了这么多,我们回过头来看看ht和ct在哪里,请看下图:
在这里插入图片描述
output在哪里?请看下图:
在这里插入图片描述

4.4 LSTM笔记

在这里插入图片描述
在这里插入图片描述

5、LSTM和其他网络组合

还记得吗,output的维度等于隐藏层神经元的个数,即hidden_size,在一些时间序列的预测中,会在output后,接上一个全连接层,全连接层的输入维度等于LSTM的hidden_size,之后的网络处理就和BP网络相同了,如下图:在这里插入图片描述
用pytorch实现上面的结构:

import torch
from torch import nn

class RegLSTM(nn.Module):
    def __init__(self):
        super(RegLSTM, self).__init__()
        # 定义LSTM
        self.rnn = nn.LSTM(input_size, hidden_size, hidden_num_layers)
        # 定义回归层网络,输入的特征维度等于LSTM的输出,输出维度为1
        self.reg = nn.Sequential(
            nn.Linear(hidden_size, 1)
        )

    def forward(self, x):
        x, (ht,ct) = self.rnn(x)
        seq_len, batch_size, hidden_size= x.shape
        x = y.view(-1, hidden_size)
        x = self.reg(x)
        x = x.view(seq_len, batch_size, -1)
        return x
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195030.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • SNMP协议详解

    SNMP协议详解SNMP协议详解简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议。在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案;由于SNMP的简单性,在Internet时代得到了蓬勃的发展,1992年发布了SNMPv2版本,以增强SNMPv1的安全性和功能。现在,已经有了SNMPv3版本。…

    2022年10月17日
  • C语言教你怎么改变字体颜色

    C语言教你怎么改变字体颜色初学c的小伙伴可能已经对那个黑底白字的框有些厌倦了,不妨加点颜色,增加加可读性.

  • 软件测试工作基本流程[通俗易懂]

    软件测试工作基本流程[通俗易懂]最近在为面试新工作做准备,所以想想整理一下软件测试的基本工作流程,大致梳理一遍,这样也便于自己在面试过程中可以沉着的面对面试官的测试工作如何进行的问题。首先,作为测试人员需要学习并了解业务,分析需求点为什么测试人员要参加需求分析?也就是进行测试需求分析的目的是什么?第一、把用户需求转化为功能需求:1)对测试范围进度量2)对处理分支进行度量3)对需…

  • mysql useradd_useradd 创建用户

    mysql useradd_useradd 创建用户useradd创建用户1.命令功能useradd创建一个新用户或者更改默认新用户信息。2.语法格式useraddoptionusernameuseradd-Doption参数选项选项选项说明-c新用户passwd文件中的说明栏(冒号分割第5栏)-d新用户的登录时的家目录-e用户被禁用时间。零时账号日期YYYY-MM-DD格式。-g指定用户对应组,用户组必须为系统现有组名称。-…

    2022年10月24日
  • python sobel滤波_Sobel滤波器

    python sobel滤波_Sobel滤波器一.sobel滤波器介绍sobel滤波器常用来提取灰度图像的水平边缘(水平特征)和竖直边缘(竖直特征)二.sobel算子纵向算子,提取图像水平边缘↑横向算子,提取图像竖直边缘↑三.实验:python实现sobel算子并将算子作用于图像importcv2importnumpyasnp#GrayscaledefBGR2GRAY(img):b=img[:,:,0].cop…

    2022年10月25日
  • W3C标准与规范「建议收藏」

    W3C标准与规范「建议收藏」W3C标准,即一系列标准的集合,他的本质是结构标准语言。就像平时使用的HTML、CSS等都需要遵守这些标准。万维网联盟创建于1994年,是web技术领域最具权威和影响力的国际中立性技术标准机构。它有效促进了web技术相互之间的兼容。就像网页是由三部分组成:结构、表现和行为。那么他对应的标准也分三方面:1.结构化标准语言:HTML。可扩展标记语言(XML):最初设计目的是弥补HTML的不

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号