首页 PaddleHub 帖子详情
[已解决]动态图ResNet18网络定义出错
收藏
快速回复
PaddleHub 问答预训练模型 1714 2
[已解决]动态图ResNet18网络定义出错
收藏
快速回复
PaddleHub 问答预训练模型 1714 2

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
收藏
回复
全部评论(2)
时间顺序
孔西皮
#2 回复于2020-08

已解决,主要是Sequential添加层的时候,layer的名字出现了重复

0
回复
s
seng812113976
#3 回复于2021-02

您好,我也遇到了类似的问题,可以请问解决的办法是什么吗

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户