CNN1D-一维卷积神经网络
CNN1D-一维卷积神经网络 模块在当前项目中的真实实现,并非简单的“单层一维卷积分类器”,而是一个面向时序数据的 TCN 风格一维因果膨胀卷积残差网络。在此基础上,系统还支持附加 lstm、gru、bilstm 或 none 四种输出头,并可选择加入多头自注意力模块。因此,该…
CNN1D-一维卷积神经网络
1. 方法概述
CNN1D-一维卷积神经网络 模块在当前项目中的真实实现,并非简单的“单层一维卷积分类器”,而是一个面向时序数据的 TCN 风格一维因果膨胀卷积残差网络。在此基础上,系统还支持附加 lstm、gru、bilstm 或 none 四种输出头,并可选择加入多头自注意力模块。因此,该模块更准确地说是“1D 因果卷积/TCN 主干 + 可选 RNN/Attention 头的 sequence-to-one 时序建模器”。
设按时间顺序排列的样本为
$$ \mathcal{D}=\{(x_t,y_t)\}_{t=1}^{N},\quad x_t\in\mathbb{R}^{d},\ y_t\in\mathcal{Y} \tag{1} $$
其中 \(x_t\) 表示第 \(t\) 个时间步的特征向量,\(y_t\) 表示目标变量。回归任务中 \(\mathcal{Y}\subseteq\mathbb{R}\),分类任务中 \(\mathcal{Y}\) 为有限类别集合。
2. 数据窗口构造与时间切分
2.1 数值校验与目标编码
程序要求所有特征列均可转换为数值;若存在非数值、空值或无穷值,将直接报错。对分类任务,目标列允许为字符串标签,并会被映射为整数类别:
$$ \phi:\mathcal{Y}\to \{0,1,\ldots,C-1\} \tag{2} $$
其中 \(C\) 为类别数,且代码要求 \(C\ge 2\)。
2.2 滑动窗口样本
设窗口长度为 \(L\),预测步长为 \(H\)。对任意起点 \(s\),输入窗口定义为
$$ \mathbf{X}_s= \begin{bmatrix} x_s\\ x_{s+1}\\ \vdots\\ x_{s+L-1} \end{bmatrix} \in\mathbb{R}^{L\times d} \tag{3} $$
对应监督目标取为
$$ z_s=y_{s+L+H-1} \tag{4} $$
因此,sequence-to-one 监督样本总数为
$$ M=N-L-H+1 \tag{5} $$
代码要求 \(L\ge 2\)、\(H\ge 1\),并且 \(M>0\);若 \(M\le 0\),则说明原始样本量不足以构造时序窗口。
2.3 按时间顺序切分训练集、验证集与测试集
设训练、验证、测试比例分别为 \(r_{\text{tr}},r_{\text{va}},r_{\text{te}}\),并满足
$$ r_{\text{tr}}+r_{\text{va}}+r_{\text{te}}=1 \tag{6} $$
对应样本数近似为
$$ M_{\text{tr}}\approx Mr_{\text{tr}},\qquad M_{\text{va}}\approx Mr_{\text{va}},\qquad M_{\text{te}}=M-M_{\text{tr}}-M_{\text{va}} \tag{7} $$
程序采用按时间顺序切分而非随机打乱,因此训练集位于前段、验证集位于中段、测试集位于后段,从而避免未来信息泄漏。
2.4 标准化
若勾选 standardize,系统使用训练集统计量对窗口特征做标准化。对第 \(j\) 个特征,有
$$ \tilde x_{t,j}=\frac{x_{t,j}-\mu_j}{\sigma_j} \tag{8} $$
其中 \(\mu_j\) 与 \(\sigma_j\) 由训练集窗口在全部时间步上的展开样本估计得到。回归任务中,目标值也会按训练集统计量标准化:
$$ \tilde y_t=\frac{y_t-\mu_y}{\sigma_y} \tag{9} $$
最终在回归评价阶段,预测值会逆变换回原始量纲后再计算误差指标。
3. TCN 风格一维卷积主干
3.1 因果膨胀卷积
第 \(l\) 个残差块使用膨胀率 \(d_l=2^{l-1}\) 的因果卷积。对输出通道 \(c\),其卷积结果可表示为
$$ h_{t,c}^{(l)}=\sum_{u=0}^{K-1}\sum_{m=1}^{C_{l-1}} w_{u,m,c}^{(l)}\,x_{t-u d_l,m}^{(l-1)}+b_c^{(l)} \tag{10} $$
其中 \(K\) 为卷积核大小,\(C_{l-1}\) 为上一层通道数。由于采用因果卷积,当前时刻输出仅依赖当前及过去的信息。
3.2 残差块结构
每个残差块由两层因果卷积、层归一化、Dropout 与残差连接组成,可抽象表示为
$$ \mathcal{F}^{(l)}(x)=\mathrm{Dropout}\Big(\mathrm{ReLU}\big(\mathrm{LN}(\mathrm{Conv}_2(\mathrm{Dropout}(\mathrm{LN}(\mathrm{Conv}_1(x)))))\big)\Big) \tag{11} $$
块输出为
$$ x^{(l)}=\mathcal{F}^{(l)}(x^{(l-1)})+\mathcal{R}^{(l)}(x^{(l-1)}) \tag{12} $$
其中 \(\mathcal{R}^{(l)}\) 为恒等映射或 \(1\times 1\) 卷积投影,用于在输入输出通道数不一致时对维度进行匹配。
3.3 多层膨胀卷积堆叠
若共有 \(B\) 个残差块,则主干输出可写为
$$ H^{(B)}=\mathcal{T}_B\circ \mathcal{T}_{B-1}\circ\cdots\circ \mathcal{T}_1(\mathbf{X}_s) \tag{13} $$
其中 \(\mathcal{T}_l\) 表示第 \(l\) 个残差块。随着膨胀率呈指数增长,网络感受野会快速扩大,从而同时捕捉短期局部模式与较长时间依赖。
4. 可选 RNN / Attention 头部
4.1 无 RNN 头部
当 head_type=none 时,程序对 TCN 输出做自适应平均池化,得到全局表示
$$ g_s=\frac{1}{T}\sum_{t=1}^{T} h_t^{(B)} \tag{14} $$
随后直接连接线性层输出预测结果。
4.2 LSTM / GRU / BiLSTM 头部
当 head_type 为 lstm、gru 或 bilstm 时,TCN 输出转为时间主序列后送入循环单元。以 LSTM 为例,其门控更新为
$$ \begin{aligned} i_t&=\sigma(W_i h_t^{(B)}+U_i s_{t-1}+b_i)\\ f_t&=\sigma(W_f h_t^{(B)}+U_f s_{t-1}+b_f)\\ \tilde c_t&=\tanh(W_c h_t^{(B)}+U_c s_{t-1}+b_c)\\ o_t&=\sigma(W_o h_t^{(B)}+U_o s_{t-1}+b_o)\\ c_t&=f_t\odot c_{t-1}+i_t\odot \tilde c_t\\ s_t&=o_t\odot \tanh(c_t) \end{aligned} \tag{15} $$
若选择 bilstm,则使用双向版本,并将正反向隐藏状态拼接后作为后续表示。
4.3 多头自注意力
若启用 attention=True,系统会先将 RNN 输出投影到注意力嵌入空间,再执行多头自注意力:
$$ Q=HW_Q,\qquad K=HW_K,\qquad V=HW_V \tag{16} $$
单头注意力为
$$ \mathrm{Attn}(Q,K,V)=\mathrm{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V \tag{17} $$
多头输出拼接后得到新的时序表示,最终取最后一个时间步的注意力输出作为预测头输入。
5. 输出层与优化目标
5.1 回归模式
回归任务的最终预测可表示为
$$ \hat z_s=w^\top r_s+b \tag{18} $$
其中 \(r_s\) 表示池化输出、RNN 最后时刻输出或注意力后最后时刻输出。训练损失采用均方误差:
$$ \mathcal{L}_{\mathrm{reg}}=\frac{1}{M_{\text{tr}}}\sum_{s=1}^{M_{\text{tr}}}(z_s-\hat z_s)^2 \tag{19} $$
5.2 分类模式
分类任务直接输出 logits。对 \(C\) 类问题,有
$$ \hat p_{s,c}=\frac{\exp(o_{s,c})}{\sum_{k=1}^{C}\exp(o_{s,k})} \tag{20} $$
训练时采用交叉熵损失:
$$ \mathcal{L}_{\mathrm{cls}}=-\frac{1}{M_{\text{tr}}}\sum_{s=1}^{M_{\text{tr}}}\sum_{c=1}^{C}\mathbf{1}(z_s=c)\ln \hat p_{s,c} \tag{21} $$
系统使用 Adam 优化器,并以验证集 val_loss 作为早停依据;若连续 patience 个 epoch 未改善,则提前终止训练并恢复最佳参数。
6. 评价指标与输出结果解释
6.1 回归指标
回归任务输出 mse、mae、rmse 与 r2,其定义分别为
$$ \mathrm{MSE}=\frac{1}{M_{\text{te}}}\sum_{s=1}^{M_{\text{te}}}(y_s-\hat y_s)^2 \tag{22} $$
$$ \mathrm{MAE}=\frac{1}{M_{\text{te}}}\sum_{s=1}^{M_{\text{te}}}|y_s-\hat y_s| \tag{23} $$
$$ \mathrm{RMSE}=\sqrt{\mathrm{MSE}} \tag{24} $$
$$ R^2=1-\frac{\sum_{s=1}^{M_{\text{te}}}(y_s-\hat y_s)^2}{\sum_{s=1}^{M_{\text{te}}}(y_s-\bar y)^2} \tag{25} $$
6.2 分类指标
分类任务在当前实现中仅输出 accuracy,其定义为
$$ \mathrm{Accuracy}=\frac{1}{M_{\text{te}}}\sum_{s=1}^{M_{\text{te}}}\mathbf{1}(\hat y_s=y_s) \tag{26} $$
需要注意,虽然有些说明文本提到可扩展分类指标,但当前代码实际导出的分类指标只有准确率。
6.3 输出结果说明
程序最终导出的 Excel 工作表包括:
Parameters:参数配置;Data_Windowing:滑窗构造元数据;Split:训练/验证/测试样本量;Metrics:最终评价指标;Training_Log:逐 epoch 训练损失与验证损失;Predictions:测试集真实值与预测值;Charts:图表路径索引。
此外,还会生成:
loss_curve.png:训练损失曲线;pred_vs_true.png:预测值与真实值对比图。
7. 算法流程
按照当前项目实现,CNN1D-一维卷积神经网络 的计算流程可归纳为:
- 读取 Excel/CSV 数据,并选择目标列与特征列;
- 检查所有特征列的数值有效性,分类目标则编码为整数标签;
- 按
seq_len与horizon构造 sequence-to-one 时序窗口; - 按时间顺序切分训练集、验证集与测试集;
- 使用训练集统计量对窗口特征做标准化;回归任务时可同步标准化目标;
- 构建 TCN 风格因果膨胀卷积残差网络,并按配置接入
none / lstm / gru / bilstm头部及可选注意力模块; - 使用 Adam 优化器训练网络,并基于验证损失执行早停;
- 在测试集上输出回归或分类指标,并导出预测结果与训练日志;
- 自动保存 Excel 文件和图表文件。
8. 关键参数说明
表 1 关键参数及含义
| 参数 | 含义 | 当前默认值 |
|---|---|---|
seq_len |
输入窗口长度 | 32 |
horizon |
预测步长 | 1 |
train_ratio |
训练集比例 | 0.70 |
val_ratio |
验证集比例 | 0.15 |
test_ratio |
测试集比例 | 自动补足为 0.15 |
standardize |
是否标准化特征;回归时也标准化目标 | True |
num_filters |
每个残差块输出通道数 | 32 |
kernel_size |
卷积核大小 | 3 |
num_blocks |
TCN 残差块数量 | 3 |
dropout |
Dropout 比例 | 0.2 |
head_type |
输出头类型 | lstm |
rnn_hidden |
RNN 隐藏维度 | 32 |
attention |
是否启用多头自注意力 | False |
attn_heads |
注意力头数 | 2 |
attn_head_dim |
每头维度 | 16 |
epochs |
训练轮数 | 50 |
batch_size |
批大小 | 64 |
lr |
学习率 | \(10^{-3}\) |
patience |
早停耐心轮数 | 10 |
device |
训练设备 | auto |
seed |
随机种子 | 42 |
9. 论文写作模板
9.1 方法描述模板
可在论文“方法部分”中表述为:
“本文采用基于一维因果膨胀卷积的时序深度学习模型进行预测。首先,将原始时序数据按滑动窗口方式构造为 sequence-to-one 监督样本,并按时间顺序划分训练集、验证集与测试集;其次,使用 TCN 风格残差块提取多尺度局部时间模式,通过指数增长的膨胀率扩大模型感受野;随后,根据任务需要在卷积主干后接入 LSTM/GRU/BiLSTM 或直接使用池化输出,并可进一步叠加多头自注意力以增强全局依赖建模能力;最后,采用 Adam 优化器最小化回归均方误差或分类交叉熵损失,并在测试集上计算预测性能指标。”
9.2 结果解释模板
结果部分可写为:一维卷积模型能够有效提取多尺度局部时序特征,若叠加 RNN 或注意力头部后指标进一步提升,则说明额外的全局依赖建模对预测性能具有正向作用。正文中可结合验证集与测试集表现讨论不同头部结构的增益。
9.3 表格标题模板
表题可写为:一维卷积时序模型预测结果与性能指标汇总表。
9.4 图表题注模板
图注可写为:一维卷积时序模型真实值与预测值对比曲线。
9.5 表格示例
建议列名:模型变体、真实值、预测值、残差、RMSE、MAE、\(R^2\) 或分类评价指标。
10. 实现说明与注意事项
- 该模块适用于每行代表一个时间步、且样本顺序已经按时间排列好的时序数据。
- 模块名称虽然是
CNN1D,但当前实现本质上是 TCN/因果膨胀卷积残差网络,并非简单的普通一维卷积分类器;论文中应按真实结构描述。 - 当前分类任务实际只导出
accuracy,并未在最终结果中输出 F1、召回率或精确率,因此论文若需这些指标,需要额外补算。 - 若环境中未安装
torch,训练代码会退化为基于sklearn的MLPClassifier/MLPRegressor后备实现;因此正式实验前需确认运行环境确实使用了 PyTorch 主后端。 raw_data在内存结果字典中仅保留原表形状和列名摘要,Excel 导出也主要保存窗口元数据、切分信息与预测结果,而不是整张原始数据表。- 真实导出逻辑不在单一 calculator 中,而是分布在
core/cnn1d_runner.py、utils/excel_handler.py与ui/results_widget.py。其中utils/excel_handler.py负责创建 xlsx、保存图表并返回输出路径,是论文中描述程序导出流程时必须对应到的真实代码位置。 - 实际
results/目录通常会生成APP_NAME分析结果_<timestamp>类型的结果文件夹,xlsx 文件名模式为CNN1D_results_<timestamp>.xlsx。结果页同时会生成repro_<safe_app>_<timestamp>.py与同级repro_inputs/,脚本内部引用的也是repro_inputs/...相对路径。 - 当前实现实际导出的工作表包括
Parameters、Data_Windowing、Split、Metrics、Training_Log、Predictions、Charts。这说明该模块更偏工程化导出命名,而不是中文结果表命名,论文表述时最好同时保留英文 sheet 名。 - 当前图表文件固定由
utils/excel_handler.py保存为loss_curve.png与pred_vs_true.png,并把文件路径写入Charts工作表。若论文中要说明“图表来源于程序自动输出”,这两个文件名应被明确写出。 - 从 repro 链路看,程序允许把上传输入复制进
results/下的repro_inputs/再执行复现,这一点说明该模块已经具备相对完整的“结果可追溯”能力,适合在论文附录中提供一键重跑脚本。
11. 论文写作建议
论文中建议把该模块准确写成“TCN 风格的一维时序卷积残差网络”,不要只写成普通 CNN1D。结果部分应至少展示模型参数、测试集指标和预测对比图;若是分类任务,建议自行补充 F1 等指标后再写入正文,以免只用 Accuracy 导致评价单薄。
12. 单篇终审补充
12.1 图题与表题对齐建议
Parameters表可写为:表X CNN1D 参数设置与网络配置。Data_Windowing表可写为:表X CNN1D 滑窗构造信息。Split表可写为:表X CNN1D 数据集切分信息。Metrics表可写为:表X CNN1D 测试集性能指标汇总。Training_Log表可写为:表X CNN1D 训练过程日志。Predictions表可写为:表X CNN1D 测试集预测结果明细。Charts表可写为:表X CNN1D 图表索引与文件路径。loss_curve.png建议写为:图X CNN1D 训练损失曲线。pred_vs_true.png建议写为:图X CNN1D 真实值与预测值对比图。
12.2 终审说明
- 当前模块名是
CNN1D,但真实主结构是 TCN 风格的一维因果膨胀卷积残差网络;论文中不宜把它描述成普通单层一维卷积分类器。 - 该实现也存在无
torch时的 sklearnMLP*后备分支。若实验运行在 fallback 路径,正文不能继续宣称采用了卷积残差网络。 - 当前导出图只有
loss_curve.png和pred_vs_true.png,没有额外的残差图或混淆矩阵图,因此论文图题不要超写。 - 当前分类任务最终导出指标偏简,只稳定给出
accuracy。若论文想比较更完整的分类性能,应额外补算 F1、precision、recall 后再写入正文。
12.3 全量强化补充
本次全量强化绑定的真实结果目录优先选用 具体的算法3/深度学习与时序网络/CNN1D-一维卷积神经网络/results/window2_cnn1d_baseline_test_cnn1d_baseline_fixed_inpu0。其中较新的主结果工作簿可直接绑定为 CNN1D_results_20260329_170808.xlsx,实际工作表为 Parameters、Data_Windowing、Split、Metrics、Training_Log、Predictions、Charts。
这个目录同时累积了大量多时间戳工作簿与对应 repro_CNN1D-一维卷积神经网络_*.py 文件,因此它本质上是 baseline 连续复算目录,而不是单次静态实验目录。本次文档应固定最后一轮 170808 作为主引用对象,其余时间戳结果视作同目录下的历史运行与再生产物。
复现脚本的真实口径为 INPUT_FILE = 'repro_inputs/cnn1d_window2_sample.csv',并在训练参数中明确给出 epochs = 2、seed = 42,最终通过 save_results(results, output_dir=str(out_dir)) 输出结果。这说明 CNN1D 当前绑定的是“相对路径 repro_inputs + 时序样本复现”链路,而不是 benchmark 问题链路。论文正文若说明复现,应把 repro_inputs/cnn1d_window2_sample.csv 作为输入副本口径写清。
13. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/深度学习与时序网络/CNN1D-一维卷积神经网络/results/window2_cnn1d_baseline_test_cnn1d_baseline_fixed_inpu0。 - 正文应围绕
Parameters、Data_Windowing、Split、Metrics、Training_Log、Predictions、Charts来写。 - 图证应对应
loss_curve.png与pred_vs_true.png,并把主结果和历史 repro 结果池区分开。 - 复现脚本应按
repro_CNN1D-一维卷积神经网络_*.py + repro_inputs/cnn1d_window2_sample.csv的口径说明。