class Chainer::Functions::Pooling::MaxPooling2D

Attributes

in_dtype[R]
in_shape[R]
indexes[R]

Public Class Methods

max_pooling_2d(x, ksize, stride: nil, pad: 0, cover_all: true) click to toggle source

Spatial max pooling function

@param [Chainer::Variable] x Input variable @param [integer || 2D integer array] ksize Size of pooling window @param [integer || 2D integer array] stride Stride of pooling applications @param [integer || 2D integer array] pad Spatial padding width for the input array @param [boolean] cover_all If `true`, all spatial locations are pooled int some output pixels @return [Chainer::Variable] Output variable

# File lib/chainer/functions/pooling/max_pooling_2d.rb, line 14
def self.max_pooling_2d(x, ksize, stride: nil, pad: 0, cover_all: true)
  self.new(ksize, stride: stride, pad: pad, cover_all: cover_all).apply([x]).first
end

Public Instance Methods

backward(indexes, gy) click to toggle source
# File lib/chainer/functions/pooling/max_pooling_2d.rb, line 36
def backward(indexes, gy)
  MaxPooling2DGrad.new(self).apply(gy)
end
forward(x) click to toggle source
# File lib/chainer/functions/pooling/max_pooling_2d.rb, line 18
def forward(x)
  @in_shape = x[0].shape
  @in_dtype = x[0].class

  col = Chainer::Utils::Conv.im2col(x[0], @kh, @kw, @sy, @sx, @ph, @pw, pval: -Float::INFINITY, cover_all: @cover_all)
  n, c, kh, kw, out_h, out_w = col.shape
  col = col.reshape(n , c, kh * kw, out_h, out_w)

  # TODO: numpy.argmax(axis=2)
  d = col.shape[3..-1].reduce(:*) || 1
  dx = col.shape[2..-1].reduce(:*) || 1
  max_index = col.max_index(2)
  @indexes = max_index.flatten.map_with_index { |val, idx| (val - (dx * (idx / d))) / d }.reshape(*max_index.shape)

  y = col.max(axis: 2)
  [y]
end