Keras - Theano - 除以零的测试

时间:2017-01-21 12:24:35

标签: theano keras keras-layer

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

我有一些训练示例,面具是空的,所以我得到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,因此它涵盖了我的所有训练样例,但这不是一个解决方案。此外,我尝试添加一个尝试/除外,但这也没有用。

1 个答案:

答案 0 :(得分:1)

try/except不会工作,因为所有这段代码都是创建符号张量图,没有异常..评估因此除以0发生在拟合/评估/预测函数中。您需要在符号图中包含逻辑/决策。

您可以使用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)
相关问题