KanResNet 调制识别:一次关于公平对比的实验
KanResNet-Modulation-Recognition 是我参与设计和构建的一套无线信号调制识别实验。项目参考 isaaccorley/pytorch-modulation-recognition 的训练流程,并使用 IvanDrokin/torch-conv-kan 的 KAN 卷积实现。在这些基础上,我把数据、ResNet/KanResNet、训练、评估、预测和交互界面组织成可比较的完整仓库。
这个仓库要解决什么问题
调制识别需要根据 I/Q 信号判断调制方式。RadioML2016.10a 同时包含多种调制类别和不同信噪比,低 SNR 下有效特征容易被噪声淹没。
我想验证引入 KAN 卷积后的 KanResNet 在这项任务中会有什么表现,但只训练一个新模型无法说明问题。必须保留一个稳定 ResNet 基线,让两者使用相同数据与训练条件,再按信噪比查看结果。
因此这个仓库解决的不只是“实现 KanResNet”,还要建立一套公平、可复现并能回到具体样本的对比流程。
我采用的整体方案
torch_modulation_recognition/data.py 统一读取 RadioML2016.10a、整理 I/Q 张量和标签;models.py 定义 ResNet 与 KanResNet;fast_kan_conv.py 封装一维 FastKANConv 与 RBF 计算;metrics.py 放置训练评估指标。
仓库入口按阶段分开。train.py 负责两种模型训练并保存最终权重,evaluate.py 加载权重并按总体、类别和 SNR 评估,predict.py 提供单样本预测。app_select.py 和 app_mixed.py 使用 Gradio 浏览数据并比较预测结果。
数据处理、训练、评估和应用共用同一套模型定义,避免实验脚本与演示页面各自复制一份网络。两份权重和准确率随 SNR 变化图也保存在仓库中,便于直接复查输出。
整个实验结构和模块衔接有我的参与。参考代码提供了基础,我完成的是把它们放进同一个问题定义和比较框架中。
如何保证 ResNet 与 KanResNet 可比
我保留 ResNet 作为基线,并让两种模型尽量使用相同的数据拆分、预处理、批大小、训练轮次和评估代码。KanResNet 只在目标卷积位置引入 FastKANConv1D 与 RBF 表示,其余变量尽可能不动。
训练使用 PyTorch 与 Poutyne 组织,W&B 记录损失、准确率和运行配置。模型结构发生变化时,参数量和训练速度也可能明显不同,因此不能只保存最后一个准确率。
固定配置还有一个现实作用:某次结果变好时,我可以判断变化来自结构,而不是学习率、随机种子或数据拆分不小心改变。
为什么评估必须按 SNR 拆开
RadioML2016.10a 的难度随 SNR 变化很大。把所有样本混在一起算总准确率,会让高 SNR 样本掩盖低 SNR 下的问题。
evaluate.py 因此会按 SNR 计算准确率,并观察类别混淆。一个模型总分稍高,不代表它在真正困难的低信噪比区间更稳定;某个结构也可能只在部分调制类别上有效。
Gradio 页面让我可以从曲线回到 I/Q 样本,查看当前信号的调制类别、SNR 和两个模型的预测。实验指标出现差异时,不会只停留在一条折线,而是继续看模型在哪些信号上分歧。
截至这次提交的复盘
当前仓库已经包含统一数据入口、ResNet 与 KanResNet、训练和 W&B 记录、按 SNR 评估、单样本预测及 Gradio 界面,形成了一条完整实验路径。
我暂时不会把结果概括成“KanResNet 一定更好”。要得到更稳的判断,还需要多个随机种子、重复实验、参数量和耗时对比,并报告各 SNR 区间的波动。
这次项目让我区分了模型实现和实验设计。把新网络写出来只是起点,基线、变量控制、记录和分组评估才决定对比有没有意义。这也是我在这次构建中最想保留的部分。




