Skip to content
This repository has been archived by the owner on Nov 17, 2023. It is now read-only.

Commit

Permalink
fix mkldnn deconvolution forward with bias
Browse files Browse the repository at this point in the history
  • Loading branch information
xinyu-intel committed May 30, 2019
1 parent 5fc4fc5 commit 628960f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
7 changes: 4 additions & 3 deletions src/operator/nn/mkldnn/mkldnn_deconvolution.cc
Original file line number Diff line number Diff line change
Expand Up @@ -296,10 +296,11 @@ static void MKLDNNDeconvFwdBiasPostProcess(const DeconvolutionParam& param,
typedef float DType;
Stream<cpu> *s = ctx.get_stream<cpu>();
Tensor<cpu, 1, DType> b = bias.data().get<cpu, 1, DType>(s);
// If the output data is stored in a special MKLDNN format, data()
// automatically converts its format to the default format.
// The output data is stored in a special MKLDNN format,
// converts its format to the default format.
// Unfortunately, MKLDNN doesn't support broadcast.
Tensor<cpu, 4, DType> out_cpu = out_data[deconv::kOut].data().get<cpu, 4, DType>(s);
auto out_data_def = out_data[deconv::kOut].Reorder2Default();
Tensor<cpu, 4, DType> out_cpu = out_data_def.data().get<cpu, 4, DType>(s);
out_cpu += mshadow::expr::broadcast<1>(b, out_cpu.shape_);
}
}
Expand Down
22 changes: 22 additions & 0 deletions tests/python/unittest/test_operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -1533,6 +1533,28 @@ def test_deconvolution():
pad = (3,)
)

@with_seed()
def test_deconvolution_forward_with_bias():
"""Check if deconvolution forward can work well with bias=True
"""
def check_deconvolution_forward_with_bias(shape=(1, 16, 5, 5), num_filter=32, num_group=1, kernel=(3, 3), pad=(1, 1)):
x = mx.sym.Variable('x')
w = mx.sym.Variable('w')
input_data = mx.random.uniform(-5, 5, shape, ctx=mx.cpu())
y = mx.sym.Deconvolution(data=x, weight=w, num_filter=num_filter, num_group=num_group, kernel=kernel, no_bias=False, pad=pad)
exe = y.simple_bind(ctx=mx.cpu(), x=shape, grad_req='null')

exe.arg_arrays[0][:] = np.random.normal(size=exe.arg_arrays[0].shape)
exe.arg_arrays[1][:] = np.random.normal(size=exe.arg_arrays[1].shape)

exe.forward(is_train=False)
o = exe.outputs[0]
t = o.asnumpy()
check_deconvolution_forward_with_bias((1, 16, 5), 32, 1, (3,), (1,))
check_deconvolution_forward_with_bias((32, 16, 5), 32, 1, (3,), (1,))
check_deconvolution_forward_with_bias((1, 16, 5, 5), 32, 1, (3, 3), (1, 1))
check_deconvolution_forward_with_bias((32, 16, 5, 5), 32, 1, (3, 3), (1, 1))


def check_nearest_upsampling_with_shape(shapes, scale, root_scale):
arr = {'arg_%d'%i: mx.random.uniform(-10.0, 10.0, shape, ctx=mx.cpu()).copyto(default_context()) for i, shape in zip(range(len(shapes)), shapes)}
Expand Down

0 comments on commit 628960f

Please sign in to comment.