tensorflow softmax всегда возвращает 1

import tensorflow as tf
import numpy as np


a = np.array([[0,0,1], [1,1,1], [1000,200,300], [-3000,-0.2,0]])

k = tf.placeholder(tf.float32, [None,3])
w = tf.Variable(tf.random_normal([3,1]))
b = tf.Variable(tf.ones([1,1]))

model = tf.nn.softmax(tf.matmul(k,w)+b)


with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print(sess.run(model, {k:a}))

вне:

[[ 1.]
 [ 1.]
 [ 1.]
 [ 1.]]

Я не понимаю, почему я всегда получаю 1, независимо от ввода, независимо от того, включаю ли я смещение B... Есть идеи? Был бы признателен.


person Testing man    schedule 23.09.2017    source источник


Ответы (3)


Изменить model = tf.nn.softmax(tf.matmul(k,w)+b) на model = tf.nn.softmax(tf.reshape(tf.matmul(k,w)+b, [-1]))

Выход tf.matmul(k,w)+b представляет собой 2D-массив. В вашем случае [4,1]. Но reduce_sum в tf.nn.softmax() по умолчанию применяется к последней оси. У вас всегда есть 1 b/c, у вас есть только 1 элемент в каждой строке. tf.reshape измените размер tf.matmul(k,w)+b на [4].

person Maosi Chen    schedule 23.09.2017

Мне кажется, вам нужно предоставить аргумент dim для softmax как 0, чтобы он вычислял softmax столбца вместо softmax строки (по умолчанию dim=-1); Поскольку для каждой строки у вас есть только один элемент (w.shape[1] == 1), каким бы ни было значение, softmax дает 1:

model = tf.nn.softmax(tf.matmul(k,w) + b, dim=0) 

import tensorflow as tf
import numpy as np
​
​
a = np.array([[0,0,1], [1,1,1], [1000,200,300], [-3000,-0.2,0]])
​
k = tf.placeholder(tf.float32, [None,3])
w = tf.Variable(tf.random_normal([3,1]))
b = tf.Variable(tf.ones([1,1]))

model = tf.nn.softmax(tf.matmul(k,w) + b, dim=0)   
​   ​
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print(sess.run(model, {k:a}))

[[  0.00000000e+00]
 [  0.00000000e+00]
 [  1.00000000e+00]
 [  1.61103498e-12]]
person Psidom    schedule 23.09.2017

Разделите код на два шага:

mul_tensor = tf.matmul(k,w)+b
model = tf.nn.softmax(mul_tensor)

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    #print(sess.run(model, {k:a}))
    print(sess.run(mul_tensor, {k:a}))

Вы получите ответ от

array([[   0.69425076],
       [   1.7690506 ],
       [  41.94503021],
       [ 309.35256958]], dtype=float32)

Таким образом, вы применяете softmax к записи 1 * 1, которая всегда возвращает вам 1.

person Prasad    schedule 23.09.2017