[已解决]动态图ResNet18网络定义出错
收藏
ResNet-18的网络定义部分的代码如下,训练时在MyCNN类的forward函数中的 x = self.layer2(x) 语句处报错,报错信息为
InvalidArgumentError: The number of input's channels should be equal to filter's channels * groups for Op(Conv). But received: the input's channels is 64, the input's shape is [64, 64, 16, 16]; the filter's channels is 128, the filter's shape is [128, 128, 3, 3]; the groups is 1, the data_format is NCHW. The error may come from wrong data_format setting.
题主是刚接触paddlepaddle的新手,知道报错信息中卷积核的通道数应该为64,但不知哪里的参数写错了,查了好久也没查出来,求帮助 qaq
#定义网络 from paddle.fluid import dygraph, layers from paddle.fluid.dygraph import Conv2D INPUT_SIZE = [64, 64] BATCH_SIZE = 64 class BasicBlock(fluid.dygraph.Layer): """ResNet的单元有两种形式,50层以下的叫做 BasicBlock """ expansion = 1 # inplanes输入通道数,planes输出通道数 def __init__(self, inplanes, planes, stride=1): super(BasicBlock, self).__init__() self.conv1 = Conv2D(inplanes, planes, (3,3), stride=stride, padding=1) self.bn1 = dygraph.BatchNorm(planes, act='relu') self.conv2 = Conv2D(planes, planes, (3,3), stride=1, padding=1) self.bn2 = dygraph.BatchNorm(planes) if stride != 1: self.downsample = dygraph.Sequential() self.downsample.add_sublayer('d1', Conv2D(inplanes, planes, (1,1), stride=stride, padding=0)) else: self.downsample = lambda x:x def forward(self, inputs, training=None): # [b, h, w, c] out = self.conv1(inputs) out = self.bn1(out) out = self.conv2(out) out = self.bn2(out) identity = self.downsample(inputs) output = layers.elementwise_add(out, identity) output = layers.relu(output) return output class MyCNN(fluid.dygraph.Layer): """ ResNet Example: """ def __init__(self, inplanes=3, layer_dims=[2,2,2,2], num_classes=5): # [2,2,2,2] super(MyCNN,self).__init__() self.stem = dygraph.Sequential() self.stem.add_sublayer('c1', Conv2D(inplanes, 64, (7,7), stride=(2,2), padding=3)) self.stem.add_sublayer('b1', dygraph.BatchNorm(64, act='relu')) self.stem.add_sublayer('p1', dygraph.Pool2D(pool_size=(3,3), pool_type='max', pool_stride=(2,2), pool_padding=(1,1))) self.layer1 = self.build_res_block(layer_dims[0], 64, 64, stride=1) self.layer2 = self.build_res_block(layer_dims[1], 64, 128, stride=2) self.layer3 = self.build_res_block(layer_dims[2], 128, 256, stride=2) self.layer4 = self.build_res_block(layer_dims[3], 256, 512, stride=2) self.avgpool = dygraph.Pool2D(pool_type='avg', pool_stride=(1,1), global_pooling=True) self.fc = dygraph.Linear(input_dim=512, output_dim=num_classes) def forward(self, inputs, training=None): x = self.stem(inputs) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = self.avgpool(x) x = layers.reshape(x, shape=[-1,512]) x = self.fc(x) return x def build_res_block(self, blocks, inplanes, planes, stride=1): res_blocks = dygraph.Sequential() res_blocks.add_sublayer('l1', BasicBlock(inplanes, planes, stride)) for _ in range(1, blocks): res_blocks.add_sublayer('l'+str(_), BasicBlock(planes, planes, stride=1)) return res_blocks
1
收藏
请登录后评论
已解决,主要是Sequential添加层的时候,layer的名字出现了重复
您好,我也遇到了类似的问题,可以请问解决的办法是什么吗