簡體   English   中英

Tensorflow 中等效但可微的 argmax 表達式

[英]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_tensorN 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM