【问题标题】:Sample weighting for CNN in TensorFlowTensorFlow 中 CNN 的样本加权
【发布时间】:2019-08-02 14:33:26
【问题描述】:

我有一个在 Tensorflow 中实现的 CNN,改编自教程: CNN with Estimators.

摘自data_input_fn:

dataset = dataset.batch(batch_size)  
iterator = dataset.make_one_shot_iterator()
features, labels = iterator.get_next()
return features, labels

摘自model_fn:

loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(  loss=loss)

我正在使用 tf.estimator.Estimator 并在调用 train 函数时提供 steps = 10000。如何在训练期间为数据集中的所有样本(大约 3M 样本)提供权重?我的理解是在第一个模型的训练期间所有样本都具有相同的权重(1/N),并用于计算加权损失。然后,根据计算出的损失值,在下一个模型的训练期间应该修改、保存和重新加载权重。是否应该从 csv 文件中提供权重,因为原始 TF 记录文件不包含权重,还是有更好的方法来做到这一点?另外,是否有一个可接受的函数来根据损失值修改权重?

【问题讨论】:

    标签: python tensorflow machine-learning


    【解决方案1】:

    AdaBoost 通常不与神经网络一起使用。训练它们的费用降低了集成方法的吸引力。因此,如果这是您想要做的,您可能必须自己实现它。

    如果您的模型是二元分类器,您可以为 tf.nn.weighted_cross_entropy_with_logits 提供类权重。

    【讨论】:

      【解决方案2】:

      可以在 tensorflow 中使用样本加权。几乎每个损失函数都有一个“权重”参数,如果你传递一个正确形状的张量,它将用于对样本进行加权。

      【讨论】:

      • 您是否有任何具体信息 - 例如如何在第一次训练迭代后从加权损失中重新计算权重?它变得更加棘手,因为大约有 300 万个样本以 10000 步的形式批量传递给训练函数以训练模型。
      猜你喜欢
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 2016-02-20
      • 2018-11-09
      • 2017-08-04
      • 2012-10-14
      相关资源
      最近更新 更多