精华内容
下载资源
问答
  • 1. LSTM模型 输入参数理解 (Long Short-Term Memory) lstm是RNN模型的一种变种模式,增加了输入门,遗忘门,输出门。 LSTM也是在时间序列预测中的常用模型。 小白我也是从这个模型入门来开始机器学习的坑。 LSTM的...
  • LSTM模型学习

    2018-12-06 21:23:37
    基于python3.6实现的,Keras相关资源:LSTM预测模型训练,IMDB数据加载,国际旅行人数预测,IMDB影评分类预测,数据标准化,模型保存到本地,从本地加载训练好的模型,plt图形绘制,以及IMDB数据和国际旅行人数...
  • LSTM模型初学代码

    2018-11-02 00:14:49
    初学者所写,请谨慎尝试,欢迎指出不足!初学者所写,请谨慎尝试,欢迎指出不足!
  • 主要介绍了Python中利用LSTM模型进行时间序列预测分析的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • LSTM模型+数据——(多步+多变量输入)_(多步+多变量输出-亲测可行
  • 首先, 利用改进的1D-CNN-LSTM模型对滚动轴承6种不同的工作状态进行了分类识别实验, 实验结果表明提出的分类模型能够以较快的速度识别出滚动轴承的不同状态, 平均识别准确率达99.83%; 其次, 将提出的模型与部分传统...
  • 本文将主要讲述如何使用BLiTZ(PyTorch贝叶斯深度学习库)来建立贝叶斯LSTM模型,以及如何在其上使用序列数据进行训练与推理。 原创文章 54获赞 109访问量 18万+ 关注 私信 展开阅读全文 作者:deephub
  • 以基因工程领域为例利用主题概率模型识别WOS核心集中论文摘要数据研究热点主题并进行主题演化关联构建,然后选取BP神经网络、支持向量机及LSTM模型等3种典型机器学习算法进行预测分析,最后利用RE指标和精准度指标...
  • 在时间序列预测问题中,建立LSTM模型,采用python语言代码实现
  • 深度学习在自然语言处理中的应用,Tensorflow下构建LSTM模型进行序列化标注
  • 这是Ensemble TS-LSTM v1,v2和v3模型的Tensorflow实现,该论文来自论文和论文 。 您可以在或前一篇论文的。 这也是论文中的通用时间滑动LSTM(TS-LSTM模型的Tensorflow实现。 广义的TS-LSTM网络由多个TS-LSTM...
  • 基于TensorFlow的lstm模型,多维时序数据预测,可自行修改网络参数。
  • 亲测可行-(多步+多变量输入)_(多步+单变量输出)_LSTM模型
  • 在真实的热电联产供热数据上的实验表明,该模型比差分整合移动平均自回归、支持向量回归、CNN以及LSTM模型的预测效果更好,对比目前企业将预定量作为预测量的方法,预测缩放误差平均值(MASE)与均方根误差(RMSE)...
  • 为了更好地研究股指预测问题,提出了基于特征选取与LSTM模型的股指预测方法,该方法从优化特征参数选取角度对模型预测能力进行提升,包含全面选取特征参数、应用系统聚类法进行特征分类、应用主成分分析对分类特征...
  • 一种关注频率信息的时间序列模型:EMD-LSTM模型,方晓晨,雷钦礼,LSTM以其可以扑捉到时序数据内部长期的依赖关系在许多时间序列建模额领域里取得了极大的成功,但是它不能清晰地刻画出时序数据不�
  • https://blog.csdn.net/zxm_jimin/article/details/94742224
  • LSTM模型

    千次阅读 2020-08-22 14:26:29
    LSTM模型 一:简介: LSTM模型,是循环神经网络的一种变体,可以很有效的解决简单循环神经网络的梯度爆炸或消失问题。 二:优缺点: 优点:改善了RNN中存在的长期依赖问题;LSTM的表现通常比时间递归神经网络及隐...

    LSTM模型

    一:简介:
    LSTM模型,是循环神经网络的一种变体,可以很有效的解决简单循环神经网络的梯度爆炸或消失问题。

    二:优缺点:
    优点:改善了RNN中存在的长期依赖问题;LSTM的表现通常比时间递归神经网络及隐马尔科夫模型(HMM)更好;作为非线性模型,LSTM可作为复杂的非线性单元用于构造更大型深度神经网络。
    缺点:一个缺点是RNN的梯度问题在LSTM及其变种里面得到了一定程度的解决,但还是不够。它可以处理100个量级的序列,而对于1000个量级,或者更长的序列则依然会显得很棘手;另一个缺点是每一个LSTM的cell里面都意味着有4个全连接层(MLP),如果LSTM的时间跨度很大,并且网络又很深,这个计算量会很大,很耗时。

    三:代码实现

    from keras.datasets import mnist
    #加载数据
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    print('x_train.shape:',x_train.shape)
    print('x_test.shape:',x_test.shape)
    输出:
    ('x_train.shape:', (60000, 28, 28))
    ('x_test.shape:', (10000, 28, 28))
    #时间序列数量
    n_step = 28
    #每次输入的维度
    n_input = 28
    #分类类别数
    n_classes = 10
    #将数据转为28*28的数据(n_samples,height,width)
    x_train = x_train.reshape(-1, n_step, n_input)
    x_test = x_test.reshape(-1, n_step, n_input)
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    #标准化数据,因为像素值在0-255之间,所以除以255后数值在0-1之间
    x_train /= 255
    x_test /= 255
    #y_train,y_test 进行 one-hot-encoding,label为0-9的数字,所以一共10类
    y_train = keras.utils.to_categorical(y_train, n_classes)
    y_test = keras.utils.to_categorical(y_test, n_classes)
    #时间序列数量
    n_step = 28
    #每次输入的维度
    n_input = 28
    #分类类别数
    n_classes = 10
    #将数据转为28*28的数据(n_samples,height,width)
    x_train = x_train.reshape(-1, n_step, n_input)
    x_test = x_test.reshape(-1, n_step, n_input)
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    #标准化数据,因为像素值在0-255之间,所以除以255后数值在0-1之间
    x_train /= 255
    x_test /= 255
    #y_train,y_test 进行 one-hot-encoding,label为0-9的数字,所以一共10类
    y_train = keras.utils.to_categorical(y_train, n_classes)
    y_test = keras.utils.to_categorical(y_test, n_classes)
    from keras import Sequential
    from keras.layers import LSTM,Dense, Activation
    from keras import optimizers
    #使用Sequential,简单搭建lstm模型
    model = Sequential()
    #这个网络中,我们采用LSTM+Dense 层+激活层,优化函数采用Adam,
    #损失函数采用交叉熵,评估采用正确率。
    #学习率
    learning_rate = 0.001
    #每次处理的数量
    batch_size = 28
    #循环次数
    epochs = 20
    #神经元的数量
    n_lstm_out = 128
    #LSTM层
    model.add(LSTM(
            units = n_lstm_out,
            input_shape = (n_step, n_input)))
    #全连接层          
    model.add(Dense(units = n_classes))
    #激活层
    model.add(Activation('softmax'))
    #查看各层的基本信息
    model.summary()
    # 编译
    model.compile(
        optimizer = optimizers.Adam(lr = learning_rate),
        loss = 'categorical_crossentropy',
        metrics = ['accuracy'])
    #训练
    model.fit(x_train, y_train, 
              epochs = epochs, 
              batch_size= batch_size, 
              verbose = 1, 
              validation_data = (x_test,y_test))
    #评估
    score = model.evaluate(x_test, y_test, 
                           batch_size = batch_size, 
                           verbose = 1)
    print('loss:',score[0])
    print('acc:',score[1])
    展开全文
  • 论文介绍的LIC-LSTM模型的源代码:分层交织卷积LSTM 源代码以匿名方式提交给Github,以符合加拿大人工智能会议的双盲审查程序 要在字符预测任务上训练两层LIC-LSTM模型,请运行main_cnn_lstm_multi.m 该软件中的Adam...
  • [结果/结论] 实 验表明基于 LSTM 模型对热点主题未来发展趋势预测准确度最高,支持向量机预测效果次之,BP 神经网络预测 效果较差且预测稳定性不足,同时结合专家咨询和文献调研表明本文方法可快速识别基因领域研究...
  • 基于Spatio-LSTM模型的城市交通路网流量预测算法,高尚,李静林,在城市环境中,道路交通流量变化快速且受随机扰动影响强烈,给交通管理和通信资源分配带来诸多困难。针对交通流量预测问题,本文
  • 时间序列LSTM 简单的LSTM模型可分析虚拟时间序列数据
  • LSTM模型在C LSTM模型在C中的实现
  • Pytorch实现的LSTM模型结构

    千次阅读 2021-03-27 19:25:40
    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网络...

    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
    
    展开全文
  • 改进snapshot模型集成方法,增加样本权重调整方法,在训练单个LSTM模型的过程中得到多个具有不同权值的模型;利用得到的多个模型构造新数据集,在新数据集上训练逻辑回归模型。实验结果表明,该方法相比于单模型LSTM,可以...
  • Keras中创建LSTM模型的步骤

    千次阅读 多人点赞 2020-11-20 13:44:36
    目录写在前面概述环境1、定义...深度学习神经网络在 Python 中很容易使用 Keras 创建和评估,但您必须遵循严格的模型生命周期。 在这篇文章中,您将了解创建、训练和评估Keras中长期记忆(LSTM)循环神经网络的分步生

    写在前面

    本文是对The 5 Step Life-Cycle for Long Short-Term Memory Models in Keras的复现与解读,新手博主,边学边记,以便后续温习,或者对他人有所帮助

    概述

    深度学习神经网络在 Python 中很容易使用 Keras 创建和评估,但您必须遵循严格的模型生命周期。
    在这篇文章中,您将了解创建、训练和评估Keras中长期记忆(LSTM)循环神经网络的分步生命周期,以及如何使用训练有素的模型进行预测。
    阅读这篇文章后,您将知道:

    1. 如何定义、编译、拟合和评估 Keras 中的 LSTM;
    2. 如何为回归和分类序列预测问题选择标准默认值。;
    3. 如何将所有连接在一起,在 Keras 开发和运行您的第一个 LSTM 循环神经网络。
      可以参考Long Short-Term Memory Networks With Python,包含了所有示例的教程以及Python源代码文件

    环境

    本教程假定您安装了 Python SciPy 环境。此示例可以使用 Python 2 或 3。

    本教程假定您已使用 TensorFlow 或 Theano 后端安装了 Keras v2.0 或更高版本。

    本教程还假定您安装了scikit-learn、pandas、NumPy 和 Matplotlib。

    接下来,让我们来看看一个标准时间序列预测问题,我们可以用作此实验的上下文。

    1、定义网络

    第一步是定义您的网络。

    神经网络在 Keras 中定义为一系列图层。这些图层的容器是顺序类。

    第一步是创建顺序类的实例。然后,您可以创建图层,并按应连接它们的顺序添加它们。由内存单元组成的LSTM循环层称为LSTM()。通常跟随 LSTM 图层并用于输出预测的完全连接层称为 Dense()。

    例如,我们可以通过两个步骤完成操作:

    model = Sequential()
    model.add(LSTM(2))
    model.add(Dense(1))
    

    但是,我们也可以通过创建层数组并传递到序列的构造函数来一步完成。

    layers = [LSTM(2), Dense(1)]
    model = Sequential(layers)
    

    网络中的第一层必须定义预期输入数。输入必须是三维的,由Samples、Timesteps和Features组成。
    Samples:数据中的行
    Timesteps:特征的过去观测值
    features:数据中的列

    假设数据作为 NumPy 数组加载,您可以使用 NumPy 中的 reshape()函数将 2D 数据集转换为 3D 数据集。如果希望列成为一个特征的时间步长,可以使用:

    data = data.reshape((data.shape[0], data.shape[1], 1))
    

    如果希望 2D 数据中的列通过一个时间步成为特征,可以使用:

    data = data.reshape((data.shape[0], 1, data.shape[1]))
    

    您可以指定input_shape,该参数需要包含时间步长数和特征数的元组。例如,如果我们有两个时间步长和一个特征的单变量时间序列与两个滞后观测值每行,它将指定如下:

    model = Sequential()
    model.add(LSTM(5, input_shape=(2,1)))
    model.add(Dense(1))
    

    LSTM 图层可以通过将它们添加到顺序模型来堆叠。重要的是,在堆叠 LSTM 图层时,我们必须为每个输入输出一个序列而不是单个值,以便后续 LSTM 图层可以具有所需的 3D 输入。我们可以通过将"return_sequences true 来做到这一点。例如:

    model = Sequential()
    model.add(LSTM(5, input_shape=(2,1), return_sequences=True))
    model.add(LSTM(5))
    model.add(Dense(1))
    

    将顺序模型视为一个管道,最终输入原始数据,并在另一个数据中显示预测。

    这是 Keras 中的有用容器,因为传统上与图层关联的关注点也可以拆分并添加为单独的图层,清楚地显示它们在数据从输入到预测转换中的作用。

    例如,可以将从图层中每个神经元转换求和信号的激活函数提取并添加到序列中,作为称为"激活"的图层样对象。

    model = Sequential()
    model.add(LSTM(5, input_shape=(2,1)))
    model.add(Dense(1))
    model.add(Activation('sigmoid'))
    

    激活函数的选择对于输出层来说至关重要,因为它将定义预测将采用的格式。

    例如,下面是一些常见的预测建模问题类型以及可以在输出层中使用的结构和标准激活函数:

    回归:线性激活函数,或"linear",以及与输出数匹配的神经元数。
    二元分类:逻辑激活功能,或"sigmoid",一个神经元输出层。
    多类分类: Softmax激活函数,或"softmax",每个类值一个输出神经元,假设为一热编码的输出模式。

    2、编译网络

    一旦我们定义了我们的网络,我们必须编译它。

    编译是效率的一步。它将我们定义的简单层序列转换为一系列高效的矩阵转换,其格式旨在根据 Keras 的配置方式在 GPU 或 CPU 上执行。

    将编译视为网络的预计算步骤。定义模型后始终需要它。

    编译需要指定许多参数,这些参数是专为培训网络而定制的。具体来说,用于训练网络和用于评估优化算法最小化的网络的优化算法。

    例如,下面是编译定义的模型并指定随机梯度下降 (sgd) 优化算法和用于回归类型问题的均方误差 (mean_squared_error) 损失函数的示例。

    model.compile(optimizer='sgd', loss='mean_squared_error')
    

    或者,可以在作为编译步骤的参数提供之前创建和配置优化器。

    algorithm = SGD(lr=0.1, momentum=0.3)
    model.compile(optimizer=algorithm, loss='mean_squared_error')
    

    预测建模问题的类型对可以使用的损耗函数的类型施加了约束。

    例如,以下是不同预测模型类型的一些标准损耗函数:

    回归: 平均平方错误或"mean_squared_error"。
    二元分类: 对数损耗,也称为交叉熵或"binary_crossentropy"。
    多类分类: 多类对数丢失或"categorical_crossentropy"。
    最常见的优化算法是随机梯度下降,但 Keras 还支持一套其他最先进的优化算法,这些算法在很少或没有配置时运行良好。

    可能最常用的优化算法,因为它们通常更好的性能是:
    Stochastic Gradient Descent: 或"sgd",这需要调整学习速率和动量
    ADAM: 或"adam",这需要调整学习率。
    RMSprop: 或"rmsprop",这需要调整学习速率。
    最后,除了损失函数之外,还可以指定在拟合模型时要收集的指标。通常,要收集的最有用的附加指标是分类问题的准确性。要收集的指标按数组中的名称指定。

    例如:

    model.compile(optimizer='sgd', loss='mean_squared_error', metrics=['accuracy'])
    

    3、训练网络

    编译网络后,它可以训练数据,这意味着调整训练数据集上的权重。

    训练网络需要指定训练数据,包括输入模式矩阵 X 和匹配输出模式数组 y。

    网络采用反向传播算法进行训练,根据编译模型时指定的优化算法和损失函数进行优化。

    反向传播算法要求为网络指定训练轮数或对训练数据集。

    每一轮训练可以划分为称为批处理的输入输出模式对。这将定义在一轮训练内更新权重。这也是一种效率优化,确保一次不会将太多的输入数据加载到内存中。

    训练网络的最小示例如下:

    history = model.fit(X, y, batch_size=10, epochs=100)
    

    训练网络以后,将返回一个历史记录对象,该对象提供模型在训练期间性能的摘要。这包括在编译模型时指定的损失和任何其他指标,每一轮训练都记录下来。

    训练网络可能需要很长时间,从数秒到数小时到数天,具体取决于网络的大小和训练数据的大小。

    默认情况下,每一轮训练的命令行上将显示一个进度条。这可能给您带来太大的噪音,或者可能会给环境带来问题,例如,如果您是交互式笔记本或 IDE。

    通过将verbose参数设置为 2,可以将显示的信息量减小到每轮训练的损失。您可以通过将verbose设置为 1 来关闭所有输出。例如:

    history = model.fit(X, y, batch_size=10, epochs=100, verbose=0)
    

    4、评估网络

    一旦网络被训练,就可以评估它。

    网络可以根据训练数据进行评估,但这不能像以前看到的所有这些数据那样,提供网络作为预测模型的性能的有用指示。

    我们可以在单独的数据集上评估网络的性能,在测试期间看不到。这将提供网络在将来预测不可见数据时的性能估计。

    该模型评估所有测试模式的损失,以及编译模型时指定的任何其他指标,如分类准确性。返回评估指标列表。

    例如,对于使用精度指标编译的模型,我们可以在新数据集上对其进行如下评估:

    loss, accuracy = model.evaluate(X, y)
    

    与训练网络一样,提供了详细的输出,以给出模型评估的进度。我们可以通过将verbose参数设置为 0 来关闭此选项。

    loss, accuracy = model.evaluate(X, y, verbose=0)
    

    5、进行预测

    一旦我们对拟合模型的性能感到满意,我们就可以用它来预测新数据。

    这和使用一系列新输入模式在模型上调用predict() 函数一样简单。

    例如:

    predictions = model.predict(X)
    

    预测将返回网络输出层提供的格式。

    在回归问题的情况下,这些预测可能采用问题格式,由线性激活函数提供。

    对于二进制分类问题,预测可能是第一个类的概率数组,可以通过舍入转换为 1 或 0。

    对于多类分类问题,结果可能采用概率数组(假设一个热编码的输出变量),可能需要使用 argmax() NumPy 函数转换为单个类输出预测。

    或者,对于分类问题,我们可以使用 predict_classes)函数,该函数将自动将 uncrisp 预测转换为清晰的整数类值。

    predictions = model.predict_classes(X)
    

    与拟合和评估网络一样,提供详细的输出,以给出模型进行预测的进展。我们可以通过将verbose参数设置为 0 来关闭此选项。

    predictions = model.predict(X, verbose=0)
    

    一个LSTM示例

    让我们用一个简单的小例子将所有的模块整合到一起。
    此示例将使用学习 10 个数字序列的简单问题。我们将向网络显示一个数字,如 0.0,并期望它预测 0.1。然后显示 0.1,并期望它预测 0.2,等等到 0.9。
    定义网络: 我们将在网络中构建一个具有1个输入时间步长和1个输入特征的LSTM神经网络,在LSTM隐藏层中构建10个内存单元,在具有线性(默认)激活功能的完全连接的输出层中构建1个神经元。
    编译网络: 我们将使用有效的ADAM优化算法与默认配置和平均平方误差损失函数,因为它是一个回归问题。
    训练网络: 我们将网络训练1000轮,并使用与训练集中模式数相等的批处理大小。我们还将关闭所有详细输出。
    评估网络: 我们将在训练数据集上评估网络。通常,我们会在测试或验证集上评估模型。
    进行预测: 我们将对训练输入数据进行预测。同样,我们通常会对不知道正确答案的数据进行预测。
    完整的代码如下:

    # 使用LSTM学习序列数据示例
    from pandas import DataFrame
    from pandas import concat
    from keras.models import Sequential
    from keras.layers import Dense
    from keras.layers import LSTM
    # 创建序列
    length = 10
    sequence = [i/float(length) for i in range(length)]
    print(sequence)
    # 创建 X/y 对儿
    df = DataFrame(sequence)
    df = concat([df.shift(1), df], axis=1)
    df.dropna(inplace=True)
    # 转换LSTM格式
    values = df.values
    X, y = values[:, 0], values[:, 1]
    X = X.reshape(len(X), 1, 1)
    # 1. 定义网络
    model = Sequential()
    model.add(LSTM(10, input_shape=(1,1)))
    model.add(Dense(1))
    # 2. 编译网络
    model.compile(optimizer='adam', loss='mean_squared_error')
    # 3. 训练网络
    history = model.fit(X, y, epochs=1000, batch_size=len(X), verbose=0)
    # 4. 评估网络
    loss = model.evaluate(X, y, verbose=0)
    print(loss)
    # 5. 进行预测
    predictions = model.predict(X, verbose=0)
    print(predictions[:, 0])
    

    运行此示例将生成以下输出,显示 10 个数字的原始输入序列、对整个序列进行预测时网络的均平方误差损失以及每个输入模式的预测。

    注意: 由于算法或评估过程具有随机性,或数值精度的差异,您的结果可能会有所不同。考虑运行示例几次,并比较平均结果。

    我们可以看到序列学得很好,特别是如果我们把预测四舍五入到小数点位。
    运行结果

    总结

    在这篇文章中,您发现了使用 Keras 库的 LSTM 循环神经网络的 5 步生命周期。

    具体来说,您了解到:

    1、如何定义、编译、拟合、评估和预测 Keras 中的 LSTM 网络。
    2、如何选择激活函数和输出层配置的分类和回归问题。
    3、如何开发和运行您的第一个LSTM模型在Keras。

    展开全文
  • PSO-LSTM 组合模型对油中溶解气体的浓度进行预测。该模 型克服了依据经验选取参数而导致预测精度低的问题。算例分 析结果表明,相较于传统预测算法,所提方法可以更好地追踪 油中溶解气体浓度的变化规律,提高了...
  • 本文通过训练双向长短期记忆网络BiLSTM与注意力机制相结合的多层文本分类模型,将其应用到招聘信息分类中.该模型包括One-hot词向量输入层、BiLSTM层、注意力机制层和输出层.其中One-hot层构建招聘词典,节省了大量...
  • 在时间序列预测问题中,建立LSTM模型,采用python语言代码实现

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,332
精华内容 21,732
关键字:

lstm模型