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

Machine learning MxNet无法保存网络的所有参数,machine-learning,deep-learning,computer-vision,mxnet,Machine Learning,Deep Learning,Computer Vision,Mxnet,在我的实验中,MxNet可能会忘记保存我的网络的一些参数 我正在学习mxnet的gluoncv软件包()。为了从工程师那里学习编程技巧,我使用“gluncv.model\u zoo.SSD.SSD”手动生成了一个SSD。我用来初始化这个类的参数与官方的“ssd\u 512\u resnet50\u v1\u voc”网络相同,除了“类=(“汽车”、“行人”、“卡车”、“交通灯”、“自行车手”)” from gluoncv.model_zoo.ssd import SSD import mxnet

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

我正在学习mxnet的gluoncv软件包()。为了从工程师那里学习编程技巧,我使用“gluncv.model\u zoo.SSD.SSD”手动生成了一个SSD。我用来初始化这个类的参数与官方的“ssd\u 512\u resnet50\u v1\u voc”网络相同,除了“类=(“汽车”、“行人”、“卡车”、“交通灯”、“自行车手”)

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

这是合理的。SSD使用函数“gluncv.nn.feature.FeatureExpander”在“resnet50\u 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基础的“\u resnet50\u v1””经过预训练,因此无法安装这些参数。然而,这些警告令人恼火

如何关闭它们?

然而,这里出现了第一个问题。我想保存网络的参数

net.save_params('F:/Temps/Models_tmp/' +'myssd.params')
_strong>'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)) 
初始化错误再次出现

运行时错误:参数“ssd0\u扩展\u传输\u conv0\u权重”尚未初始化。请注意,您应该初始化参数并使用Block.collect_params()而不是Block.params创建Trainer,因为后者不包括嵌套子块的参数

这不正确,因为保存的文件“myssd.params”应包含我的网络的所有已安装参数

为了找到块“ssd0\u expand\u trans\u conv0”,我在“gluncv.nn.feature”中做了更深入的研究。功能扩展器。我使用“mxnet.glion”。nn.Conv2D'替换“功能扩展器”函数中的“”mx.sym.卷积

这些新块可以手动初始化。但是,MxNet仍然报告相同的错误。 手动初始化似乎没有效果


如何保存网络的所有参数并将其还原?有一个关于保存和加载的教程,可能会有所帮助:

您不想按此处所述加载ssd的原因是什么?一位教授在“”提出了一个想法。
'''
        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)