【问题标题】:Keras - Theano - Test for division by zeroKeras - Theano - 测试除以零
【发布时间】:2017-06-06 08:47:54
【问题描述】:

我有一个计算时间步的平均值并支持屏蔽的层。 我的问题是掩码可能是空的(没有填充时间步),但我不知道在使用张量时如何检查零。

我有一些掩码为空的训练示例,因此我得到一个 NaN 损失并且程序崩溃。

这是我的图层:

class MeanOverTime(Layer):
    def __init__(self, **kwargs):
        self.supports_masking = True
        super(MeanOverTime, self).__init__(**kwargs)

    def call(self, x, mask=None):
        if mask is not None:
            return K.cast(x.sum(axis=1) / mask.sum(axis=1, keepdims=True), K.floatx()) # this may result to division by zero
        else:
            return K.mean(x, axis=1)

    def get_output_shape_for(self, input_shape):
        return input_shape[0], input_shape[-1]

    def compute_mask(self, input, input_mask=None):
        return None

这个mask.sum(axis=1, keepdims=True) 变为零。为了绕过这个,我增加了 input_length,所以它涵盖了我所有的训练示例,但这不是一个解决方案。我也尝试添加一个 try/except 但这也没有用。

【问题讨论】:

    标签: theano keras keras-layer


    【解决方案1】:

    try/except 不会工作,因为这段代码所做的只是创建没有例外的符号张量图.. 评估因此除以 0 发生在 fit/evaluate/predict 函数中。您需要在符号图中包含逻辑/决策。

    您可以使用switch(condition, then_expression, else_expression) 来包含 if 和 else:

    def call(self, x, mask=None):
        if mask is not None:
            sum = mask.sum(axis=1, keepdims=True)
            cond = K.equal(sum,0)
            _the_other_tensor_ = ....
            div = K.switch(cond, _the_other_tensor_ ,sum)
            return K.cast(x.sum(axis=1) / div, K.floatx()) # this may result to division by zero
        else:
            return K.mean(x, axis=1)
    

    或者只是使用clip(x, min_value, max_value) 来剪辑一个非常小的数字 epsilon 以使除法在数值上稳定。

    def call(self, x, mask=None):
        if mask is not None:
            sum = mask.sum(axis=1, keepdims=True)
            div = K.clip(sum, K.epsilon, 1)
            return K.cast(x.sum(axis=1) / div, K.floatx()) # this may result to division by zero
        else:
            return K.mean(x, axis=1)
    

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 2022-11-16
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多