【神经网络】01 - 基本骨架nn.Module

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)

img

首先,我们导入了PyTorch库,并引入了其中的 torchnn 模块。

然后,定义了一个名为 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)

img这段代码演示了如何使用PyTorch中的torch.nn.functional.conv2d函数进行二维卷积操作。以下是对每行代码的解释:

  1. import torch: 导入PyTorch库。
  2. import torch.nn.functional as F: 导入PyTorch的函数模块,并使用F作为别名。
  3. 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的数值)。
  4. kernel = torch.tensor([[1, 2, 1], [0, 1, 0], [2, 1, 0]]): 创建一个卷积核(filter)的张量,表示一个3x3的卷积核。
  5. img_input = torch.reshape(img_input, (1, 1, 5, 5)): 将输入图像张量重塑为大小为(1, 1, 5, 5)的四维张量,其中第一个1表示批次大小,第二个1表示通道数,最后两个5表示图像的高度和宽度。
  6. kernel = torch.reshape(kernel, (1, 1, 3, 3)): 将卷积核张量重塑为大小为(1, 1, 3, 3)的四维张量,与输入图像的形状相匹配。
  7. output = F.conv2d(img_input, kernel, stride=1): 使用F.conv2d函数对输入图像进行卷积操作,传入输入图像张量、卷积核张量,并设置步长(stride)为1。这将产生一个输出特征图(output feature map)。
  8. print(output): 打印输出特征图。
  9. output2 = F.conv2d(img_input, kernel, stride=2): 使用步长(stride)为2进行卷积操作,产生另一个输出特征图。
  10. print(output2): 打印第二个输出特征图。
  11. output3 = F.conv2d(img_input, kernel, stride=1, padding=1): 使用步长(stride)为1,并设置填充(padding)为1进行卷积操作。填充可以在图像周围添加额外像素,有助于保持输出特征图的大小与输入图像相同。
  12. print(output3): 打印具有填充的输出特征图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值