MxNet 无法保存网络的所有参数
MxNet has trouble saving all parameters of a network
在我的实验中,MxNet 可能忘记保存我网络的一些参数。
正在研究mxnet的gluoncv包(https://gluon-cv.mxnet.io/index.html)。为了向工程师学习编程技巧,我用‘gluoncv.model_zoo.ssd.SSD’手动生成了一个SSD。我用来初始化这个class的参数和官方的'ssd_512_resnet50_v1_voc'网络一样except'classes=('car', 'pedestrian', 'truck', 'trafficLight', 'biker')'。
from gluoncv.model_zoo.ssd import SSD
import mxnet as mx
name = 'resnet50_v1'
base_size = 512
features=['stage3_activation5', 'stage4_activation2']
filters=[512, 512, 256, 256]
sizes=[51.2, 102.4, 189.4, 276.4, 363.52, 450.6, 492]
ratios=[[1, 2, 0.5]] + [[1, 2, 0.5, 3, 1.0/3]] * 3 + [[1, 2, 0.5]] * 2
steps=[16, 32, 64, 128, 256, 512]
classes=('car', 'pedestrian', 'truck', 'trafficLight', 'biker')
pretrained=True
net = SSD(network = name, base_size = base_size, features = features,
num_filters = filters, sizes = sizes, ratios = ratios, steps = steps,
pretrained=pretrained, classes=classes)
我尝试向该网络提供人造 数据 x,但出现以下错误。
x = mx.nd.zeros(shape=(batch_size,3,base_size,base_size))
cls_preds, box_preds, anchors = net(x)
RuntimeError: Parameter 'ssd0_expand_trans_conv0_weight' has not been initialized. Note that you should initialize parameters and create Trainer with Block.collect_params() instead of Block.params because the later does not include Parameters of nested child Blocks
这是有道理的。 SSD 使用函数 'gluoncv.nn.feature.FeatureExpander' 在 '_resnet50_v1[ 上添加新层=87=]_',我忘了初始化它们。所以,我使用以下代码。
net.initialize()
哦哦,它给了我很多警告。
v.initialize(None, ctx, init, force_reinit=force_reinit)
C:\Users\Bird\AppData\Local\conda\conda\envs\ssd\lib\site-packages\mxnet\gluon\parameter.py:687: UserWarning: Parameter 'ssd0_resnetv10_stage4_batchnorm9_running_mean' is already initialized, ignoring. Set force_reinit=True to re-initialize.
v.initialize(None, ctx, init, force_reinit=force_reinit)
C:\Users\Bird\AppData\Local\conda\conda\envs\ssd\lib\site-packages\mxnet\gluon\parameter.py:687: UserWarning: Parameter 'ssd0_resnetv10_stage4_batchnorm9_running_var' is already initialized, ignoring. Set force_reinit=True to re-initialize.
v.initialize(None, ctx, init, force_reinit=force_reinit)
作为SSD基础的'_resnet50_v1_'是预训练的,所以这些参数不能安装。但是,这些警告很烦人。
如何关闭它们?
但是,第一个问题出现了。我想保存网络的参数。
net.save_params('F:/Temps/Models_tmp/' +'myssd.params')
_'resnet50_v1_'(‘resnet50_v1-c940b1a0.params’)的参数文件为97.7MB;然而,我的参数文件只有9.96MB。有什么神奇的技术可以压缩这些参数吗?
为了测试这项新技术,我打开了一个新的控制台并重建了同一个网络。然后,我加载保存的参数并向其提供数据。
net.load_params('F:/Temps/Models_tmp/' +'myssd.params')
x = mx.nd.zeros(shape=(batch_size,3,base_size,base_size))
初始化错误又来了.
RuntimeError: Parameter 'ssd0_expand_trans_conv0_weight' has not been initialized. Note that you should initialize parameters and create Trainer with Block.collect_params() instead of Block.params because the later does not include Parameters of nested child Blocks
这不可能是正确的,因为保存的文件 'myssd.params' 应该包含我网络的所有安装参数。
为了找到块'_ssd0_expand_trans_conv0',我在'中做了更深入的研究gluoncv.nn.feature。 FeatureExpander_’。我使用‘mxnet.gluon。 nn.Conv2D'替换'中的'mx.sym.Convolution' ]FeatureExpander'函数。
'''
y = mx.sym.Convolution(
y, num_filter=num_trans, kernel=(1, 1), no_bias=use_bn,
name='expand_trans_conv{}'.format(i), attr={'__init__': weight_init})
'''
Conv1 = nn.Conv2D(channels = num_trans,kernel_size = (1, 1),use_bias = use_bn,weight_initializer = weight_init)
y = Conv1(y)
Conv1.initialize(verbose = True)
'''
y = mx.sym.Convolution(
y, num_filter=f, kernel=(3, 3), pad=(1, 1), stride=(2, 2),
no_bias=use_bn, name='expand_conv{}'.format(i), attr={'__init__': weight_init})
'''
Conv2 = nn.Conv2D(channels = f,kernel_size = (3, 3),padding = (1, 1),strides = (2, 2),use_bias = use_bn, weight_initializer = weight_init)
y = Conv2(y)
Conv2.initialize(verbose = True)
这些新块可以手动初始化。但是,MxNet 仍然报告 相同的错误。
看来手动初始化没有效果。
如何保存我网络的所有参数并恢复它们?
在我的实验中,MxNet 可能忘记保存我网络的一些参数。
正在研究mxnet的gluoncv包(https://gluon-cv.mxnet.io/index.html)。为了向工程师学习编程技巧,我用‘gluoncv.model_zoo.ssd.SSD’手动生成了一个SSD。我用来初始化这个class的参数和官方的'ssd_512_resnet50_v1_voc'网络一样except'classes=('car', 'pedestrian', 'truck', 'trafficLight', 'biker')'。
from gluoncv.model_zoo.ssd import SSD
import mxnet as mx
name = 'resnet50_v1'
base_size = 512
features=['stage3_activation5', 'stage4_activation2']
filters=[512, 512, 256, 256]
sizes=[51.2, 102.4, 189.4, 276.4, 363.52, 450.6, 492]
ratios=[[1, 2, 0.5]] + [[1, 2, 0.5, 3, 1.0/3]] * 3 + [[1, 2, 0.5]] * 2
steps=[16, 32, 64, 128, 256, 512]
classes=('car', 'pedestrian', 'truck', 'trafficLight', 'biker')
pretrained=True
net = SSD(network = name, base_size = base_size, features = features,
num_filters = filters, sizes = sizes, ratios = ratios, steps = steps,
pretrained=pretrained, classes=classes)
我尝试向该网络提供人造 数据 x,但出现以下错误。
x = mx.nd.zeros(shape=(batch_size,3,base_size,base_size))
cls_preds, box_preds, anchors = net(x)
RuntimeError: Parameter 'ssd0_expand_trans_conv0_weight' has not been initialized. Note that you should initialize parameters and create Trainer with Block.collect_params() instead of Block.params because the later does not include Parameters of nested child Blocks
这是有道理的。 SSD 使用函数 'gluoncv.nn.feature.FeatureExpander' 在 '_resnet50_v1[ 上添加新层=87=]_',我忘了初始化它们。所以,我使用以下代码。
net.initialize()
哦哦,它给了我很多警告。
v.initialize(None, ctx, init, force_reinit=force_reinit)
C:\Users\Bird\AppData\Local\conda\conda\envs\ssd\lib\site-packages\mxnet\gluon\parameter.py:687: UserWarning: Parameter 'ssd0_resnetv10_stage4_batchnorm9_running_mean' is already initialized, ignoring. Set force_reinit=True to re-initialize.
v.initialize(None, ctx, init, force_reinit=force_reinit)
C:\Users\Bird\AppData\Local\conda\conda\envs\ssd\lib\site-packages\mxnet\gluon\parameter.py:687: UserWarning: Parameter 'ssd0_resnetv10_stage4_batchnorm9_running_var' is already initialized, ignoring. Set force_reinit=True to re-initialize.
v.initialize(None, ctx, init, force_reinit=force_reinit)
作为SSD基础的'_resnet50_v1_'是预训练的,所以这些参数不能安装。但是,这些警告很烦人。
如何关闭它们?
但是,第一个问题出现了。我想保存网络的参数。
net.save_params('F:/Temps/Models_tmp/' +'myssd.params')
_'resnet50_v1_'(‘resnet50_v1-c940b1a0.params’)的参数文件为97.7MB;然而,我的参数文件只有9.96MB。有什么神奇的技术可以压缩这些参数吗?
为了测试这项新技术,我打开了一个新的控制台并重建了同一个网络。然后,我加载保存的参数并向其提供数据。
net.load_params('F:/Temps/Models_tmp/' +'myssd.params')
x = mx.nd.zeros(shape=(batch_size,3,base_size,base_size))
初始化错误又来了.
RuntimeError: Parameter 'ssd0_expand_trans_conv0_weight' has not been initialized. Note that you should initialize parameters and create Trainer with Block.collect_params() instead of Block.params because the later does not include Parameters of nested child Blocks
这不可能是正确的,因为保存的文件 'myssd.params' 应该包含我网络的所有安装参数。
为了找到块'_ssd0_expand_trans_conv0',我在'中做了更深入的研究gluoncv.nn.feature。 FeatureExpander_’。我使用‘mxnet.gluon。 nn.Conv2D'替换'中的'mx.sym.Convolution' ]FeatureExpander'函数。
''' y = mx.sym.Convolution( y, num_filter=num_trans, kernel=(1, 1), no_bias=use_bn, name='expand_trans_conv{}'.format(i), attr={'__init__': weight_init}) ''' Conv1 = nn.Conv2D(channels = num_trans,kernel_size = (1, 1),use_bias = use_bn,weight_initializer = weight_init) y = Conv1(y) Conv1.initialize(verbose = True) ''' y = mx.sym.Convolution( y, num_filter=f, kernel=(3, 3), pad=(1, 1), stride=(2, 2), no_bias=use_bn, name='expand_conv{}'.format(i), attr={'__init__': weight_init}) ''' Conv2 = nn.Conv2D(channels = f,kernel_size = (3, 3),padding = (1, 1),strides = (2, 2),use_bias = use_bn, weight_initializer = weight_init) y = Conv2(y) Conv2.initialize(verbose = True)
这些新块可以手动初始化。但是,MxNet 仍然报告 相同的错误。 看来手动初始化没有效果。
如何保存我网络的所有参数并恢复它们?