PyTorch —— 神经网络权重初始化

4 篇文章 0 订阅
3 篇文章 0 订阅

权重初始化

神经网络从错误中学习,但是错误要能够被定位到。如果不能定位到错误那么就无法改正。

对于神经网络中的参数来说,如果所有参数全部一样(比如初始化为全0),那么就面临一个问题:梯度往哪里下降是最快呢??

看一个例子

神经网络很难判断哪些权重需要更改,因为每个层级的神经元输出是一样的。为了避免神经元具有相同的输出,我们使用独特权重。我们还可以随机选择权重,避免每个周期后的损失都陷于局部最低点。

如果使用正态(normal)或者uniform(均匀),结果就会好得多。随机的权重是很重要的。

权重初始化函数(均匀):

def weights_init_uniform(m):
    classname = m.__class__.__name__
    # for every Linear layer in a model..
    if classname.find('Linear') != -1:
        # apply a uniform distribution to the weights and a bias=0
        m.weight.data.uniform_(0.0, 1.0)
        m.bias.data.fill_(0)

应用方法:

model_uniform = Net()
model_uniform.apply(weights_init_uniform)

以一般法则进行初始化的函数 。分布和使用一般法则初始化权重的模型;范围是 − y , y -y,y y,y其中 y = 1 / n y=1 / \sqrt{n} y=1/n

def weights_init_uniform_rule(m):
    classname = m.__class__.__name__
    # for every Linear layer in a model..
    if classname.find('Linear') != -1:
        # get the number of the inputs
        n = m.in_features
        y = 1.0/np.sqrt(n)
        m.weight.data.uniform_(-y, y)
        m.bias.data.fill_(0)

# create a new model with these weights
model_rule = Net()
model_rule.apply(weights_init_uniform_rule)

利用正态进行初始化:

## complete this function
def weights_init_normal(m):
    '''Takes in a module and initializes all linear layers with weight
       values taken from a normal distribution.'''
    
    classname = m.__class__.__name__
    # for every Linear layer in a model
    # m.weight.data shoud be taken from a normal distribution
    # m.bias.data should be 0
    if classname.find('Linear') != -1:
        m.weight.data.normal_(0.0, 0.05)
        m.bias.data.fill_(0)

利用helper来进行比较:

import helpers

# put them in list form to compare
## evaluate the behavior using helpers.compare_init_weights

model_list = [(model_2, 'No'), 
              (model_normal_rule, 'Normal Distribution')]

# evaluate behavior 
helpers.compare_init_weights(model_list, 
                             'No vs Normal', 
                             train_loader,
                             valid_loader)

结果显示正态有更低的训练误差。

和更高的验证精确度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值