MxNet mengalami kesulitan menyimpan semua parameter jaringan

Dalam percobaan saya, MxNet mungkin lupa menyimpan beberapa parameter jaringan saya.

Saya sedang mempelajari paket gluoncv mxnet (https://gluon-cv.mxnet.io/index.html). Untuk mempelajari keterampilan pemrograman dari para insinyur, saya membuat SSD secara manual dengan 'gluoncv.model_zoo.ssd.SSD'. Parameter yang saya gunakan untuk menginisialisasi kelas ini sama dengan jaringan resmi 'ssd_512_resnet50_v1_voc' kecuali 'classes=('car', 'pedestrian', ' truk', '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)

Saya mencoba memasukkan data x buatan manusia ke jaringan ini, dan menghasilkan kesalahan berikut.

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

Ini masuk akal. SSD menggunakan fungsi 'gluoncv.nn.feature.FeatureExpander' untuk menambahkan lapisan baru pada '_resnet50_v1_', dan saya lupa inisialisasi mereka. Jadi, saya menggunakan kode berikut.

net.initialize()

Oho, ini memberiku banyak peringatan.

  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_' yang merupakan basis SSD telah dilatih sebelumnya, sehingga parameter ini tidak dapat dipasang. Namun peringatan ini mengganggu.

Bagaimana cara menonaktifkannya?

Namun, di sinilah masalah pertama. Saya ingin menyimpan parameter jaringan.

net.save_params('F:/Temps/Models_tmp/' +'myssd.params')

File parameter _'resnet50_v1_' ('resnet50_v1-c940b1a0.params') berukuran 97,7MB; namun, file parameter saya hanya 9,96MB. Apakah ada teknologi ajaib untuk mengompresi parameter ini?

Untuk menguji teknologi baru ini, saya membuka konsol baru dan membangun kembali jaringan yang sama. Kemudian, saya memuat parameter yang disimpan dan memasukkan data ke dalamnya.

net.load_params('F:/Temps/Models_tmp/' +'myssd.params')
x = mx.nd.zeros(shape=(batch_size,3,base_size,base_size)) 

Kesalahan inisialisasi terjadi lagi.

RuntimeError: Parameter 'ssd0_expand_trans_conv0_weight' belum diinisialisasi. Perhatikan bahwa Anda harus menginisialisasi parameter dan membuat Pelatih dengan Block.collect_params() alih-alih Block.params karena yang terakhir tidak menyertakan Parameter dari Blok anak yang disarangkan

Ini tidak benar karena file yang disimpan 'myssd.params' harus berisi semua parameter jaringan saya yang terinstal.

Untuk menemukan blok '_ssd0_expand_trans_conv0', saya melakukan penelitian lebih dalam di 'gluoncv.nn.feature. FiturExpander_'. Saya menggunakan 'mxnet.gluon. nn.Conv2D' untuk menggantikan 'mx.sym.Convolution' di 'FeatureExpander< /kuat>' fungsi.

'''
        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)

Blok baru ini dapat diinisialisasi secara manual. Namun, MxNet masih melaporkan kesalahan yang sama. Tampaknya inisialisasi manual tidak berpengaruh.

Bagaimana cara menyimpan semua parameter jaringan saya dan memulihkannya?


person Blue Bird    schedule 12.06.2018    source sumber
comment
Apakah ada alasan mengapa Anda tidak ingin memuat SSD Anda seperti yang dijelaskan di sini? gluon-cv.mxnet. io/build/examples_detection/   -  person Sergei    schedule 23.06.2018


Jawaban (1)


Ada tutorial tentang menyimpan dan memuat yang mungkin bisa membantu: 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
Seorang profesor menyarankan sebuah ide di 'diskusi.mxnet.io/t/'. - person Blue Bird; 04.08.2018