任务描述
本关任务:本关提供了一个Variable 类型的变量x,要求按照条件创建一个Conv2d变量conv,一个MaxPool2d变量pool,对x应用卷积和最大池化操作并赋值给变量outpout_pool,并输出outpout_pool 的大小。
相关知识
Pytorch 中池化分为两种:
- 最大池化MaxPool
- 平均池化 AvgPool
MaxPool
MaxPool | 描述 |
MaxPool1d | 对输入信号应用1维最大池化操作 |
MaxPool2d | 对输入信号应用2维最大池化操作 |
MaxPool3d | 对输入信号应用3维最大池化操作 |
下面以MaxPool1d做详细介绍,2维和3维只是在1维的基础上计算了长宽、长宽高的池化。
函数定义:
torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
若输入大小为: (N,C,L),则输出大小为:(N,C,Lout)的计算方式如下:
参数说明:
参数名 | 参数类型 | 说明 | 默认值 |
kernel_size | int或tuple | 最大池化窗口的大小 | |
stride | int or tuple, optional | 滑动窗口 | 默认为 kernel_size |
padding | int or tuple, optional | 在两侧添加隐式零进行填充 | |
dilation | int or tuple, optional | 控制窗口中元素步幅的参数 | |
return_indices | boolean ,optional | 如果等于True,会返回输出最大值的序号,对于上采样操作会有帮助 | |
ceil_mode | boolean ,optional | 如果等于True,计算输出信号大小的时候,会使用向上取整(ceil) | 默认的向下取整(floor) |
维度: Input: (N,C,L) Output: (N,C,Lout)
应用示例:
# pool of size=3, stride=2
m = nn.MaxPool1d(3, stride=2)
input = Variable(torch.Tensor([[[1,2,3,4,5,6,7]]]))
output = m(input)
print(output.size())
输出结果:
Variable containing:(0 ,.,.) = 3 5 7[torch.FloatTensor of size 1x1x3]
AvgPool
AvgPool | 描述 |
AvgPool1d | 对输入信号应用1维平均池化操作 |
AvgPool2d | 对输入信号应用2维平均池化操作 |
AvgPool3d | 对输入信号应用3维平均池化操作 |
下面以AvgPool1d做详细介绍,2维和3维只是在1维的基础上计算了长宽、长宽高的池化。
函数定义:
torch.nn.AvgPool1d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True)
若输入大小: (N,C,L),输出大小(N,C,Lout)和池化窗口大小k的关系是
如果填充不为零,则输入在两侧都会隐式填充零。
参数kernel_size,stride,padding可以是一个int或一个元素的元组。
参数说明:
参数名 | 参数类型 | 说明 | 默认值 |
kernel_size | int或tuple | 最大池化窗口的大小 | |
stride | int or tuple, optional | 滑动窗口 | 默认为 kernel_size |
padding | int or tuple, optional | 在两侧添加隐式零进行填充 | |
ceil_mode | boolean ,optional | 如果等于True,计算输出信号大小的时候,会使用向上取整(ceil) | 默认的向下取整(floor) |
count_include_pad | boolean ,optional | 如果等于True,将在求平均的计算中用0填充 | |
维度 | |||
Input: (N,C,L) | |||
Output: (N,C,Lout) | |||
Lout=floor((Lin+2∗padding−kernelsize)/stride+1) |
应用示例:
# pool with window of size=3, stride=2
m = nn.AvgPool1d(3, stride=2)
output = m(Variable(torch.Tensor([[[1,2,3,4,5,6,7]]])))
print(output)
输出结果:
Variable containing:(0 ,.,.) = 2 4 6[torch.FloatTensor of size 1x1x3]
编程要求
本关涉及的代码文件为pool.py,本次编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下:
- 创建一个in_channels=3, out_channels=32, kernel_size=(3, 3), stride=1, padding=1, bias=True的Conv2d变量conv;
- 创建一个kernel_size=(2, 2), stride=2的MaxPool2d变量pool;
- 对x应用卷积和最大池化操作并赋值给变量outpout_pool;
- 输出 outpout_pool 的大小。
- 具体请参见后续测试样例。
测试说明
测试过程:
- 本关涉及的测试文件为pool.py,运行用户填写后的程序判断正误。
- 测试程序将检测两个方面:是否包含特定的代码行以及程序的输出是否正确,若两个方面均正确则输出下面的预期输出,否则报错。
- 请注意输出格式及规范。
- 注意,在声明变量时请按照提示命名,否则将会报错。
以下是测试样例:
测试输入: 预期输出:
Pool output size : torch.Size([10, 32, 14, 14])
Congratulation!
代码实战
import torch
import torch.nn as nn
from torch.autograd import Variable
x = Variable(torch.randn(10, 3, 28, 28))
#/********** Begin *********/
#创建一个in_channels=3, out_channels=32, kernel_size=(3, 3), stride=1, padding=1, bias=True的Conv2d变量conv
conv=nn.Conv2d(3,32,(3,3),1,1,bias=True)
#创建一个kernel_size=(2, 2), stride=2的MaxPool2d变量pool
pool=nn.MaxPool2d((2,2),2)
#对x应用卷积和最大池化操作并赋值给变量outpout_pool
outpout_pool=pool(conv(x))
#输出 outpout_pool 的大小,要求输出打印不换行
print('Pool output size : ',outpout_pool.size())
#/********** End *********/