pytorch网络模型构建场景的问题介绍

目录
  • 1. 网络模型构建中的问题
    • 1.1 输入变量是Tensor张量
    • 1.2 __init__()方法使用
    • 1.3 内置函数setattr()
    • 1.4 网络模型的构建

记录使用pytorch构建网络模型过程遇到的点

1. 网络模型构建中的问题

1.1 输入变量是Tensor张量

各个模块和网络模型的输入, 一定要是tensor 张量;

可以用一个列表存放多个张量。

如果是张量维度不够,需要升维度,

可以先使用 torch.unsqueeze(dim = expected)

然后再使用torch.cat(dim ) 进行拼接;

需要传递梯度的数据,禁止使用numpy, 也禁止先使用numpy,然后再转换成张量的这种情况出现;

这是因为pytorch的机制是只有是 Tensor 张量的类型,才会有梯度等属性值,如果是numpy这些类别,这些变量并会丢失其梯度值。

1.2 __init__()方法使用

class ex:
    def __init__(self):
        pass

__init__方法必须接受至少一个参数即self,

Python中,self是指向该对象本身的一个引用,

通过在类的内部使用self变量,

类中的方法可以访问自己的成员变量,简单来说,self.varname的意义为”访问该对象的varname属性“

当然,__init__()中可以封装任意的程序逻辑,这是允许的,init()方法还接受任意多个其他参数,允许在初始化时提供一些数据,例如,对于刚刚的worker类,可以这样写:

class worker:
    def __init__(self,name,pay):
        self.name=name
        self.pay=pay

这样,在创建worker类的对象时,必须提供name和pay两个参数:

b=worker('Jim',5000)

Python会自动调用worker.init()方法,并传递参数。

细节参考这里init方法

1.3 内置函数setattr()

此时,可以使用python自带的内置函数 setattr(), 和对应的getattr()

setattr(object, name, value)

object – 对象。

name – 字符串,对象属性。

value – 属性值。

对已存在的属性进行赋值:
>>>class A(object):
...     bar = 1
... 
>>> a = A()
>>> getattr(a, 'bar')          # 获取属性 bar 值
1
>>> setattr(a, 'bar', 5)       # 设置属性 bar 值
>>> a.bar
5
如果属性不存在会创建一个新的对象属性,并对属性赋值:

>>>class A():
...     name = "runoob"
... 
>>> a = A()
>>> setattr(a, "age", 28)
>>> print(a.age)
28
>>>

setattr() 语法

setattr(object, name, value)

object – 对象。

name – 字符串,对象属性。

value – 属性值。

1.4 网络模型的构建

注意到, 在python的 __init__() 函数中, self 本身就是该类的对象的一个引用,即self是指向该对象本身的一个引用,

利用上述这一点,当在神经网络中,

需要给多个属性进行实例化时,

且这多个属性使用的是同一个类进行实例化.

则使用 setattr(self, string, object1) 添加属性;

class Temporal_GroupTrans(nn.Module):
    def __init__(self,   num_classes=10,num_groups=35, drop_prob=0.5, pretrained= True):
        super(Temporal_GroupTrans, self).__init__()
        conv_block = Basic_slide_conv()
        for i in range( num_groups):
            setattr(self, "group" + str(i), conv_block)
        # 自定义transformer模型的初始化, CustomTransformerModel() 在该类中传入初始化模型的参数,
        # nip:512 输入序列中,每个列向量的编码维度, 16: 注意力头的个数
        # 600: 中间mlp 隐藏层的维数,  6: 堆叠transforEncode 编码模块的个数;
        self.trans_model = CustomTransformerModel(512,16,600, 6,droupout=0.5,nclass=4)

则使用 getattr(self, string, object1) 获取属性;

        trans_input_sequence = []
        for i in range(0, num_groups, ):
            #   每组语谱图的大小是一个 (bt, ch,96,12)的矩阵,组与组之间没有重叠;
            cur_group = x[:, :, :, 12 * i:12 * (i + 1)]
            # VARIABLE_fun = "self.group"   # 每一组,与之对应的卷积模块;
            # cur_fun = eval(VARIABLE_fun + str(i ))
            cur_fun = getattr(self, 'group'+str(i))
            cur_group_out = cur_fun(cur_group).unsqueeze(dim=1)  # [bt,1, 512]
            trans_input_sequence.append(cur_group_out)

到此这篇关于pytorch网络模型构建场景的问题介绍的文章就介绍到这了,更多相关pytorch网络模型构建内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • pytorch构建网络模型的4种方法

    利用pytorch来构建网络模型有很多种方法,以下简单列出其中的四种. 假设构建一个网络模型如下: 卷积层-->Relu层-->池化层-->全连接层-->Relu层-->全连接层 首先导入几种方法用到的包: import torch import torch.nn.functional as F from collections import OrderedDict 第一种方法 # Method 1 --------------------------------------

  • pytorch网络模型构建场景的问题介绍

    目录 1. 网络模型构建中的问题 1.1 输入变量是Tensor张量 1.2 __init__()方法使用 1.3 内置函数setattr() 1.4 网络模型的构建 记录使用pytorch构建网络模型过程遇到的点 1. 网络模型构建中的问题 1.1 输入变量是Tensor张量 各个模块和网络模型的输入, 一定要是tensor 张量: 可以用一个列表存放多个张量. 如果是张量维度不够,需要升维度, 可以先使用 torch.unsqueeze(dim = expected) 然后再使用torch.

  • SpringBoot快速构建应用程序方法介绍

    首先介绍一下SpringBoot在Coding上的使用场景.Coding中使用SpringBoot搭建的Email服务. 之所以选择SpringBoot,原因就是更加轻量级.在往常的Spring项目中,依赖的库太多,配置太繁杂,用在这只提供Email服务的程序上未免也小题大做了.而SpringBoot提供一些非功能性的常见的大型项目类特性(如内嵌服务器.安全.度量.健康检查.外部化配置)使得我们在部署上也更为方便,如可以直接地内嵌Tomcat/Jetty(不需要单独去部署war包) 1.Spri

  • Maven构建生命周期详细介绍

    什么是构建生命周期 构建生命周期是一组阶段的序列(sequence of phases),这些构建生命周期中的每一个由构建阶段的不同列表定义,其中构建阶段表示生命周期中的阶段. 例如,默认(default)的生命周期包括以下阶段(注意:这里是简化的阶段,用于生命周期阶段的完整列表): 验证(validate) - 验证项目是否正确,所有必要的信息可用 编译(compile) - 编译项目的源代码 测试(test) - 使用合适的单元测试框架测试编译的源代码.这些测试不应该要求代码被打包或部署 打

  • 详解pytorch中squeeze()和unsqueeze()函数介绍

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行.squeeze(a)就是将a中所有为1的维度删掉.不为1的维度没有影响.a.squeeze(N) 就是去掉a中指定的维数为一的维度.还有一种形式就是b=torch.squeeze(a,N) a中去掉指定的定的维数为一的维度. 再看torch.unsque

  • PyTorch中的torch.cat简单介绍

    目录 1.toych简单介绍 2.张量Tensors 3.torch.cat 1.toych简单介绍 包torch包含了多维疑是的数据结构及基于其上的多种数学操作. torch包含了多维张量的数据结构以及基于其上的多种数学运算.此外,它也提供了多种实用工具,其中一些可以更有效地对张量和任意类型进行序列化的工具. 它具有CUDA的对应实现,可以在NVIDIA GPU上进行张量运算(计算能力>=3.0) 2. 张量Tensors torch.is_tensor(obj):如果obj是一个pytorc

  • PyTorch device与cuda.device用法介绍

    目录 1 查看当前的device 2 cpu设备可以使用“cpu:0”来指定 3 gpu设备可以使用“cuda:0”来指定 4 查询CPU和GPU设备数量 5 从CPU设备上转换到GPU设备 5.1 torch.Tensor方法默认使用CPU设备 5.2 使用to方法将cpu的Tensor转换到GPU设备上 5.3 使用.cuda方法将cpu的Tensor转换到GPU设备上 1 查看当前的device 输入情况: import torch print("Default Device : {}&q

  • 关于Pytorch中模型的保存与迁移问题

    目录 1 引言 2 模型的保存与复用 2.1 查看网络模型参数 2.2 载入模型进行推断 2.3 载入模型进行训练 2.4 载入模型进行迁移 3 总结 1 引言 各位朋友大家好,欢迎来到月来客栈.今天要和大家介绍的内容是如何在Pytorch框架中对模型进行保存和载入.以及模型的迁移和再训练.一般来说,最常见的场景就是模型完成训练后的推断过程.一个网络模型在完成训练后通常都需要对新样本进行预测,此时就只需要构建模型的前向传播过程,然后载入已训练好的参数初始化网络即可. 第2个场景就是模型的再训练过

  • 关于PyTorch源码解读之torchvision.models

    PyTorch框架中有一个非常重要且好用的包:torchvision,该包主要由3个子包组成,分别是:torchvision.datasets.torchvision.models.torchvision.transforms. 这3个子包的具体介绍可以参考官网: http://pytorch.org/docs/master/torchvision/index.html. 具体代码可以参考github: https://github.com/pytorch/vision/tree/master/

  • Three.JS实现三维场景

    最近在看一些Web3D的内容,觉得如果用纯openGLes写一个简单的3D场景太难了:不过还好,有很多现成的库可以使用. (个人感觉):我知道的经常的是Three.JS和SceneJS.感觉Three.JS资料比较多,貌似好学一些吧:另一个是ScenenJS,感觉官方介绍比较好,适合做一些工程和医学上的模拟,实时性比较好,但是中文资料感觉比较少,不太好学习.我个人看的是Three.JS 学习中用到的一些工具和库:学习中用到一些库,也费了不少时间去整理,下载: 用到的工具:WebStorm,个人感

随机推荐