paddle与torch前向对齐(resnet18)

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")

 

 

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值