在相同的维度且数值为1的输入下,发现pytorch输出数值靠近1和-1,而mindspore的输出数值却几乎接近于0,请问这是哪里的问题?(mindspore的是1.8CPU版本)
import mindspore
import mindspore.nn as nn1
from mindspore import Tensor
import mindspore.ops as ops
import numpy as np
import torch
import torch.nn as nn2
x1 = Tensor(np.ones([1, 3, 4, 4, 4]), mindspore.float32)
print(x1)
x2 = torch.ones([1, 3, 4, 4, 4])
print(x2)
msconv3d = nn1.Conv3d(in_channels=3, out_channels=3, kernel_size=(2, 2, 2), stride=(2, 2, 2), pad_mode='same')
msoutput = msconv3d(x1)
print(msoutput.shape)
print(msoutput)
pyconv3d = nn2.Conv3d(in_channels=3, out_channels=3, kernel_size=(2, 2, 2), stride=(2, 2, 2))
pyoutput = pyconv3d(x2)
print(pyoutput.shape)
print(pyoutput)
我测试过您给的代码,发现
1. torch.nn.Conv3d的表现并不完全如同您描述的“输出数值靠近1和-1”,您可以多跑几次验证一下
2. ms和pytorch的nn.Conv3d输出的结果确实体现出分布的不同。对此的解释是:这两个算子参数的默认设置不完全相同,我查找出来的有以下两点不同:
2.1:torch.nn.Conv3d的bias默认=True,这个参数对应在ms中为has_bias,默认为False,不过,这点的影响其实不大
2.2:torch.nn.Conv3d有个weight属性,它被设置为均匀分布,具体可以参考https://pytorch.org/docs/1.5.0/nn.html?highlight=conv3d#torch.nn.Conv3d 中的描述,而mindspore.nn.Conv3d对应的默认参数为weight_init='normal'
综上,您可以通过在调用mindspore.nn.Conv3d()时设置has_bias=True, weight_init='uniform',使得输出和pytorch的输出分布接近。