Tensorflow tf.data.Dataset是否支持生成字典结构?
下面是来自[]的一段代码。在本例中,Tensorflow tf.data.Dataset是否支持生成字典结构?,tensorflow,tensorflow-datasets,tensorflow-estimator,Tensorflow,Tensorflow Datasets,Tensorflow Estimator,下面是来自[]的一段代码。在本例中,map函数是一个用于读取数据的用户定义函数。在map函数中,我们需要设置输出类型为[tf.uint8,label.dtype] import cv2 # Use a custom OpenCV function to read the image, instead of the standard # TensorFlow `tf.read_file()` operation. def _read_py_function(filename, label):
map
函数是一个用于读取数据的用户定义函数。在map
函数中,我们需要设置输出类型为[tf.uint8,label.dtype]
import cv2
# Use a custom OpenCV function to read the image, instead of the standard
# TensorFlow `tf.read_file()` operation.
def _read_py_function(filename, label):
image_decoded = cv2.imread(image_string, cv2.IMREAD_GRAYSCALE)
return image_decoded, label
# Use standard TensorFlow operations to resize the image to a fixed shape.
def _resize_function(image_decoded, label):
image_decoded.set_shape([None, None, None])
image_resized = tf.image.resize_images(image_decoded, [28, 28])
return image_resized, label
filenames = ["/var/data/image1.jpg", "/var/data/image2.jpg", ...]
labels = [0, 37, 29, 1, ...]
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.map(
lambda filename, label: tuple(tf.py_func(
_read_py_function, [filename, label], [tf.uint8, label.dtype])))
dataset = dataset.map(_resize_function)
我的问题是,如果我们希望\u read\u py\u function()
输出Python字典,那么我们如何设置输出类型?是否存在继承数据类型,如tf.dict
?例如:
def _read_py_function(filename):
image_filename = filename[0]
label_filename = filename[1]
image_id = filename[2]
image_age = filename[3]
image_decoded = cv2.imread(image_filename, cv2.IMREAD_GRAYSCALE)
image_decoded = cv2.imread(label_fielname, cv2.IMREAD_GRAYSCALE)
return {'image':image_decoded, 'label':label_decoded, 'id':image_id, 'age':image_age}
那么,我们如何设计
dataset.map()
函数呢?在tf.data.dataset.map
调用的函数中返回dicts应该可以正常工作
以下是一个例子:
dataset=tf.data.dataset.range(10)
dataset=dataset.map(lambda x:{'a':x,'b':2*x})
dataset=dataset.map(λy:y['a']+y['b'])
res=dataset.make_one_shot_iterator().get_next()
使用tf.Session()作为sess:
对于范围(10)内的i:
断言sess.run(res)==3*i
要添加到上述答案中,这同样有效:
dataset = tf.data.Dataset.range(10)
dataset = dataset.map(lambda x: {'a': x, 'b': 2 * x})
res = dataset.make_one_shot_iterator().get_next()
with tf.Session() as sess:
for i in range(10):
curr_res = sess.run(res)
assert curr_res['a'] == i
assert curr_res['b'] == 2 * i
您使用的是什么TensorFlow版本?我相信TensorFlow 1.4支持dicts,而1.2不支持(但支持元组)。您好@de1,谢谢您的评论!我使用的是1.4。您好Moindrot先生,谢谢!目前我仍在首先将数据转换为TFRecords,并序列化数据(图像+文本)进入TFRecords。以后我会尝试你的方法,然后我会给出反馈。非常感谢!