pytorch低版本加載高版本pytorch訓練得到的模型,出現‘module’ object has no attribute ‘_rebuild_tensor_v2’錯誤

情景
使用pytorch0.3來加載Mobilenetv1的模型(用更高版本的pytorch訓練得到的),出現“AttributeError: ‘module’ object has no attribute ‘_rebuild_tensor_v2’”錯誤。

分析
追根溯源,查看pytorch的源碼,torch下__init__.py定義了__all__ = [**, ‘load’, **],然後是from .serialization import load,然後去看serialization.py的源碼,load函數下面調用了_load函數,但是 我並沒有找到_rebuild_tensor_v2函數。在最新版的pytorch源碼下,_utils.py下存在_rebuild_tensor_v2函數,但是在低版本下沒有_rebuild_tensor_v2函數。個人猜想,在調用torch.load的時候,在某處調用了_rebuild_tensor_v2,但是在低版本pytorch的_utils.py文件中沒有定義該函數,因此需要自己重新定義。

解決
參考:https://discuss.pytorch.org/t/question-about-rebuild-tensor-v2/14560 給出的解決方案,在調用torch.load的py文件中,添加以下代碼,自己定義_rebuild_tensor_v2函數:

import torch._utils
try:
    torch._utils._rebuild_tensor_v2
except AttributeError:
    def _rebuild_tensor_v2(storage, storage_offset, size, stride, requires_grad, backward_hooks):
        tensor = torch._utils._rebuild_tensor(storage, storage_offset, size, stride)
        tensor.requires_grad = requires_grad
        tensor._backward_hooks = backward_hooks
        return tensor
    torch._utils._rebuild_tensor_v2 = _rebuild_tensor_v2

擴展閱讀
這種解決版本不兼容衝突的方法也叫作:Monkey Patch。猴子補丁。
大概意思就是:在運行時對已有代碼進行修改,達到hot patch的功能。
具體可參考:https://blog.csdn.net/fly910905/article/details/77152110

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章