【问题标题】:Returning dataset from tf.data.Dataset.map() causes 'TensorSliceDataset' object has no attribute 'get_shape' error从 tf.data.Dataset.map() 返回数据集导致“TensorSliceDataset”对象没有属性“get_shape”错误
【发布时间】:2018-06-12 04:28:41
【问题描述】:

我正在使用数据集 API 创建输入管道。我正在使用类似于以下模式的 tf.data.Dataset.map() 方法:

def mapped_fn(_):
    X = tf.random_uniform([3,3])
    y = tf.random_uniform([3,1])
    dataset = tf.data.Dataset.from_tensor_slices((X,y))
    return dataset

with tf.Session() as sess:
    first = tf.random_uniform([1,2])         
    unimportant_dataset = tf.data.Dataset.from_tensors(first)
    dataset = unimportant_dataset.map(mapped_fn)
    sess.run(dataset)

我收到以下错误:AttributeError: 'TensorSliceDataset' object has no attribute 'get_shape'

整体上下文是mapped_fn从.tfrecords文件中反序列化一个Example protobuf(在这种情况下由unimportant_dataset表示),重塑特征向量(X),并且需要返回一个定义了元素的数据集通过新特征向量的切片(在这种情况下为(3,))。返回ZipDataset 时,我遇到了类似的错误。提前致谢!

【问题讨论】:

    标签: tensorflow machine-learning deep-learning tensorflow-datasets


    【解决方案1】:

    DomJack's answer 关于Dataset.map() 的签名是绝对正确的:它期望传递的mapped_fn 的返回值是一个或多个张量(或稀疏张量)。

    如果您确实有一个返回Dataset 的函数,您可以使用Dataset.flat_map() 将所有返回的数据集展平并连接到一个数据集中,如下所示:

    def mapped_fn(_):
        X = tf.random_uniform([3,3])
        y = tf.random_uniform([3,1])
        dataset = tf.data.Dataset.from_tensor_slices((X,y))
        return dataset
    
    # Generate 100 dummy elements.
    unimportant_dataset = tf.data.Dataset.range(100)
    
    # Convert each dummy element into a dataset of 3 nested elements, and concatenate them.
    dataset = unimportant_dataset.flat_map(mapped_fn)
    

    【讨论】:

      【解决方案2】:

      传递给tf.data.Dataset.mapmap_fn 应该从调用数据集中获取单个示例的张量,并返回返回数据集的张量。

      例如

      def map_fn(example_proto):
        features, labels = parse_example_proto(example_proto)
        # do data augmentation here
        return features, labels
      
      dataset = tf.data.TfRecordsDataset(filenames)
      dataset = dataset.repeat().shuffle().map(
        map_fn, num_parallel_calls=8).prefetch(1)
      features, labels = dataset.make_one_shot_iterator().get_next()
      

      【讨论】:

      • 感谢您的指导。基于documentation,看起来map() 函数应该返回Dataset。是否有一些我忽略的转换?
      • map 函数返回一个数据集,但 map 的第一个参数本身就是一个函数,该函数应该返回张量。
      猜你喜欢
      • 2021-06-24
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      相关资源
      最近更新 更多