Проблема с функцией softmax в выходном слое - PullRequest
1 голос
/ 26 мая 2020

У меня хранится тензор в a, как показано ниже:

<tf.Tensor: shape=(5, 1), dtype=float32, numpy=
array([[0.1 ],
       [0.2 ],
       [0.4 ],
       [0.15],
       [0.15]], dtype=float32)>

, когда я применяю к нему функцию softmax,

a_tf = tf.nn.softmax(a)

Я получаю тензор, как показано ниже

<tf.Tensor: shape=(5, 1), dtype=float32, numpy=
array([[1.],
       [1.],
       [1.],
       [1.],
       [1.]], dtype=float32)>

хотя я бы ожидал, что нормализованные значения от 0 до 1 дают в сумме 1.

Действительно, когда я использую код определения softmax

a_tf = out_put = (tf.exp(a)) / (tf.reduce_sum(tf.exp(a)))

I получить тензор, как ожидалось:

<tf.Tensor: shape=(5, 1), dtype=float32, numpy=
array([[0.1799347 ],
       [0.19885859],
       [0.24288644],
       [0.18916014],
       [0.18916014]], dtype=float32)>

Кто-нибудь может объяснить, почему первый фрагмент кода не работает должным образом?

1 Ответ

2 голосов
/ 26 мая 2020

Ваш входной массив (или тензор) имеет форму (5, 1), и по умолчанию tf.nn.softmax работает с последним измерением. Теперь вы можете увидеть, что идет не так, потому что последнее измерение - это отдельный элемент, который затем нормализуется с помощью softmax до 1.0

У вас есть два варианта:

  • Укажите axis=0 на tf.nn.softmax, чтобы операция выполнялась в первом, а не в последнем измерении.
  • Измените форму массива, придав ему форму (1, 5), которая будет работать с вызовом по умолчанию tf.nn.softmax
...