tensor2tensor 修改记

  • 因为要用自己的翻译数据集合LDC,但是tensor2tensor中只有wmt18 enzh的数据集合处理方法,因此仿照这他写一个自己的。(主要是因为wmt18的数据集太大了有几千万条数据,做个试验得好几天,所以先在一个小的数据集上试验,如果好了再试试大的数据集)。
  • 先找到Enzh WMTproblem类,可以看到叫32k的原因是因为词表的大小差不多是32k
@registry.register_problem
class TranslateEnzhWmt32k(translate.TranslateProblem):
  @property
  def approx_vocab_size(self):
    return 2**15  # 32k
  • train_dataset差不多是长这样
datasets = train_dataset = _NC_TRAIN_DATASETS = [[
    "http://data.statmt.org/wmt18/translation-task/training-parallel-nc-v13.tgz", [
        "training-parallel-nc-v13/news-commentary-v13.zh-en.en",
        "training-parallel-nc-v13/news-commentary-v13.zh-en.zh"
    ]
]]  # 里面只有一个item
  • source_datasets大概长这样
source_datasets = [[item[0], [item[1][0]]] for item in train_dataset]  # dataset name
source_datasets = [[
["http://data.statmt.org/wmt18/translation-task/training-parallel-nc-v13.tgz"],
["training-parallel-nc-v13/news-commentary-v13.zh-en.en"]
]]

生成source的词典

source_vocab = generator_utils.get_or_generate_vocab(
    data_dir,
    tmp_dir,
    self.source_vocab_name,
    self.approx_vocab_size,
    source_datasets,
    file_byte_budget=1e8,
    max_subtoken_length=self.max_subtoken_length)
  • generate_lines_for_vocab
  • vocab_generator里面得到的句子大概是这样的,是经过处理的句子,因此接下来的部分我们没有必要看了,只需要把vocab_generator的部分换成我们自己的数据集即可。

总的处理逻辑

  • 传入参数中各个字段所表示的含义,这个是要按照他的格式来写的否则就运行不了。
  • compile_data的含义就是对.sgm后缀的文件进行处理,然后写到.lang1文件里面,根据我的观察,解析出来的文件和原来的文件news-commentary-v13.zh-en.en是差不多的,只是少了一行。
  • 返回的是一个字典,有两项,一个是inputs表示源数据,一个是targets是目标数据,在这个函数中只进行了序列化和数字化,没有进行截断和填充

总结

  • 所以说source[0]中的urlbasename的文件如果没有出现在tmp_dir目录里中那么就会下载相应的文件或者压缩包。
training-parallel-nc-v13.tgz
  • source[1]中的文件如果没有出现在tmp_dir文件夹中,那么就会解压刚才下载的压缩包,然后从里面读取文件(这里的文件是处理好的news-commentary-v13.zh-en.zh)一行一个数据,用来生成词表。
  • 整个generate_encoded_samples返回值是一个生成器,生成器返回的是一个字典,字典有两项,一个是inputs表示源数据,一个是targets是目标数据,这两个都是一个列表。
  • 因此如果要改传入数据的话
    • 为了能让生成单词表,要修改generate_lines_for_vocab中的url相关代码,因为此时的数据在本地,不用url下载。并且把解压缩相关的代码也注释掉,在tmp_dir目录下创建和for source in sources: source[1]里面命名一样的文件即可,其他部分包括get_or_generate_vocab_inner都不用改,因为他的目的是在data_dir目录下创建一个词表。
    • 对于生成训练数据,只需要给text_problems.text2text_tex_iterator中传入source(lang1)target(lang2)文件名即可,translate.compile_data的目的也是了从.sgm文件中解析文件。

Vocab

  • vocab命名和data_filename有关,data_filenameproblem基类中的定义是默认是注册名字。因此如果要让vocab适应现在的任务的话,只用注册的时候名字不一样,只用改动函数generate_text_for_vocab即可。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容