初始化模型参数 python_Pytorch: 神经网络模型参数初始化与 Finetune

1 参数初始化

参数的初始化其实就是对参数赋值。而待学习的参数其实都是 Variable,它其实是对 Tensor 的封装,同时提供了data,grad 等接口,这就意味着可以直接对这些参数进行操作赋值。这就是 PyTorch 简洁高效所在。

在pytorch中,有自己默认初始化参数方式,所以在你定义好网络结构以后,不进行参数初始化也是可以的。

PyTorch在自定义变量及其初始化方法:

self.fuse_weight_1 = torch.nn.Parameter(torch.FloatTensor(1), requires_grad=True)

self.fuse_weight_1.data.fill_(0.25)

如上是定义一个可学习的标量。也可以定义一个可学习的矩阵:

self.fuse_weight_1 = torch.nn.Parameter(torch.FloatTensor(torch.rand(3,3)), requires_grad=True)

如:卷积层的权重weight 和偏置 bias 的初始化:

import torch

import torch.nn as nn

conv1 = nn.Conv2d(3, 10, 5, stride=1, bias=True)

nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain('relu'))

nn.init.constant(conv1.bias, 0.1)

示例:

首先定义了一个初始化函数:from torch.nn import init

#define the initial function to init the layer's parameters for the network

def weigth_init(m):

# 使用isinstance来判断m属于什么类型

if isinstance(m, nn.Conv2d):

init.xavier_uniform_(m.weight.data)

init.constant_(m.bias.data,0.1)

elif isinstance(m, nn.BatchNorm2d):

m.weight.data.fill_(1)

m.bias.data.zero_()

elif isinstance(m, nn.Linear):

m.weight.data.normal_(0,0.01)

m.bias.data.zero_()

接着进行调用就ok了,不过要先把网络模型实例化:#Define Network

model = Net(args.input_channel,args.output_channel)

model.apply(weigth_init)

此上就完成了对模型中训练参数的初始化。

def initNetParams(net):

你可能感兴趣的:(初始化模型参数,python)