pytorch学习笔记之自己搭建一个网络结构

Pytorch定义深度神经网络其实就是一个层堆叠的过程,在__init__中定义层结构,每一层可能包含卷积、池化等操作。也可以复用Pytorch底层封装好的已经成熟的网络结构对layer进行初始化。

该类中还有一个forward函数,在实例化模型的时候,底层会自动调用该函数。该函数中可以定义学习率,为初始化定义的layer传入数据等。

一般自定义的op,如果您想在PyTorch中自定义OP的话,您需要继承这个类nn.Module,您需要在继承的时候复写forwardbackward方法,可能还需要复写__init__方法。您需要在forward中定义OP,在backward说明如何计算梯度。forwardbackward方法中进行计算的类型都是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

神经网络的典型处理如下所示:

  1. 定义可学习参数的网络结构(堆叠各层和层的设计);
  2. 数据集输入;
  3. 对输入进行处理(由定义的网络层进行处理),主要体现在网络的前向传播;
  4. 计算loss ,由Loss层计算;
  5. 反向传播求梯度;
  6. 根据梯度改变参数值,最简单的实现方式(SGD)为:
    weight = weight - learning_rate * gradient

forward的底层执行过程:以一个Module为例

  1. 调用module的call方法
  2. module的call里面调用module的forward方法
  3. forward里面如果碰到Module的子类,回到第1步,如果碰到的是Function的子类,继续往下
  4. 调用Function的call方法
  5. Function的call方法调用了Function的forward方法。
  6. Function的forward返回值
  7. module的forward返回值
  8. 在module的call进行forward_hook操作,然后返回值。

你可能感兴趣的:(机器学习之路,python,数据分析,pytorch)