gpt4 book ai didi

python - Tensorflow:将 `tf.data.Dataset` 迭代器转换为张量

转载 作者:行者123 更新时间:2023-12-01 07:58:03 25 4
gpt4 key购买 nike

我有一个数据集,它是来自新 tf.Datasets 模块的 tf.data.Dataset 。当然,tf.data.Dataset 是示例的迭代器,但我实际上需要将此迭代器转换为包含加载到内存中的所有数据的完整张量。我正在处理文本数据,为了提取语料库的词汇进行标记化,我实际上需要立即使用整个文本语料库。

我当然可以编写一个循环来执行此操作,但我想知道是否有更矢量化或更快速的方法来实现相同的任务。谢谢。

我至少可以提供代码的开头。请注意,我正在使用 Tensorflow 2.0a 来尝试为转换做好准备:

import tensorflow_datasets as tfds

# Download the data
imdb_builder = tfds.builder('imdb_reviews')
imdb_builder.download_and_prepare()

# Setup training test split
imdb_train = imdb_builder.as_dataset(split=tfds.Split.TRAIN)
imdb_test = imdb_builder.as_dataset(split=tfds.Split.TEST)

# Look at the specs on the dataset if you wish
# print(imdb_builder.info)

看一个例子。观察数据未标记化。

a, = imdb_train.take(1)
print(a['text'])

tf.Tensor(b"As a lifelong fan of Dickens, I have ...", shape=(), dtype=string)

这就是我陷入困境的地方。请注意,当尝试在此数据集上创建迭代器时,我收到了错误:

iter = imdb_train.batch(10).repeat(1).make_one_shot_iterator()

---------------------------------------------------------------------------

AttributeError Traceback (most recent call last)

<ipython-input-35-1bf70c474a05> in <module>()
----> 1 imdb_train = imdb_train.batch(10).repeat(1).make_one_shot_iterator()

AttributeError: 'RepeatDataset' object has no attribute 'make_one_shot_iterator'

最佳答案

1。数据加载

使用tfds.load更简单、更紧凑:

import tensorflow_datasets as tfds

train = tfds.load("imdb_reviews", as_supervised=True, split=tfds.Split.TRAIN)

2。词汇节省程序

非常简单,您可能想从零开始索引。

class Tokenizer:
def __init__(self):
self.vocab = {}
self._counter: int = 1
self.tokenizer = tfds.features.text.Tokenizer()

def __call__(self, text):
# Haven't found anything working with tf.tensor, oh sweet irony
tokens = self.tokenizer.tokenize(text.numpy())
for token in tokens:
if not token in self.vocab:
self.vocab[token] = self._counter
self._counter += 1

TBH 很遗憾,没有类似用于普通张量的tokenizer实用程序,我需要像这样转换它们,但是哦,好吧,它仍处于 alpha 阶段。

3。对您的数据进行标记

TF2.0 及其 eager 模式起,您可以使用循环轻松地使用 one_shot_iterator 和其他奇怪的想法进行迭代:

tokenizer = Tokenizer()

for text, _ in train:
tokenizer(text)

重要提示:您不必将所有内容加载到内存中,因为它是一个迭代器。尽管对于非常大的语料库,您可能会在 vocab 中遇到内存问题。

4。结果

打印项目及其索引:

print(list(tokenizer.vocab.keys())[:10])
print(list(tokenizer.vocab.values())[:10])

给我们:

['This', 'was', 'soul', 'provoking', 'I', 'am', 'an', 'Iranian', 'and', 'living']
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

关于python - Tensorflow:将 `tf.data.Dataset` 迭代器转换为张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55858099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com