PyTorch CNN 模型实现:代码详解及错误排查

本示例展示了如何使用 PyTorch 构建一个简单的 CNN 模型,并详细解释了代码中的每个部分。此外,还分析了常见的错误,例如 RuntimeError: Given groups=1, weight of size [5, 1, 12], expected input[100, 10000, 12] to have 1 channels, but got 10000 channels instead。

import torch
import torch.nn as nn

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Sequential(
            nn.Conv1d(1, 5, kernel_size=12, stride=1, padding=1),
            nn.Mish()
        )
        self.conv2 = nn.Sequential(
            nn.Conv1d(5, 10, kernel_size=12, stride=1, padding=1),
            nn.Mish()
        )
        self.conv3 = nn.Sequential(
            nn.Conv1d(10, 15, kernel_size=12, stride=1, padding=1),
            nn.Mish()
        )
        self.conv4 = nn.Sequential(
            nn.Conv1d(15, 20, kernel_size=12, stride=1, padding=1),
            nn.Mish()
        )
        self.conv5 = nn.Sequential(
            nn.Conv1d(20, 25, kernel_size=12, stride=1, padding=1),
            nn.Mish()
        )
        self.conv6 = nn.Sequential(
            nn.Conv1d(25, 30, kernel_size=12, stride=1, padding=1),
            nn.Mish()
        )
        self.conv7 = nn.Sequential(
            nn.Conv1d(30, 35, kernel_size=12, stride=1, padding=1),
            nn.Mish()
        )
        self.conv8 = nn.Sequential(
            nn.Conv1d(35, 40, kernel_size=12, stride=1, padding=1),
            nn.Mish()
        )
        self.avgpool = nn.AvgPool1d(kernel_size=2, stride=1)
        self.global_avgpool = nn.AdaptiveAvgPool1d(1)
        self.fc = nn.Linear(40, 6)
        self.softmax = nn.Softmax(dim=1)
        self.loss_fn = nn.CrossEntropyLoss()

    def forward(self, x):
        x = torch.squeeze(x,dim=1)
        x = self.conv1(x)
        x = self.avgpool(x)
        x = self.conv2(x)
        x = self.avgpool(x)
        x = self.conv3(x)
        x = self.avgpool(x)
        x = self.conv4(x)
        x = self.avgpool(x)
        x = self.conv5(x)
        x = self.avgpool(x)
        x = self.conv6(x)
        x = self.avgpool(x)
        x = self.conv7(x)
        x = self.avgpool(x)
        x = self.conv8(x)
        x = self.global_avgpool(x)
        x = x.view(x.size(0), -1)
        feature = x
        x = self.fc(x)
        output = self.softmax(x)
        return feature, output

# 输入reshape
# 报错为RuntimeError: Given groups=1, weight of size [5, 1, 12], expected input[100, 10000, 12] to have 1 channels, but got 10000 channels instead

### 错误分析

**RuntimeError: Given groups=1, weight of size [5, 1, 12], expected input[100, 10000, 12] to have 1 channels, but got 10000 channels instead**

错误信息表明,在第一个卷积层中,权重张量的形状为 [5, 1, 12],其中 [5, 1, 12] 表示权重张量的形状:

* 5:滤波器的数量
* 1:输入通道数
* 12:卷积核大小

错误信息还指出,输入张量的形状为 [100, 10000, 12],其中 10000 代表输入通道数,而模型预期输入通道数为 1。

### 错误原因

该错误通常是由于输入数据维度不匹配导致的。在该模型中,第一个卷积层期望输入数据的通道数为 1,而实际输入数据的通道数为 10000。

### 解决方法

为了解决此错误,需要确保输入数据的形状与模型的预期一致。

* 确保输入数据形状为 [batch_size, 1, sequence_length],其中 batch_size 为批次大小,sequence_length 为输入序列长度。

例如,可以通过 `torch.squeeze(x,dim=1)` 将输入数据压缩到期望的形状。

```python
    def forward(self, x):
        x = torch.squeeze(x,dim=1)
        # ...

总结

本示例展示了一个简单的 CNN 模型实现,并解释了常见错误的解决方法。在实际应用中,需要根据具体的任务和数据特点进行调整。

PyTorch CNN 模型实现:代码详解及错误排查

原文地址: https://www.cveoy.top/t/topic/ddqG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录