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

Python 在pytorch中定义一个连接不完整的网络,如卷积,python,neural-network,pytorch,convolution,Python,Neural Network,Pytorch,Convolution,我想训练一个小的神经网络,它以一个8维向量作为输入,并预测三种可能的类别之一。第一个隐藏层应该包含6个神经元,其中每个神经元在输入层中只接受3个连续维度的激活。第二个隐藏层还应包含6个节点并完全连接,最后一层应为输出层,具有3个神经元。因此,拓扑结构是: 假设一个小批量由64个(8维)数据点组成 我尝试使用1D卷积实现第一层。由于一维卷积滤波器假设输入是一系列点,因此我认为一个好方法是定义6个滤波器,在8个一维点上运行: import torch.nn as nn import torch.n

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

假设一个小批量由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
是一种好方法吗?我看到另一种方法是使用遮罩层,但我不知道如何定义它。

是否希望第一个隐藏层共享权重?如果是这样,请使用Conv1d。不,事实上,我不希望权重被共享,所以我认为在第一层定义6个独立的过滤器是一种方法。