How to make tf.data.Dataset return all of the elements in one call?
是否有一种简单的方法来获取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #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 |
简而言之,没有一种获得尺寸/长度的好方法。
A
tf.data.Iterator provides the main way to extract elements from a dataset. The operation returned byIterator.get_next() yields the next element of a Dataset when executed, and typically acts as the interface between input pipeline code and your model.
而且,就其本质而言,迭代器没有方便的大小/长度概念。参见此处:在Python中获取迭代器中的元素数量
但是,更一般而言,为什么会出现此问题?如果您正在调用
不知道这是否仍然可以在TensorFlow的最新版本中使用,但是如果绝对需要这样做,一个棘手的解决方案是创建一个大于数据集大小的批处理。您无需知道数据集有多大,只需请求更大的批量即可。