在模型计算中,
假如输入的数据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
如果你不想经过卷积操作后的特征图尺寸变化,需要加“padding”参数。
你目前的代码中,paddle.nn.Flatten()之后是64x1024的,设定padding参数以后会变成64x4096(这符合你的演算思路)。
补充一点点,选择特定的卷积尺寸和步长,也能起到不改变特征尺寸的效果,建议百度 尺寸不变卷积。
你的卷积并不是尺寸不变卷积,你可以在网络里打印每一层输出的shape。
是我理解有问题,正确的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
多谢,我shape 没有算对
多谢,我shape 没有算对
是不是shape没对上的问题
是的,shape没有对上,忽略的默认的参数
你的卷积并不是尺寸不变卷积
用padding
如stride=3,padding应该取1
网上有很多计算公式的