pytorch对模型参数初始化

举例说明:

  • Encoder :设计的编码其模型
  • weights_init(): 用来初始化模型
  • model.apply():实现初始化
# coding:utf-8
from torch import nn

def weights_init(mod):
    """设计初始化函数"""
    classname=mod.__class__.__name__
    # 返回传入的module类型
    print(classname)
    if classname.find(‘Conv‘)!= -1:    #这里的Conv和BatchNnorm是torc.nn里的形式
        mod.weight.data.normal_(0.0,0.02)
    elif classname.find(‘BatchNorm‘)!= -1:
        mod.weight.data.normal_(1.0,0.02) #bn层里初始化γ,服从(1,0.02)的正态分布
        mod.bias.data.fill_(0)  #bn层里初始化β,默认为0

class Encoder(nn.Module):
    def __init__(self, input_size, input_channels, base_channnes, z_channels):

        super(Encoder, self).__init__()
        # input_size必须为16的倍数
        assert input_size % 16 == 0, "input_size has to be a multiple of 16"

        models = nn.Sequential()
        models.add_module(‘Conv2-{0}-{1}‘.format(input_channels, base_channnes), nn.Conv2d(input_channels, base_channnes, 4, 2, 1, bias=False))
        models.add_module(‘LeakyReLU-{0}‘.format(base_channnes), nn.LeakyReLU(0.2, inplace=True))
        # 此时图片大小已经下降一倍
        temp_size = input_size/2

        # 直到特征图高宽为4
        # 目的是保证无论输入什么大小的图片,经过这几层后特征图大小为4*4
        while temp_size > 4 :
            models.add_module(‘Conv2-{0}-{1}‘.format(base_channnes, base_channnes*2), nn.Conv2d(base_channnes, base_channnes*2, 4, 2, 1, bias=False))
            models.add_module(‘BatchNorm2d-{0}‘.format(base_channnes*2), nn.BatchNorm2d(base_channnes*2))
            models.add_module(‘LeakyReLU-{0}‘.format(base_channnes*2), nn.LeakyReLU(0.2, inplace=True))
            base_channnes *= 2
            temp_size /= 2

        # 特征图高宽为4后面则添加上最后一层
        # 让输出为1*1
        models.add_module(‘Conv2-{0}-{1}‘.format(base_channnes, z_channels), nn.Conv2d(base_channnes, z_channels, 4, 1, 0, bias=False))
        self.models = models

    def forward(self, x):
        x = self.models(x)
        return x

if __name__ == ‘__main__‘:
    e = Encoder(256, 3, 64, 100)
    # 对e模型中的每个module和其本身都会调用一次weights_init函数,mod参数的值即这些module
    e.apply(weights_init)
    # 根据名字来查看参数
    for name, param in e.named_parameters():
        print(name)
        # 举个例子看看是否按照设计进行初始化
        # 可见BatchNorm2d的weight是正态分布形的参数,bias参数都是0
        if name == ‘models.BatchNorm2d-128.weight‘ or name == ‘models.BatchNorm2d-128.bias‘:
            print(param)

返回:

/anaconda3/envs/deeplearning/bin/python3.6 /Users/user/pytorch/iforest_autoencoder/autoencoder.py
# 返回的是依次传入初始化函数的module
Conv2d
LeakyReLU
Conv2d
BatchNorm2d
LeakyReLU
Conv2d
BatchNorm2d
LeakyReLU
Conv2d
BatchNorm2d
LeakyReLU
Conv2d
BatchNorm2d
LeakyReLU
Conv2d
BatchNorm2d
LeakyReLU
Conv2d
Sequential
Encoder

# 输出name的格式,并根据条件打印出BatchNorm2d-128的两个参数
models.Conv2-3-64.weight
models.Conv2-64-128.weight
models.BatchNorm2d-128.weight
Parameter containing:
tensor([0.9737, 0.9825, 1.0013, 1.0038, 1.0145, 1.0123, 0.9710, 0.9802, 0.9921,
        0.9991, 0.9697, 1.0093, 1.0183, 0.9882, 1.0499, 0.9782, 1.0252, 1.0002,
        1.0002, 0.9648, 0.9999, 1.0166, 1.0086, 0.9585, 1.0112, 1.0027, 1.0129,
        0.9993, 1.0105, 1.0015, 1.0130, 0.9883, 0.9819, 0.9977, 1.0069, 1.0052,
        0.9889, 1.0120, 0.9969, 0.9744, 0.9735, 0.9675, 1.0091, 1.0371, 0.9837,
        1.0087, 1.0112, 1.0187, 0.9862, 0.9890, 1.0268, 1.0211, 1.0530, 0.9952,
        0.9837, 0.9852, 0.9984, 0.9983, 0.9799, 0.9840, 0.9961, 1.0157, 1.0371,
        1.0252, 1.0190, 1.0086, 0.9949, 0.9933, 0.9920, 1.0028, 0.9915, 0.9741,
        0.9996, 1.0064, 1.0132, 0.9887, 1.0218, 1.0061, 1.0010, 0.9904, 0.9641,
        0.9813, 1.0139, 1.0312, 1.0217, 0.9971, 0.9722, 0.9817, 1.0017, 0.9918,
        0.9990, 0.9990, 1.0157, 1.0110, 1.0149, 0.9859, 1.0236, 1.0176, 1.0219,
        1.0035, 1.0018, 1.0449, 0.9978, 1.0013, 0.9806, 1.0075, 0.9687, 1.0065,
        1.0110, 1.0141, 1.0595, 0.9958, 1.0081, 1.0053, 0.9846, 0.9971, 0.9876,
        1.0357, 0.9888, 0.9943, 0.9797, 1.0254, 0.9893, 0.9932, 0.9815, 1.0306,
        0.9821, 0.9898], requires_grad=True)
models.BatchNorm2d-128.bias
Parameter containing:
tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0.], requires_grad=True)
models.Conv2-128-256.weight
models.BatchNorm2d-256.weight
models.BatchNorm2d-256.bias
models.Conv2-256-512.weight
models.BatchNorm2d-512.weight
models.BatchNorm2d-512.bias
models.Conv2-512-1024.weight
models.BatchNorm2d-1024.weight
models.BatchNorm2d-1024.bias
models.Conv2-1024-2048.weight
models.BatchNorm2d-2048.weight
models.BatchNorm2d-2048.bias
models.Conv2-2048-100.weight

原文地址:https://www.cnblogs.com/wanghui-garcia/p/11385160.html

时间: 2024-08-02 01:23:02

pytorch对模型参数初始化的相关文章

从头学pytorch(十):模型参数访问/初始化/共享

模型参数的访问初始化和共享 参数访问 参数访问:通过下述两个方法.这两个方法是在nn.Module类中实现的.继承自该类的子类也有相同方法. .parameters() .named_parameters() import torch from torch import nn from torch.nn import init net = nn.Sequential(nn.Linear(4, 3), nn.ReLU(), nn.Linear(3, 1)) # pytorch已进行默认初始化 pr

模型参数的初始化

1.  tf.global_variables_initializer() 可以初始化所有变量. import tensorflow as tfa=tf.Variable(tf.ones((2,3)),name='a')b=tf.Variable(tf.random_normal(shape=(2,3),stddev=0.35),name='b')sess=tf.Session()sess.run(tf.global_variables_initializer())print(sess.run(

[深度学习] Pytorch(三)—— 多/单GPU、CPU,训练保存、加载模型参数问题

[深度学习] Pytorch(三)-- 多/单GPU.CPU,训练保存.加载预测模型问题 上一篇实践学习中,遇到了在多/单个GPU.GPU与CPU的不同环境下训练保存.加载使用使用模型的问题,如果保存.加载的上述三类环境不同,加载时会出错.就去研究了一下,做了实验,得出以下结论: 多/单GPU训练保存模型参数.CPU加载使用模型 #保存 PATH = 'cifar_net.pth' torch.save(net.module.state_dict(), PATH) #加载 net = Net()

[Pytorch]深度模型的显存计算以及优化

原文链接:https://oldpan.me/archives/how-to-calculate-gpu-memory 前言 亲,显存炸了,你的显卡快冒烟了! torch.FatalError: cuda runtime error (2) : out of memory at /opt/conda/conda-bld/pytorch_1524590031827/work/aten/src/THC/generic/THCStorage.cu:58 想必这是所有炼丹师们最不想看到的错误,没有之一.

使用参数初始化表来实现对数据成员的初始化

这是c++提供的一种机制,具体格式如下: 1 class BOX 2 { 3 public: 4 BOX(int h,int w ,int len); 5 private: 6 int height; 7 int width; 8 int length; 9 }; 10 11 使用参数初始化表初始化的方式: 12 13 BOX::BOX(int h ,int w ,int len):height(h), width(w), length(len){} 14 15 传统的方式是这样子写的: 16

fluent批量处理——模型参数的设置

对于常见的工程应用来说,计算的工况很多,尤其优化工作,少则几百,多则上千,面对如此之多的case文件要写,假如按照一个一个的读写的话,相信你一定会为这么机械的工作烦躁,甚至影响今后好几天的心情,那么有什么简便一些的方法呢?答案是肯定的.那就是采用fluent的journal文件.首先打开fluent软件,在file/write/start journal,见下图: 选择保存文件名*.journal后(看你自己怎么设置文件名),我一般按照这一组的类型来命名:这样, journal文件就开始记录你以

【scikit-learn】如何进行模型参数的选择

内容概要 这一节我们介绍以下几个内容: 我们该怎样选择模型用于监督学习任务? 我们该如何选择调整得到最好的模型参数? 我们该如何对测试数据进行预测估计? 1. 使用整个数据集进行训练和测试 这里我们使用手中的整个数据集来训练模型 使用同样的数据集来测试模型,然后评估预测的结果和真实结果的差别 In [1]: from sklearn.datasets import load_iris iris = load_iris() # create X(features) and y(response)

mvc参数初始化默认值写了要放后

当有参数初始化值得时候参数要放后.如下remark为初始化值会报错. public ActionResult Add(int ckid, int proid, int pronum, int hjnum=0, string remark)  { } 需要将string remark修改为string remark="".

C++学习8 构造函数的参数初始化表

构造函数是一种特殊的成员函数,在创建对象时自动执行,主要用来进行初始化工作,例如对 private 属性的成员变量赋值. 对成员变量的初始化,除了在构造函数的函数体中一一赋值,还可以采用参数初始化表.请看下面的代码: class Student{ private: char *name; int age; float score; public: Student(char *, int, float); void say(); }; //在构造函数中采用参数初始化表 Student::Stude