MxNet无法保存网络的所有参数

时间:2018-06-12 02:26:58

标签: machine-learning deep-learning computer-vision mxnet

在我的实验中, MxNet 可能会忘记保存网络的某些参数。

我正在研究mxnet的 gluoncv 包(https://gluon-cv.mxnet.io/index.html)。为了从工程师那里学习编程技巧,我手动生成了一个带有“ gluoncv.model_zoo.ssd.SSD ”的SSD。我用来初始化此类的参数与官方的“ ssd_512_resnet50_v1_voc ”网络相同,除了' 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 _'上添加新图层,我忘记了初始化它们。所以,我使用以下代码。

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:参数'ssd0_expand_trans_conv0_weight'尚未初始化。请注意,您应该初始化参数并使用Block.collect_params()而不是Block.params创建Trainer,因为后者不包括嵌套子块的参数

这可能不对,因为保存的文件'myssd.params'应该包含我网络的所有已安装参数。

要找到块'_ ssd0_expand_trans_conv0 ',我会在' gluoncv.nn.feature中进行更深入的研究。 FeatureExpander _”。我使用' mxnet.gluon。 nn.Conv2D '替换' FeatureExpander 中的 'mx.sym.Convolution ' / strong>'功能。

'''
        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仍会报告 相同的错误 。 似乎手动初始化没有任何效果。

如何保存网络的所有参数并将其恢复?

1 个答案:

答案 0 :(得分:0)

有一个有关保存和加载的教程可能会有所帮助: https://mxnet.incubator.apache.org/tutorials/gluon/save_load_params.html