【MindSpore易点通】如何实现梯度不回传以及梯度回传后不更新权重功能

背景信息

用户在使用深度学习网络结构执行开发任务时,难免会遇到一些代码上看上去很正常,而且代价函数也在不断减小,但是因为不知道的bug存在,使得我们得到的神经网络并不是最优解。为详细排查所遇问题,故在此提供2种不同接口用以实现梯度不回传以及梯度回传后不更新权重功能。

一、使用stop_gradient接口实现

1、示例代码

import numpy as np
import mindspore.ops as ops
from mindspore import Tensor, context
from mindspore.ops 
import operations as Pimport mindspore.nn as nn
import mindsporefrom mindspore.ops import stop_gradient

#设置训练环境
context.set_context(mode=context.GRAPH_MODE, device_target="Ascend")
class PrintDemo(nn.Cell):
        def __init__(self):
            super(PrintDemo, self).__init__()
            self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=4, stride=1 ,has_bias=False, weight_init='normal', pad_mode='valid')
            self.conv2 = nn.Conv2d(in_channels=6, out_channels=2, kernel_size=2, pad_mode="valid")
            self.conv3 = nn.Conv2d(in_channels=2, out_channels=6, kernel_size=2, pad_mode="valid")
            self.print = P.Print()

        #打印出特定层权重输出结果
        def construct(self, input_data):
            x = self.conv1(input_data)
            x = stop_gradient(x)
            self.print("self.conv1.weight:", self.conv1.weight)
            x = self.conv2(x)
            x = self.conv3(x)

            return x

def test():
    input_data = Tensor(np.ones([1, 1, 32, 32]), mindspore.float32)
    net = PrintDemo()
    net(input_data)
    return net(input_data)

test()

参数注解:

stop_gradient():在反向传播时禁止网络梯度更新。

二、使用requires_grad接口实现

1、示例代码

class PrintDemo(nn.Cell):
        #打印出特定层权重输出结果
        def construct(self, input_data):
            ...
            # x = stop_gradient(x)
            ...
def test():
    ...
    for param in net.trainable_params():
        if 'conv1' in param.name:
            param.requires_grad = False
        else:
            param.requires_grad = True
    ...

test()

参数注解:

requires_grad:bool类型,当值为True时表面该参数需要更新,反之则不需更新。

三、实验截图

梯度更新的中心思想沿着loss函数梯度的方向更新权重以让loss函数的值最小化或accuracy最大化,在示例代码中使用requires_grad与stop_gradient方法实现禁止conv1层梯度更新。实验中conv1层中开始与结束时的权重变化如下图所示:

conv1中权重值的变化:

MindSpore中,Transformer模型是基于自注意力机制的深度学习模型,在NLP领域被广泛应用。MindSpore提供了相关的API和方法来构建和训练Transformer模型。 首先,在MindSpore中,可以使用`EmbeddingLookup`类来定义词嵌入层,该层负责将输入的单词转换为向量表示。这个类在`transformer_model.py`文件中进行定义。 接下来,为了进行网络的反向传播和训练,可以使用MindSpore的高级接口`MindSpore.Model`来定义网络反向和进行训练。在`transformer_model.py`文件中,可以看到网络的反向定义以及使用`MindSpore.Model`进行训练的示例代码。首先,通过`TransformerTrainOneStepCell`将网络和损失函数组合在一起,然后使用该组合后的网络进行训练。 最后,通过调用`model.train`方法,可以使用定义好的模型、数据集和优化器进行训练。需要指定训练的轮数、数据集、回调函数等参数来完成训练过程。 综上所述,在MindSpore中,可以使用相关的API和方法来构建和训练Transformer模型。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【MindSpore易点通】Transformer的注意力机制](https://blog.csdn.net/Kenji_Shinji/article/details/127958722)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [基于MindSpore的Transformer网络实现](https://blog.csdn.net/Kenji_Shinji/article/details/127314332)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值