1D CNN第一层的理想输入大小

我正在尝试构建一个用于时间序列的1D CNN。输入长度为500,仅有2个标签。目前我构建的架构如下:有3个卷积层,每个卷积层后面跟随一个激活层。第一个卷积层接收50个通道作为输入。

import torchimport torch.nn as nnimport numpy as npimport randomclass Simple1DCNN3(torch.nn.Module):    def __init__(self):        super(Simple1DCNN5, self).__init__()        self.sequence = nn.Sequential(            torch.nn.Conv1d(in_channels=50,                                           out_channels=64,                                           kernel_size=5,                                           stride=2),            torch.nn.ReLU(),            torch.nn.Conv1d(in_channels=64,                                           out_channels=128,                                           kernel_size=3),            torch.nn.ReLU(),            torch.nn.Conv1d(in_channels=128,                                           out_channels=256,                                           kernel_size=1),            torch.nn.ReLU(),        )        self.fc1 = nn.Linear(256, 2)            def forward(self, x):        x = x.view(1, 50,-1)                for layer in self.sequence:            x = layer(x)            print(x.size())        x = x.view(1,-1)        #print(x.size())        x = self.fc1(x)        #print(x.size())        return xnet = Simple1DCNN3()input_try = np.random.uniform(-10, 10, 500)input_try = torch.from_numpy(input_try).float()net(input_try)print("input successfull passed to net")input_try_modif = input_try.view(1, 50,-1)print(input_try.shape)print(input_try_modif.shape)

据我所知,这迫使我将输入分割成10个50个时间点的段。我理解得对吗?难道不是将第一层构造为有500个通道作为输入并使用滑动窗口内核会更明智吗?我在另一个脚本中尝试了这种方法,但得到了以下错误消息

import torchimport torch.nn as nnimport numpy as npimport randomclass Simple1DCNN4(torch.nn.Module):    def __init__(self):        super(Simple1DCNN5, self).__init__()        self.sequence = nn.Sequential(            torch.nn.Conv1d(in_channels=500,                                           out_channels=64,                                           kernel_size=5,                                           stride=2),            torch.nn.ReLU(),            torch.nn.Conv1d(in_channels=64,                                           out_channels=128,                                           kernel_size=3),            torch.nn.ReLU(),            torch.nn.Conv1d(in_channels=128,                                           out_channels=256,                                           kernel_size=1),            torch.nn.ReLU(),        )        self.fc1 = nn.Linear(256, 2)            def forward(self, x):        x = x.view(1, 50,-1)                for layer in self.sequence:            x = layer(x)            print(x.size())        x = x.view(1,-1)        #print(x.size())        x = self.fc1(x)        #print(x.size())        return xnet = Simple1DCNN4()input_try = np.random.uniform(-10, 10, 500)input_try = torch.from_numpy(input_try).float()net(input_try)print("input successfull passed to net")input_try_modif = input_try.view(1, 50,-1)print(input_try.shape)print(input_try_modif.shape)

错误消息:

RuntimeError: Given groups=1, weight of size [64, 500, 5], expected input[1, 50, 10] to have 500 channels, but got 50 channels instead

编辑

感谢@ghchoi的回答,这是工作内核的代码。为此,我还不得不将所有卷积层的内核大小改为1。

class Simple1DCNN5(torch.nn.Module):    def __init__(self):        super(Simple1DCNN5, self).__init__()        self.sequence = nn.Sequential(            torch.nn.Conv1d(in_channels=500,                                           out_channels=64,                                           kernel_size=1,                                           stride=2),            torch.nn.ReLU(),            torch.nn.Conv1d(in_channels=64,                                           out_channels=128,                                           kernel_size=1),            torch.nn.ReLU(),            torch.nn.Conv1d(in_channels=128,                                           out_channels=256,                                           kernel_size=1),            torch.nn.ReLU(),        )        self.fc1 = nn.Linear(256, 2)            def forward(self, x):        x = x.view(1, 500,-1)                for layer in self.sequence:            x = layer(x)            #print(x.size())        x = x.view(1,-1)        #print(x.size())        x = self.fc1(x)        #print(x.size())        return x

我拥有的数据类型是2秒的单导联ECG(心电图)信号。这是心脏电信号的记录。以下是样本可能的外观(在2D图上绘制),其中x轴是时间,y轴是电压/振幅

enter image description here


回答:

尝试

    def forward(self, x):        x = x.view(1, 500, -1)         ...net = Simple1DCNN4()input_try = np.random.uniform(-10, 10, 5000)

通过这种方式,第一个Conv1d的输入将拥有500个通道。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注