torch | paddle |
nn.BatchNorm2d | nn.BatchNorm2D |
nn.Conv2d | nn.Conv2D |
bias | bias_attr |
nn.ReLU(inplace=True) | nn.ReLU() |
nn.MaxPool2d | nn.MaxPool2D |
nn.AdaptiveAvgPool2d | nn.AdaptiveAvgPool2D |
nn.Module.modules | nn.Layer.sublayers |
|
|
遇到的问题:30系列显卡跑出的结果和CPU以及20系列显卡的结果不一致,误差比较大
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/5/17 11:55
# @Author : wangjianrong
# @File : 02_前向对比比较.py
import numpy as np
import torch
import paddle
from paddle.nn.initializer import Assign
# torch_x = np.load("torch_x.npy")
# paddle_x = np.load("paddle_x.npy")
#
# torch_w = np.load("torch_conv.npy")
# paddle_w = np.load("paddle_conv.npy")
# paddle.set_device('cpu')
paddle_x = np.random.randn(1,64,56,56).astype('float32')
torch_x = paddle_x.copy()
paddle_w = np.ones((128,64,3,3)).astype('float32')
torch_w = paddle_w.copy()
torch_conv = torch.nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,stride=1,bias=False)
paddle_conv = paddle.nn.Conv2D(in_channels=64,out_channels=128,kernel_size=3,stride=1,bias_attr=None)
torch_conv.weight = torch.nn.Parameter(torch.from_numpy(torch_w))
parameter = paddle_conv.create_parameter(shape=paddle_w.shape,default_initializer=Assign(paddle_w))
paddle_conv.add_parameter("weight",parameter)
# torch_conv = torch_conv.cuda()
torch_y = torch_conv(torch.from_numpy(torch_x)).cpu().detach().numpy()
paddle_y = paddle_conv(paddle.to_tensor(paddle_x)).numpy()
print(np.max(np.abs(torch_y-paddle_y)))
将上述表中的接口一一对应修改,并注释掉dropout(resnet18不包括dp)
from collections import OrderedDict
if __name__ == '__main__':
model_path = "/home/ubuntu/.cache/torch/checkpoints/resnet18-5c106cde.pth"
model = resnet18(False)
torch_state_dict = torch.load(model_path)
paddle_state_dict = model.state_dict()
new_state_dict = OrderedDict()
# torch_key = [(key,val) for key,val in torch_state_dict.items()]
# paddle_key = [(key,val) for key,val in model.state_dict().items()]
torch_keys = [key for key, val in torch_state_dict.items()]
paddle_keys = [key for key, val in paddle_state_dict.items()]
assert len(torch_keys)==len(paddle_keys)
for paddle_key in paddle_keys:
#bn层命名区别
if '_mean' in paddle_key:
torch_key = paddle_key.replace('_mean','running_mean')
elif '_variance' in paddle_key:
torch_key = paddle_key.replace('_variance','running_var')
else:
torch_key = paddle_key
paddle_val = torch_state_dict[torch_key].detach().numpy().astype('float32')
#fc层参数转置
if 'fc' in paddle_key and 'weight' in paddle_key:
paddle_val = paddle_val.T
new_state_dict[paddle_key] = paddle_val
model.set_state_dict(new_state_dict)
paddle.save(model.state_dict(),"res18.pdparams")