我正在尝试构建一个用于时间序列的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轴是电压/振幅
回答:
尝试
def forward(self, x): x = x.view(1, 500, -1) ...net = Simple1DCNN4()input_try = np.random.uniform(-10, 10, 5000)
通过这种方式,第一个Conv1d
的输入将拥有500个通道。