MxNet มีปัญหาในการบันทึกพารามิเตอร์ทั้งหมดของเครือข่าย

ในการทดสอบของฉัน MxNet อาจลืมบันทึกพารามิเตอร์บางตัวของเครือข่ายของฉัน

ฉันกำลังศึกษาแพ็คเกจ gluoncv ของ mxnet (https://gluon-cv.mxnet.io/index.html) เพื่อเรียนรู้ทักษะการเขียนโปรแกรมจากวิศวกร ฉันจึงสร้าง SSD ด้วยตนเองด้วย "gluoncv.model_zoo.ssd.SSD" พารามิเตอร์ที่ฉันใช้ในการเริ่มต้นคลาสนี้เหมือนกับเครือข่าย 'ssd_512_resnet50_v1_voc' อย่างเป็นทางการ ยกเว้น 'classes=('car', 'pedestrian', ' รถบรรทุก', 'ไฟจราจร', 'นักขี่จักรยาน')'

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)

'_resnet50_v1_' ซึ่งเป็นฐานของ SSD ได้รับการฝึกอบรมล่วงหน้าแล้ว ดังนั้นจึงไม่สามารถติดตั้งพารามิเตอร์เหล่านี้ได้ อย่างไรก็ตาม คำเตือนเหล่านี้น่ารำคาญ

ฉันจะปิดได้อย่างไร

อย่างไรก็ตาม ปัญหาแรกมาถึง ฉันต้องการบันทึกพารามิเตอร์ของเครือข่าย

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' ยังไม่ได้เตรียมใช้งาน โปรดทราบว่าคุณควรเริ่มต้นพารามิเตอร์และสร้าง Trainer ด้วย Block.collect_params() แทน Block.params เนื่องจากในภายหลังจะไม่รวมพารามิเตอร์ของบล็อกย่อยที่ซ้อนกัน

สิ่งนี้ไม่ถูกต้องเนื่องจากไฟล์ 'myssd.params' ที่บันทึกไว้ควรมีพารามิเตอร์ที่ติดตั้งทั้งหมดของเครือข่ายของฉัน

หากต้องการค้นหาบล็อก '_ssd0_expand_trans_conv0' ฉันจึงค้นคว้าเชิงลึกใน 'gluoncv.nn.feature ฟีเจอร์เอ็กซ์แพนเดอร์_’ ฉันใช้ 'mxnet.gluon nn.Conv2D' เพื่อแทนที่ 'mx.sym.Convolution' ใน 'FeatureExpander< /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 ยังคงรายงานข้อผิดพลาดเดียวกัน ดูเหมือนว่าการเริ่มต้นด้วยตนเองจะไม่มีผลใดๆ

ฉันจะบันทึกพารามิเตอร์ทั้งหมดของเครือข่ายของฉันและกู้คืนได้อย่างไร


person Blue Bird    schedule 12.06.2018    source แหล่งที่มา
comment
มีเหตุผลที่คุณไม่ต้องการโหลด ssd ตามที่อธิบายไว้ที่นี่หรือไม่ gluon-cv.mxnet. io/build/examples_detection/   -  person Sergei    schedule 23.06.2018


คำตอบ (1)


มีบทช่วยสอนในเรื่องของการบันทึกและการโหลดที่อาจช่วยได้: https://mxnet.apache.org/versions/1.6/api/python/docs/tutorials/packages/gluon/blocks/save_load_params.html

person Simon Corston-Oliver    schedule 08.07.2018
comment
อาจารย์แนะนำแนวคิดที่ 'discuss.mxnet.io/t/'. - person Blue Bird; 04.08.2018