PyTorch 模型构造

记录几种模型构造的方法:

继承Module类来构造模型

Module是所有神经网络模块的基类,通过继承它来得到我们需要的模型,通常我们需要重载Module类的__init__函数和forward函数。

实例

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))

利用Module的子类

在Pytorch中实现了继承自Module的可以方便构造模型的类,有SequentialModuleListModuleDict

  • 使用Sequential

    当模型的前向计算为简单串联各个层的计算时,Sequential类可以通过更加简单的方式定义模型。这正是Sequential类的目的:它可以接收一个子模块的有序字典(OrderedDict)或者一系列子模块作为参数来逐一添加Module的实例,而模型的前向计算就是将这些实例按添加的顺序逐一计算。

    这里实现一个与Sequential具有相似功能的MySequential

    class MySequential(nn.Module):
    from collections import OrderedDict
    def __init__(self, *args):
        super(MySequential, self).__init__()
        if len(args) == 1 and isinstance(args[0], OrderedDict): # 如果传入的是一个OrderedDict
            for key, module in args[0].items():
                self.add_module(key, module)  # add_module方法会将module添加进self._modules(一个OrderedDict)
        else:  # 传入的是一些Module
            for idx, module in enumerate(args):
                self.add_module(str(idx), module)
    def forward(self, input):
        # self._modules返回一个 OrderedDict,保证会按照成员添加时的顺序遍历成员
        for module in self._modules.values():
            input = module(input)
        return input
    
  • 使用ModuleList

    将子模块放在一个列表(list)之中
    ModuleList可以像常规的Python list一样执行append()extend()操作,有一些区别在于ModuleList中的所有模块的参数会被自动地添加到整个网络之中

    实例

    net = nn.ModuleList([nn.Linear(784, 256), nn.ReLU()])
    net.append(nn.Linear(256, 10)) # # 类似List的append操作
    print(net[-1])  # 类似List的索引访问
    print(net)

    虽然SequentialModuleList都可以列表化构造网络,但二者存在区别:ModuleList仅仅是一个储存各种模块的列表,这些模块之间没有联系也没有顺序(所以不用保证相邻层的输入输出维度 匹配),而且没有实现forward功能(需要自己实现)。Sequential内的模块需要按照顺序排列,要保证相邻层的输入输出大小相匹配,内部forward功能已经实现。

    ModuleList的出现可以让网络定义前向传播时更加灵活:

    class MyModule(nn.Module):
    def __init__(self):
        super(MyModule, self).__init__()
        self.linears = nn.ModuleList([nn.Linear(10, 10) for i in range(10)])
    
    def forward(self, x):
        # ModuleList can act as an iterable, or be indexed using ints
        for i, l in enumerate(self.linears):
            x = self.linears[i // 2](x) + l(x)
        return x
  • 使用ModuleDict
    ModuleDict接收一个子模块的字典作为输入, 然后也可以类似字典那样进行添加访问操作:

    net = nn.ModuleDict({
    'linear': nn.Linear(784, 256),
    'act': nn.ReLU(),
    })
    net['output'] = nn.Linear(256, 10) # 添加
    print(net['linear']) # 访问
    print(net.output)
    print(net)
    # net(torch.zeros(1, 784)) # 会报NotImplementedError

    ModuleList一样,使用ModuleDict时同样需要自己定义forward

参考:

  1. 动手学深度学习PyTorch版
  2. PyTorch官方文档

原文地址:https://www.cnblogs.com/patrolli/p/11896776.html

时间: 2024-10-01 00:37:49

PyTorch 模型构造的相关文章

pytorch模型转caffe模型

Pytorch模型转换Caffe模型踩坑指南,代码使用的是Github上的工程,地址:https://github.com/longcw/pytorch2caffe 操作环境:ubuntu = 14.04 miniconda 3 caffe pytorch = 0.2.0 torchvision = 0.1.8 python = 2.7 环境配置: 第一步 : 在miniconda创建一个虚拟环境pytorch2caffe : conda create -n pytorch2caffe pyth

tensorflow和pytorch模型之间转换

参考链接:https://github.com/bermanmaxim/jaccardSegment/blob/master/ckpt_to_dd.py 一. tensorflow模型转pytorch模型 import tensorflow as tf import deepdish as dd import argparse import os import numpy as np def tr(v): # tensorflow weights to pytorch weights if v.

使用深度双向LSTM模型构造社区问答系统

/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 关于社区问答系统的问题背景,我们在之前的"利用卷积神经网络构造社区问答系统"一文里已经说明得很清楚,本文就不再赘述,不清楚背景的读者可自行参照上文,我们这些相关的研发工作主要是为了开发畅捷通"会计家园"交流社区的相关功能.为了保持行文完整,简明叙述形式化描述的问题如下: 假设我们已知问答库如下: 其中,Qi是问答社区中的历史问题,Ai是Qi问题的精华答案: 现有社区用户

将Pytorch模型从CPU转换成GPU

1. 如何进行迁移 对模型和相应的数据进行.cuda()处理.通过这种方式,我们就可以将内存中的数据复制到GPU的显存中去.从而可以通过GPU来进行运算了. 1.1 判定使用GPU 下载了对应的GPU版本的Pytorch之后,要确保GPU是可以进行使用的,通过torch.cuda.is_available()的返回值来进行判断.通过torch.cuda.device_count()可以获得能够使用的GPU数量.其他就不多赘述了. 常常通过如下判定来写可以跑在GPU和CPU上的通用模型: 1 if

生产与学术之Pytorch模型导出为安卓Apk尝试记录

生产与学术 写于 2019-01-08 的旧文, 当时是针对一个比赛的探索. 觉得可能对其他人有用, 就放出来分享一下 生产与学术, 真实的对立... 这是我这两天对pytorch深度学习->android实际使用的这个流程的一个切身感受. 说句实在的, 对于模型转换的探索, 算是我这两天最大的收获了... 全部浓缩在了这里: https://github.com/lartpang/DHSNet-PyTorch/blob/master/converter.ipynb 鉴于github加载ipyn

商品多规格模型构造示例

系统涉及到商品,往往就有规格的存在,一个商品多个规格需要去维护,如何通过js的方式快速构造出商品规格编辑的排列组合?整体思想是逐个规格往下合并的方式,核心js代码如下: <script type="text/javascript"> function test() { var doubleArrays = [ [{valId:"1",valCode:"M",valName:"大码"},{valId:"2&

利用GBDT模型构造新特征

[本文链接:http://www.cnblogs.com/breezedeus/p/4109480.html,转载请注明出处] 我的博客主营地迁至github,欢迎朋友们有空去看看:https://breezedeus.github.io/,阅读体验好很多. 本文具体内容:https://breezedeus.github.io/2014/11/19/breezedeus-feature-mining-gbdt.html.

pytorch模型参数

1.torch.nn.state_dict(): 返回一个字典,保存着module的所有状态(state). parameters和persistent_buffers都会包含在字典中,字典的key就是parameter和buffer的names. 例子: import torch from torch.autograd import Variable import torch.nn as nn class Model(nn.Module): def __init__(self): super(

21 , CSS 构造模型

1. div 2. 边距 3. 边框 4. 定位 5. 浮动 1 21.1  div 部分(division)---<div>元素,经常以 div 形式引用---是 XHTML 元素,用于定义 XHTML 文 件中的区域. 1.添加 div <div> <p>This is our content area.</p> </div> 给 div 添加一个 id <div id=”container”> <p>This is