自定义层

不带参数的层

先构造1个不带参数的层

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

class CenteredLayer(bb.Module):
	def __init__(self):
		super().__init__()
	def forward(self,X):
		return X-X.mean()
layer = CenteredLayer()
layer(torch.FloatTensor([1,2,3,4,5]))
net = nn.Sequential(nn.Linear(8,128),CenteredLayer())

向该网络发送任意参数后,检查是否为0.处理的是浮点数,因为存储精度的问题,会看到一个非常小的非零数

Y = net(torch.rand(4,8))
Y.mean()

带参数的层

继续定义一些具有参数的层,这些参数可以通过训练继续调整,使用内置函数来创建函数

class MyLinear(nn.Module):
	def __init__(self,in_units,units):
		super().__init__()
		self.weight = nn.Parameter(torch.randn(in_units,units))
		self.bias = nn.Parameter(torch.randn(units,))
	
	def forward(self,X):
		linear = torch.matmul(X,self.weight.data)+self.bias.data
		return F.relu(linear)