【Mindspore1.1】【BatchNorm / GradOperation】测试模块infer_backward,求解答

在Mindspore开发中,针对Batchnorm3d算子的test_infer_backward测试遇到问题。文章探讨了在训练模式切换到推理后进行反向计算的意义,以及为何在推理阶段求取input_grad。通过实例代码,解释了在推理状态下梯度更新与冻结网络层的关系。
摘要由CSDN通过智能技术生成

在为Mindspore开发Batchnorm3d算子的测试过程中遇到了一些问题,求解答。

代码定位:tests/st/ops/gpu/test_batchnorm_op.py中第四个测试函数test_infer_backward()。

【操作步骤&问题现象】

1、batchnorm算子在set_train(False)之后,已经进入了推理状态,此时进行反向计算,实际意义是什么?和“冻结网络层不进行梯度更新”是否有关系?

2、test_infer_backward()中使用GradOperation获取到了梯度函数“ms_grad”,后又进行了ms_grad(ms_input, Tensor(input_grad))调用,按理说应该传入input和output_grad求input_grad才对,这里为什么传入了Input_grad?求出来的又是什么?

【关键代码】

class Batchnorm_Net(Cell):

    def __init__(self, c, weight, bias, moving_mean, moving_var_init, use_batch_statistics=None):

        super(Batchnorm_Net, self).__init__()

        self.bn = BatchNorm2d(c, eps=0.00001, momentum=0.1, beta_init=bias, gamma_init=weight,

                              moving_mean_init=moving_mean, moving_var_init=moving_var_init,

                              use_batch_statistics=use_batch_statistics)



    def construct(self, input_data):

        x = self.bn(input_data)

        return x



class Grad(Cell):

    def __init__(self, network):

        super(Grad, self).__init__()

        self.grad = C.GradOperation(get_all=True, sens_param=True)

        self.network = network



    def construct(self, input_data, sens):

        gout = self.grad(self.network)(input_data, sens)

        return gout



@pytest.mark.level0

@pytest.mark.platform_x86_gpu_training

@pytest.mark.env_onecard

def test_infer_backward():

    expect_output = np.array([[[[-0.3224156, -0.3840524], [1.1337637, -1.0998858]],

                               [[-0.1724273, -0.877854], [0.0422135, 0.5828123]],

                               [[-1.1006137, 1.1447179], [0.9015862, 0.5024918]]]]).astype(np.float32)

    np.random.seed(1)

    x_np = np.random.randn(1, 3, 2, 2).astype(np.float32)

    input_grad_np = np.random.randn(1, 3, 2, 2).astype(np.float32)

    ms_input = Tensor(x_np)

    weight = Tensor(np.ones(3).astype(np.float32))

    bias = Tensor(np.zeros(3).astype(np.float32))

    moving_mean = Tensor(np.zeros(3).astype(np.float32))

    moving_var_init = Tensor(np.ones(3).astype(np.float32))

    context.set_context(mode=context.GRAPH_MODE, device_target="GPU")

    ms_net = Batchnorm_Net(3, weight, bias, moving_mean, moving_var_init)

    ms_net.set_train(False)

    ms_grad = Grad(ms_net)

    ms_out_grad_np = ms_grad(ms_input, Tensor(input_grad_np))

    assert np.allclose(ms_out_grad_np[0].asnumpy(), expect_output)

解答:

Batchnorm2d是有在推理模式下跑反向的场景的,这是一种特殊场景,在推理之后,要跑反向求梯度,获取对输入的梯度值。不会更新冻结网络层。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值