使用TensorFlow模块更新参数和使用手动变量更新之间的区别



我有

#using module
dense = tf.layers.dense(tf_dataset_l, nn_hidden, activation=tf.tanh)
logits_l = tf.layers.dense(dense, num_labels, activation=tf.nn.softmax)        
loss_l = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=tf_labels_l, logits=logits_l))       
optimizer_l = tf.train.GradientDescentOptimizer(0.5).minimize(loss_l)
#manual
w1 = tf.Variable(tf.truncated_normal([image_size * image_size, nn_hidden]))
b1 = tf.Variable(tf.zeros([nn_hidden]))
w2 = tf.Variable(tf.truncated_normal([nn_hidden, num_labels]))
b2 = tf.Variable(tf.zeros([num_labels]))       
dense = tf.tanh(tf.matmul(tf_dataset, w1) + b1)
logits = tf.matmul(hidden, w2) + b2    
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=tf_labels, logits=logits))
optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)

使用MNIST图像并在相同条件下,使用模块的最终性能:92.2%与手动的最终性能:88.7%

我不使用一些正则化技巧或其他技巧。我不知道为什么它们之间有区别。请让我知道

正确答案:

使用准备好的模块时,在第一个实现中有一个双重 softmax 激活。双软最大值:logits_l = tf.layers.dense(dense, num_labels, activation=tf.nn.softmax),然后你再次执行softmax_cross_entropy_with_logits。这是不同的,并且由于它的性能更好,因此也很有趣:)

测试代码并查看生成所需的确切计算图始终是一个好主意。祝你好运!

最新更新