代码之家  ›  专栏  ›  技术社区  ›  bw4sz

Tensorflow softmax不忽略掩蔽值

  •  0
  • bw4sz  · 技术社区  · 3 年前

    我正在恢复这个集线器 issue

    在该时间步输入张量中的所有值都等于 mask\u值,则timestep将全部屏蔽(跳过) 下游层(只要它们支持掩蔽)。

    如果任何下游层不支持掩蔽,则接收到这样的

    
    # create padded zeros and change two valid entries.
    inputs = np.zeros([1,5])
    inputs[0,1] = 0.5
    inputs[0,2] = 0.1
    inputs = tf.Variable(inputs)
    masked_inputs = tf.keras.layers.Masking(mask_value=0.0)(inputs)
    with_masking = tf.keras.layers.Softmax()(masked_inputs)
    without_masking = tf.keras.layers.Softmax()(inputs)
    

    这两个结果实际上是相同的

    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的有效条目,类似于

    #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)>
    

    要忽略softmax函数中的0,我们可以切换出大量负数?

    相关: tensorflow - softmax ignore negative labels (just like caffe)

    from tensorflow import __version__
    __version__
    '2.3.1'
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   Akshay Sehgal    3 年前

    我想这已经解释得很清楚了 Github issue softmax() 仍在操作 0.0 值并返回 non-zero link ).

    只有这样才能从 softmax() 就是通过考试 . 如果将屏蔽值设置为 float64 , Softmax()

    要获得float64上的机器限制,您需要 tf.float64.min -1.7976931348623157e+308 post .

    下面是一个实现,供您参考 tf.boolean_mask tf.where 用于创建遮罩并将其传递给 softmax()

    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)