情景
使用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