代码之家  ›  专栏  ›  技术社区  ›  dasWesen

创建输出dict的TensorFlow数据集

  •  2
  • dasWesen  · 技术社区  · 8 年前

    我对我的数据集有一个带有“元数据”的dict。 {'m1': array_1, 'm2': array_2, ...}. 每个数组都有形状(n,…),其中n是样本数。

    问题是: 是否可以创建一个 tf.data.Dataset 输出字典 {'meta_1': sub_array_1, 'meta_2': sub_array_2, ...} 对于数据集迭代器的每次迭代。get_next()?在这里,子数组应该包含一个批的第i个元数据,所以应该有shape(batch_sz,…)。

    到目前为止我尝试的是使用 tf.data.Dataset.from_generator() ,如下所示:

    N = 100
    # dictionary of arrays:
    metadata = {'m1': np.zeros(shape=(N,2)), 'm2': np.ones(shape=(N,3,5))} 
    num_samples = N
    
    def meta_dict_gen():
        for i in range(num_samples):
            ls = {}
            for key, val in metadata.items():
                ls[key] = val[i]
            yield ls
    
    dataset = tf.data.Dataset.from_generator(meta_dict_gen, output_types=(dict))
    

    这个问题似乎出在 output_types=(dict) . 上面的代码向我扔了一个

    类型错误:参数'tout'的预期数据类型不是<类'dict'>。


    我使用的是TensorFlow 1.8和python 3.6。

    1 回复  |  直到 7 年前
        1
  •  6
  •   Jongwook Choi    7 年前

    所以事实上,你可以做你想做的,你只需要对口述的内容做具体的说明:

    import tensorflow as tf
    import numpy as np
    
    N = 100
    # dictionary of arrays:
    metadata = {'m1': np.zeros(shape=(N,2)), 'm2': np.ones(shape=(N,3,5))}
    num_samples = N
    
    def meta_dict_gen():
        for i in range(num_samples):
            ls = {}
            for key, val in metadata.items():
                ls[key] = val[i]
            yield ls
    
    dataset = tf.data.Dataset.from_generator(
        meta_dict_gen,
        output_types={k: tf.float32 for k in metadata},
        output_shapes={'m1': (2,), 'm2': (3, 5)})
    iter = dataset.make_one_shot_iterator()
    next_elem = iter.get_next()
    print(next_elem)
    

    输出:

    {'m1': <tf.Tensor 'IteratorGetNext:0' shape=(2,) dtype=float32>,
     'm2': <tf.Tensor 'IteratorGetNext:1' shape=(3, 5) dtype=float32>}