MxNet預訓練模型到Pytorch模型的轉換
預訓練模型在不同深度學習框架中的轉換是一種常見的任務。今天剛好DPN預訓練模型轉換問題,順手將這個過程記錄一下。
核心轉換函式如下所示:
def convert_from_mxnet(model, checkpoint_prefix, debug=False):
_, mxnet_weights, mxnet_aux = mxnet.model.load_checkpoint(checkpoint_prefix, 0)
remapped_state = {}
for state_key in model.state_dict().keys():
k = state_key.split('.')
aux = False
mxnet_key = ''
if k[0] == 'features':
if k[1] == 'conv1_1':
# input block
mxnet_key += 'conv1_x_1__'
if k[2] == 'bn':
mxnet_key += 'relu-sp__bn_'
aux, key_add = _convert_bn(k[3])
mxnet_key += key_add
else:
assert k[3] == 'weight'
mxnet_key += 'conv_' + k[3]
elif k[1] == 'conv5_bn_ac':
# bn + ac at end of features block
mxnet_key += 'conv5_x_x__relu-sp__bn_'
assert k[2] == 'bn'
aux, key_add = _convert_bn(k[3])
mxnet_key += key_add
else:
# middle blocks
if model.b and 'c1x1_c' in k[2]:
bc_block = True # b-variant split c-block special treatment
else:
bc_block = False
ck = k[1].split('_')
mxnet_key += ck[0] + '_x__' + ck[1] + '_'
ck = k[2].split('_')
mxnet_key += ck[0] + '-' + ck[1]
if ck[1] == 'w' and len(ck) > 2:
mxnet_key += '(s/2)' if ck[2] == 's2' else '(s/1)'
mxnet_key += '__'
if k[3] == 'bn':
mxnet_key += 'bn_' if bc_block else 'bn__bn_'
aux, key_add = _convert_bn(k[4])
mxnet_key += key_add
else:
ki = 3 if bc_block else 4
assert k[ki] == 'weight'
mxnet_key += 'conv_' + k[ki]
elif k[0] == 'classifier':
if 'fc6-1k_weight' in mxnet_weights:
mxnet_key += 'fc6-1k_'
else:
mxnet_key += 'fc6_'
mxnet_key += k[1]
else:
assert False, 'Unexpected token'
if debug:
print(mxnet_key, '=> ', state_key, end=' ')
mxnet_array = mxnet_aux[mxnet_key] if aux else mxnet_weights[mxnet_key]
torch_tensor = torch.from_numpy(mxnet_array.asnumpy())
if k[0] == 'classifier' and k[1] == 'weight':
torch_tensor = torch_tensor.view(torch_tensor.size() + (1, 1))
remapped_state[state_key] = torch_tensor
if debug:
print(list(torch_tensor.size()), torch_tensor.mean(), torch_tensor.std())
model.load_state_dict(remapped_state)
return model
從中可以看出,其轉換步驟如下:
(1)建立pytorch的網路結構模型,設為model
(2)利用mxnet來讀取其儲存的預訓練模型,得到mxnet_weights;
(3)遍歷載入後模型mxnet_weights的state_dict().keys
(4)對一些指定的key值,需要進行相應的處理和轉換
(5)對修改鍵名之後的key利用numpy之間的轉換來實現載入。
為了實現上述轉換,首先pip安裝mxnet,現在新版的mxnet安裝還是非常方便的。
第二步,執行轉換程式,實現預訓練模型的轉換。
可以看到在相當的資料夾下已經出現了轉換後的模型。
相關文章
- PyTorch預訓練Bert模型PyTorch模型
- 【AI】Pytorch_預訓練模型AIPyTorch模型
- 從VGG到ResNet,你想要的MXNet預訓練模型輕鬆學模型
- 取出預訓練模型中間層的輸出(pytorch)模型PyTorch
- 如何將keras訓練的模型轉換成tensorflow lite模型Keras模型
- Mxnet模型檔案轉換為Pb模型檔案模型
- Mxnet速查_CPU和GPU的mnist預測訓練_模型匯出_模型匯入再預測_匯出onnx並預測GPU模型
- Caffe轉mxnet模型——mxnet工具模型
- 自訓練 + 預訓練 = 更好的自然語言理解模型模型
- PyTorch 模型訓練實⽤教程(程式碼訓練步驟講解)PyTorch模型
- pytorch-模型儲存與載入自己訓練的模型詳解PyTorch模型
- 輕量化模型訓練加速的思考(Pytorch實現)模型PyTorch
- 預訓練模型 & Fine-tuning模型
- Caffe轉mxnet模型——mmdnn模型DNN
- 【預訓練語言模型】 使用Transformers庫進行BERT預訓練模型ORM
- 對比復現34個預訓練模型,PyTorch和Keras你選誰?模型PyTorchKeras
- 【小白學PyTorch】5 torchvision預訓練模型與資料集全覽PyTorch模型
- 通用模型、全新框架,WavLM語音預訓練模型全解模型框架
- pytorch使用交叉熵訓練模型學習筆記PyTorch熵模型筆記
- 【Meetup預告】OpenMLDB+OneFlow:連結特徵工程到模型訓練,加速機器學習模型開發特徵工程模型機器學習
- 知識增強的預訓練語言模型系列之ERNIE:如何為預訓練語言模型注入知識模型
- 新型大語言模型的預訓練與後訓練正規化,谷歌的Gemma 2語言模型模型谷歌Gemma
- 新型大語言模型的預訓練與後訓練正規化,Meta的Llama 3.1語言模型模型
- 瀏覽器中的機器學習:使用預訓練模型瀏覽器機器學習模型
- pytorch,訓練模型時記憶體佔用不斷上升PyTorch模型記憶體
- TorchVision 預訓練模型進行推斷模型
- 常見預訓練語言模型簡述模型
- 新型大語言模型的預訓練與後訓練正規化,蘋果的AFM基礎語言模型模型蘋果
- 模型訓練:資料預處理和預載入模型
- 【預訓練語言模型】使用Transformers庫進行GPT2預訓練模型ORMGPT
- 一文講透預訓練模型的改進訓練演算法 ,輕鬆達到State of the Art模型演算法
- 加入Transformer-XL,這個PyTorch包能呼叫各種NLP預訓練模型ORMPyTorch模型
- NLP領域預訓練模型的現狀及分析模型
- keras中VGG19預訓練模型的使用Keras模型
- pytorch模型(.pt)轉onnx模型(.onnx)的方法PyTorch模型
- 新型大語言模型的預訓練與後訓練正規化,阿里Qwen模型阿里
- 人工智慧的預訓練基礎模型的分類人工智慧模型
- 預訓練語言模型:還能走多遠?模型