我写了一个函数来自动为你计算这个
def conv2linear(IMG_SIZE,kernel_size,padding,stride,num_layers,num_nodes=[]):
for layer in range(num_layers):
if layer == 0:
layershape=np.hstack((int(((IMG_SIZE[0]-kernel_size+2*padding)/stride)+1),(int(((IMG_SIZE[1]-kernel_size+2*padding)/stride)+1))))
poolshape=np.hstack(((layershape/2),num_nodes[layer])).astype(int)
else:
layershape=np.hstack((int(((poolshape[0]-kernel_size+2*padding)/stride)+1),(int(((poolshape[1]-kernel_size+2*padding)/stride)+1))))
poolshape=np.hstack(((layershape/2),num_nodes[layer])).astype(int)
return np.prod(poolshape)
将其应用于您的问题将如下所示:
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3,6,5)
self.conv2 = nn.Conv2d(6,16,5)
#Implement conv2linear here.
IMG_SIZE=[32,32]
kernel_size = 5
padding = 0
stride = 1
num_layers = 2
num_nodes = [6, 16]
flatConv=self.conv2linear(IMG_SIZE,kernel_size,padding,stride,num_layers,num_nodes=num_nodes)
self.fc1 = nn.Linear(flatConv, 120) #flattening
self.fc2 = nn.Linear(120,84)
self.fc3 = nn.Linear(84,10)
def conv2linear(self,IMG_SIZE,kernel_size,padding,stride,num_layers=3,num_nodes=[]):
for layer in range(num_layers):
if layer == 0:
layershape=np.hstack((int(((IMG_SIZE[0]-kernel_size+2*padding)/stride)+1),(int(((IMG_SIZE[1]-kernel_size+2*padding)/stride)+1))))
poolshape=np.hstack(((layershape/2),num_nodes[layer])).astype(int)
else:
layershape=np.hstack((int(((poolshape[0]-kernel_size+2*padding)/stride)+1),(int(((poolshape[1]-kernel_size+2*padding)/stride)+1))))
poolshape=np.hstack(((layershape/2),num_nodes[layer])).astype(int)
return np.prod(poolshape)
def forward(self, x):
x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))
x = F.max_pool2d(F.relu(self.conv2(x)),2)
x = x.view(x.size()[0],-1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
print(net)
这使用@trizard和@Ivass描述的相同方法,答案是400(即16x5x5)