【问题标题】:Tensorflow Estimator API: How to pass parameter from input functionTensorflow Estimator API:如何从输入函数传递参数
【发布时间】:2018-04-12 03:36:28
【问题描述】:

我正在尝试添加类权重作为模型的超参数,但要计算权重我需要读取输入数据,这发生在 input_fn 内部,然后传递给 estimator.fit()input_fn 的输出只是特征,标签应该具有相同的形状 num_examples * num_features。我的问题 - 有没有办法将数据从 input_fn 传播到 model_fn 的超参数图?或者作为替代方案 - 可能有一个 input_fn 数据集的包装器,它允许对少数/欠采样的多数以及批处理进行过采样 - 在这种情况下,我不需要任何参数来传播。

【问题讨论】:

  • 指定使用tf.estimator.Estimatortf.contrib.learn.Estimator 可能很重要。我相信它们之间有细微的差别
  • 每批重量不同吗?您不能将其与特征和标签一起作为输出传递吗?
  • 我使用的 tensorflow.org/api_docs/python/tf/estimator/inputs/… 要求所有输出的大小相等,我可能可以重塑权重以使其与特征大小相同。但我想知道是否有更简洁的方法来传递数据集生成的参数,这些参数不是特征和标签。

标签: tensorflow tensorflow-estimator


【解决方案1】:

特征和标签都可以是张量的字典(不仅仅是一个张量)。张量可以是您想要的任何形状,尽管通常是 num_examples * ...

如果您不使用任何预定义的估计器,最简单的方法是添加另一个具有计算权重所需的特征,计算模型中的权重然后使用它们(乘以损失或将其传递为一个参数)。

您还可以访问 input_fn 中的超参数,以便您可以在那里计算权重并将其添加为单独的列。

如果您使用固定估算器,请查看文档。我看到他们中的大多数都支持 weight_column_name。在这种情况下,只需将其命名为您在特征字典中用于权重值的名称。

或者,如果所有其他方法都失败了,您可以在将数据提供给 tensorflow 之前按照您想要的方式对数据进行采样。

【讨论】:

  • 感谢您的回答,但我不认为 TF 提供的函数允许特征字典中的张量为任何形状 -(例如 numpy_input_fn),我总是可以编写自己的函数或编写我自己的采样逻辑。但我想知道是否有任何首选的方式来做到这一点。因为看起来根本不支持 Estimator API 原生提供的不平衡类。我打算使用数据集大小的单独特征列,为每条记录复制权重。
  • 不平衡的类通常很难处理。如果不平衡很轻微,您可以使用示例权重。如果不平衡较大,则权重会在梯度中产生大量噪声,因此如果您复制示例以使批次的平均权重在批次之间或多或少相同,则可能会更好。如果不平衡仍然较大,您可能必须对小类进行过采样或对大类进行欠采样。与往常一样,您需要尝试一下,看看哪些方法可以解决您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多