2016-09-30 57 views
0

我只是想知道TensorFlow软件包提供的softmax(即tensorflow.nn.softmax)能被我自己实现的softmax代替吗?在TensorFlow中可以用默认的softmax替代默认的softmax吗?

我运行cross_entropy计算原始教程文件mnist_softmax.py:

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(tf.nn.softmax(y)), reduction_indices=[1])) 

它会给一个交叉验证的准确率0.9195,这很有道理。

不过,我做了一些变化,比如下面:

# Create the model 
x = tf.placeholder(tf.float32, [None, 784]) 
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10])) 
y = tf.matmul(x, W) + b 

# The below two lines are added by me, an equivalent way to calculate softmax, at least in my opinion 
y1 = tf.reduce_sum(y) 
y2 = tf.scalar_mul(1.0/y1, y) 

# Define loss and optimizer 
y_ = tf.placeholder(tf.float32, [None, 10]) 

... 
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y2), reduction_indices=[1])) 
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 

然而,交叉验证的准确率只有0.098。

任何人都有任何洞察到这个问题?非常感谢。

回答

1

您的y2事实上并不等于计算softmax。 SOFTMAX是

softmax(y) = e^y/S 

S是归一化因子(的e^y所有y S中的总和)。此外,当您计算标准化因子时,您只需要减少类别之和,而不是样本。更正确的方法是

y1 = tf.reduce_sum(tf.exp(y), reduction_indices=[1]) 
y2 = tf.scalar_mul(1.0/y1, tf.exp(y)) 
+0

感谢您的更正,我很抱歉我的疏忽。是的,在采用你的代码后,事情变得更好。不过,我只是放弃reduction_indices = [1],因为python解释器抱怨。 –