一、头文件
torch.nn.Module
二、简单示例
python
import torch.nn as nn
import torch.nn.functional as F
class Model(nn.Module):
def __init__(self) -> None:
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))
- 类定义与构造函数:
- class Model(nn.Module): 声明一个名为Model的类,继承自torch.nn.Module。
- init(self) -> None: 定义了构造函数__init__,用于初始化网络结构。
- super().init() 调用父类的构造函数,确保nn.Module中的初始化逻辑被正确执行。
- self.conv1 = nn.Conv2d(1, 20, 5) 创建了第一个卷积层。
- self.conv2 = nn.Conv2d(20, 20, 5) 创建第二个卷积层
- 前向传播 forward:
- def forward(self, x): 定义了前向传播函数,用于定义输入数据如何经过模型的每一层得到最终输出。
- x = F.relu(self.conv1(x)) 将输入x通过第一个卷积层conv1,然后将结果通过ReLU激活函数。ReLU激活函数用于引入非线性,以增强模型的表达能力。
- return F.relu(self.conv2(x)) 继续将数据传递给第二个卷积层conv2,并再次应用ReLU激活函数。
三、自己写代码尝试一下
python
import torch
from torch import nn
class Mary(nn.Module):
def __init__(self):
super().__init__()
def forward(self,input):
output=input+1
return output
tensor_Yorelee=torch.tensor(10)
Yorelee=Mary()
Yorelee_output=Yorelee(tensor_Yorelee)
print(Yorelee_output)
输出:
python
tensor(11)
提示:善于运用debug
,可以显示出每一步到了哪里,且变量值是什么
四、__call__和forward的比较
学到这里,我会想之前学到的__call__和forward函数有什么区别呢?
- model(x) 等价于调用 call 方法,而 call 会调用 forward 并处理一些额外逻辑。
- 如果只调用 forward,会省略 call 中的附加功能,因此一般建议使用 model(x) 语法,以便自动调用 call 和 forward。
python
model = Model() # 创建模型实例
# 直接调用 `__call__`,实际上是调用了 `forward` 并包含了额外的处理
output = model(x)
# 直接调用 `forward`,不会包含 `__call__` 中的额外处理
output = model.forward(x)