新手做網(wǎng)站的詳細(xì)步驟網(wǎng)站友鏈
Cell作為神經(jīng)網(wǎng)絡(luò)構(gòu)造的基礎(chǔ)單元,與神經(jīng)網(wǎng)絡(luò)層(Layer)的概念相對應(yīng),對Tensor計算操作的抽象封裝,能夠更準(zhǔn)確清晰地對神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行表示。除了基礎(chǔ)的Tensor計算流程定義外,神經(jīng)網(wǎng)絡(luò)層還包含了參數(shù)管理、狀態(tài)管理等功能。而參數(shù)(Parameter)是神經(jīng)網(wǎng)絡(luò)訓(xùn)練的核心,通常作為神經(jīng)網(wǎng)絡(luò)層的內(nèi)部成員變量。本節(jié)我們將系統(tǒng)介紹參數(shù)、神經(jīng)網(wǎng)絡(luò)層以及其相關(guān)使用方法。
Parameter
參數(shù)(Parameter)是一類特殊的Tensor,是指在模型訓(xùn)練過程中可以對其值進(jìn)行更新的變量。MindSpore提供mindspore.Parameter類進(jìn)行Parameter的構(gòu)造。為了對不同用途的Parameter進(jìn)行區(qū)分,下面對兩種不同類別的Parameter進(jìn)行定義:
- 可訓(xùn)練參數(shù)。在模型訓(xùn)練過程中根據(jù)反向傳播算法求得梯度后進(jìn)行更新的Tensor,此時需要將required_grad設(shè)置為True。
- 不可訓(xùn)練參數(shù)。不參與反向傳播,但需要更新值的Tensor(如BatchNorm中的mean和var變量),此時需要將requires_grad設(shè)置為False。
在Cell的__init__方法中,我們定義了w和b兩個Parameter,并配置name進(jìn)行命名空間管理。在construct方法中使用self.attr直接調(diào)用參與Tensor運(yùn)算。
獲取Parameter
在使用Cell+Parameter構(gòu)造神經(jīng)網(wǎng)絡(luò)層后,我們可以使用多種方法來獲取Cell管理的Parameter。
獲取單個參數(shù)
單獨獲取某個特定參數(shù),直接調(diào)用Python類的成員變量即可。
可使用Cell.trainable_params方法獲取可訓(xùn)練參數(shù),通常在配置優(yōu)化器時需調(diào)用此接口。
使用Cell.get_parameters()方法可獲取所有參數(shù),此時會返回一個Python迭代器
或者可以調(diào)用Cell.parameters_and_names返回參數(shù)名稱及參數(shù)。
修改Parameter
直接修改參數(shù)值
Parameter是一種特殊的Tensor,因此可以使用Tensor索引修改的方式對其值進(jìn)行修改。
可調(diào)用Parameter.set_data方法,使用相同Shape的Tensor對Parameter進(jìn)行覆蓋。該方法常用于使用Initializer進(jìn)行Cell遍歷初始化。
運(yùn)行時修改參數(shù)值
參數(shù)的主要作用為模型訓(xùn)練時對其值進(jìn)行更新,在反向傳播獲得梯度后,或不可訓(xùn)練參數(shù)需要進(jìn)行更新,都涉及到運(yùn)行時參數(shù)修改。由于MindSpore的使用靜態(tài)圖加速編譯設(shè)計,此時需要使用mindspore.ops.assign接口對參數(shù)進(jìn)行賦值。該方法常用于自定義優(yōu)化器場景。下面是一個簡單的運(yùn)行時修改參數(shù)值樣例:
import mindspore as ms
@ms.jit
def modify_parameter():
??? b_hat = ms.Tensor([7, 8, 9])
??? ops.assign(net.b, b_hat)
??? return True
modify_parameter()
print(net.b.asnumpy())
Parameter Tuple
變量元組ParameterTuple,用于保存多個Parameter,繼承于元組tuple,提供克隆功能。
如下示例提供ParameterTuple創(chuàng)建方法: