在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)
原文地址:http://blog.51cto.com/14135971/2331344