前言

从现在开始进入神经网络的搭建环节,先学神经网络的基本骨架nn.Module的使用

nn.Module模块使用

nn.Module是对所有神经网络提供一个基本的类。

我们的神经网络是继承nn.Module这个类,即nn.Module为父类,nn.Module为所有神经网络提供一个模板,对其中一些我们不满意的部分进行修改。

调用提供的神经网络的包

from torch import nn

构造名为Tudui的神经网络并继承PyTorch提供的Module

class Tudui(nn.Module):

重写__init__函数,继承父类的初始化

def __init__(self):
    super(Tudui,self).__init__()

重写forward函数

def forward(self,input):
    output = input + 1
    return output

创建神经网络

Tudui = Tudui()

创建一个值为 1.0 的tensor输入

x = torch.tensor(1.0)

输出

output = Tudui(x)
print(output)

本神经网络为简单的输入加1,所以可以看到输出结果为2

完整代码

from torch import nn
import torch

class Tudui(nn.Module):
    def __init__(self):
        super(Tudui,self).__init__()

    def forward(self,input):
        output = input + 1
        return output

Tudui = Tudui()
x = torch.tensor(1.0)
output = Tudui(x)
print(output)

super(Myclass, self).__init__()

代码对应

super(Tudui,self).__init__()

简单理解就是子类把父类的__init__()放到自己的__init__()当中,这样子类就有了父类的__init__()的那些东西。

Myclass类继承nn.Module,super(Myclass, self).__init__()就是对继承自父类nn.Module的属性进行初始化。而且是用nn.Module的初始化方法来初始化继承的属性。

super().__init()__()来通过初始化父类属性以初始化自身继承了父类的那部分属性;这样一来,作为nn.Module的子类就无需再初始化那一部分属性了,只需初始化新加的元素。

子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。

forward函数

代码对应

def forward(self,input):
    output = input + 1
    return output

使用pytorch的时候,不需要手动调用forward函数,只要在实例化一个对象中传入对应的参数就可以自动调用 forward 函数。

因为 PyTorch 中的大部分方法都继承自 torch.nn.Module,而 torch.nn.Module 的__call__(self)函数中会返回 forward()函数 的结果,因此PyTroch中的 forward()函数等于是被嵌套在了__call__(self)函数中;因此forward()函数可以直接通过类名被调用,而不用实例化对象。

class A():
    def __call__(self, param):
        print('i can called like a function')
        print('传入参数的类型是:{}   值为: {}'.format(type(param), param))
        res = self.forward(param)
        return res
    
    def forward(self, input_):
        print('forward 函数被调用了')
        print('in  forward, 传入参数类型是:{}  值为: {}'.format( type(input_), input_))
        return input_

a = A()
input_param = a('i')
print("对象a传入的参数是:", input_param)

结果

i can called like a function

传入参数的类型是:<class 'str'> 值为: i

forward 函数被调用了

in forward, 传入参数类型是:<class 'str'> 值为: i

对象a传入的参数是: i

更多推荐