pytorch基础教程-模型编写(一)

'''

pytorch 中神经网络模块化接口的了解

1, torch.nn是专门为设计的模块化接口,nn构建位于autograd之上,可以定义和运行神经网络

2, nn.Module是nn中十分重要的类,包含网络各层的定义以及forward方法

'''

'''

定义自己的网络:

1, 需要继承nn.Module类,并实现forward方法

2, 一般把网络中具有可学习参数的层放在构造函数中

3,不具有可学习参数的层可放在构造函数中,也可不放在构造函数中

4,只要在nn.Module的子类中定义了forward函数,backward函数就会被自动实现

5,forward函数可以使用任何Variable支持函数

pytorch中基于nn.Module的构建模型中,只支持mini-batch的Variab的输入方式

比如,只有一张输入图片,也需要变成NxCxHxW的形式:

input_image = torch.FloatTensor(1,28,28)

input_image = Variable(input_image)

input_image = input_image.unsqueeze(0)

'''

对于所有的接口函数都在:pytorch中文文档中

https://ptorch.com/docs/1/torch-nn

所以接下来模型撰写就,以LeNet为例:

import torch 
import torch.nn as nn 
import torch.nn.functional as F 
from torch.autograd import Variable 
class LeNet(nn.Module):
    def __init__(self):
        # nn.Module的子类函数必须在构造函数中执行父类的构造函数
        super(LeNet, self).__init__()   # 等价与nn.Module.__init__()
 
        # nn.Conv2d返回的是一个Conv2d class的一个对象,该类中包含forward函数的实现
        # 当调用self.conv1(input)的时候,就会调用该类的forward函数
        self.conv1 = nn.Conv2d(1, 6, (5, 5))   # output (N, C_{out}, H_{out}, W_{out})`
        self.conv2 = nn.Conv2d(6, 16, (5, 5))
        self.fc1 = nn.Linear(256, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)
 
    def forward(self, x):
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))  # F.max_pool2d的返回值是一个Variable
        x = F.max_pool2d(F.relu(self.conv2(x)), (2, 2))
        x = x.view(x.size()[0], -1)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
 
        # 返回值也是一个Variable对象
        return x
 
 
def output_name_and_params(net):
    for name, parameters in net.named_parameters():
        print('name: {}, param: {}'.format(name, parameters))
 
 
if __name__ == '__main__':
    net = LeNet()
    print('net: {}'.format(net))
    params = net.parameters()   # generator object
    print('params: {}'.format(params))
    output_name_and_params(net)
 
    input_image = torch.FloatTensor(1, 1, 28, 28)
 
    # 和tensorflow不一样,pytorch中模型的输入是一个Variable,而且是Variable在图中流动,不是Tensor。
    # 这可以从forward中每一步的执行结果可以看出
    input_image = Variable(input_image)
 
    output = net(input_image)
    # print('output: {}'.format(output))
    # print('output.size: {}'.format(output.size()))

参考:https://blog.csdn.net/u012609509/article/details/81203436

你可能感兴趣的:(pytorch)