python - 使用 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%
我不使用一些正则化技巧或其他。我不知道为什么它们之间有区别。请告诉我
解决方案
正确答案:
当使用准备好的模块时,在第一个实现中存在双 softmax 激活。double softmax: logits_l = tf.layers.dense(dense, num_labels, activation=tf.nn.softmax)
,然后你再次执行softmax_cross_entropy_with_logits
。这是不同的,因为它表现更好,它也很有趣:)
测试代码并查看是否生成了所需的精确计算图始终是一个好主意。祝你好运!
推荐阅读
- android - 从设备分辨率获取 webview 分辨率
- php - 无法访问字符串变量(“1”)上的属性(“名称”)
- c# - 尽管可用内存充足,但使用 Report.Render() 方法时出现 OutOfMemoryException
- c++ - constexpr 和未定义的行为
- reactjs - 如何为 TabbedForm react-admin 创建路由
- cplex - 从 CPLEX 中的 excel 读取在元组内声明的简单一维数组
- c++ - 如何禁用 QToolBar 中的扩展按钮?
- kubernetes - 如果已经存在,如何告诉 helm 不要创建/更改资源?
- android - 当用户尝试扫描 NFC 标签时,Android 10 显示 NFC 读取错误 toast
- javascript - 组件仅在第二次刷新时加载