Как выполнить tf.nn.softmax в двух выбранных измерениях в tensorflow?

#tensorflow #softmax

#tensorflow #softmax

Вопрос:

Я хочу реализовать tf.nn.softmax() для выбранных двух измерений тензор с формой (batch_size=?, height, width, channel) .

Но tf.nn.softmax() кажется невозможным получить 2 оси одновременно. Использование tf.softmax(tensor, axis=[1, 2]) вызовет ошибку оси в tensorflow.

Как я могу реализовать это элегантно и в векторном режиме? спасибо: D

Ответ №1:

Это можно сделать с помощью функций активации keras:

 # logits has shape [BS, H, W, CH]
prob = tf.keras.activations.softmax(logits, axis=[1, 2])
# prob has shape [BS, H, W, CH]
check = tf.reduce_sum(prob, axis=[1, 2])
# check is tensor of ones with shape [BS, CH]
  

Ответ №2:

Вместо того, чтобы передавать два измерения одновременно, я бы сначала соответствующим образом изменил входные данные, например:

 array = tf.constant([[1., 2.], [3., 4.]])

tf.nn.softmax(array, axis=0) # Calculate for axis 0
tf.nn.softmax(array, axis=1) # Calculate for axis 1

tf.nn.softmax(tf.reshape(array, [-1])) # Calculate for both axes
  

Ответ №3:

Вы можете сделать

 array = np.random.rand(1, 2, 2, 1)
s1 = tf.nn.softmax(array, axis=1)
s2 = tf.nn.softmax(array, axis=2)
rs = tf.reduce_sum([s1, s2], 0)
  

Это вернет тензор той же формы, что и исходный массив

Комментарии:

1. Да, но это не гарантирует, что сумма всех элементов в массиве равна 1, что является важным соображением, учитывая, что softmax часто используется для интерпретации выходных данных как вероятностей.