Тензор потока 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... Есть идеи? Был бы признателен.
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 б / к, у вас есть только 1 элемент в каждой строке. tf.reshape
изменить размер tf.matmul(k,w)+b
до [4].
Разделите ваш код на два этапа:
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.
Похоже, мне нужно предоставить 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]]