01 - 基本骨架nn.Module
示例
在 PyTorch 中,nn.Module 是一个用于构建神经网络模型的基类。nn.Module 提供了许多功能,使得神经网络的构建、参数管理和导出等操作变得更加方便。
import torch
from torch import nn
class MyNN(nn.Module):
def __init__(self):
super().__init__()
def forward(self, input):
output = input + 1
return output
mynn = MyNN()
x = torch.tensor(1.0)
output = mynn(x)
print(output)
首先,我们导入了PyTorch库,并引入了其中的 torch
和 nn
模块。
然后,定义了一个名为 MyNN
的类,它继承自 nn.Module
类,这是PyTorch中定义神经网络模型的基类。在 MyNN
类中,我们定义了一个 __init__
方法用于初始化模型,但这个方法目前为空,因为在这个简单的例子中,我们并没有添加具体的层或参数。
接下来,我们定义了 forward
方法,这是 nn.Module
类中必须实现的方法。在这个方法中,我们对输入进行加一操作,并将结果作为输出返回。
接着,我们实例化了 MyNN
类,创建了一个名为 mynn
的对象。
接着,我们创建了一个值为1.0的PyTorch张量 x
。
然后,我们将 x
作为输入传递给 mynn
对象,即 output = mynn(x)
,这会调用 MyNN
类中定义的 forward
方法,并将输入 x
加一后的结果作为输出赋值给 output
。
最后,我们打印输出结果 output
,这里的输出结果将是2.0,因为我们将输入1.0加一了,得到了2.0。
卷积操作
# 卷积测试
import torch
import torch.nn.functional as F
img_input = torch.tensor([[1, 2, 0, 3, 1],
[0, 1, 2, 3, 1],
[1, 2, 1, 0, 0],
[5, 2, 3, 1, 1],
[2, 1, 0, 1, 1]])
kernel = torch.tensor([[1, 2, 1],
[0, 1, 0],
[2, 1, 0]])
img_input = torch.reshape(img_input, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))
# 这里的stride是步长
output = F.conv2d(img_input, kernel, stride=1)
print(output)
output2 = F.conv2d(img_input, kernel, stride=2)
print(output2)
# padding默认为0,设置为1可以给四周扩宽一个像素
output3 = F.conv2d(img_input, kernel, stride=1, padding=1)
print(output3)
这段代码演示了如何使用PyTorch中的torch.nn.functional.conv2d
函数进行二维卷积操作。以下是对每行代码的解释:
import torch
: 导入PyTorch库。import torch.nn.functional as F
: 导入PyTorch的函数模块,并使用F
作为别名。img_input = torch.tensor([[1, 2, 0, 3, 1], [0, 1, 2, 3, 1], [1, 2, 1, 0, 0], [5, 2, 3, 1, 1], [2, 1, 0, 1, 1]])
: 创建一个输入图像的张量,表示一个5x5的图像,其中每个数字代表张量中的元素值(如果输入图片,则代表图片的灰度或者RGB不同通道的0~255的数值)。kernel = torch.tensor([[1, 2, 1], [0, 1, 0], [2, 1, 0]])
: 创建一个卷积核(filter)的张量,表示一个3x3的卷积核。img_input = torch.reshape(img_input, (1, 1, 5, 5))
: 将输入图像张量重塑为大小为(1, 1, 5, 5)的四维张量,其中第一个1表示批次大小,第二个1表示通道数,最后两个5表示图像的高度和宽度。kernel = torch.reshape(kernel, (1, 1, 3, 3))
: 将卷积核张量重塑为大小为(1, 1, 3, 3)的四维张量,与输入图像的形状相匹配。output = F.conv2d(img_input, kernel, stride=1)
: 使用F.conv2d
函数对输入图像进行卷积操作,传入输入图像张量、卷积核张量,并设置步长(stride)为1。这将产生一个输出特征图(output feature map)。print(output)
: 打印输出特征图。output2 = F.conv2d(img_input, kernel, stride=2)
: 使用步长(stride)为2进行卷积操作,产生另一个输出特征图。print(output2)
: 打印第二个输出特征图。output3 = F.conv2d(img_input, kernel, stride=1, padding=1)
: 使用步长(stride)为1,并设置填充(padding)为1进行卷积操作。填充可以在图像周围添加额外像素,有助于保持输出特征图的大小与输入图像相同。print(output3)
: 打印具有填充的输出特征图。