我就废话不多说了,大家还是直接看代码吧~

print(np.shape(X))#(1920, 45, 20)

X=sequence.pad_sequences(X, maxlen=100, padding='post')

print(np.shape(X))#(1920, 100, 20)

model = Sequential()

model.add(Masking(mask_value=0,input_shape=(100,20)))

model.add(LSTM(128,dropout_W=0.5,dropout_U=0.5))

model.add(Dense(13,activation='softmax'))

model.compile(loss='categorical_crossentropy',

optimizer='adam',

metrics=['accuracy'])

# 用于保存验证集误差最小的参数,当验证集误差减少时,保存下来

checkpointer = ModelCheckpoint(filepath="keras_rnn.hdf5", verbose=1, save_best_only=True, )

history = LossHistory()

result = model.fit(X, Y, batch_size=10,

nb_epoch=500, verbose=1, validation_data=(testX, testY),

callbacks=[checkpointer, history])

model.save('keras_rnn_epochend.hdf5')

补充知识:RNN(LSTM)数据形式及Padding操作处理变长时序序列dynamic_rnn

Summary

RNN

样本一样,计算的状态值和输出结构一致,也即是说只要当前时刻的输入值也前一状态值一样,那么其当前状态值和当前输出结果一致,因为在当前这一轮训练中权重参数和偏置均未更新

RNN的最终状态值与最后一个时刻的输出值一致

输入数据要求格式为,shape=(batch_size, step_time_size, input_size),那么,state的shape=(batch_size, state_size);output的shape=(batch_size, step_time_size, state_size),并且最后一个有效输出(有效序列长度,不包括padding的部分)与状态值会一样

LSTM

LSTM与RNN基本一致,不同在于其状态有两个c_state和h_state,它们的shape一样,输出值output的最后一个有效输出与h_state一致

用变长RNN训练,要求其输入格式仍然要求为shape=(batch_size, step_time_size, input_size),但可指定每一个批次中各个样本的有效序列长度,这样在有效长度内其状态值和输出值原理不变,但超过有效长度的部分的状态值将不会发生改变,而输出值都将是shape=(state_size,)的零向量(注:RNN也是这个原理)

需要说明的是,不是因为无效序列长度部分全padding为0而引起输出全为0,状态不变,因为输出值和状态值得计算不仅依赖当前时刻的输入值,也依赖于上一时刻的状态值。其内部原理是利用一个mask matrix矩阵标记有效部分和无效部分,这样在无效部分就不用计算了,也就是说,这一部分不会造成反向传播时对参数的更新。当然,如果padding不是零,那么padding的这部分输出和状态同样与padding为零的结果是一样的

'''

#样本数据为(batch_size,time_step_size, input_size[embedding_size])的形式,其中samples=4,timesteps=3,features=3,其中第二个、第四个样本是只有一个时间步长和二个时间步长的,这里自动补零

'''

import pandas as pd

import numpy as np

import tensorflow as tf

train_X = np.array([[[0, 1, 2], [9, 8, 7], [3,6,8]],

[[3, 4, 5], [0, 10, 110], [0,0,0]],

[[6, 7, 8], [6, 5, 4], [1,7,4]],

[[9, 0, 1], [3, 7, 4], [0,0,0]],

[[9, 0, 1], [3, 3, 4], [0,0,0]]

])

sequence_length = [3, 1, 3, 2, 2]

train_X.shape, train_X[:,2:3,:].reshape(5, 3)

tf.reset_default_graph()

x = tf.placeholder(tf.float32, shape=(None, 3, 3)) # 输入数据只需能够迭代并符合要求shape即可,list也行,shape不指定表示没有shape约束,任意shape均可

rnn_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=6) # state_size[hidden_size]

lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=6) # state_size[hidden_size]

outputs1, state1 = tf.nn.dynamic_rnn(rnn_cell, x, dtype=tf.float32, sequence_length=sequence_length)

outputs2, state2 = tf.nn.dynamic_rnn(lstm_cell, x, dtype=tf.float32, sequence_length=sequence_length)

with tf.Session() as sess:

sess.run(tf.global_variables_initializer()) # 初始化rnn_cell中参数变量

outputs1, state1 = sess.run((outputs1, state1), feed_dict={x: train_X})

outputs2, state2 = sess.run([outputs2, state2], feed_dict={x: train_X})

print(outputs1.shape, state1.shape) # (4, 3, 5)->(batch_size, time_step_size, state_size), (4, 5)->(batch_size, state_size)

print(outputs2.shape) # state2为LSTMStateTuple(c_state, h_state)

print("---------output1state1-----------")

print(outputs1) # 可以看出output1的最后一个时刻的输出即为state1, 即output1[:,-1,:]与state1相等

print(state1)

print(np.all(outputs1[:,-1,:] == state1))

print("---------output2state2-----------")

print(outputs2) # 可以看出output2的最后一个时刻的输出即为LSTMStateTuple中的h

print(state2)

print(np.all(outputs2[:,-1,:] == state2[1]))

再来怼怼dynamic_rnn中数据序列长度tricks

思路样例代码

from collections import Counter

import numpy as np

origin_data = np.array([[1, 2, 3],

[3, 0, 2],

[1, 1, 4],

[2, 1, 2],

[0, 1, 1],

[2, 0, 3]

])

# 按照指定列索引进行分组(看作RNN中一个样本序列),如下为按照第二列分组的结果

# [[[1, 2, 3], [0, 0, 0], [0, 0, 0]],

# [[3, 0, 2], [2, 0, 3], [0, 0, 0]],

# [[1, 1, 4], [2, 1, 2], [0, 1, 1]]]

# 第一步,将原始数据按照某列序列化使之成为一个序列数据

def groupby(a, col_index): # 未加入索引越界判断

max_len = max(Counter(a[:, col_index]).values())

for i in set(a[:, col_index]):

d[i] = []

for sample in a:

d[sample[col_index]].append(list(sample))

# for key in d:

# d[key].extend([[0]*a.shape[1] for _ in range(max_len-len(d[key]))])

return list(d.values()), [len(_) for _ in d.values()]

samples, sizes = groupby(origin_data, 2)

# 第二步,根据当前这一批次的中最大序列长度max(sizes)作为padding标准(不同批次的样本序列长度可以不一样,但同一批次要求一样(包括padding的部分)),当然也可以一次性将所有样本(不按照批量)按照最大序列长度padding也行,可能空间浪费

paddig_samples = np.zeros([len(samples), max(sizes), 3])

for seq_index, seq in enumerate(samples):

paddig_samples[seq_index, :len(seq), :] = seq

paddig_samples

以上这篇keras在构建LSTM模型时对变长序列的处理操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

本文标题: keras在构建LSTM模型时对变长序列的处理操作

本文地址: http://www.cppcns.com/jiaoben/python/324123.html

lstm 变长序列_keras在构建LSTM模型时对变长序列的处理操作相关推荐

  1. python里res有什么用_python – 为什么在tensorflow中构建resnet模型时使用固定填充...

    假设我们的步幅为2,内核大小为3. 使用带填充的tf.layers.conv2d相同: 情况1: pad| |pad inputs: 0 |1 2 3 4 5 |0 |_______| |______ ...

  2. 如何在验证集加噪声_如何使用Python构建机器学习模型

    如何使用Python构建机器学习模型?在构建机器学习模型时,我们希望将误差保持在尽可能低的水平.对于任何打算学习Python进行大数据分析的人来说,这都是一项关键技能.误差的两个主要来源是偏差和方差. ...

  3. 时序预测构建ARIMA模型时报错:NotImplementedError: statsmodels.tsa.arima_model.ARMA and statsmodels.tsa.arima_

    在我时序预测构建ARIMA模型时出现报错: NotImplementedError: statsmodels.tsa.arima_model.ARMA and statsmodels.tsa.arim ...

  4. 使用keras构建LSTM分类器

    使用keras构建LSTM分类器 LSTM是什么? Long short term memory 长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解 ...

  5. 使用LSTM神经网络进行音乐合成(数据格式,模型构建,完整源码)

    本文章将讲解如何借用机器学习框架Tensorflow和Keras,构建LSTM神经网络模型,通过学习音乐数据,来自动合成一段音乐. 训练的原始音乐数据为:下载试听 合成的音乐例子:下载试听 完整代码( ...

  6. lstm需要优化的参数_使用PyTorch手写代码从头构建LSTM,更深入的理解其工作原理...

    这是一个造轮子的过程,但是从头构建LSTM能够使我们对体系结构进行更加了解,并将我们的研究带入下一个层次. LSTM单元是递归神经网络深度学习研究领域中最有趣的结构之一:它不仅使模型能够从长序列中学习 ...

  7. lstm中look_back的大小选择_使用PyTorch手写代码从头构建LSTM,更深度的理解其工作原理

    这是一个造轮子的过程,但是从头构建LSTM能够使我们对体系结构进行更加了解,并将我们的研究带入下一个层次. LSTM单元是递归神经网络深度学习研究领域中最有趣的结构之一:它不仅使模型能够从长序列中学习 ...

  8. lstm实例:构建lstm模型过程

    参考连接: LSTM系列_3.1~3.3.第一个LSTM小例子:Keras中LSTM建模的5个核心步骤(python)_日拱一卒-CSDN博客_lstm python 例子 1.定义网络 我们将构建一 ...

  9. pytorch笔记:构建LSTM网络,实现训练验证和测试过程

    文章目录 LSTM many to one型 构建模型 数据归一化和分割 训练和验证过程 测试过程 many to many型   关于LSTM和RNN,可以看我的 blog,关于pytorch的一些 ...

最新文章

  1. mysql 手动写时间_关于数据库中如何存储时间的一点思考
  2. 谷歌取得量子计算突破:200秒完成经典计算机10000年计算任务
  3. codevs1002 搭桥
  4. getopt实现传参自动识别
  5. 为 Sublime Text 3059 配置 PHP 编译环境
  6. php调用百度天气接口,php使用百度天气接口示例
  7. Android官方开发文档Training系列课程中文版:数据存储之文件存储
  8. python菜单函数_Python 自学笔记- 列表及其内置函数
  9. promise封装读取文件
  10. 照片宽高比怎么设置_视频号在哪里打开?怎么开通视频号?98页的视频号运营手册请收好...
  11. OpenCV 与 Matlab 中最小二乘法拟合直线数据不一致的问题
  12. SWAT模型 建模方法、实例应用、高级进阶
  13. 增长研究:电子烟巨头JUUL未公开的增长启示
  14. MOSFET手册解读MOS管参数解读(转)
  15. 经验系列之java拦截器获取POST入参导致@RequestBody参数丢失问题解决
  16. NXP S32K1 Timer之LPIT模块Driver分析
  17. 国内数据资源共享平台介绍
  18. python课程设计小结和体会_关于课程设计心得体会
  19. 球与球的碰撞检测java测试_cocos 躲避球游戏(2) --资源导入和碰撞检测
  20. HP电池警告,系统侦测到电池可储存容量过低,为了最佳效能,这颗电池可能需要更换。主电池(601),Enter-继续启动,解决方法

热门文章

  1. jsoncpp 构造空数组
  2. 推荐一个SAM文件中flag含义解释工具--转载
  3. 安卓程序如何保证低内存下依然存在
  4. SQL   PL/SQL   SQL*PLUS三者的区别
  5. INotifyPropertyChanged 接口
  6. LNMP 环境遇到的权限问题
  7. scrapy爬取百万小说
  8. k8s实现jenkins master-slave分布式构建方案
  9. kafka发送及消费消息示例
  10. 解决phoenix中创建的表名及字段默认是大写的问题