1. 程式人生 > >Pytorch:AG接口,BBIN接口,MG接口,PT接口對接平臺權重初始化

Pytorch:AG接口,BBIN接口,MG接口,PT接口對接平臺權重初始化

cto 進行 訓練 plan roc self. ESS http 類型

在TensorFlow中,AG接口,BBIN接口,MG接口,PT接口對接平臺Q2222168869權重的初始化主要是在聲明張量的時候進行的。 而PyTorch則提供了另一種方法:首先應該聲明張量,然後修改張量的權重。通過調用torch.nn.init包中的多種方法可以將權重初始化為直接訪問張量的屬性。

1、不初始化的效果
在Pytorch中,定義一個tensor,不進行初始化,打印看看結果:

w = torch.Tensor(3,4)
print (w)

可以看到這時候的初始化的數值都是隨機的,而且特別大,這對網絡的訓練必定不好,最後導致精度提不上,甚至損失無法收斂。

2、初始化的效果

技術分享圖片
演示站:http://fanshubbs.com/thread-424-1-1.html

PyTorch提供了多種參數初始化函數:

torch.nn.init.constant(tensor, val)
torch.nn.init.normal(tensor, mean=0, std=1)
torch.nn.init.xavier_uniform(tensor, gain=1)
等等。詳細請參考:
註意上面的初始化函數的參數tensor,雖然寫的是tensor,但是也可以是Variable類型的。而神經網絡的參數類型Parameter是Variable類的子類,所以初始化函數可以直接作用於神經網絡參數。實際上,我們初始化也是直接去初始化神經網絡的參數。

讓我們試試效果:

w = torch.Tensor(3,4)

torch.nn.init.normal_(w)
print (w)

3、初始化神經網絡的參數
對神經網絡的初始化往往放在模型的init()函數中,如下所示:
class Net(nn.Module):

def init(self, block, layers, num_classes=1000):
self.inplanes = 64
super(Net, self).init()


*** #定義自己的網絡層
***

for m in self.modules():
    if isinstance(m, nn.Conv2d):
        n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
        m.weight.data.normal_(0, math.sqrt(2. / n))
    elif isinstance(m, nn.BatchNorm2d):
        m.weight.data.fill_(1)
        m.bias.data.zero_()

*** #定義後續的函數


也可以采取另一種方式:
定義一個權重初始化函數,如下:

def weights_init(m):
classname = m.class.name
if classname.find(‘Conv2d‘) != -1:
init.xaviernormal(m.weight.data)
init.constant_(m.bias.data, 0.0)
elif classname.find(‘Linear‘) != -1:
init.xaviernormal(m.weight.data)
init.constant_(m.bias.data, 0.0)

在模型聲明時,調用初始化函數,初始化神經網絡參數:

model = Net(*****)
model.apply(weights_init)

Pytorch:AG接口,BBIN接口,MG接口,PT接口對接平臺權重初始化