Keras - Theano - 测试除以零
Keras - Theano - Test for division by zero
我有一个图层可以计算时间步长的平均值并支持遮罩。
我的问题是,掩码可能是空的(没有填充时间步长),但我不知道如何在使用张量时检查零。
我有一些掩码为空的训练示例,因此我得到了 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 但这也没有用。
try/except
不会工作,因为这段代码所做的只是创建符号张量图,它没有例外.. 因此除以 0 的评估发生在 fit/evaluate/predict 函数中。您需要在符号图中包含 logic/decision。
您可以使用 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)
我有一个图层可以计算时间步长的平均值并支持遮罩。 我的问题是,掩码可能是空的(没有填充时间步长),但我不知道如何在使用张量时检查零。
我有一些掩码为空的训练示例,因此我得到了 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 但这也没有用。
try/except
不会工作,因为这段代码所做的只是创建符号张量图,它没有例外.. 因此除以 0 的评估发生在 fit/evaluate/predict 函数中。您需要在符号图中包含 logic/decision。
您可以使用 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)