我有一个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中遵循教程)。
感谢。
答案 0 :(得分:1)
这听起来不像您使用Tensorflow数据集管道进行设置,以下是执行此操作的指南:
https://www.tensorflow.org/programmers_guide/datasets
你可以遵循那个(这是正确的方法,但是有一个小的学习曲线可以习惯它),或者你可以将numpy数组传递给sess.run
作为{{1}的一部分参数。如果你这样做,那么你应该创建一个feed_dict
,它将由tf.placeholder
中的值填充。这里的许多基本教程示例都遵循这种方法:
答案 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。