所有的module有两个比较重要的函数:init()和forward()
在init()中,首先继承父类
然后再定义别的层,比如nn.Linear(256, 10)(输入256维,输出10维)
直接使用pytorch封装的模型
import torch
from torch import nn
from torch.nn import functional as F
net = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))
X = torch.rand(2, 20)
net(X)
自定义MLP
#倒入torch包
import torch
from torch import nn
from torch.nn import functional as F
#定义网络
class MLP(nn.Module):
def __init__(self):
super().__init__()
self.hidden = nn.Linear(20, 256)
self.out = nn.Linear(256, 10)
def forward(self, X):
return self.out(F.relu(self.hidden(X)))
#声明网络
#输入是2*20的矩阵
X = torch.rand(2, 20)
net = MLP(X)
#输出是2*10的矩阵
一个可接受参数输入的模型
import torch
from torch import nn
from torch.nn import functional as F
class MySequential(nn.Module):
def __init__(self, *args):
super().__init__()
#对所有传进来的layer,放在一个特殊的成员变量_modules中
#_modules是一个按序的dict
for block in args:
self._modules[block] = block
def forward(self, X):
#在forward中,给定X,返回的list和插入进去的顺序是一样的
#一层一层调用,返回X
for block in self.__modules.values():
X = block(X)
return X
X = torch.rand(2, 20)
net = MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))
net(X)
总结
- 在init中定义好层
- 在forward中设计好前向计算的方法