2017-09-23 6 views
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) 


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

sur:tensorflow softmax toujours revenir 1

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

Je ne comprends pas pourquoi je reçois toujours 1, peu importe l'entrée, peu importe si je ... B nous retrouvons le biais Des idées? J'apprécierais ça.

Répondre

1

changement model = tf.nn.softmax(tf.matmul(k,w)+b) à model = tf.nn.softmax(tf.reshape(tf.matmul(k,w)+b, [-1]))

La sortie de tf.matmul(k,w)+b est un tableau 2D. Dans votre cas, [4,1]. Mais le reduce_sum en tf.nn.softmax() est appliqué par défaut au dernier axe. Vous avez toujours 1 b/c vous avez seulement 1 éléments dans chaque ligne. tf.reshape changez la taille de tf.matmul(k,w)+b en [4].

1

Attend pour moi, vous devez fournir l'argument dim-softmax comme 0 il calcule la colonne softmax au lieu de ligne softmax (par défaut dim = -1); Étant donné que pour chaque ligne que vous avez un seul élément (w.shape [1] == 1), quelle que soit la valeur, softmax donne 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]] 
1

Divisez votre code dans deux étapes:

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})) 

Vous obtiendrez réponse de

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

Donc vous appliquez softmax sur 1 * 1 entrée qui vous reviendra 1 toujours.