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

2024-06-02 06:59:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个TensorFlow数据集,包含将近15000张彩色图像,分辨率为168*84,每个图像都有标签。其类型和形状如下:

<;连接数据集形状:((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)
.
.
.

我试着把每个张量转换成np.数组(我想这是上面函数的正确类型)使用tf.评估()和np.拉威尔(). 但我失败了。在

那么,我如何将这个数据集转换成正确的类型来传递给函数呢?在

加上

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

谢谢。在


Tags: 数据函数图像layer类型inputtftensorflow
3条回答

您可以尝试立即执行,以前我用session run给出了一个答案(如下所示)。
在急切执行期间,对张量使用.numpy()会将该张量转换为numpy数组。
示例代码(来自我的用例):


    #enable eager execution
    from __future__ import absolute_import, division, print_function, unicode_literals
    import tensorflow as tf
    tf.enable_eager_execution()
    print('Is executing eagerly?',tf.executing_eagerly())      

    #load datasets
    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 
    train_A=train_horses.batch(1000).make_one_shot_iterator().get_next()[0].numpy()
    print(train_A.shape)

    #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()

旧,会话运行,回答:

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

^{pr2}$

我还需要完成这个任务(从数据集到数组),但不需要打开急切模式。我想出了以下办法:

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,)的张量的数据集开始。在

由于eager已关闭,我们需要通过Tensorflow会话运行数据集。由于会话需要张量,所以我们必须将数据集转换为张量。在

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

我们现在使用TensorArray.concat()将整个数组转换为一个张量。然而,当我们这样做时,整个数据集变成了一个一维数组。所以我们需要tf.reshape()把它恢复到原来的张量形状,再加上一个额外的维度来将它们全部叠加起来。在

最后我们用张量,在一个会话中运行它。这就给了我们新的机会。在

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

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

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

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

相关问题 更多 >