[英]An equivalent but differentiable argmax expression in Tensorflow
我需要張量中最大值的單熱表示。
例如,考慮張量2 x 3
:
[ [1, 5, 2],
[0, 3, 7] ]
我所針對的one-hot-argmax表示如下所示:
[ [0, 1, 0],
[0, 0, 1] ]
我可以按如下方式進行,其中my_tensor
是N x 3
張量:
position = tf.argmax(my_tensor, axis=1). # Shape (N x )
one_hot_pos = tf.one_hot(position, depth=3) # Shape (N x 3)
但是這部分代碼需要可區分,因為我正在對其進行培訓。 我的解決方法如下,其中EPSILON = 1e-3
是一個小常數:
max_value = tf.reduce_max(my_tensor, axis=1, keepdims=True)
clip_min = max_value - EPSILON
one_hot_pos = (tf.clip_by_value(my_tensor, clip_min, max_value) - clip_min) / (max_value - clip_min)
該解決方法在大多數情況下都有效,但是 - 正如預期的那樣 - 它存在一些問題:
EPSILON
敏感:如果它太小,可能會發生被零除argmax
:即使在平局的情況下argmax
只選擇一個你知道模擬argmax
后跟one_hot
情況的更好方法,同時修復提到的兩個問題,但只使用可微分的 Tensorflow 函數嗎?
做一些最大值、平鋪和乘法運算。 喜歡:
a = tf.Variable([ [1, 5, 2], [0, 3, 7] ]) # your tensor
m = tf.reduce_max(a, axis=1) # [5,7]
m = tf.expand_dims(m, -1) # [[5],[7]]
m = tf.tile(m, [1,3]) # [[5,5,5],[7,7,7]]
y = tf.cast(tf.equal(a,m), tf.float32)) # [[0,1,0],[0,0,1]]
這是一個可微的棘手乘法運算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.