1 系统环境
硬件环境(Ascend/GPU/CPU): 不限
MindSpore版本: 2.0.0
执行模式(PyNative/ Graph): 不限
Python版本: 3.7.5
操作系统平台: 不限
2 报错信息
2.1 问题描述
运行示例代码出现报错
2.2 报错信息
2.3 脚本代码(代码格式,可上传附件)
import mindspore
from mindspore import nn
import mindspore.ops as ops
class Residual(nn.Cell):
"""The Residual block of ResNet."""
def __init__(self, input_channels, num_channels,
use_1x1conv=False, strides=1):
super().__init__()
self.conv1 = nn.Conv2d(input_channels, num_channels,
kernel_size=3, padding=1, stride=strides, pad_mode='pad')
self.conv2 = nn.Conv2d(num_channels, num_channels,
kernel_size=3, padding=1, pad_mode='pad')
if use_1x1conv:
self.conv3 = nn.Conv2d(input_channels, num_channels,
kernel_size=1, stride=strides)
else:
self.conv3 = None
self.bn1 = nn.BatchNorm2d(num_channels)
self.bn2 = nn.BatchNorm2d(num_channels)
def forward(self, X):
Y = ops.relu(self.bn1(self.conv1(X)))
Y = self.bn2(self.conv2(Y))
if self.conv3:
X = self.conv3(X)
Y += X
return ops.relu(Y)
def resnet_block(in_channels, out_channels, num_residuals,
first_block=False):
blk = []
for i in range(num_residuals):
if i == 0 and not first_block:
blk.append(Residual(in_channels, out_channels,
use_1x1conv=True, strides=2))
nn.Conv2d(in_channels, out_channels,
kernel_size=3, padding=1, stride=2, pad_mode='pad')
else:
blk.append(Residual(out_channels, out_channels))
return nn.SequentialCell(*blk)
# net = resnet_block(10,3, 3)
net = nn.SequentialCell(
nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, pad_mode='pad'),
nn.BatchNorm2d(64),
nn.ReLU())
net.insert_child_to_cell("resnet_block1", resnet_block(64, 64, 2, first_block=True))
net.insert_child_to_cell("resnet_block2", resnet_block(64, 128, 2))
trainer = nn.Adam(net.trainable_params(), learning_rate=0.001) 3 根因分析
******此处由用户补充详细的定位过程******
当前框架容器类命名机制某些场景会失效,导致cell里Parameter重复,导致训练时报错。
4 解决方案
******此处由用户填写******
包含文字方案和最终脚本代码
支持上传附件
1 系统环境
硬件环境(Ascend/GPU/CPU): 不限
MindSpore版本: 2.0.0
执行模式(PyNative/ Graph): 不限
Python版本: 3.7.5
操作系统平台: 不限
2 报错信息
2.1 问题描述
运行示例代码出现报错
2.2 报错信息
raise ValueError("The value {} , its name '{}' already exists. " ValueError: The value Parameter (name=0.conv1.weight, shape=(128, 64, 3, 3), dtype=Float32, requires_grad=True) , its name '0.conv1.weight' already exists. Please set a unique name for the parameter.2.3 脚本代码(代码格式,可上传附件)
import mindspore from mindspore import nn import mindspore.ops as ops class Residual(nn.Cell): """The Residual block of ResNet.""" def __init__(self, input_channels, num_channels, use_1x1conv=False, strides=1): super().__init__() self.conv1 = nn.Conv2d(input_channels, num_channels, kernel_size=3, padding=1, stride=strides, pad_mode='pad') self.conv2 = nn.Conv2d(num_channels, num_channels, kernel_size=3, padding=1, pad_mode='pad') if use_1x1conv: self.conv3 = nn.Conv2d(input_channels, num_channels, kernel_size=1, stride=strides) else: self.conv3 = None self.bn1 = nn.BatchNorm2d(num_channels) self.bn2 = nn.BatchNorm2d(num_channels) def forward(self, X): Y = ops.relu(self.bn1(self.conv1(X))) Y = self.bn2(self.conv2(Y)) if self.conv3: X = self.conv3(X) Y += X return ops.relu(Y) def resnet_block(in_channels, out_channels, num_residuals, first_block=False): blk = [] for i in range(num_residuals): if i == 0 and not first_block: blk.append(Residual(in_channels, out_channels, use_1x1conv=True, strides=2)) nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1, stride=2, pad_mode='pad') else: blk.append(Residual(out_channels, out_channels)) return nn.SequentialCell(*blk) # net = resnet_block(10,3, 3) net = nn.SequentialCell( nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, pad_mode='pad'), nn.BatchNorm2d(64), nn.ReLU()) net.insert_child_to_cell("resnet_block1", resnet_block(64, 64, 2, first_block=True)) net.insert_child_to_cell("resnet_block2", resnet_block(64, 128, 2)) trainer = nn.Adam(net.trainable_params(), learning_rate=0.001)3 根因分析
******此处由用户补充详细的定位过程******
当前框架容器类命名机制某些场景会失效,导致cell里Parameter重复,导致训练时报错。
4 解决方案
******此处由用户填写******
包含文字方案和最终脚本代码
支持上传附件