pytorch系列10 --- 如何自定义参数初始化方式 ,apply()

本文主要内容:

  1. 单层网络初始化
  2. 多层网络初始化
    1. 使用apply和weight_init函数
    2. __init__函数使用self.modules()初始化

1.单层网络

  1. 在创建model后直接调用torch.nn.innit里的初始化函数
layer1 = torch.nn.Linear(10,20)
torch.nn.init.xavier_uniform_(layer1.weight)
torch.nn.init.constant_(layer1.bias, 0)
  1. 也可以重写reset_parameters()方法,并不推荐

2. 使用tf.Squential 或自定义多层网络

tf.Sequential() ,请查看pytorch系列7 -----nn.Sequential讲解

  1. 使用torch.nn.Module.apply.

apply(fn): 看一下apply在Module的实现。在这里插入图片描述

将函数fn递归的运用在每个子模块上,这些子模块由self.children()返回.
关于self.children()和self.modules()的工作方式,请查看此篇博文pytorch系列8 --self.modules() 和 self.children()的区别
常被用来初始化网络层参数。注意fn需要一个参数。

具体步骤是:

  1. 定义weight_init函数,并在weight_init中通过判断模块的类型来进行不同的参数初始化定义类型。
  2. model=Net(…) 创建网络结构
  3. model.apply(weight_init),将weight_init初始化方式应用到submodels上

在以下的代码中只初始化线性层,至于卷积层,批归一化层后面会讲到的

示例:https://github.com/pytorch/examples/blob/master/dcgan/main.py#L95

# -*- coding: utf-8 -*-

import torch
from torch import nn

# hyper parameters
in_dim=1
n_hidden_1=1
n_hidden_2=1
out_dim=1

class Net(nn.Module):
    
    
    def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
        super(</
<think>好的,我需要帮助用户了解在PyTorch中进行参数初始化的方法。首先,我应该回顾用户提供的引用内容,看看有哪些相关信息。引用1提到PyTorch的张量初始化与基本运算,引用2和3讨论了参数初始化的不同方法,如高斯分布、均匀分布、Xavier和He初始化。引用4提到了如何在PyTorch中遍历模型层并应用特定初始化。 用户的问题是关于PyTorch参数初始化的教程,所以需要系统地整理这些方法,并给出具体的代码示例。根据引用3,常见的初始化方法包括随机、零、正态、均匀,以及更高级的Xavier和He初始化。引用4提到如何在模型初始化时遍历各层并应用不同的方法,比如对卷积层使用kaiming初始化。 接下来,我需要将信息结构化。首先介绍内置初始化方法,如`init`模块中的函数,然后讲解自定义初始化方法,比如通过遍历模块并应用初始化。然后可以提到迁移学习中的预训练初始化,最后总结注意事项,如激活函数的影响和参数类型的不同处理。 需要确保代码示例正确,比如使用`torch.nn.init`下的函数,并展示如何应用到模型的层。同时,注意用户提到的LaTeX格式要求,行内公式用$...$,独立公式用$$...$$,比如初始化公式可能需要单独成段。 还需要生成相关问题,可能涉及不同初始化方法的比较、选择依据、在模型中的应用步骤以及调试方法。确保引用正确,比如引用[^2][^3][^4]在相关部分末尾自然添加。 最后检查是否符合所有系统级指令,特别是中文回答、LaTeX格式正确,结构清晰,分步骤说明,并附上相关问题。</think>### PyTorch参数初始化方法教程 在PyTorch中,参数初始化是模型训练的重要环节,合理的初始化能加速收敛并提高模型性能。以下是常见的初始化方法及实现步骤: --- #### 一、内置初始化方法 PyTorch通过`torch.nn.init`模块提供多种初始化函数: 1. **零初始化** 将参数初始化为零,适用于偏置项(bias): ```python torch.nn.init.zeros_(tensor) ``` 2. **常数初始化** 将参数初始化为固定值: ```python torch.nn.init.constant_(tensor, value=0.1) ``` 3. **正态分布初始化** 基于高斯分布初始化参数,需指定均值(`mean`)和标准差(`std`): ```python torch.nn.init.normal_(tensor, mean=0.0, std=0.01) ``` 4. **均匀分布初始化** 在区间$[a, b]$内均匀采样: ```python torch.nn.init.uniform_(tensor, a=0.0, b=1.0) ``` --- #### 二、高级初始化方法 1. **Xavier/Glorot初始化** 适用于线性层和激活函数(如Tanh、Sigmoid),通过缩放方差保持输入输出方差一致。公式为: $$W \sim U\left(-\sqrt{\frac{6}{n_{\text{in}} + n_{\text{out}}}}, \sqrt{\frac{6}{n_{\text{in}} + n_{\text{out}}}}\right)$$ PyTorch实现: ```python torch.nn.init.xavier_uniform_(tensor) # 均匀分布 torch.nn.init.xavier_normal_(tensor) # 正态分布 ``` 2. **He/Kaiming初始化** 针对ReLU激活函数优化,公式基于输入维度$n_{\text{in}}$的方差缩放[^3]: $$W \sim N\left(0, \sqrt{\frac{2}{n_{\text{in}}}}\right)$$ PyTorch实现: ```python torch.nn.init.kaiming_uniform_(tensor, mode='fan_in', nonlinearity='relu') # 均匀分布 torch.nn.init.kaiming_normal_(tensor, mode='fan_in', nonlinearity='relu') # 正态分布 ``` --- #### 三、自定义初始化方法 通过遍历模型层,针对不同类型层应用初始化策略[^4]: ```python def init_weights(m): if isinstance(m, torch.nn.Linear): torch.nn.init.xavier_normal_(m.weight) if m.bias is not None: torch.nn.init.zeros_(m.bias) elif isinstance(m, torch.nn.Conv2d): torch.nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') model = MyModel() model.apply(init_weights) # 递归应用初始化函数 ``` --- #### 四、迁移学习中的初始化 使用预训练模型参数作为初始值: ```python pretrained_model = torchvision.models.resnet18(pretrained=True) model = MyCustomModel() model.load_state_dict(pretrained_model.state_dict(), strict=False) # 部分加载参数 ``` --- #### 五、注意事项 1. **激活函数适配** 如ReLU适合He初始化,Tanh适合Xavier初始化。 2. **参数类型区分** 权重(weights)和偏置(bias)通常采用不同策略。 3. **梯度影响** 初始化范围过大可能导致梯度爆炸,过小可能引发梯度消失。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值