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 相关文章推荐
探索Python3.4中新引入的asyncio模块
Apr 08 Python
Python实用日期时间处理方法汇总
May 09 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
pygame实现简易飞机大战
Sep 11 Python
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
OpenCV 模板匹配
Jul 10 Python
TensorFlow设置日志级别的几种方式小结
Feb 04 Python
pycharm 添加解释器的方法步骤
Aug 31 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 Python
pandas按条件筛选数据的实现
Feb 20 Python
浅析Python中的套接字编程
Jun 22 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 应用程序的安全 -- 不能违反的四条安全规则
2006/11/26 PHP
php中使用redis队列操作实例代码
2013/02/07 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
PHP中echo和print的区别
2014/08/28 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
禁止js文件缓存的代码
2010/04/09 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
js 通过cookie实现刷新不变化树形菜单
2014/10/30 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
使用JavaScript破解web
2018/09/28 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
2017/06/27 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
python实现梯度下降法
2020/03/24 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
人力资源经理的岗位职责
2014/03/02 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
国旗下讲话演讲稿
2014/05/08 职场文书
感恩教育月活动总结
2014/07/07 职场文书
python xlwt模块的使用解析
2021/04/13 Python
原生JS中应该禁止出现的写法
2021/05/05 Javascript
Python四款GUI图形界面库介绍
2022/06/05 Python