tf.data.Dataset 属性及方法

大型元素集

  • 源数据集 (Source Datasets)

    创建数据集的最简单方法 list:

    dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
    for element in dataset:
      print(element)
    

    处理文本文件:

    dataset = tf.data.TextLineDataset(["file1.txt", "file2.txt"])
    

    处理TFRecord文件

    dataset = tf.data.TFRecordDataset(["file1.tfrecords", "file2.tfrecords"])
    

    创建一个匹配规则的所有文件的数据集

    dataset = tf.data.Dataset.list_files("/path/*.txt")  # doctest: +SKIP
    
  • 转换 (Transformations)

    有了数据集后,您可以对准备的数据进行转换

    dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
    dataset = dataset.map(lambda x: x*2)
    list(dataset.as_numpy_iterator())
    # 输出 [2, 4, 6]
    
  • 小 tips

    数据集里的元素说明 element_spec

    dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3]).element_spec
    TensorSpec(shape=(), dtype=tf.int32, name=None)
    

方法

  • apply

    apply(
        transformation_func
    )
    参数:transformation_func 一个方法名(此方法接收一个dataset参数 并返回处理后的dataset)
    返回值:apply的返回值 即参数 transformation_func 方法的返回值
    

    将转换函数应用于此数据集

    dataset = tf.data.Dataset.range(100)
    def dataset_fn(ds):
      return ds.filter(lambda x: x < 5)
    dataset = dataset.apply(dataset_fn)
    list(dataset.as_numpy_iterator())
    # Output: [0, 1, 2, 3, 4]
    
  • as_numpy_iterator

    返回一个迭代器,该迭代器将数据集的所有元素转换为numpy

    dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
    for element in dataset.as_numpy_iterator():
      print(element)
    # Output: 
    # 1
    # 2
    # 3
    
    dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
    print(list(dataset.as_numpy_iterator()))
    # Output: [1, 2, 3]
    
  • as_numpy_iterator() 将保留数据集元素的嵌套结构

    dataset = tf.data.Dataset.from_tensor_slices({'a': ([1, 2], [3, 4]),
                                                  'b': [5, 6]})
    list(dataset.as_numpy_iterator()) == [{'a': (1, 3), 'b': 5},
                                          {'a': (2, 4), 'b': 6}]
    # Output: True
    
  • batch

    将数据集进行分批处理

    batch(
        batch_size, drop_remainder=False
    )
    # param1: batch_size 每批次包含几个元素
    # param2: drop_remainder ds_length/batch_size 不能被整除时 是否删掉最后一个批次
    # return: 一个 Dataset
    
    dataset = tf.data.Dataset.range(8)
    dataset = dataset.batch(3)
    list(dataset.as_numpy_iterator())
    # Output: [array([0, 1, 2]), array([3, 4, 5]), array([6, 7])]
    
    dataset = tf.data.Dataset.range(8)
    dataset = dataset.batch(3, drop_remainder=True)
    list(dataset.as_numpy_iterator())
    # Output: [array([0, 1, 2]), array([3, 4, 5])]
    
  • cache

    缓存数据集中的元素 可缓存在内存或指定文件内

    cache(
        filename=''
    )
    # param: filename 文件名 如未提供此参数 则默认缓存到内存
    # return: 一个 Dataset
    
    dataset = tf.data.Dataset.range(5)
    dataset = dataset.map(lambda x: x**2)
    dataset = dataset.cache()  # 缓存到内存中
    # The first time reading through the data will generate the data using `range` and `map`.
    list(dataset.as_numpy_iterator())
    
    # Subsequent iterations read from the cache.
    list(dataset.as_numpy_iterator())
    
    dataset = tf.data.Dataset.range(5)
    dataset = dataset.cache("/path/to/file")  # doctest: +SKIP  缓存到文件中
    list(dataset.as_numpy_iterator())  # doctest: +SKIP
    
    dataset = tf.data.Dataset.range(10)
    dataset = dataset.cache("/path/to/file")  # Same file! # doctest: +SKIP
    list(dataset.as_numpy_iterator())  # doctest: +SKIP
    
  • concatenate

    通过将给定数据集与此数据集连接来创建一个 Dataset

    注意 两个数据集的 结构 和 数据类型 必须一致

    concatenate(
        dataset
    )
    
    a = tf.data.Dataset.range(1, 4)  # ==> [ 1, 2, 3 ]
    b = tf.data.Dataset.range(4, 8)  # ==> [ 4, 5, 6, 7 ]
    ds = a.concatenate(b)
    list(ds.as_numpy_iterator())
    # Output: [1, 2, 3, 4, 5, 6, 7]
    
  • enumerate

    枚举此数据集的元素

    enumerate(
        start=0
    )
    # param: start 表示枚举的起始值
    # return: A Dataset
    
    dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
    dataset = dataset.enumerate(start=5)
    for element in dataset.as_numpy_iterator():
      print(element)
    # Output:
    # (5, 1)
    # (6, 2)
    # (7, 3)
    
    # The nested structure of the input dataset determines the structure of
    # elements in the resulting dataset.
    dataset = tf.data.Dataset.from_tensor_slices([(7, 8), (9, 10)])
    dataset = dataset.enumerate()
    for element in dataset.as_numpy_iterator():
      print(element)
    # Output:
    # (0, array([7, 8], dtype=int32))
    # (1, array([ 9, 10], dtype=int32))
    
  • filter

    过滤数据集 进行条件筛选

    filter(
        predicate
    )
    # param: predicate 将数据集元素映射到布尔值的函数。
    # return: A Dataset
    
    dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
    dataset = dataset.filter(lambda x: x < 3)
    list(dataset.as_numpy_iterator())
    # Output: [1, 2]
    
    # `tf.math.equal(x, y)` is required for equality comparison
    def filter_fn(x):
      return tf.math.equal(x, 1)
    dataset = dataset.filter(filter_fn)
    list(dataset.as_numpy_iterator())
    # Output: [1]
    
  • flat_map

    flat_map(
        map_func
    )
    # param: map_func 映射数据集里每一个元素的方法
    # return: A Dataset
    

    根据map_func方法映射并展开数据集

    dataset = Dataset.from_tensor_slices([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    dataset = dataset.flat_map(lambda x: Dataset.from_tensor_slices(x))
    list(dataset.as_numpy_iterator())
    # Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
  • from_generator

    根据生成器创建一个数据集

    @staticmethod
    from_generator(
        generator, output_types, output_shapes=None, args=None
    )
    # param1: generator 一个可调用的生成器 其返回值的结构和类型必须与param2, param3一致 该生成器函数的参数数量需要与param4一致
    # param2: 确定生成器返回的每个值的数据类型
    # param3: 确定生成器返回的每个值的结构形状
    # param4: 一个元组 传递给生成器作为参数
    
    import itertools
    
    def gen():
      for i in itertools.count(1):
        yield (i, [1] * i)
    
    dataset = tf.data.Dataset.from_generator(
         gen,
         (tf.int64, tf.int64),
         (tf.TensorShape([]), tf.TensorShape([None])))
    
    list(dataset.take(3).as_numpy_iterator())
    # Output: [(1, array([1])), (2, array([1, 1])), (3, array([1, 1, 1]))]
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343