如何将Tensorflow数据集转换为2D numpy数组

时间:2018-05-19 00:31:35

标签: python tensorflow

我有一个TensorFlow数据集,其中包含近15000个多色图像,每个图像的分辨率为168 * 84,标签为。它的类型和形状是这样的:

< ConcatenateDataset形状:((168,84,3,)()),类型:(tf.float32,tf.int32)>

我需要用它来训练我的网络。这就是为什么我需要将它作为参数传递给我构建我的图层的函数:

def cnn_model_fn(features, labels, mode):

  input_layer = tf.reshape(features["x"], [-1, 168, 84, 3])
  # Convolutional Layer #1
  conv1 = tf.layers.conv2d(
     inputs=input_layer,
     filters=32,
     kernel_size=[5, 5],
     padding="same",
     activation=tf.nn.relu)
.
.
.

我试图通过使用tf.eval()和np.ravel()将每个张量转换为np.array(这是上面函数的正确类型,我猜)。但我失败了。

那么,如何将此数据集转换为正确的类型以将其传递给函数?

我是python和tensorflow的新手,如果我们不能直接使用它们来构建图层,我不认为我理解为什么会有数据集(我在TensorFlow的网站btw中遵循教程)。

感谢。

3 个答案:

答案 0 :(得分:1)

这听起来不像您使用Tensorflow数据集管道进行设置,以下是执行此操作的指南:

https://www.tensorflow.org/programmers_guide/datasets

你可以遵循那个(这是正确的方法,但是有一个小的学习曲线可以习惯它),或者你可以将numpy数组传递给sess.run作为{{1}的一部分参数。如果你这样做,那么你应该创建一个feed_dict,它将由tf.placeholder中的值填充。这里的许多基本教程示例都遵循这种方法:

https://github.com/aymericdamien/TensorFlow-Examples

答案 1 :(得分:1)

我最近遇到了这个问题,我这样做是这样的:


    #load datasets
    import tf
    import tensorflow_datasets as tfds
    dataset, metadata = tfds.load('cycle_gan/horse2zebra',
                                  with_info=True, as_supervised=True)
    train_horses, train_zebras = dataset['trainA'], dataset['trainB']

    #load dataset in to numpy array
    sess = tf.compat.v1.Session()
    tra=train_horses.batch(1000).make_one_shot_iterator().get_next()
    train_A=np.array(sess.run(tra)[0])
    print(train_A.shape)
    sess.close()

    #preview one of the images
    import matplotlib.pyplot as plt
    %matplotlib inline
    import numpy as np
    print(train_A.shape)
    plt.imshow(train_A[1])
    plt.show()

答案 2 :(得分:0)

我还需要完成此任务(将数据集转换为数组),但是无需打开eager模式。我设法提出以下建议:

dataset = tf.data.Dataset.from_tensor_slices([[1,2],[3,4]])

tensor_array = tf.TensorArray(dtype=dataset.element_spec.dtype,
                              size=0,
                              dynamic_size=True,
                              element_shape=dataset.element_spec.shape)
tensor_array = dataset.reduce(tensor_array, lambda a, t: a.write(a.size(), t))
tensor = tf.reshape(tensor_array.concat(), (-1,)+tuple(dataset.element_spec.shape))
array = tf.Session().run(tensor)

print(type(array))
# <class 'numpy.ndarray'>

print(array)
# [[1 2]
#  [3 4]]

这是什么:
我们从一个包含2个(2,)形状的张量的数据集开始。

由于渴望已不存在,我们需要通过Tensorflow会话运行数据集。而且由于会话需要张量,因此我们必须将数据集转换为张量。

为此,我们使用Dataset.reduce()(象征性地)将所有元素放入TensorArray中。

我们现在使用TensorArray.concat()将整个数组转换为单个张量。但是,当我们执行此操作时,整个数据集将变为一维数组。因此,我们需要tf.reshape()使其恢复到原始张量的形状,再加上一个额外的维度以将它们全部堆叠起来。

最后,我们获取张量并在会话中运行它。这给了我们numpy ndarray。