keras在定义损失函数后做了什么?

时间:2017-08-05 16:10:16

标签: python deep-learning keras theano

我在theano和keras(theano后端)构建了一个密集的(10)-softmax-crossentropy网络。 我分别转出计算图。 在theano版本(图1,这个计算图是我的想法。 但是对于keras版本(图2),它似乎是在损失定义(crossentropy)之后添加的计算。为什么?

请教导那些了解你在做什么的人......

Fig.1 Theano version

Fig.2 Keras(backend is Theano) version

1 个答案:

答案 0 :(得分:0)

在Keras中,在损失计算之后,样本权重和损失权重应用于损失。请参阅脚本training.py中的这些行。

  • 样品重量:

        score_array = K.mean(score_array, axis=list(range(weight_ndim, ndim)))
        score_array *= weights
        score_array /= K.mean(K.cast(K.not_equal(weights, 0), K.floatx()))
    return K.mean(score_array)
    
  • 减肥:

    if total_loss is None:
        total_loss = loss_weight * output_loss
    

将这些线映射回计算图是很简单的。例如,以下块计算K.mean(K.cast(K.not_equal(weights, 0), K.floatx()))

enter image description here

  • 第一个节点计算K.not_equal(weights, 0)
  • 第二个节点是K.cast(..., K.floatx())
  • 所有其他节点大约是K.mean(...)
    • 左侧分支计算批量大小(调用shape,并从中获取维度0
    • 右分支计算张量和
    • 将右分支的输出除以左分支的输出
  • 此块的最终输出是标量K.mean(K.cast(K.not_equal(weights, 0), K.floatx()))