[已解决]动态图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的名字出现了重复
您好,我也遇到了类似的问题,可以请问解决的办法是什么吗