Tensorflow softmax不会忽略掩蔽值

Tensorflow softmax不会忽略掩蔽值,tensorflow,keras,deep-learning,Tensorflow,Keras,Deep Learning,我之所以复兴这个github,是因为我相信它是有效的,需要解释。keras有一个掩蔽层,其中的文档可以读取 对于输入张量中的每个时间步,如果 在该时间步输入张量中的所有值都等于 掩码_值,则时间步将在所有时间段中被屏蔽并跳过 下游层,只要它们支持掩蔽 如果任何下游层不支持掩蔽,则仍接收到此类掩蔽 输入掩码时,将引发异常 这两个结果几乎相同 with_masking <tf.Tensor: shape=(1, 5), dtype=float32, numpy= array([[0.17379

我之所以复兴这个github,是因为我相信它是有效的,需要解释。keras有一个掩蔽层,其中的文档可以读取

对于输入张量中的每个时间步,如果 在该时间步输入张量中的所有值都等于 掩码_值,则时间步将在所有时间段中被屏蔽并跳过 下游层,只要它们支持掩蔽

如果任何下游层不支持掩蔽,则仍接收到此类掩蔽 输入掩码时,将引发异常

这两个结果几乎相同

with_masking
<tf.Tensor: shape=(1, 5), dtype=float32, numpy=
array([[0.1737954 , 0.28654018, 0.19207363, 0.1737954 , 0.1737954 ]],
      dtype=float32)>
without_masking
<tf.Tensor: shape=(1, 5), dtype=float64, numpy=array([[0.1737954 , 0.28654017, 0.19207362, 0.1737954 , 0.1737954 ]])>

我认为这已经在您链接的文章中得到了很好的解释。根本的问题是,无论数组是否被屏蔽,softmax仍然以0.0值运行,并返回数学上预期的非零值

从softmax获得零输出的唯一方法是传递一个非常小的浮点值。如果将屏蔽值设置为float64的最小可能机器限制,则该值的Softmax将为零

要获得float64上的机器限制,您需要tf.float64.min,它等于-1.7976931348623157e+308。有关此机器限制的更多信息

以下是一个实现,仅供您在tf.boolean_mask上参考,以及使用tf.where创建mask并将其传递给softmax的正确方法-


我认为这已经在您链接的文章中得到了很好的解释。根本的问题是,无论数组是否被屏蔽,softmax仍然以0.0值运行,并返回数学上预期的非零值

从softmax获得零输出的唯一方法是传递一个非常小的浮点值。如果将屏蔽值设置为float64的最小可能机器限制,则该值的Softmax将为零

要获得float64上的机器限制,您需要tf.float64.min,它等于-1.7976931348623157e+308。有关此机器限制的更多信息

以下是一个实现,仅供您在tf.boolean_mask上参考,以及使用tf.where创建mask并将其传递给softmax的正确方法-


清楚,有帮助,回答得很好。清楚,有帮助,回答得很好。
with_masking
<tf.Tensor: shape=(1, 5), dtype=float32, numpy=
array([[0.1737954 , 0.28654018, 0.19207363, 0.1737954 , 0.1737954 ]],
      dtype=float32)>
without_masking
<tf.Tensor: shape=(1, 5), dtype=float64, numpy=array([[0.1737954 , 0.28654017, 0.19207362, 0.1737954 , 0.1737954 ]])>
#Assign one large value 
inputs = np.zeros([1,2])
inputs[0,0] = 0.5
inputs[0,1] = 0.1
inputs = tf.Variable(inputs)
without_masking = tf.keras.layers.Softmax()(inputs)

without_masking
<tf.Tensor: shape=(1, 2), dtype=float64, numpy=array([[0.59868766, 0.40131234]])>
with_masking
<tf.Tensor: shape=(1, 5), dtype=float32, numpy=
array([[0 , 0.59868766, 0.40131234, 0, 0 ]],
      dtype=float32)>
from tensorflow import __version__
__version__
'2.3.1'
import tensorflow as tf

inputs = np.zeros([1,5])
inputs[0,1] = 0.5
inputs[0,2] = 0.1
inputs = tf.Variable(inputs)

#Returns only the elements that are not masked (2,)
with_boolmask = tf.boolean_mask(inputs, inputs!=0)
with_boolmask = tf.keras.layers.Softmax()(with_boolmask)

#Correct way to do it!
masked_inp = tf.where(inputs!=0, inputs, tf.float64.min) #<----
with_where = tf.keras.layers.Softmax()(masked_inp)

print('BOOLEAN MASK (NOT EXPECTED)')
print(with_boolmask)

print('')
print('MASKED INPUT - ')
print(masked_inp)
print('')
print('SOFTMAX OUTPUT')
print(with_where)
BOOLEAN MASK (NOT EXPECTED)
tf.Tensor([0.59868765 0.40131232], shape=(2,), dtype=float32)

MASKED INPUT - 
tf.Tensor(
[[-1.79769313e+308  5.00000000e-001  1.00000000e-001 -1.79769313e+308
  -1.79769313e+308]], shape=(1, 5), dtype=float64)

SOFTMAX OUTPUT
tf.Tensor([[0.         0.59868765 0.40131232 0.         0.        ]], shape=(1, 5), dtype=float32)