首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow softmax不忽略掩蔽值

Tensorflow softmax不忽略掩蔽值
EN

Stack Overflow用户
提问于 2021-01-15 23:55:04
回答 2查看 1.4K关注 0票数 1

我正在恢复这个github 问题,因为我认为它是有效的,需要解释。tf.keras有一个掩蔽层,其中包含读取

对于输入张量中的每个时间步骤(张量中的维#1 ),如果输入张量在该时间步骤中的所有值都等于mask_value,那么时间步骤将在所有下游层(只要它们支持掩蔽)被屏蔽(跳过)。 如果任何下游层不支持掩蔽,但接收到这样的输入掩码,则会引发异常。

代码语言:javascript
复制
# 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)

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

代码语言:javascript
复制
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,类似于

代码语言:javascript
复制
#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]])>

在正确的位置上垫

代码语言:javascript
复制
with_masking
<tf.Tensor: shape=(1, 5), dtype=float32, numpy=
array([[0 , 0.59868766, 0.40131234, 0, 0 ]],
      dtype=float32)>

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

相关:tensorflow - softmax忽略负面标签(就像caffe一样)

代码语言:javascript
复制
from tensorflow import __version__
__version__
'2.3.1'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-16 00:32:11

我认为在你链接的Github问题中已经很好地解释了这一点。根本的问题是,无论数组是否被屏蔽,softmax()仍然对0.0值进行操作,并按数学预期返回non-zero值(链接)。

softmax()获得零输出的唯一方法是传递一个非常小的。如果将蒙面值设置为float64的最小可能计算机限制,则此值的Softmax()将为零。

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

以下是仅在tf.boolean_mask上引用的实现,以及使用tf.where创建掩码并将其传递给softmax()的正确方法-

代码语言:javascript
复制
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)
代码语言:javascript
复制
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)
票数 6
EN

Stack Overflow用户

发布于 2021-08-12 04:17:23

如果我错了,请随时纠正我。我想我们有个简单的方法。

代码语言:javascript
复制
import tensorflow as tf
import numpy as np
import math

# create padded zeros and change two valid entries.
inputs = tf.constant([0., 0.5, 0.1, 0., 0.])
mask = tf.not_equal(inputs, 0.)
with_masking = tf.keras.layers.Softmax()(inputs, mask=mask)
without_masking = tf.keras.layers.Softmax()(inputs)

print(with_masking)
print(without_masking)

输出是,

代码语言:javascript
复制
tf.Tensor([0.         0.59868765 0.40131232 0.         0.        ], shape=(5,), dtype=float32)
tf.Tensor([0.1737954  0.28654018 0.19207363 0.1737954  0.1737954 ], shape=(5,), dtype=float32)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65745053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档