在pytorch中定义一个连接不完整的网络,如卷积

2024-10-03 17:28:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在Pytorch中训练一个小型神经网络,它以一个8维向量作为输入,并预测三种可能的类别之一。第一个隐藏层应该包含6个神经元,其中每个神经元在输入层中只接受3个连续维度的激活。第二个隐藏层还应包含6个节点并完全连接,最后一层应为输出层,具有3个神经元。因此,拓扑结构是:

network topology

假设一个小批量由64个(8维)数据点组成

我尝试使用1D卷积实现第一层。由于一维卷积滤波器假设输入是一系列点,因此我认为一个好方法是定义6个滤波器,在8个一维点上运行:

import torch.nn as nn
import torch.nn.functional as functional

class ExampleNet(nn.Module):

    def __init__(self, batch_size, input_channels, output_channels):
        super(ExampleNet, self).__init__()
        self._layer1 = nn.Conv1d(in_channels=1, out_channels=input_channels - 2, kernel_size=3, stride=1)
        self._layer2 = nn.Linear(in_features=input_channels - 2, out_features=input_channels - 2)
        self._layer3 = nn.Linear(in_features=input_channels - 2, out_features=output_channels)

    def forward(self, x):
        x = functional.relu(self._layer1(x))
        x = functional.relu(self._layer2(x))
        x = functional.softmax(self._layer3(x))
        return x

net = ExampleNet(64, 8, 3)

我知道Pytork在训练网络时需要一系列大小为64 x 8 x 1的阵列。然而,由于我以非传统的方式应用1D卷积滤波器,我认为我应该有大小为64 x 1 x 8的输入数组,并且我希望输出大小为64 x 3。我使用以下小批量随机点在网络中运行:

# Generate a mini-batch of 64 samples
input = torch.randn(64, 1, 8)
out = net(input)
print(out.size())

我得到的结果告诉我我定义了一个错误的拓扑。您建议我如何定义所需的图层?在我的案例中,使用Conv1d是一种好方法吗?我看到另一种方法是使用遮罩层,但我不知道如何定义它


Tags: 方法inselfinputsize定义nntorch