pytorch:时间序列特征提取CNN,不同维度的batches

问题描述 投票:0回答:0

我正在使用 CNN 从不同长度的时间数据中提取特征。我正在使用 pad_sequence 批量填充数据,但每个批次仍将具有不同的时间维度。我目前正在通过在 FCN 层之前的 CNN 中使用自适应平均池化层来处理这个问题。但是我不确定这是否是正确的做法。代码是:

##pad tensors
def pad_collate(batch):
    sequences = [item[0] for item in batch]
    lengths = [len(seq) for seq in sequences]
    padded_sequences = pad_sequence(sequences, batch_first=True, padding_value=0)
    return padded_sequences, lengths

    

## Create dataloader
trainData = Sequence(root = path)
trainDataLoader = DataLoader(trainData, batch_size = BATCH_SIZE, collate_fn= pad_collate)

## CNN model
class FeatureExtractor(nn.Module):
    def __init__(self, block, layers):
        super(FeatureExtractor, self).__init__()
        self.inplanes = 6

        ## 1st CONV layers
        self.conv1 = nn.Conv2d(in_channels = 1, out_channels = 6, kernel_size = 3, stride = 2, padding = 4)
        self.bn1 = nn.BatchNorm2d(6)
        self.relu1 = nn.ReLU()
        self.maxpool1 = nn.MaxPool2d(kernel_size=3, stride = 2, padding = 1)
        ## residual blocks
        self.layer0 = self._make_layer(block, 12, layers[0], stride = 1)
        self.layer1 = self._make_layer(block, 24, layers[1], stride = 2)
        self.avgpool = nn.AdaptiveAvgPool2d((5,5)) ##### MY CURRENT SOLUTION #####
        self.fc = nn.Linear(600, 128)
        
    def _make_layer(self, block, planes, blocks, stride):
        downsample = None
        if stride != 1 or self.inplanes != planes:
            downsample  = nn.Sequential(nn.Conv2d(self.inplanes, planes, kernel_size=1, stride=stride),
                            nn.BatchNorm2d(planes))
        layers = []
        layers.append(block(self.inplanes, planes, stride, downsample))
        self.inplanes = planes
        for i in range(1, blocks):
            layers.append(block(self.inplanes, planes))

        return nn.Sequential(*layers)
    
    def forward(self, x):
        ## first conv
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu1(x)
        x = self.maxpool1(x)

        ## conv blocks
        x = self.layer0(x)
        x = self.layer1(x)

        ##FCN layer
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        output = self.fc(x)
        return output

也欢迎任何其他评论(我是自学成才的)

deep-learning pytorch conv-neural-network
© www.soinside.com 2019 - 2024. All rights reserved.