【问题标题】:Tensorflow: How to use dataset from generator in EstimatorTensorflow:如何在 Estimator 中使用来自生成器的数据集
【发布时间】:2018-02-13 14:30:49
【问题描述】:

试图建立简单的模型只是为了弄清楚如何处理tf.data.Dataset.from_generator。我不明白如何设置output_shapes 参数。我尝试了几种组合,包括未指定它,但由于张量的形状不匹配,仍然会收到一些错误。这个想法只是产生两个带有SIZE = 10 的numpy 数组并用它们运行线性回归。代码如下:

SIZE = 10


def _generator():
    feats = np.random.normal(0, 1, SIZE)
    labels = np.random.normal(0, 1, SIZE)
    yield feats, labels


def input_func_gen():
    shapes = (SIZE, SIZE)
    dataset = tf.data.Dataset.from_generator(generator=_generator,
                                             output_types=(tf.float32, tf.float32),
                                             output_shapes=shapes)
    dataset = dataset.batch(10)
    dataset = dataset.repeat(20)
    iterator = dataset.make_one_shot_iterator()
    features_tensors, labels = iterator.get_next()
    features = {'x': features_tensors}
    return features, labels


def train():
    x_col = tf.feature_column.numeric_column(key='x', )
    es = tf.estimator.LinearRegressor(feature_columns=[x_col])
    es = es.train(input_fn=input_func_gen)

另一个问题是是否可以使用此功能为 tf.feature_column.crossed_column 的特征列提供数据?总体目标是在批量训练中使用Dataset.from_generator 功能,在数据不适合内存的情况下,数据从数据库中加载到块上。高度赞赏所有意见和示例。

谢谢!

【问题讨论】:

    标签: tensorflow tensorflow-datasets


    【解决方案1】:

    tf.data.Dataset.from_generator() 的可选 output_shapes 参数允许您指定生成器产生的值的形状。它的类型有两个约束来定义它应该如何被指定:

    • output_shapes 参数是一个“嵌套结构”(例如,一个元组、一个元组的元组、一个元组的字典等),它必须与生成器产生的值的结构相匹配。

      在您的程序中,_generator() 包含语句 yield feats, labels。因此,“嵌套结构”是两个元素的元组(每个数组一个)。

    • output_shapes 结构的每个组件都应该匹配相应张量的形状。数组的形状始终是维度的元组。 (tf.Tensor 的形状更一般:参见this Stack Overflow question 进行讨论。)我们来看看feats 的实际形状:

      >>> SIZE = 10
      >>> feats = np.random.normal(0, 1, SIZE)
      >>> print feats.shape
      (10,)
      

    因此,output_shapes 参数应该是一个 2 元素元组,其中每个元素是 (SIZE,)

    shapes = ((SIZE,), (SIZE,))
    dataset = tf.data.Dataset.from_generator(generator=_generator,
                                             output_types=(tf.float32, tf.float32),
                                             output_shapes=shapes)
    

    最后,您需要向tf.feature_column.numeric_column()tf.estimator.LinearRegressor() API 提供更多有关形状的信息:

    x_col = tf.feature_column.numeric_column(key='x', shape=(SIZE,))
    es = tf.estimator.LinearRegressor(feature_columns=[x_col],
                                      label_dimension=10)
    

    【讨论】:

    • 太棒了!但是,如果您的专长具有这样的大小,您该怎么做:专长 = np.random.rand(4,2) 和标签 = np.random.rand(4,1)。我的意思是,我可以向估计器提供这个维度以及它应该具有哪个配置。谢谢@mrry
    • 如果我尝试这样做,我会遇到此错误:ValueError: Dimensions must be equal, but are 2 and 3 for 'linear/head/labels/assert_equal/Equal' (op: 'Equal') with输入形状:[2]、[3]。
    • @JulioCamPlaz 我遇到了同样的问题,如果专长有大小,你解决了吗?谢谢
    • @crafet 是的,你不能这样做。你只能使用批量大小来让它更快
    • @crafet 我改变了批量大小,它变得更快了
    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多