Tensorflow Softmax返回标识矩阵

Tensorflow Softmax返回标识矩阵,tensorflow,softmax,Tensorflow,Softmax,我输入到softmax,y=tf.nn.softmax(tf.matmul(x,W)+b),是一个有值矩阵 tf.matmul(x, W) + b = [[ 9.77206726e+02] [ 5.72391296e+02] [ 3.53560760e+02] [ 4.75727379e-01] [ 6.58911804e+02]] 但是当这被输入到softmax中时,我得到: tf.nn.softmax(tf.matmul(x, W) + b) = [[ 1.] [ 1.

我输入到
softmax
y=tf.nn.softmax(tf.matmul(x,W)+b)
,是一个有值矩阵

tf.matmul(x, W) + b =
[[  9.77206726e+02]
 [  5.72391296e+02]
 [  3.53560760e+02]
 [  4.75727379e-01]
 [  6.58911804e+02]]
但是当这被输入到softmax中时,我得到:

tf.nn.softmax(tf.matmul(x, W) + b) =
[[ 1.]
 [ 1.]
 [ 1.]
 [ 1.]
 [ 1.]]
使我的训练输出为
1
s的数组,这意味着每批训练数据上的权重
W
或偏差
b
均未更新。这也导致我对随机测试数据集的准确度为
1

下面是我的代码:

x = tf.placeholder(tf.float32, [None, 2])

W = tf.Variable(tf.random_normal([2, 1]))

b = tf.Variable(tf.random_normal([1]))

y = tf.nn.softmax(tf.matmul(x, W) + b)

## placeholder for cross-entropy
y_ = tf.placeholder(tf.float32, [None, 1])

## cross-entropy function
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

## backpropagation & gradienct descent
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

## initialize variables
init = tf.initialize_all_variables()

sess = tf.Session()
sess.run(init)

ITER_RANGE = 10
EVAL_BATCH_SIZE = ( len(training_outputs)/ITER_RANGE )
training_outputs = np.reshape(training_outputs, (300, 1))
## training
for i in range(ITER_RANGE):
  print 'iterator:'
  print i

  ## batch out training data
  BEGIN = ( i*EVAL_BATCH_SIZE )
  END = ( (i*EVAL_BATCH_SIZE) + EVAL_BATCH_SIZE )

  batch_ys = training_outputs[BEGIN:END]
  batch_xs = training_inputs[BEGIN:END]

  print 'batch_xs'
  print batch_xs

  print 'batch_ys'
  print batch_ys

  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

  # y = tf.nn.softmax(tf.matmul(x, W) + b)
  print 'y'
  print (sess.run(y, feed_dict={x: batch_xs, y_: batch_ys}))

  #print 'x'
  #print sess.run(x)

  print 'W'
  print sess.run(W)

  print 'b'
  print sess.run(b)

  print 'tf.matmul(x, W) + b'
  print sess.run(tf.matmul(x, W) + b, feed_dict={x: batch_xs, y_: batch_ys})

  print 'tf.nn.softmaxtf.matmul(x, W) + b)'
  print sess.run((tf.nn.softmax(tf.matmul(x, W) + b)), feed_dict={x: batch_xs, y_: batch_ys})

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

test_outputs = np.random.rand(300, 1)

## the following prints 1
print(sess.run(accuracy, feed_dict={x: test_inputs, y_: test_outputs}))
根据的定义,它“将任意实值的K维向量“挤压”为(0,1)范围内实值的K维向量,加起来等于1”

如果只有1个输出值,则Softmax输出的分类概率分布仅为
1
,而不是加起来等于1的值。

根据的定义,它“将任意实值的K维向量“挤压”为加起来等于1的范围(0,1)内实值的K维向量”


如果只有1个输出值,则Softmax输出的分类概率分布仅为
1
,而不是加起来等于1的值。

似乎Softmax函数应用于输出向量中的每个不同值。尝试转换输出,即将
tf.nn.softmax(tf.matmul(x,W)+b))
更改为
tf.nn.softmax(tf.transpose(tf.matmul(x,W)+b))

似乎将softmax函数应用于输出向量中的每个不同值。尝试转换输出,即更改
tf.nn.softmax(tf.matmul(x,W)+b))
tf.nn.softmax(tf.transpose(tf.matmul(x,W)+b))

看起来您只有两个类{yes,no},
tf.matmul(x,W)+b
表示{yes的概率。在这种情况下,您应该将
tf.nn.sigmoid\u cross\u entropy\u与\u logits
一起使用,而不是
softmax
。比如:

y_pred = tf.matmul(x, W) + b
loss = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(y_pred, y_))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)

看起来只有两个类{yes,no}和
tf。matmul(x,W)+b
表示{yes}的概率。在这种情况下,您应该将
tf.nn.sigmoid\u cross\u entropy\u与\u logits
一起使用,而不是
softmax
。比如:

y_pred = tf.matmul(x, W) + b
loss = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(y_pred, y_))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)

交叉熵损失是不完全的。将交叉熵与logits结合使用。

交叉熵损失是不完整的。使用交叉熵和logits