12

有没有一种简单的方法可以在 a 中获取整个元素集tf.data.Dataset?即我想将数据集的批量大小设置为我的数据集的大小,而无需专门传递元素的数量。这对于我想一次性测量整个数据集的准确性的验证数据集很有用。我很惊讶没有一种方法可以获取tf.data.Dataset

4

6 回答 6

4

TensorFlow 2.0 中

您可以使用as_numpy_iterator枚举数据集

for element in Xtrain.as_numpy_iterator(): 
  print(element) 
于 2020-04-20T23:14:46.480 回答
3

简而言之,没有获得尺寸/长度的好方法;tf.data.Dataset是为数据管道构建的,因此具有迭代器结构(根据我的理解并根据我对 Dataset ops code 的阅读。来自程序员指南

Atf.data.Iterator提供了从数据集中提取元素的主要方法。执行时返回的操作Iterator.get_next()产生 Dataset 的下一个元素,通常充当输入管道代码和模型之间的接口。

而且,就其本质而言,迭代器没有方便的大小/长度概念。在这里看到:Getting number of elements in an iterator in Python

更一般地说,为什么会出现这个问题?如果你正在调用batch,你也会得到一个tf.data.Dataset,所以无论你在批处理上运行什么,你都应该能够在整个数据集上运行;它将遍历所有元素并计算验证准确性。换句话说,我认为您实际上并不需要尺寸/长度来做您想做的事情。

于 2018-01-06T13:00:47.580 回答
2

tf.dataAPI 创建一个'tensors/component'使用适当的前缀/后缀调用的张量(如果适用)。创建实例后。您可以按名称评估张量并将其用作批量大小。

#Ignore the warnings
import warnings
warnings.filterwarnings("ignore")

import pandas as pd
import tensorflow as tf
import numpy as np

import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (8,7)
%matplotlib inline


from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/")

Xtrain = mnist.train.images[mnist.train.labels < 2]
ytrain = mnist.train.labels[mnist.train.labels < 2]

print(Xtrain.shape)
#(11623, 784)
print(ytrain.shape)
#(11623,)  

#Data parameters
num_inputs = 28
num_classes = 2
num_steps=28

# create the training dataset
Xtrain = tf.data.Dataset.from_tensor_slices(Xtrain).map(lambda x: tf.reshape(x,(num_steps, num_inputs)))
# apply a one-hot transformation to each label for use in the neural network
ytrain = tf.data.Dataset.from_tensor_slices(ytrain).map(lambda z: tf.one_hot(z, num_classes))
# zip the x and y training data together and batch and Prefetch data for faster consumption
train_dataset = tf.data.Dataset.zip((Xtrain, ytrain)).batch(128).prefetch(128)

iterator = tf.data.Iterator.from_structure(train_dataset.output_types,train_dataset.output_shapes)
X, y = iterator.get_next()

training_init_op = iterator.make_initializer(train_dataset)

def get_tensors(graph=tf.get_default_graph()):
    return [t for op in graph.get_operations() for t in op.values()]

get_tensors()
#<tf.Tensor 'tensors_1/component_0:0' shape=(11623,) dtype=uint8>,
#<tf.Tensor 'batch_size:0' shape=() dtype=int64>,
#<tf.Tensor 'drop_remainder:0' shape=() dtype=bool>,
#<tf.Tensor 'buffer_size:0' shape=() dtype=int64>,
#<tf.Tensor 'IteratorV2:0' shape=() dtype=resource>,
#<tf.Tensor 'IteratorToStringHandle:0' shape=() dtype=string>,
#<tf.Tensor 'IteratorGetNext:0' shape=(?, 28, 28) dtype=float32>,
#<tf.Tensor 'IteratorGetNext:1' shape=(?, 2) dtype=float32>,
#<tf.Tensor 'TensorSliceDataset:0' shape=() dtype=variant>,
#<tf.Tensor 'MapDataset:0' shape=() dtype=variant>,
#<tf.Tensor 'TensorSliceDataset_1:0' shape=() dtype=variant>,
#<tf.Tensor 'MapDataset_1:0' shape=() dtype=variant>,
#<tf.Tensor 'ZipDataset:0' shape=() dtype=variant>,
#<tf.Tensor 'BatchDatasetV2:0' shape=() dtype=variant>,
#<tf.Tensor 'PrefetchDataset:0' shape=() dtype=variant>]

sess = tf.InteractiveSession()
print('Size of Xtrain: %d' % tf.get_default_graph().get_tensor_by_name('tensors/component_0:0').eval().shape[0])
#Size of Xtrain: 11623
于 2018-11-24T00:12:18.257 回答
1

不确定这在最新版本的 TensorFlow 中是否仍然有效,但如果这是绝对需要的,一个 hacky 解决方案是创建一个大于数据集大小的批次。您不需要知道数据集有多大,只需请求更大的批量即可。

于 2018-06-05T16:04:40.117 回答
1

TensorFlowget_single_element()终于可以做到这一点 -一次调用中返回所有元素。

这避免了使用.map()or生成和使用迭代器的需要iter()(这对于大数据集来说可能代价高昂)。

get_single_element()返回封装数据集所有成员的张量(或张量的元组或字典)。我们需要将数据集的所有成员批量传递到单个元素中。

这可用于获取作为张量数组的特征,或者作为元组或字典(张量数组)的特征和标签,具体取决于原始数据集的创建方式。

在 SO 上查看这个答案,以获取将特征和标签解包到张量数组元组中的示例。

于 2021-08-19T16:42:23.823 回答
0

添加约翰的答案:

total = []
for element in val_ds.as_numpy_iterator(): 
  total.append(element[1])

all_total = np.concatenate(total)
print(all_total)
于 2021-06-18T15:18:31.237 回答