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