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
# 解决方法:
# 1. 检查输入张量的形状,确保通道数为1。
# 2. 如果输入数据实际上只有一个通道,使用torch.unsqueeze()函数添加一个维度,将形状从[100, 10000, 12]调整为[100, 1, 10000, 12]

该代码示例定义了一个包含8个卷积层和一个全连接层的CNN模型,并使用Mish激活函数。代码还包含了解决输入形状不匹配错误的步骤。

输入形状不匹配错误:

如果遇到RuntimeError: Given groups=1, weight of size [5, 1, 12], expected input[100, 10000, 12] to have 1 channels, but got 10000 channels instead 错误,表示输入张量的通道数与卷积层期望的通道数不匹配。

解决方法:

  1. 检查输入张量的形状,确保通道数为1。
  2. 如果输入数据实际上只有一个通道,使用torch.unsqueeze()函数添加一个维度,将形状从[100, 10000, 12]调整为[100, 1, 10000, 12]。

代码说明:

  • nn.Conv1d:一维卷积层
  • nn.Mish:Mish激活函数
  • nn.AvgPool1d:一维平均池化层
  • nn.AdaptiveAvgPool1d:自适应平均池化层
  • nn.Linear:全连接层
  • nn.Softmax:Softmax函数
  • nn.CrossEntropyLoss:交叉熵损失函数

代码示例:

import torch
import torch.nn as nn

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # ... (模型定义)

    def forward(self, x):
        # ... (前向传播)

# 输入数据
input_data = torch.randn(100, 10000, 12)

# 将输入数据调整为正确的形状
input_data = torch.unsqueeze(input_data, dim=1)

# 创建模型实例
model = CNN()

# 前向传播
feature, output = model(input_data)

# 打印输出
print(feature.shape)
print(output.shape)
PyTorch CNN模型构建与运行:使用Mish激活函数

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

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