pytorch和tensorflow所含的maxpool,虽然名字相同,但是功能是不一样。之前在用pytorch复现darknet里面的yolo-v2时才发现这个问题。在yolov2的第六个maxpool的时候,kernel为2,stride为1,所以
按道理来说呢,输出的边size应该比输入的边size少1,但是yolo的设计是输入和输出的shape要相同。所以才发现了这个问题。
不同之处在于padding的补全方式
pytorch里的maxpool,padding的方式是四周都补0,如果padding等于x,那么输入的feature map就会比原来大上x圈。并且还支持dilation模式Σ( ° △ °|||)︴
而tensorflow里的maxpool,padding方式是分为SAME
和VALID
,在SAME
模式下,padding有时候只会在图像右侧和下方补0,而左侧和上方并不会。不支持dilation。
举个例子
如果输入一个3X3的图片,
1,2,3
4,5,6
7,8,9
对其做kernel_size=2,stride=1的maxpool,那么本应该得到
5,6
8,9
# pytorch版本
import torch
import torch.nn.functional as F
from torch.autograd import Variable
data = torch.FloatTensor([[[[1, 2, 3],