python pytorch自定义_pytorch自定义层如何实现?超简单!

在pytorch中,给我们提供了大量的预定义层,直接就能拿来用,但是对于科研小能手来说,肯定有各种关于神经网络的奇思妙想,这时候可能预定义层根本没法满足自己的需求,所以,需要我们能简单方便的实现自己的自定义层,并且能够与预定义层无缝结合在一个模型里。那应该怎么做呢?

总所周知,神经网络的任何操作都可以封装成pytorch的层,这样方便调用,所以比如relu等激活函数也是pytorch中的层,但是这种层并没有需要训练的参数。

所以自定义层可以分为两种,一种是带参数的,一种是不带参数的。

一、不带参数的

不带参数的非常简单,因为它没有自己的参数,所以它完成的工作肯定是对输入张量X进行各种乱七八糟的操作,最后返回一个张量。那么我们的实现方式如下:

import torch

from torch import nn

class CenteredLayer(nn.Module):

def __init__(self, **kwargs):

super(CenteredLayer, self).__init__(**kwargs)

def forward(self, x):

return x - x.mean()

# 使用的时候跟自定义层的使用方法一样,例如:

layer = CenteredLayer()

layer(torch.tensor([1, 2, 3, 4, 5], dtype=torch.float))

# 或者作为更复杂模型的一部分:

net = nn.Sequential(nn.Linear(8, 128), CenteredLayer())

可以看到,只需要在forward函数中进行相应的变换就行了,这些变换都是pytorch中张量计算的基本操作,就不再赘述了。

二、带参数的

在pytorch中模型参数的访问、初始化和共享文章中提到了Parameter类是Tensor类的子类,区别是用Parameter创建张量的时候会把这个张量作为模型的参数,因此,我们想创建带参数的自定义层,只需要比刚才多做一个工作:声明一些Parameter类的实例(在__init__函数中)。比如:

class MyDense(nn.Module):

def __init__(self):

super(MyDense, self).__init__()

self.params=nn.Parameter(torch.randn(4, 1))

def forward(self, x):

x = torch.mm(x, self.params)

return x

net = MyDense()

print(net)

有时候我们可能需要创建的Parameter比较多,为了方便,pytorch提供了两个类:ParameterList和ParameterDict,这两个类可以传入多个Parameter实例,然后可以像python中的列表和字典一样去访问或更改ParameterList或ParameterDict中的Parameter,例如:

class MyDense(nn.Module):

def __init__(self):

super(MyDense, self).__init__()

self.params = nn.ParameterList([nn.Parameter(torch.randn(4, 4)) for i in range(3)])

self.params.append(nn.Parameter(torch.randn(4, 4)))

self.params1 = nn.ParameterDict({

'linear1': nn.Parameter(torch.randn(4, 4))

})

self.params1.update({'linear2': nn.Parameter(torch.randn(4, 2))}) # 新增

def forward(self, x):

for i in range(len(self.params)):

x = torch.mm(x, self.params[i])

return torch.mm(x, self.params1[“linear2”])

net = MyDense()

print(net)

带参数的自定义层的使用更预定义的层还有不带参数的自定义层的用法完全一样,可以完美的集成到同一个模型中,这样想要什么样的模型就都能做啦

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值