如何在tensorflow中自定义ops/layer后添加slim.batch_norm?
How to add slim.batch_norm after custom ops/layer in tensorflow?
我有一个旨在构建架构的功能
Input(x) -> o=My_ops(x,128) -> o=slim.batch_norm(o)
所以,我的功能是
def _build_block(self, x, name, is_training=True):
with tf.variable_scope(name) as scope:
o = my_ops(x, 256)
batch_norm_params = {
'decay': 0.9997,
'epsilon': 1e-5,
'scale': True,
'updates_collections': tf.GraphKeys.UPDATE_OPS,
'fused': None, # Use fused batch norm if possible.
'is_training': is_training
}
with slim.arg_scope([slim.batch_norm], **batch_norm_params) as bn:
return slim.batch_norm(o)
我说的对吗?我可以像上面的函数那样设置 is_training
吗?如果没有,你能帮我解决一下吗?
你的功能没问题。是的,您可以像那样将 is_training
设置为 slim.batch_norm
。
但是我觉得你的代码复杂得没必要。这是一个等效版本:
def _build_block(self, x, name, is_training=True):
with tf.variable_scope(name):
o = my_ops(x, 256)
return slim.batch_norm(o, decay=0.9997, epsilon=1e-5, scale=True, is_training=is_training)
请注意,我删除了 arg_scope
(因为它的主要用例是 重复 相同的参数到 多个 层,你只有一个),省略了 updates_collections=tf.GraphKeys.UPDATE_OPS
和 fused=None
(因为这些是默认值),删除了 as scope
(因为它未被使用)。
我有一个旨在构建架构的功能
Input(x) -> o=My_ops(x,128) -> o=slim.batch_norm(o)
所以,我的功能是
def _build_block(self, x, name, is_training=True):
with tf.variable_scope(name) as scope:
o = my_ops(x, 256)
batch_norm_params = {
'decay': 0.9997,
'epsilon': 1e-5,
'scale': True,
'updates_collections': tf.GraphKeys.UPDATE_OPS,
'fused': None, # Use fused batch norm if possible.
'is_training': is_training
}
with slim.arg_scope([slim.batch_norm], **batch_norm_params) as bn:
return slim.batch_norm(o)
我说的对吗?我可以像上面的函数那样设置 is_training
吗?如果没有,你能帮我解决一下吗?
你的功能没问题。是的,您可以像那样将 is_training
设置为 slim.batch_norm
。
但是我觉得你的代码复杂得没必要。这是一个等效版本:
def _build_block(self, x, name, is_training=True):
with tf.variable_scope(name):
o = my_ops(x, 256)
return slim.batch_norm(o, decay=0.9997, epsilon=1e-5, scale=True, is_training=is_training)
请注意,我删除了 arg_scope
(因为它的主要用例是 重复 相同的参数到 多个 层,你只有一个),省略了 updates_collections=tf.GraphKeys.UPDATE_OPS
和 fused=None
(因为这些是默认值),删除了 as scope
(因为它未被使用)。