Tensor2Tensor使用入门

1. 简介

Tensor2Tensor是google出品的一个神仙级工具包,能大大简化类似模型的开发调试时间。在众多的深度学习工具中,个人认为这货属于那种门槛还比较高的工具。并且google家的文档一向做得很辣鸡,都是直接看源码注释摸索怎么使用。

Tensor2Tensor的版本和Tensorflow版本是对应的,我电脑上是tensorflow 1.14.0,就这样安装了pip install tensor2tensor==1.14.1

2. 基础模块

import os
import tensorflow as tf

from tensor2tensor.utils import registry
from tensor2tensor.data_generators import text_encoder
from tensor2tensor.data_generators import problem
from tensor2tensor.data_generators.text_problems import Text2TextProblem
from tensor2tensor.data_generators.text_problems import VocabType
from tensor2tensor.models import transformer

text_encoder中预定义了一些把string转化为ids的类型。

problem不知道怎么说,看官方解释就行了,反正新增加任务都需要自己写个Problem类型。

Problems consist of features such as inputs and targets, and metadata such
as each feature's modality (e.g. symbol, image, audio) and vocabularies. Problem
features are given by a dataset, which is stored as a TFRecord file with tensorflow.Example protocol buffers. All
problems are imported in all_problems.py or are registered with @registry.register_problem.

这里是直接调用了models里面的transformers,如果自己该模型,还需要使用@registry.register_model注册模型。

3. Problems写法

最好看下Text2TextProblem模块的源码看下google的结构思路,以文本生成任务为例。

# 数据格式
想看你的美照<TAB>亲我一口就给你看

我亲两口<TAB>讨厌人家拿小拳拳捶你胸口
......

新建文件my_task.py

@registry.register_problem
class Seq2SeqDemo(Text2TextProblem):
    TRAIN_FILES = "train.txt"
    EVAL_FILES = "dev.txt"

    @property
    def vocab_type(self):
        # 见父类的说明

        return VocabType.TOKEN

    @property
    def oov_token(self):
        return "<UNK>"

    def _generate_vocab(self, tmp_dir):
        vocab_list = [self.oov_token]
        user_vocab_file = os.path.join(tmp_dir, "vocab.txt")
        with tf.gfile.GFile(user_vocab_file, "r") as vocab_file:
            for line in vocab_file:
                token = line.strip().split("\t")[0]
                vocab_list.append(token)
        token_encoder = text_encoder.TokenTextEncoder(None, vocab_list=vocab_list)
        return token_encoder

    def _generate_samples(self, data_dir, tmp_dir, dataset_split):
        del data_dir
        is_training = dataset_split == problem.DatasetSplit.TRAIN
        files = self.TRAIN_FILES if is_training else self.EVAL_FILES
        files = os.path.join(tmp_dir, files)
        with tf.gfile.GFile(files, "r") as fin:
            for line in fin:
                inputs, targets = line.strip().split("\t")
                yield {"inputs": inputs, "targets": targets}

    def generator_samples(self, data_dir, tmp_dir, dataset_split):
        vocab_filepath = os.path.join(data_dir, self.vocab_filename)
        if not tf.gfile.Exists(vocab_filepath):
            token_encoder = self._generate_vocab(tmp_dir)
            token_encoder.store_to_file(vocab_filepath)
        return self._generate_samples(data_dir, tmp_dir, dataset_split)

tmp_dir是真实的训练文本和字典存放的地方,data_dir是处理后的字典和TFRcord存在的地方。

关键就一个方法generator_samples,它有两个作用,读入字典转换数据文件方便后面转化为TFRecord的形式。

其中有个天坑,generator_samples_generator_samples我是故意拆开写的。如果合并了,因为生成器的性质,在没有遍历之前generator_samplesreturn之前的代码都不会执行。但是注意到父类中有个有个方法generate_encoded_samples其中有两行:

generator = self.generate_samples(data_dir, tmp_dir, dataset_split)
encoder = self.get_or_create_vocab(data_dir, tmp_dir)

generator_samples如果没有执行到token_encoder = self._generate_vocab(tmp_dir)self.get_or_create_vocab这边就直接炸了,找不到字典。因此,这两个函数不能拆开,problem调用结构就这样,暂时只知道这么改。

最后,还要添加transformer的模型参数,想了解参数请看transformer.transformer_base源码(°ー°〃)。

@registry.register_hparams
def my_param():
    hparams = transformer.transformer_base()
    hparams.summarize_vars = True
    hparams.num_hidden_layers = 4
    hparams.batch_size = 64
    hparams.max_length = 40
    hparams.hidden_size = 512
    hparams.num_heads = 8
    hparams.dropout = 0.1
    hparams.attention_dropout = 0.1
    hparams.filter_size = 1024
    hparams.layer_prepostprocess_dropout = 0.1
    hparams.learning_rate_warmup_steps = 1000
    hparams.learning_rate_decay_steps = 800
    hparams.learning_rate = 3e-5
    return hparams

4. 运行

首先生成TFRecod文件,执行命令

t2t_datagen \
    --t2t_usr_dir=/code_path (to my_task.py)
    --data_dir=/record_data_path
    --tmp_dir=/data_path
    --problem=Seq2SeqDemo

然后训练

t2t_trainer \
    --data_dir=/same_as_above
    --problem=Seq2SeqDemo
    --model=transformer
    --hparams_set=my_param
    --output_dir=~/output_dir
    --job-dir=~/output_dir
    --train_steps=8000
    --eval_steps=2000

训练好的模型进行预测(decode)

t2t_decoder \
    --data_dir=/same_as_above
    --problem=Seq2SeqDemo
    --model=transformer
    --hparams_set=my_param
    --output_dir=~/output_dir
    --decode_from_file=/dev_file_path
    --decode_to_file=/file_save_path
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容