Tensorflow与RNN、双向LSTM等的踩坑记录及解决


Posted in Python onMay 31, 2021

1、tensorflow(不定长)文本序列读取与解析

tensorflow读取csv时需要指定各列的数据类型。

但是对于RNN这种接受序列输入的模型来说,一条序列的长度是不固定。这时如果使用csv存储序列数据,应当首先将特征序列拼接成一列。

例如两条数据序列,第一项是标签,之后是特征序列

[0, 1.1, 1.2, 2.3] 转换成 [0, '1.1_1.2_2.3']

[1, 1.0, 2.5, 1.6, 3.2, 4.5] 转换成 [1, '1.0_2.5_1.6_3.2_4.5']

这样每条数据都只包含固定两列了。

读取方式是指定第二列为字符串类型,再将字符串按照'_'分割并转换为数字。

关键的几行代码示例如下:

def readMyFileFormat(fileNameQueue):
    reader = tf.TextLineReader()
    key, value = reader.read(fileNameQueue)

    record_defaults = [["Null"], [-1], ["Null"], ["Null"], [-1]]
    phone1, seqlen, ts_diff_strseq, t_cod_strseq, userlabel = tf.decode_csv(value, record_defaults=record_defaults)
    ts_diff_str = tf.string_split([ts_diff_strseq], delimiter='_')
    t_cod_str = tf.string_split([t_cod_strseq], delimiter='_')
    # 每个字符串转数字
    Str2Float = lambda string: tf.string_to_number(string, tf.float32)
    Str2Int = lambda string: tf.string_to_number(string, tf.int32)
    ts_diff_seq = tf.map_fn(Str2Float, ts_diff_str.values, dtype = tf.float32) # 一定要加上dtype,且必须与fn的输出类型一致
    t_cod_seq = tf.map_fn(Str2Int, t_cod_str.values, dtype = tf.int32)

2、时序建模的序列预测、序列拟合、标签预测,及输入数据格式

序列预测、拟合的“标签”都是序列本身,区别是未来时刻或者是当前时刻,当前时刻的拟合任务类似于antoencoder的reconstruction

标签预测常见于语言学建模,有单词级标签的分词与整句标签的情感分析,前者需要对每一个单词输入都要输出其分词标识,后者是取最后若干输出级联前馈神经网络分类器

keras的输入-输出对:需要将序列拆分成多个片段

序列形式:

按时间列表:static_bidirectional_rnn

多维数组:bidirectional_dynamic_rnn与stack_bidirectional_dynamic_rnn 变长双向rnn的正确使用姿势

3、多任务设置及相应的输出向量划分

对于标签预测任务,按需取输出即可

对于序列预测、拟合:

双向lstm:通常用于拟合。但如果需要捕捉动态信息,尽管需要序列完整输入,则仍可以加上正向预测与反向预测

单向lstm:拟合与预测

4、zero padding

后一般需要通过tf.boolean_mask()隔离这些零的影响,函数输入包括数据矩阵和补零位置的指示矩阵。

5、get_shape()方法

与 tf.shape() 类型区别,前者得到一个list,后者得到一个tensor

6、双向LSTM的信息瓶颈的解决

Tensorflow与RNN、双向LSTM等的踩坑记录及解决

如果在时间步的最后输出,则可能会导致开始的一些字符被遗忘门给遗忘。

所以这里就对每个时间步的输出做出了处理,

主要处理有:

1、拼接:把所有的输出拼接在一起。

2、Average

3、Pooling

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python切片用法实例教程
Sep 08 Python
python使用urllib2实现发送带cookie的请求
Apr 28 Python
基于python的Tkinter实现一个简易计算器
Dec 31 Python
Python yield与实现方法代码分析
Feb 06 Python
对python使用telnet实现弱密码登录的方法详解
Jan 26 Python
在Python中表示一个对象的方法
Jun 25 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
python suds访问webservice服务实现
Jun 26 Python
python中random.randint和random.randrange的区别详解
Sep 20 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
TensorFlow2.0使用keras训练模型的实现
Feb 20 Python
python中validators库的使用方法详解
Sep 23 Python
Python数据类型最全知识总结
May 31 #Python
教你怎么用Python操作MySql数据库
Django集成富文本编辑器summernote的实现步骤
Python基础知识学习之类的继承
May 31 #Python
Django实现聊天机器人
Python趣味挑战之教你用pygame画进度条
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 #Python
You might like
discuz Passport 通行证 整合笔记
2008/06/30 PHP
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
Extjs入门之动态加载树代码
2010/04/09 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
js post提交调用方法
2014/02/12 Javascript
果断收藏9个Javascript代码高亮脚本
2016/01/06 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
jQuery实现边框动态效果的实例代码
2016/09/23 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
js实现图片上传预览原理分析
2017/07/13 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
Python数据类型详解(二)列表
2016/05/08 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
pycham查看程序执行的时间方法
2018/11/29 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
Python+opencv+pyaudio实现带声音屏幕录制
2019/12/23 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
2021/03/04 Python
高性能装备提升营地:Kammok
2019/02/27 全球购物
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
信息专业个人的自我评价
2013/12/27 职场文书
大一军训感言
2014/01/09 职场文书
会计学自我鉴定
2014/02/06 职场文书
安全生产汇报材料
2014/02/17 职场文书
《雷雨》教学反思
2014/02/20 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
详解php中流行的rpc框架
2021/05/29 PHP