描述
我在model_fn()
tf.estimator.Estimator
实例化中使用丢失函数包装TensorFlow模型。
各种优化器(例如tf.train.MomentumOptimizer
或tf.train.AdagradOptimizer
)为模型中的所有可训练变量(伽马,批量标准化的beta,卷积核,......)创建Read(_x)
运算时optimizer.apply_gradients()
1}}被调用。
具体而言,它们的名称为Read_<num>/ReadVariableOp
,类型为tf.Operation
。
问题是这些变量是在tf.variable_scope
的根目录之外的任何tf.name_scope
或tf.Graph
之外创建的。
这完全扰乱了TensorBoard的可读性:
红框是实际模型。蓝色框架封装了所有300多个读取函数的一小部分。
问题
我是否有办法将所有Read_<num>
操作包含在tf.name_scope()
之类的内容中?或者是否有其他方式以编程方式(即不是通过鼠标单击)从TensorBoard中删除它们?
我尝试了什么
将呼叫包裹到此apply_gradients()
:
with tf.name_scope('apply_gradients_to_ns'):
with tf.variable_scope('apply_gradients_to_vs'):
minimize_op = optimizer.apply_gradients(
grads_and_vars=grads_and_vars,
global_step=tf.train.get_or_create_global_step(),
name='apply_gradients_to_name'
)
没有效果。但是,所有Read_<num>
操作的范围都不受影响。
跟踪这些操作的创建:
在tensorflow.python.training.slot_creator.py
,第179行,create_zeros_slot(..., colocate_with_primary=True)
触发tensorflow.python.ops.variable_scope.py
第1298行,get_variable(..., use_resource=None)
use_resource=True
。
但是,我不想在TensorFlow的源代码中乱七八糟。
此外,我得出结论,这种行为是有意的,我只是错误地使用它。
如何使用
尝试不同的分发策略:OneDeviceStrategy
,MirroredStrategy
。
两者都产生类似的效果。
唯一的区别是MirroredStrategy
创建了group_deps_<num>
个变量。
重现此效果的代码,更详细的说明,以及另外两个屏幕截图:https://github.com/patzm/tf-estimator-distribute-so