Containers 中有6个模块,最常用的就是第一个Module。
我们所搭建的神经网络都行从Module这个类当中继承。
一、Module的官方文档
import torch.nn as nn import torch.nn.functional as F class Model(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(1, 20, 5) self.conv2 = nn.Conv2d(20, 20, 5) def forward(self, x): x = F.relu(self.conv1(x)) return F.relu(self.conv2(x))
详细注解:
import torch.nn as nn
import torch.nn.functional as F
class Modul(nn.Module):
#定义了一个神经网络,名字叫Module。然后它继承了nn.Module这个类。
相当于Module给我们所有的神经网络提供了一个模板,然后我们继承它,就是拿这个模板过来用,如果我们对其中一些部分可以进行修改,像这里应用的两个函数。
def __init__(self): #__init__函数,我们首先进行初始化。
super().__init__() #这一步是必须要的,等于 super(Module, self).__init__() [这是pyrhon2版本的写法,()里的Module ,self,不能省略,但是pyrhon3可以省略了]
可以理解为super().__init__(),就是继承父类的init方法,调用它的初始化函数。
self.conv1 = nn.Conv2d(1, 20, 5)
self.conv2 = nn.Conv2d(20, 20, 5)
后面部分是我们自己写的,需要的步骤。
def forward(self, x): #self是指这个类本身,x是输入的数据。
x = F.relu(self.conv1(x)) #输入是x,先经过一次卷积conv1,再进行非线性处理relu
return F.relu(self.conv2(x))
#再经过一次卷积conv1,再进行非线性处理relu , 最后进行一个返回。
输入input->神经网络(结果forward处理)->output输出
(这个叫神经网络中的forward前向传播,除此之外,还有backward反向传播)
二、实例练习
1 代码及结果
这里我们可以自己写段简单的代码练习一下Module。
import torch
from torch import nn#定义一个名字叫Test的神经网络的模板
class Test(nn.Module):
def __init__(self):
super(Test, self).__init__()def forward(self, input):
output = input + 1
return output#应用Test这个神经网络模板
test = Test() #使用Test这个模板来创建神经网络test,初始化x = torch.tensor(1.2)
y = torch.Tensor(1,2)
output1 = test(x)
output2 = test(y)
print(output1)
print(output2)运行结果:
tensor(2.2000)
tensor([[1., 1.]])
2.torch.tensor()和torch.Tensor()的区别
在torch.tensor()中,tensor是一个函数,它的使用是这样的
torch.tensor(data, dtype=None, device=None, requires_grad=False)
data可以是各种类型的数据
而在torch.Tensor()中,Tensor是一个类,它是torch.FloatTensor()的别名,括号里要输入序列。如文中的实例,输入1.2,它会报错:TypeError: new(): data must be a sequence (got float),所以输入了(1,2)