char-rnn-tensorflow源码解析及结构流程分析
char-rnn-tensorflow由飞飞弟子karpathy编写,展示了如何用tensorflow来搭建一个基本的RNN(LSTM)网络,并进行基于char的seq2seq进行训练。
数据读取部分
data文件夹下的input.txt为示例用的莎翁剧本,在数据读取阶段的preprocess函数中,将基于该文本文件生产词汇表文件vocal.pkl(记录词的索引)和data.npy(将训练用的文字转换成索引的文件)。

其中,self.vocab就是组织的字典文件,给出任意char能查询到它的index,如[(3:c),(25:y)....]。如果是第一次读取,Self.char(索引对应字符)被dump到vocab.pkl文件中。读取的文字素材内容也通过查字典文件的方式被
转成索引队列,存入tensor变量和data.npy文件中。
接下来确定每一批训练用的Batch的数据:

最终得到一个epoch需要训练的batch数量,训练数据x_batch和y_batch(y_batch[i]存储了x_batch[i+1]的char,并在结尾处循环),两者都是长度为num_batch的list,每一个item是一个batch需要训练的数据tensor(或标签数据),
即batch_size组数据(上图的第一个50),每一组数据有seq_length个word(上图的第二个50)。
model的建立
这里使用了rnn.BasicLSTMCell,也就是基本的LSTM来构建cell,隐层单元数为args.rnn_size(默认128个),一个cell中的layer层数为2.隐层单元的个数也就对应了训练出来的词的dense-vector的维度,隐层单元的矩阵类似于
word2vec中训练用的隐层矩阵。模型中的placeholder参数self.input_data和self.target的shape为[args.batch_size, args.seq_length],经过embedding查找后,被转化为稠密向量inputs(长度为batch_size的list,每一个item的
shape为[args.seq_length,args.rnn_size],如上所述,args.rnn_size即是dense-vector的维度,每一个word由dense-vector维度的词向量来表示)

上例将embedding矩阵初始化为one-hot编码的对角矩阵,如果不进行初始化(就像char-rnn例子里面一样),则数据会在initial的时候被随机初始化,如下图:


最终,input会被压成一个长度为num_steps的列表,每个元素是[batch_size, input_size]的2-D维的tensor

MultiRNNCell函数构造了一个时间步的多层rnn

legacy_seq2seq.rnn_decoder负责实现将其循环num_steps个时间步,这里的num_step就等价于seq_length。

这里附上rnn_decoder的伪代码

接下来就是手动求导 手动优化了:

训练完成后,Sample的流程总体上中规中矩,每次喂一个char给模型,吐出一个char,重复设定的num次。不过比较奇怪的是最后一步,在chars_size维的结果向量中选取最大概率的索引时,使用了一个奇怪的函数,


char-rnn-tensorflow源码解析及结构流程分析的更多相关文章
- Flink 源码解析 —— 项目结构一览
Flink 源码项目结构一览 https://t.zsxq.com/MNfAYne 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...
- Sentinel源码解析一(流程总览)
引言 Sentinel作为ali开源的一款轻量级流控框架,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性.相比于Hystrix,Sentinel的设计更加简 ...
- Tensorflow源码解析1 -- 内核架构和源码结构
1 主流深度学习框架对比 当今的软件开发基本都是分层化和模块化的,应用层开发会基于框架层.比如开发Linux Driver会基于Linux kernel,开发Android app会基于Android ...
- tensorflow源码解析系列文章索引
文章索引 framework解析 resource allocator tensor op node kernel graph device function shape_inference 拾遗 c ...
- 顺序线性表 ---- ArrayList 源码解析及实现原理分析
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7738888.html ------------------------------------ ...
- Thinkphp6源码分析之解析,Thinkphp6路由,Thinkphp6路由源码解析,Thinkphp6请求流程解析,Thinkphp6源码
Thinkphp6源码解析之分析 路由篇-请求流程 0x00 前言: 第一次写这么长的博客,所以可能排版啊,分析啊,什么的可能会比较乱.但是我大致的流程已经觉得是说的够清楚了.几乎是每行源码上都有注释 ...
- tensorflow源码解析之framework拾遗
把framework中剩余的内容,按照文件名进行了简单解析.时间原因写的很仓促,算是占个坑,后面有了新的理解再来补充. allocation_description.proto 一个对单次内存分配结果 ...
- tensorflow源码解析之common_runtime-executor-上
目录 核心概念 executor.h Executor NewLocalExecutor ExecutorBarrier executor.cc structs GraphView ExecutorI ...
- tensorflow源码解析之framework-allocator
目录 什么是allocator 内存分配器的管理 内存分配追踪 其它结构 关系图 涉及的文件 迭代记录 1. 什么是allocator Allocator是所有内存分配器的基类,它定义了内存分配器需要 ...
随机推荐
- iOS - 设置系统类似的方法弃用警告的方式
在开发过程中,调用系统方法时,经常可以看xCode 提示 该方法已弃用,如下图: 觉得特别炫,查一下资料,如果自己也想实现如下的效果,只需要采用系统的如下几个关键字加在方法名后面就可以了: NS_DE ...
- 0c-适配 iOS 11
参考路径:https://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653579210&idx=1&sn=d5ea8d46c ...
- Python学习之-- IO 操作
阻塞IO / 非阻塞IO /IO多路复用 / 异步IO 说明:同步IO包含(阻塞IO / 非阻塞IO /IO多路复用),因为他们有个共同特性就是都需要内核态到用户态的一个等待. 基本概念解释,环境限定 ...
- git修改commit message及vi编辑器的简单使用
1.修改commit信息 git commit --amend 2.进入vi编辑器修改 ‘i’进入insert模式,输入文字: ‘esc’回到命令模式,删除文字,移动光标: ‘:’进入底行模式,‘wq ...
- java面向对象基础编程题
第一题: 设计一个形状类Shape,方法:求周长和求面积.形状类的子类:Rect(矩形),Circle(圆形).Rect类的子类:Square(正方形).不同的子类会有不同的计算周长和面积的方法1.总 ...
- lombok注解简化实体类getting 和 setting 方法
实体类注解,将以往的get/set方法简化为标签注解,让代码看着更简洁. Maven依赖: <dependency> <groupId>org.projectlombok< ...
- HDU1087 Super Jumping! Jumping! Jumping!(LIS)
题目意思: http://acm.hdu.edu.cn/showproblem.php? pid=1087 此题的意思求最长上升子序列的和. 题目分析: 在求最长上升子序列的时候,不在保存最长的个数, ...
- 常见machine learning模型实现
一.感知机模型 二.线性回归(Linear Regression) from numpy import * def loadData(filename): x = [] y = [] f = open ...
- Bag-of-words模型、TF-IDF模型
Bag-of-words model (BoW model) 最早出现在NLP和IR(information retrieval)领域. 该模型忽略掉文本的语法和语序, 用一组无序的单词(words) ...
- Visual Studio VS如何拷贝一个项目的窗体文件到另一个项目
1 比如下我有一个项目,我要把这个Config整个窗体和代码拷贝到另一个项目 2 在新项目中添加现有项,然后把这个窗体相关的三个文件都添加到新的项目中 3 然后在新窗体中就什么都有了 ...