如何在 Tensorflow 对象检测 API 中初始化卷积层的权重?
How to initialize weight for convolution layers in Tensorflow Object Detection API?
我按照这个 tutorial 来实现 Tensorflow 对象检测 API。
首选方法是使用预训练模型。
但对于某些情况,我们需要从头开始训练。
为此我们只需要在配置文件中注释掉两行作为
#fine_tune_checkpoint: "object_detection/data/mobilenet_v1_1.0_224/mobilenet_v1_1.0_224.ckpt"
#from_detection_checkpoint: true
如果我想用 Xavier 权重初始化来初始化权重,我该怎么做?
mobilenet_v1 特征提取器从 research/slim/nets:
导入 backbone 网络
25: from nets import mobilenet_v1
mobilenet 的代码根据 specification 实例化层,如下所示:
net = slim.conv2d(net, depth(conv_def.depth), conv_def.kernel, stride=conv_def.stride, scope=end_point)
见
https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.py#L264
如您所见,没有 kwargs
传递给 conv2d
调用,因此在当前代码中您无法指定将使用哪个 weights_initializer
。
不过,by default无论如何初始化器都是 Xavier,所以你很幸运。
我必须说,如果没有在某些辅助任务上对特征提取器进行预训练,训练和目标检测模型可能会失败。
如您在 configuration protobuf definition 中所见,您可以使用 3 个初始化程序:
- TruncatedNormalInitializer truncated_normal_initializer
- VarianceScalingInitializer variance_scaling_initializer
- RandomNormalInitializer random_normal_initializer
VarianceScalingInitializer 正是您要找的。它是通用初始化器,您基本上可以通过设置 factor=1.0, mode='FAN_AVG'
将其转换为 Xavier 初始化器,如 the documentation 中所述。
因此,通过将初始值设定项设置为
initializer {
variance_scaling_initializer {
factor: 1.0
uniform: true
mode: FAN_AVG
}
}
在您的配置中,您获得了 Xavier 初始化器。
而且,即使您需要训练新数据,也请考虑使用预训练网络作为初始化而不是随机初始化。有关详细信息,请参阅 this article。
我按照这个 tutorial 来实现 Tensorflow 对象检测 API。
首选方法是使用预训练模型。
但对于某些情况,我们需要从头开始训练。
为此我们只需要在配置文件中注释掉两行作为
#fine_tune_checkpoint: "object_detection/data/mobilenet_v1_1.0_224/mobilenet_v1_1.0_224.ckpt"
#from_detection_checkpoint: true
如果我想用 Xavier 权重初始化来初始化权重,我该怎么做?
mobilenet_v1 特征提取器从 research/slim/nets:
导入 backbone 网络25: from nets import mobilenet_v1
mobilenet 的代码根据 specification 实例化层,如下所示:
net = slim.conv2d(net, depth(conv_def.depth), conv_def.kernel, stride=conv_def.stride, scope=end_point)
见 https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.py#L264
如您所见,没有 kwargs
传递给 conv2d
调用,因此在当前代码中您无法指定将使用哪个 weights_initializer
。
不过,by default无论如何初始化器都是 Xavier,所以你很幸运。
我必须说,如果没有在某些辅助任务上对特征提取器进行预训练,训练和目标检测模型可能会失败。
如您在 configuration protobuf definition 中所见,您可以使用 3 个初始化程序:
- TruncatedNormalInitializer truncated_normal_initializer
- VarianceScalingInitializer variance_scaling_initializer
- RandomNormalInitializer random_normal_initializer
VarianceScalingInitializer 正是您要找的。它是通用初始化器,您基本上可以通过设置 factor=1.0, mode='FAN_AVG'
将其转换为 Xavier 初始化器,如 the documentation 中所述。
因此,通过将初始值设定项设置为
initializer {
variance_scaling_initializer {
factor: 1.0
uniform: true
mode: FAN_AVG
}
}
在您的配置中,您获得了 Xavier 初始化器。
而且,即使您需要训练新数据,也请考虑使用预训练网络作为初始化而不是随机初始化。有关详细信息,请参阅 this article。