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解决鸡兔同笼问题的方法
Dec 20 Python
Python赋值语句后逗号的作用分析
Jun 08 Python
深入理解Python分布式爬虫原理
Nov 23 Python
Python 查看list中是否含有某元素的方法
Jun 27 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
django使用LDAP验证的方法示例
Dec 10 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
Dec 24 Python
django框架基于模板 生成 excel(xls) 文件操作示例
Jun 19 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
Python WSGI 规范简介
Apr 11 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 Python
Python函数中的不定长参数相关知识总结
Jun 24 Python
Python数据类型最全知识总结
May 31 #Python
教你怎么用Python操作MySql数据库
Django集成富文本编辑器summernote的实现步骤
Python基础知识学习之类的继承
May 31 #Python
Django实现聊天机器人
Python趣味挑战之教你用pygame画进度条
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 #Python
You might like
全国FM电台频率大全 - 12 安徽省
2020/03/11 无线电
实现php加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
ajax php 实现写入数据库
2009/09/02 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
基于PHP文件操作的详解
2013/06/05 PHP
php5.5中类级别的常量使用介绍
2013/10/02 PHP
PHP 实现公历日期与农历日期的互转换
2017/09/13 PHP
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
JS实现换肤功能的方法实例详解
2019/01/30 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
python简单实现旋转图片的方法
2015/05/30 Python
Python实现控制台进度条功能
2016/01/04 Python
python实现TF-IDF算法解析
2018/01/02 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
优秀党支部事迹材料
2014/01/14 职场文书
宿舍打麻将检讨书
2014/01/24 职场文书
党建目标管理责任书
2014/07/25 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
党员教师四风自我剖析材料
2014/09/30 职场文书
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript