def test_padding(backend_default, poolargs): fshape, nifm, padding, stride, in_sz, batch_size = poolargs NervanaObject.be.bsz = batch_size # basic sanity check with random inputs inshape = (nifm, in_sz, in_sz) insize = np.prod(inshape) neon_layer = Pooling(fshape=fshape, strides=stride, padding=padding) inp = neon_layer.be.array(np.random.random((insize, batch_size))) inp.lshape = inshape neon_layer.configure(inshape) neon_layer.prev_layer = True neon_layer.allocate() neon_layer.set_deltas([neon_layer.be.iobuf(inshape)]) out = neon_layer.fprop(inp).get() ncheck = [0, batch_size/2, batch_size-1] (out_exp, check_inds) = ref_pooling(inp, inp.lshape, (fshape, fshape), padding, (stride, stride), neon_layer.be, ncheck=ncheck) out_shape = list(out_exp.shape[0:3]) out_shape.append(batch_size) outa = out.reshape(out_shape) assert allclose_with_out(out_exp, outa[:, :, :, check_inds], atol=0.0, rtol=0.0)
def test_padding(backend_default, poolargs): fshape, nifm, padding, stride, in_sz, batch_size = poolargs NervanaObject.be.bsz = batch_size # basic sanity check with random inputs inshape = (nifm, in_sz, in_sz) insize = np.prod(inshape) neon_layer = Pooling(fshape=fshape, strides=stride, padding=padding) inp = neon_layer.be.array(np.random.random((insize, batch_size))) inp.lshape = inshape neon_layer.configure(inshape) neon_layer.prev_layer = True neon_layer.allocate() neon_layer.set_deltas([neon_layer.be.iobuf(inshape)]) out = neon_layer.fprop(inp).get() ncheck = [0, batch_size // 2, batch_size - 1] (out_exp, check_inds) = ref_pooling(inp, inp.lshape, (fshape, fshape), padding, (stride, stride), neon_layer.be, ncheck=ncheck) out_shape = list(out_exp.shape[0:3]) out_shape.append(batch_size) outa = out.reshape(out_shape) assert allclose_with_out(out_exp, outa[:, :, :, check_inds], atol=0.0, rtol=0.0)
def meanpool_handler(network, flags, stacks, this_model): # num_filters=flags['num_filters'] layername = flags.get('layername', None) filter_size = flags.get('filter_size', 0) conv_stride = flags.get('stride', 0) if conv_stride == 0 or conv_stride == 1: pad = filter_size//2 elif conv_stride > 0: if filter_size == conv_stride: pad = 0 else: pad = filter_size//2 if 'pad' in flags: pad = flags['pad'] dim = len(get_output_shape(network))-2 assert filter_size > 0 network = sequential(layers=(network, Pooling( fshape=(filter_size,)*dim if dim>=2 else filter_size, strides=max(1, conv_stride), padding=pad, op='avg', name=layername, ))) return network, ()
def test_pooling(): """ test pooling forward and backward path """ N = 128 C = 3 D = 1 H = W = 32 J = T = 1 R = S = 2 ngt.make_transformer() padding = dict(pad_d=0, pad_h=0, pad_w=0, pad_c=0) strides = dict(str_d=1, str_h=1, str_w=1, str_c=1) fshape = dict(J=J, T=T, R=R, S=S) pool_params = dict(op='max') pool_params.update(padding) pool_params.update(strides) pool_params.update(fshape) ax_i = ng.make_axes([ax.C, ax.D, ax.H, ax.W, ax.N]) ax_i.set_shape((C, D, H, W, N)) inputs = ng.placeholder(axes=ax_i) ax_o = ng.make_axes([ ng.make_axis(roles=[ar.features_input]).named('C'), ng.make_axis(roles=[ar.features_0]).named('D'), ng.make_axis(roles=[ar.features_1]).named('H'), ng.make_axis(roles=[ar.features_2]).named('W'), ax.N ]) ax_o[:-1].set_shape((output_dim(C, J, padding['pad_c'], strides['str_c']), output_dim(D, T, padding['pad_d'], strides['str_d']), output_dim(H, R, padding['pad_h'], strides['str_h']), output_dim(W, S, padding['pad_w'], strides['str_w']))) # randomly initialize input_value = rng.uniform(-1, 1, ax_i) assert input_value.shape == ax_i.lengths # compute convolution with graph output = ng.pooling(pool_params, inputs, axes=ax_o) targets = ng.placeholder(axes=ax_o) costs = ng.cross_entropy_binary(ng.sigmoid(output), targets) error = ng.sum(costs, out_axes=()) / ng.batch_size(costs) d_inputs = ng.deriv(error, inputs) targets_value = rng.uniform(.1, 0.9, output.axes) with executor([output, error, d_inputs], inputs, targets) as conv_executor: result_ng, err_ng, gradI_ng = conv_executor(input_value, targets_value) # Now compute reference values via NEON NervanaObject.be.bsz = N neon_layer = Pooling(fshape=fshape, padding=padding, strides=strides, op="max") inp = neon_layer.be.array(input_value.reshape(C * H * W * D, N)) neon_layer.configure((C, H, W)) neon_layer.prev_layer = True neon_layer.allocate() neon_layer.set_deltas(DummyDeltaBuffers()) result_ne = neon_layer.fprop(inp).get().reshape(output.axes.lengths) act_result_ne = 1. / (1.0 + np.exp(-result_ne)) err = neon_layer.be.array( (act_result_ne - targets_value).reshape(-1, N) / float(N)) gradI_ne = neon_layer.bprop(err).get().reshape(ax_i.lengths) # Compare fprop ng.testing.assert_allclose(result_ng, result_ne, rtol=0, atol=1e-6) # Compare bprop ng.testing.assert_allclose(gradI_ng, gradI_ne, rtol=0, atol=1e-6)