权重初始化
1.
这个可以放在模型net的__init__:中
for name, param in self.named_parameters():
if 'weight' in name:
nn.init.xavier_normal_(param)
比如说:
class Model(nn.Module):
def __init__(self):
super(Model,self).__init__()
self.conv1=nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1)
self.max1=nn.MaxPool2d(kernel_size=3, stride=2)
self.conv2=nn.Conv2d(96, 256, kernel_size=5, padding=2)
self.max2=nn.MaxPool2d(kernel_size=3, stride=2)
self.conv3=nn.Conv2d(256, 384, kernel_size=3, padding=1)
self.conv4=nn.Conv2d(384, 384, kernel_size=3, padding=1)
self.conv5 = nn.Conv2d(384, 256, kernel_size=3, padding=1)
self.max3=nn.MaxPool2d(kernel_size=3,stride=2)
self.flatten=nn.Flatten()
self.line1=nn.Linear(6400, 4096)
self.drop1=nn.Dropout(0.5)
self.line2=nn.Linear(4096, 4096)
self.drop2 = nn.Dropout(0.5)
self.line3=nn.Linear(4096, 10)
for name, param in self.named_parameters():
if 'weight' in name:
nn.init.xavier_normal_(param)
def forward(self,input):
x=self.max1(torch.relu(self.conv1(input)))
x=self.max2(torch.relu(self.conv2(x)))
x=torch.relu(self.conv3(x))
x=torch.relu(self.conv4(x))
x=self.max3(torch.relu(self.conv5(x)))
x=self.flatten(x)
x=self.drop1(torch.relu(self.line1(x)))
x=self.drop2(torch.relu(self.line2(x)))
x=self.line3(x)
return x
这种适合于你写这种__init__(self):
,也就是不适用Sequential
框架。
2.
如果使用框架的话,就用这种:
def init_weights(m):
if type(m) == nn.Linear or type(m) == nn.Conv2d:
nn.init.xavier_uniform_(m.weight)
net.apply(init_weights)
net = nn.Sequential(
# 这里使用一个11*11的更大窗口来捕捉对象。
# 同时,步幅为4,以减少输出的高度和宽度。
# 另外,输出通道的数目远大于LeNet
nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
# 减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,且增大输出通道数
nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
# 使用三个连续的卷积层和较小的卷积窗口。
# 除了最后的卷积层,输出通道的数量进一步增加。
# 在前两个卷积层之后,汇聚层不用于减少输入的高度和宽度
nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Flatten(),
# 这里,全连接层的输出数量是LeNet中的好几倍。使用dropout层来减轻过拟合
nn.Linear(6400, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
# 最后是输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000
nn.Linear(4096, 10)
)
X = torch.randn(1, 1, 224, 224)
for layer in net:
X=layer(X)
print(layer.__class__.__name__,'output shape:\t',X.shape)
#model=Model()
def init_weights(m):
if type(m) == nn.Linear or type(m) == nn.Conv2d:
nn.init.xavier_uniform_(m.weight)
net.apply(init_weights)