from:http://blog.csdn.net/VictoriaW/article/details/72872036
之前我學習了神經網絡中權值初始化的方法
那么如何在pytorch里實現呢。
PyTorch提供了多種參數初始化函數:
torch.nn.init.constant(tensor, val)torch.nn.init.normal(tensor, mean=0, std=1)torch.nn.init.xavier_uniform(tensor, gain=1)- 等等。詳細請參考:http://pytorch.org/docs/nn.html#torch-nn-init
注意上面的初始化函數的參數tensor,雖然寫的是tensor,但是也可以是Variable類型的。而神經網絡的參數類型Parameter是Variable類的子類,所以初始化函數可以直接作用於神經網絡參數。
示例:
self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3) init.xavier_uniform(self.conv1.weight) init.constant(self.conv1.bias, 0.1)
上面的語句是對網絡的某一層參數進行初始化。如何對整個網絡的參數進行初始化定制呢?
def weights_init(m):
classname=m.__class__.__name__
if classname.find('Conv') != -1:
xavier(m.weight.data)
xavier(m.bias.data)
net = Net()
net.apply(weights_init) #apply函數會遞歸地搜索網絡內的所有module並把參數表示的函數應用到所有的module上。
不建議訪問以下划線為前綴的成員,他們是內部的,如果有改變不會通知用戶。更推薦的一種方法是檢查某個module是否是某種類型:
def weights_init(m):
if isinstance(m, nn.Conv2d):
xavier(m.weight.data)
xavier(m.bias.data)
