有没有一种简单的方法可以在 a 中获取整个元素集tf.data.Dataset
?即我想将数据集的批量大小设置为我的数据集的大小,而无需专门传递元素的数量。这对于我想一次性测量整个数据集的准确性的验证数据集很有用。我很惊讶没有一种方法可以获取tf.data.Dataset
6 回答
在TensorFlow 2.0 中
for element in Xtrain.as_numpy_iterator():
print(element)
简而言之,没有获得尺寸/长度的好方法;tf.data.Dataset
是为数据管道构建的,因此具有迭代器结构(根据我的理解并根据我对 Dataset ops code 的阅读。来自程序员指南:
A
tf.data.Iterator
提供了从数据集中提取元素的主要方法。执行时返回的操作Iterator.get_next()
产生 Dataset 的下一个元素,通常充当输入管道代码和模型之间的接口。
而且,就其本质而言,迭代器没有方便的大小/长度概念。在这里看到:Getting number of elements in an iterator in Python
更一般地说,为什么会出现这个问题?如果你正在调用batch
,你也会得到一个tf.data.Dataset
,所以无论你在批处理上运行什么,你都应该能够在整个数据集上运行;它将遍历所有元素并计算验证准确性。换句话说,我认为您实际上并不需要尺寸/长度来做您想做的事情。
tf.data
API 创建一个'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
不确定这在最新版本的 TensorFlow 中是否仍然有效,但如果这是绝对需要的,一个 hacky 解决方案是创建一个大于数据集大小的批次。您不需要知道数据集有多大,只需请求更大的批量即可。
添加约翰的答案:
total = []
for element in val_ds.as_numpy_iterator():
total.append(element[1])
all_total = np.concatenate(total)
print(all_total)