pointer-network是最近seq2seq比较火的一个分支,在基于深度学习的阅读理解,摘要系统中都被广泛应用。

感兴趣的可以阅读原paper 推荐阅读

https://medium.com/@devnag/pointer-networks-in-tensorflow-with-sample-code-14645063f264

 
 

这个思路也是比较简单
就是解码的预测限定在输入的位置上
这在很多地方有用

比如考虑机器翻译的大词典问题,词汇太多了很多词是长尾的,词向量训练是不充分的,那么seq2seq翻译的时候很难翻译出这些词
另外专名什么的
很多是可以copy到
解码输出的

另外考虑文本摘要,很多时候就是要copy输入原文中的词,特别是长尾专名
更好的方式是copy而不是generate

 
 

网络上有一些pointer-network的实现,比较推荐

 https://github.com/ikostrikov/TensorFlow-Pointer-Networks

这个作为入门示例比较好,使用简单的static rnn 实现更好理解,当然 dynamic速度更快,但是从学习角度

先实现static更好一些。

Dynamic rnn的 pointer network实现

https://github.com/devsisters/pointer-network-tensorflow 

这里对static rnn实现的做了一个拷贝并做了小修改,改正了其中的一些问题
参见
https://github.com/chenghuige/hasky/tree/master/applications/pointer-network/static

 
 

这个小程序对应的应用是输入一个序列
比如,输出排序结果

 
 

我们的构造数据

python dataset.py

EncoderInputs: [array([[ 0.74840968]]), array([[ 0.70166106]]), array([[ 0.67414996]]), array([[ 0.9014052]]), array([[ 0.72811645]])]

DecoderInputs: [array([[ 0.]]), array([[ 0.67414996]]), array([[ 0.70166106]]), array([[ 0.72811645]]), array([[ 0.74840968]]), array([[ 0.9014052]])]

TargetLabels: [array([[ 3.]]), array([[ 2.]]), array([[ 5.]]), array([[ 1.]]), array([[ 4.]]), array([[ 0.]])]

 
 

训练过程中的eval展示:

2017-06-07 22:35:52 0:28:19 eval_step: 111300 eval_metrics:

['eval_loss:0.070', 'correct_predict_ratio:0.844']

label--: [ 2 6 1 4 9 7 10 8 5 3 0]

predict: [ 2 6 1 4 9 7 10 8 5 3 0]

label--: [ 1 6 2 5 8 3 9 4 10 7 0]

predict: [ 1 6 2 5 3 3 9 4 10 7 0]

 
 

大概是这样
第一个我们认为是预测完全正确了,
第二个预测不完全正确

 
 

原程序最主要的问题是 Feed_prev 设置为True的时候 原始代码有问题的 因为inp使用的是decoder_input这是不正确的因为

预测的时候其实是没有decoder_input输入的,原代码预测的时候decoder input强制copy/feed了encoder_input

这在逻辑是是有问题的。 实验效果也证明修改成训练也使用encoder_input来生成inp效果好很多。

 
 

那么关于feed_prev我们知道在预测的时候是必须设置为True的因为,预测的时候没有decoder_input我们的下一个输出依赖

上一个预测的输出。

训练的时候我们是用decoder_input序列训练(feed_prev==False)还是也使用自身预测产生的结果进行下一步预测feed_prev==True呢

参考tensorflow官网的说明

In the above invocation, we set feed_previous to False. This means that the decoder will use decoder_inputstensors as provided. If we set feed_previous to True, the decoder would only use the first element of decoder_inputs. All other tensors from this list would be ignored, and instead the previous output of the decoder would be used. This is used for decoding translations in our translation model, but it can also be used during training, to make the model more robust to its own mistakes, similar to Bengio et al., 2015 (pdf).

 
 

来自 <https://www.tensorflow.org/tutorials/seq2seq>

 
 

这里使用

train.sh

train-no-feed-prev.sh
做了对比实验

训练时候使用feed_prev==True效果稍好(红色) 特别是稳定性方差小一些

 
 

 
 

Pointer-network的tensorflow实现-1的更多相关文章

  1. Convolutional Neural Network in TensorFlow

    翻译自Build a Convolutional Neural Network using Estimators TensorFlow的layer模块提供了一个轻松构建神经网络的高端API,它提供了创 ...

  2. (转)The Road to TensorFlow

    Stephen Smith's Blog All things Sage 300… The Road to TensorFlow – Part 7: Finally Some Code leave a ...

  3. TensorFlow简易学习[3]:实现神经网络

    TensorFlow本身是分布式机器学习框架,所以是基于深度学习的,前一篇TensorFlow简易学习[2]:实现线性回归对只一般算法的举例只是为说明TensorFlow的广泛性.本文将通过示例Ten ...

  4. TensorFlow tutorial

    代码示例来自https://github.com/aymericdamien/TensorFlow-Examples tensorflow先定义运算图,在run的时候才会进行真正的运算. run之前需 ...

  5. 5个最好的TensorFlow网络课程

    1. Introduction to TensorFlow for Artificial Intelligence, Machine Learning and Deep Learning This c ...

  6. Recurrent Neural Network[Content]

    下面的RNN,LSTM,GRU模型图来自这里 简单的综述 1. RNN 图1.1 标准RNN模型的结构 2. BiRNN 3. LSTM 图3.1 LSTM模型的结构 4. Clockwork RNN ...

  7. 改善深层神经网络-week3编程题(Tensorflow 实现手势识别 )

    TensorFlow Tutorial Initialize variables Start your own session Train algorithms Implement a Neural ...

  8. Convolutional Neural Network-week1编程题(TensorFlow实现手势数字识别)

    1. TensorFlow model import math import numpy as np import h5py import matplotlib.pyplot as plt impor ...

  9. 吴恩达课后习题第二课第三周:TensorFlow Introduction

    目录 第二课第三周:TensorFlow Introduction Introduction to TensorFlow 1 - Packages 1.1 - Checking TensorFlow ...

随机推荐

  1. MSP430F5529学习记录

    个人学习理解,难免有错,望各位大佬指出错误,不胜感激 有些引脚在单片机上没看到,在原理图上可以找得到,说明这些引脚没有引出来 单片机上的引出的引脚是可以外部操作的,有些不必要引出的就直接在单片机内部 ...

  2. db2 reorgchk

    db2 reorgchk 命令是最重要的.也是经常被忽略的 DB2 调整命令之一. db2 reorgchk 命令被忽略是因为它不是一个一次性调整项.由于更新是在 DB2 数据库上执行的,因此关于表的 ...

  3. CSS_盒子模型

    2016-10-22 <css入门经典>第6章 1.每个HTML元素对应于一个显示盒子,但不是所有的元素都显示在屏幕上. 2.HTML元素显示为CSS显示盒子的真正方法称为“可视格式化方式 ...

  4. 【数位dp】Beautiful Numbers @2018acm上海大都会赛J

    目录 Beautiful Numbers PROBLEM 题目描述 输入描述: 输出描述: 输入 输出 MEANING SOLUTION CODE Beautiful Numbers PROBLEM ...

  5. 【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348

    目录 Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 MEA ...

  6. JS——事件流与事件处理程序

    1.事件流:从页面中接收事件的顺序 1.1 IE :事件冒泡流1.2 Netscape :事件捕获1.3 DOM事件流 :事件捕获阶段——事件目标阶段——事件冒泡阶段DOM2级事件规定 :捕获阶段不会 ...

  7. Spring quartz 单机、集群+websocket集群实现文本、图片、声音、文件下载及推送、接收及显示

    相关环境 Nginx,Spring5.x当前(要选择4.0+),tomcat9.x或8.x都可以,Quartz 2.x集群(实际运用是Quartz的集群模式和单机模式共存的) 测试面页:http:// ...

  8. Node + Selenium使用小结

    可参考网上的步骤进行操作.例如这篇文章:https://wangheng3751.github.io/2018/01/17/selenium/ 1.安装Node.js,去官网下载最新版本的Node.j ...

  9. 在Mac平台上安装配置ELK时的一些总结

    一.前言 大数据处理是流行的一些表现,在不断壮大的数据处理中,怎么样处理数据才是我们继续做好开发的正道.本文章来自网络,不敢原创,但是也有很大借鉴.   二.MAC安装ELK   首先是安装elast ...

  10. Go 语言极速入门

    本系列文章主要是记录<Go 语言实战>和<Google 资深工程师深度讲解 Go 语言>的学习笔记. Go 语言极速入门1 - 环境搭建与最简姿势Go 语言极速入门2 - 基础 ...