PyTorch-实现对表格类型数据的一维卷积(CNN1D)

数据集:首先看一下我自己的表格类型的数据

看到大家都私信要代码,太多了发不过来,我把代码放到github上了:

github链接: https://github.com/JiaBinBin233/CNN1D
我的数据集是一个二分类的数据集,是一个12维的数据(第一列为标签列,其他的11列是属性列)
在这里插入图片描述

神经网络架构

#两层卷积层,后面接一个全连接层
class Learn(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.model1 = nn.Sequential(
        	#输入通道一定为1,输出通道为卷积核的个数,2为卷积核的大小(实际为一个[1,2]大小的卷积核)
            nn.Conv1d(1, 16, 2),  
            nn.Sigmoid(),
            nn.MaxPool1d(2),  # 输出大小:torch.Size([128, 16, 5])
            nn.Conv1d(16, 32, 2),
            nn.Sigmoid(),
            nn.MaxPool1d(4),  # 输出大小:torch.Size([128, 32, 1])
            nn.Flatten(),  # 输出大小:torch.Size([128, 32])
        )
        self.model2 = nn.Sequential(
            nn.Linear(in_features=32, out_features=2, bias=True),
            nn.Sigmoid(),
        )
    def forward(self, input):
        x = self.model1(input)
        x = self.model2(x)
        return x

我个人认为输入的数据是什么格式的是一个难点

首先看一下没有经过处理过的数据

for data in train_loader:
    X_data, Y_data = data[0], data[1]
    print(X_data)
    print(X_data.shape)
输出结果如下

在这里插入图片描述
原始数据是一个128行11列的数据,每一行数据代表一个样本,一共有128个样本(batch_size=128)

对数据进行处理,处理成可以输入到卷积网络的数据形式

X_data = X_data.reshape(-1,1,11) # -1表示让系统自己计算有多少个样本,这个操作的目的就是把数据转换为3维的
print(X_data)
print(X_data.shape)
输出结果如下

在这里插入图片描述

运行

output = Learn(X_data)
loss = loss_function(output, Y_data)
optim.zero_grad()
loss.backward()
optim.step()

原理

一维卷积的流程是卷积核对每一条样本进行横向卷积(卷积核的个数为输出通道的大小),对每条样本卷积的次数为卷积核的个数。每条样本被卷积具体的卷积流程我在别人的博客截了个图方便大家理解

在这里插入图片描述

这个图就是卷积核对一个样本进行卷积的具体操作

### 使用 PyTorchCNN 对轴承故障的一维信号进行分类 #### 数据预处理 为了有效地使用卷积神经网络(CNN)对一维信号进行分类,数据预处理是一个至关重要的环节。通常情况下,原始采集到的时间序列数据可能含有噪声或是不同长度的数据片段,这不利于后续的模型训练工作。 针对这种情况,可以采取如下措施: - **标准化/归一化**:确保输入数据具有相同的尺度范围有助于加快收敛速度并提升性能。常用的方法有最小最大缩放(min-max scaling),即将所有数值调整至0~1之间;还有Z-score标准化,使数据均值为零标准差为一时常用于正态分布假设下的场景[^2]。 - **分段与填充**:当遇到不定长时间序列时,可以通过截断超出部分以及补全不足之处的方式统一样本尺寸。具体做法取决于应用背景和个人偏好,比如采用前向填充(forward fill)、后向填充(backward fill)或者是简单的重复最后一个已知观测值等策略来填补缺失位置上的空白[^3]。 - **增强技术**:适当引入随机扰动作为扩充手段能够增加训练集多样性从而改善最终效果。例如,轻微平移(shifts)、翻转(flips)或加性高斯白噪(additive Gaussian noise)[^4]。 ```python import torch from torchvision import transforms transform = transforms.Compose([ transforms.ToTensor(), # 转换为张量形式 transforms.Normalize(mean=[.5], std=[.5]) # 归一化处理 ]) ``` #### 模型构建 定义适合于解决特定任务需求架构的设计至关重要。考虑到目标是一维信号分类问题,则应优先考虑那些专门为此类输入设计过的组件。下面给出一个简单而有效的CNN框架实例说明: - 输入层接收形状为(batch_size, channels=1, length=N) 的张量; - 卷积层(Conv1D): 应用多个滤波器提取局部模式特征; - 批规范化(BatchNorm1d): 加速训练过程稳定梯度传播; - 非线性激活函数(ReLU): 增强表达能力打破线性关系局限; - 最大池化(MaxPool1d): 下采样减少计算复杂度保持重要信息不变; - 全连接层(Linear): 将多通道二维矩阵展成单列向量映射到类别空间内完成预测输出。 ```python class CNNet(torch.nn.Module): def __init__(self): super().__init__() self.conv_layers = torch.nn.Sequential( torch.nn.Conv1d(in_channels=1, out_channels=64, kernel_size=7), torch.nn.BatchNorm1d(num_features=64), torch.nn.ReLU(), torch.nn.MaxPool1d(kernel_size=2), torch.nn.Conv1d(in_channels=64, out_channels=128, kernel_size=5), torch.nn.BatchNorm1d(num_features=128), torch.nn.ReLU(), torch.nn.MaxPool1d(kernel_size=2) ) self.fc_layer = torch.nn.Linear(in_features=..., out_features=num_classes) def forward(self, x): batch_size = x.size()[0] conv_out = self.conv_layers(x).view(batch_size,-1) fc_output = self.fc_layer(conv_out) return fc_output ``` 注意上述代码中的`in_features`参数需依据实际情况设定,即由前面各层运算后的总维度决定。 #### 训练最佳实践 在准备好了高质量的数据集并且精心挑选了一个合理的网络之后,接下来就是配置好一系列辅助工具以保障整个流程顺利开展下去了。 - **选择合适的优化算法**:Adam因其自适应学习率机制而在众多候选者之中脱颖而出成为首选项之一[^1]。 - **设置恰当的学习速率**:初始阶段可设较高水平以便快速探索解空间随后逐渐降低直至找到全局最优解附近再精细微调。 - **运用早停法(Early Stopping)**:监控验证集表现一旦发现连续若干轮次无明显进步立即终止迭代防止过拟合现象发生同时节省资源消耗。 - **实施K折交叉验证(K-fold Cross Validation)**:将全部可用资料划分为k份轮流充当测试子集其余则合并构成临时训练集合以此方式多次循环获取更稳健可靠的评价指标平均值而非依赖单一划分方案所得结果容易受到偶然因素干扰不够客观全面.
评论 73
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值