def test_conv(n64_hw32_c32_3x3): cf = ConvParams(**n64_hw32_c32_3x3) inputs = ng.placeholder(axes=cf.ax_i) filters = ng.placeholder(axes=cf.ax_f) # randomly initialize input_value = rng.uniform(-0.5, 0.5, cf.ax_i) filter_value = rng.uniform(-0.5, 0.5, cf.ax_f) error_value = rng.uniform(-0.5, 0.5, cf.ax_o) inputs = ng.placeholder(cf.ax_i) filters = ng.placeholder(cf.ax_f) errors = ng.placeholder(cf.ax_o) output = ng.convolution(cf.conv_params, inputs, filters, axes=cf.ax_o) bprop_out = bprop_conv(errors, inputs, filters, output) updat_out = update_conv(errors, inputs, filters, output) with executor([output, bprop_out, updat_out], inputs, filters, errors) as conv_executor: result_ng, gradI_ng, gradF_ng = conv_executor(input_value, filter_value, error_value) # Compute reference with NumPy result_np, gradI_np, gradF_np = reference_conv(cf.dimI, cf.dimF, cf.dimO, cf.conv_params, input_value, filter_value, error_value) # Compare fprop assert np.allclose(result_ng, result_np, rtol=0, atol=0.5) # Compare bprop assert np.allclose(gradI_ng, gradI_np, rtol=0, atol=0.5) # Compare update assert np.allclose(gradF_ng, gradF_np, rtol=0, atol=2)
def execute_convolution(image_height, image_width, filter_height, filter_width, channel=16, batch_size=32, filter_count=8, image_3rd_dim=1, filter_3rd_dim=1, padding=(0, 0, 0), stride=(1, 1, 1), dilation=1, np_comparison=False): pad_h, pad_w, pad_d = padding str_h, str_w, str_d = stride cf = ConvParams(C=channel, N=batch_size, K=filter_count, D=image_3rd_dim, H=image_height, W=image_width, T=filter_3rd_dim, R=filter_height, S=filter_width, pad_d=pad_d, pad_h=pad_h, pad_w=pad_w, str_d=str_d, str_h=str_h, str_w=str_w, dil_d=dilation, dil_h=dilation, dil_w=dilation) inputs = ng.placeholder(cf.ax_i) filters = ng.placeholder(cf.ax_f) rng = RandomTensorGenerator(0, np.float32) input_value = rng.uniform(-4, 4, cf.ax_i, dtype=int) filter_value = rng.uniform(-4, 4, cf.ax_f, dtype=int) error_value = rng.uniform(-0.5, 0.5, cf.ax_o) with executor( ng.convolution(cf.conv_params, inputs, filters, axes=cf.ax_o), inputs, filters) as const_executor: out = const_executor(input_value, filter_value) if np_comparison: np_out, gradInp, gradF_np = \ reference_conv(cf.dimI, cf.dimF, cf.dimO, cf.conv_params, input_value, filter_value, error_value) return out, np_out return out