首页 > 解决方案 > 使用 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% vs 手动的最终性能:88.7%

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

标签: pythontensorflowmodule

解决方案


正确答案:

当使用准备好的模块时,在第一个实现中存在双 softmax 激活。double softmax: logits_l = tf.layers.dense(dense, num_labels, activation=tf.nn.softmax),然后你再次执行softmax_cross_entropy_with_logits。这是不同的,因为它表现更好,它也很有趣:)

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


推荐阅读