Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow:将`tf.data.Dataset`迭代器转换为张量_Python_Tensorflow - Fatal编程技术网

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

Python Tensorflow:将`tf.data.Dataset`迭代器转换为张量,python,tensorflow,Python,Tensorflow,我有一个数据集,作为新的tf.Datasets模块中的tf.data.dataset。当然,tf.data.Dataset是一个例子的迭代器,但是我需要将这个迭代器转换成一个完整的张量,其中包含加载到内存中的所有数据。我正在处理文本数据,为了提取语料库的词汇表进行标记化,我实际上需要一次完整的文本语料库 当然,我可以编写一个循环来实现这一点,但我想知道是否有一种更矢量化或更快的方法来实现相同的任务。谢谢 我至少可以提供代码的开头。注意:我正在使用Tensorflow 2.0a尝试并为转换做好准备

我有一个数据集,作为新的
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'
iter=imdb\u train.batch(10)。重复(1)。生成一个\u shot\u迭代器()
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
---->1 imdb\u train=imdb\u train.batch(10)。重复(1)。生成一个快照迭代器()
AttributeError:“RepeatDataset”对象没有属性“make\u one\u shot\u 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
遗憾的是,对于普通张量没有类似于标记器的实用程序,我需要这样转换它们,但哦,好吧,它仍然处于alpha阶段

3.标记您的数据 由于
TF2.0
和它的
eager
模式,您可以使用
one_shot\u 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]

你不需要一次加载整个语料库(你真的不应该)。您可以将
tf.data.Dataset
.map
与类似的自定义functor一起使用(您知道,我并不是在这里插入答案或其他任何东西)
Tensorflow数据集
library及其应用程序在这里也会有所帮助。词汇收集程序应该可以很好地使用这两个概念进行编码。@SzymonMaszke感谢您的评论。是的,你在这里遇到了很多挫折。因此,为了提取完整的词汇表,我需要迭代整个数据集——这样我就知道我获得了所有可能的单词。下面是一个使用标记器的示例——请参阅接受的答案。这是一个不同的东西,我的意思是比你链接的方法更现代、更可读。通过
map
作为
tf.data.Dataset
进行迭代应该是可行的。虽然我真的不确定在NLP的情况下,从长远来看,
tensorflow
和它的
tf.data.Dataset
抽象是否方便使用(例如,柠檬化)。如果我是你,我会改变框架(如果你可以的话)。如果你能给我提供示例
tf.data.Dataset
,我可能会解决一些问题。我添加了一些代码——至少是尽我所能。新的Tensorflow数据集似乎没有遵循
tf.data.Dataset
spec 100%,因此出于某种原因,我无法创建迭代器。不确定这是不是Tensorflow 2.0的问题?我们的想法是迭代这个过程,识别单词并将它们分配给ID。有一个tf.lookup函数用于为id分配字符串:哦,非常感谢@SzymonMaszke。是的,我通常自己处理图像,但也尝试探索文本。非常感谢你的努力。我至少可以从你能生产的东西开始,然后从那里开始。