权重初始化

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)
posted @ 2023-11-01 11:05  lipu123  阅读(35)  评论(0)    收藏  举报