Pytorch定义深度神经网络其实就是一个层堆叠的过程,在__init__
中定义层结构,每一层可能包含卷积、池化等操作。也可以复用Pytorch底层封装好的已经成熟的网络结构对layer进行初始化。
该类中还有一个forward
函数,在实例化模型的时候,底层会自动调用该函数。该函数中可以定义学习率,为初始化定义的layer传入数据等。
一般自定义的op
,如果您想在PyTorch
中自定义OP
的话,您需要继承这个类nn.Module
,您需要在继承的时候复写forward
和backward
方法,可能还需要复写__init__
方法。您需要在forward
中定义OP
,在backward
说明如何计算梯度。forward
和backward
方法中进行计算的类型都是Tensor
,而不是我们传入的Variable。计算完forward和backward之后,会包装成Variable返回。
一般过程如下:
def MyModel(nn.Module):
def __init__(self, a, b, ...):
super(MyModel, self).__init__()
# parameters
self.para = ...
# layers
self.method = ...
def forward(self, x):
# data flow
x = ...
return x
# 初始化模型和优化器
model = MyModel(a, b, ...)
optimizer = torch.optim.Adam(...)
# 模型训练
for i in epoch:
model.train() # 开始训练
self.optimizer.zero_grad()
output = model(input_data) # 训练
loss = metrics(predict, output) # 计算损失
loss.backward() # 反向传递
self.optimizer.step() # 参数更新
以下内容摘抄自博主:鹊踏枝-码农PyTorch之前向传播函数forward
拿LeNet举例:
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
layer1 = nn.Sequential()
layer1.add_module('conv1', nn.Conv(1, 6, 3, padding=1))
layer1.add_moudle('pool1', nn.MaxPool2d(2, 2))
self.layer1 = layer1
layer2 = nn.Sequential()
layer2.add_module('conv2', nn.Conv(6, 16, 5))
layer2.add_moudle('pool2', nn.MaxPool2d(2, 2))
self.layer2 = layer2
layer3 = nn.Sequential()
layer3.add_module('fc1', nn.Linear(400, 120))
layer3.add_moudle('fc2', nn.Linear(120, 84))
layer3.add_moudle('fc3', nn.Linear(84, 10))
self.layer3 = layer3
def forward(self, x):
x = self.layer1(x)
x = self.layer2(x)
x = x.view(x.size(0), -1)
x = self.layer3(x)
return x
神经网络的典型处理如下所示: