PyTorch CNN 模型实现:代码详解及错误排查
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 模型实现,并解释了常见错误的解决方法。在实际应用中,需要根据具体的任务和数据特点进行调整。
原文地址: https://www.cveoy.top/t/topic/ddqG 著作权归作者所有。请勿转载和采集!