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?