Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature request] 使用 tf.data API 重构数据输入管道 #398

Closed
luozhouyang opened this issue Jul 9, 2020 · 9 comments
Closed

[Feature request] 使用 tf.data API 重构数据输入管道 #398

luozhouyang opened this issue Jul 9, 2020 · 9 comments
Assignees
Labels
enhancement New feature or request

Comments

@luozhouyang
Copy link

Is your feature request related to a problem? Please describe.
就如 #336 所描述的,训练数据很大内存无法加载所有训练数据的情况在实际应用中很常见,generator的方式其实也不是很灵活,例如在整个数据集上做shuffle

Describe the solution you'd like
使用tf.dataAPI构建强大的高性能的数据输入管道

Describe alternatives you've considered

Additional context

@luozhouyang luozhouyang added the enhancement New feature or request label Jul 9, 2020
@luozhouyang
Copy link
Author

如果有需要,我可以提供一个pull request。不过这个部分重构改动比较大,需要讨论一下代码结构组织等等。

@BrikerMan
Copy link
Owner

目前 v2 分支已经通过 generator 实现了超大数据的加载和 shuffle. 不直接使用 tf.data 是因为发现 tf.data 和 processor 结合使用比较麻烦。可以参考一下

for sample in self:

当然如果有更好的解决办法可以讨论看看的~

@BrikerMan
Copy link
Owner

BrikerMan commented Jul 9, 2020

按照 Kashgari 理念,需要支持用户直接输入分词后的句子即可,后续构建词表 和 padding 等操作都需要内置实现。tf.data 对于不定长文本数据支持还是不够好,文档也不全。

@luozhouyang
Copy link
Author

tf.data 对于不定长文本数据支持不够好

能具体说一说吗?因我个人使用tf.data构建Seq2Seq模型的输入都OK的啊。tf.data可以按照batch最长序列进行padding,也可以按照指定最大长度进行padding,也可以按照数据长度进行分桶,减少计算量。同时也可以对数据进行各种转换。

另外,我个人感觉把词典构建和数据输入管道构建过程解耦开来会比较好。词典可以使用单独的一个工具来生成,然后Tokenizer负责加载词典进行分词、ID转化,数据输入管道利用Tokenizer,可以让用户直接提供原始文本,即可构建完整的训练输入管道。

@BrikerMan
Copy link
Owner

解耦是可以的,但是解耦让用户自己处理了,那么市面上这种工具很多,Kashgari 的定位和存在就没有太多必要了。这个也是我一直坚持让用户能够使用文本数据直接 fit 的原因。

可以看看你的 seq2seq tf.data 构建代码么?

@luozhouyang
Copy link
Author

TransformerTextFileDatasetBuilder

目前上面这个实现没有加入按照长度分桶。

可以在tensorflow/nmt找到例子。

@BrikerMan
Copy link
Owner

如果对 Kashgari 改造,你的思路如何呢?可以讨论看看

@luozhouyang
Copy link
Author

我看你的代码已经大致完成了genrator构建输入管道。如果generator能解决上述问题,那就用generator吧。没必要再搞一套tf.data的。如果以后有遇到必须使用tf.data的场景,再来考虑这个事情。

@BrikerMan
Copy link
Owner

我看你的代码已经大致完成了genrator构建输入管道。如果generator能解决上述问题,那就用generator吧。没必要再搞一套tf.data的。如果以后有遇到必须使用tf.data的场景,再来考虑这个事情。

嗯嗯,generator 更加灵活一些,顺便也帮忙多看看 TF2 版本还有没有什么问题~ 欢迎提更多的建议意见~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants