首页 Paddle框架 帖子详情
Conv2D 输出 和 Linear 输入为什么不一致? 已解决
收藏
快速回复
Paddle框架 问答模型训练 664 11
Conv2D 输出 和 Linear 输入为什么不一致? 已解决
收藏
快速回复
Paddle框架 问答模型训练 664 11

在模型计算中,

        假如输入的数据shape 为 [64,3,32,32]

        self.conv1 = paddle.nn.Conv2D(in_channels=3, out_channels=32, kernel_size=(3, 3))  

        经过上一步,输出会变成  [64,32,32,32]
        self.pool1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)

       经过上一步,输出会变成  [64,32,16,16]

        self.conv2 = paddle.nn.Conv2D(in_channels=32, out_channels=64, kernel_size=(3,3))

       经过上一步,输出会变成  [64,64,16,16]
        self.pool2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)

       经过上一步,输出会变成  [64,64,8,8]

        self.conv3 = paddle.nn.Conv2D(in_channels=64, out_channels=64, kernel_size=(3,3))

        经过上一步,输出会变成  [64,64,8,8]

        self.flatten = paddle.nn.Flatten()

        经过上一步,输出会变成  [64,64*8*8]

 

       为什么下面的Linear 输入维度会是1024,这里看不懂,哪位大神解答一下????

        self.linear1 = paddle.nn.Linear(in_features=1024, out_features=64)
        self.linear2 = paddle.nn.Linear(in_features=64, out_features=num_classes)

定义的网络如下:

class MyNet(paddle.nn.Layer):
    def __init__(self, num_classes=1):
        super(MyNet, self).__init__()

        self.conv1 = paddle.nn.Conv2D(in_channels=3, out_channels=32, kernel_size=(3, 3))
        self.pool1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)

        self.conv2 = paddle.nn.Conv2D(in_channels=32, out_channels=64, kernel_size=(3,3))
        self.pool2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)

        self.conv3 = paddle.nn.Conv2D(in_channels=64, out_channels=64, kernel_size=(3,3))

        self.flatten = paddle.nn.Flatten()

        self.linear1 = paddle.nn.Linear(in_features=1024, out_features=64)
        self.linear2 = paddle.nn.Linear(in_features=64, out_features=num_classes)

    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = self.pool1(x)

        x = self.conv2(x)
        x = F.relu(x)
        x = self.pool2(x)

        x = self.conv3(x)
        x = F.relu(x)

        x = self.flatten(x)
        x = self.linear1(x)
        x = F.relu(x)
        x = self.linear2(x)
        return x
h
haowll
已解决
4# 回复于2022-02
      是我理解有问题,正确的shape 输出应该是这样的:        假如输入的数据shape 为 [64,3,32,32]         self.conv1 = paddle.nn.Conv2D(in_channels=3, out_channels=32, kernel_size=(3, 3))           经过上一步,输出会变成  [64,32,30,30]         self.pool1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)        经过上一步,输出会变成  [64,32,15,15]         self.conv2 = paddle.nn.Conv2D(in_channels=32, out_channels=64, kernel_size=(3,3))        经过上一步,输出会变成  [64,64,13,13]         self.pool2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)        经过上一步,输出会变成  [64,64,6,6]         self.conv3 = paddle.nn.Conv2D(in_channels=64, out_channels=64, kernel_size=(3,3))         经过上一步,输出会变成  [64,64,4,4]         self.flatten = paddle.nn.Flatten()         经过上一步,输出会变成  [64,64*4*4] ,   64*4*4 刚好就是1024
展开
0
收藏
回复
全部评论(11)
时间顺序
Automate
#2 回复于2022-02

如果你不想经过卷积操作后的特征图尺寸变化,需要加“padding”参数。

paddle.nn.Conv2D(padding='same')

你目前的代码中,paddle.nn.Flatten()之后是64x1024的,设定padding参数以后会变成64x4096(这符合你的演算思路)。

0
回复
十进制到二进制
#3 回复于2022-02

补充一点点,选择特定的卷积尺寸和步长,也能起到不改变特征尺寸的效果,建议百度 尺寸不变卷积。

你的卷积并不是尺寸不变卷积,你可以在网络里打印每一层输出的shape。

0
回复
h
haowll
#4 回复于2022-02

      是我理解有问题,正确的shape 输出应该是这样的: 

      假如输入的数据shape 为 [64,3,32,32]

        self.conv1 = paddle.nn.Conv2D(in_channels=3, out_channels=32, kernel_size=(3, 3))  

        经过上一步,输出会变成  [64,32,30,30]
        self.pool1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)

       经过上一步,输出会变成  [64,32,15,15]

        self.conv2 = paddle.nn.Conv2D(in_channels=32, out_channels=64, kernel_size=(3,3))

       经过上一步,输出会变成  [64,64,13,13]
        self.pool2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)

       经过上一步,输出会变成  [64,64,6,6]

        self.conv3 = paddle.nn.Conv2D(in_channels=64, out_channels=64, kernel_size=(3,3))

        经过上一步,输出会变成  [64,64,4,4]

        self.flatten = paddle.nn.Flatten()

        经过上一步,输出会变成  [64,64*4*4] ,   64*4*4 刚好就是1024

1
回复
h
haowll
#5 回复于2022-02
如果你不想经过卷积操作后的特征图尺寸变化,需要加“padding”参数。 [代码] 你目前的代码中,paddle.nn.Flatten()之后是64x1024的,设定padding参数以后会变成64x4096(这符合你的演算思路)。
展开

多谢,我shape 没有算对

0
回复
h
haowll
#6 回复于2022-02
补充一点点,选择特定的卷积尺寸和步长,也能起到不改变特征尺寸的效果,建议百度 尺寸不变卷积。 你的卷积并不是尺寸不变卷积,你可以在网络里打印每一层输出的shape。

多谢,我shape 没有算对

0
回复
TowerNet
#7 回复于2022-02

是不是shape没对上的问题

0
回复
h
haowll
#8 回复于2022-02
是不是shape没对上的问题

是的,shape没有对上,忽略的默认的参数

0
回复
fi_Past
#9 回复于2022-03

你的卷积并不是尺寸不变卷积

0
回复
fi_Past
#10 回复于2022-03

用padding

0
回复
fi_Past
#11 回复于2022-03

如stride=3,padding应该取1

0
回复
fi_Past
#12 回复于2022-03

网上有很多计算公式的

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