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 相关文章推荐
gearman的安装启动及python API使用实例
Jul 08 Python
浅析Python中的多进程与多线程的使用
Apr 07 Python
Python中的XML库4Suite Server的介绍
Apr 14 Python
约瑟夫问题的Python和C++求解方法
Aug 20 Python
python开发中module模块用法实例分析
Nov 12 Python
点球小游戏python脚本
May 22 Python
python3 http提交json参数并获取返回值的方法
Dec 19 Python
Python selenium根据class定位页面元素的方法
Feb 26 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
Python 串口读写的实现方法
Jun 12 Python
Python3 列表,数组,矩阵的相互转换的方法示例
Aug 05 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
Feb 05 Python
Python数据类型最全知识总结
May 31 #Python
教你怎么用Python操作MySql数据库
Django集成富文本编辑器summernote的实现步骤
Python基础知识学习之类的继承
May 31 #Python
Django实现聊天机器人
Python趣味挑战之教你用pygame画进度条
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 #Python
You might like
php实现的一段简单概率相关代码
2016/05/30 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
laravel通用化的CURD的实现
2019/12/13 PHP
js控制表单操作的常用代码小结
2013/08/15 Javascript
javascript 数组操作详解
2015/01/29 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
浅谈Angular2 模块懒加载的方法
2017/10/04 Javascript
vue脚手架中配置Sass的方法
2018/01/04 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
vue1.0和vue2.0的watch监听事件写法详解
2018/09/11 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
Python实现的ini文件操作类分享
2014/11/20 Python
Python 性能优化技巧总结
2016/11/01 Python
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
2019/08/19 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
印尼披萨外送专家:Domino’s Pizza印尼
2017/12/28 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
超市后勤自我鉴定
2014/01/17 职场文书
计算机数据库专业职业生涯规划书
2014/02/08 职场文书
《纸船和风筝》教学反思
2014/02/15 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
家庭困难证明
2014/10/12 职场文书
2014年审计工作总结
2014/11/17 职场文书
企业安全生产检查制度
2015/08/06 职场文书
Python中的套接字编程是什么?
2021/06/21 Python