简介:一套开箱即用的MIMO通信信号识别工具包,基于DetNet网络结构实现,支持PyTorch或TensorFlow框架(具体依赖见settings.py)。内含预训练权重文件DetNetmodel.cpkt(含.meta、.index、.data三部分),以及多轮训练保存的检查点model_save_10/20/30,方便继续训练或对比实验。提供完整的训练脚本DetNet_train.py、测试脚本DetNet_test.py和验证脚本code_test.py,配合settings.py可快速配置数据路径、超参数和GPU/CPU设备选项。TensorBoard日志文件events.out.tfevents已打包,便于可视化训练过程中的损失、准确率等指标变化。整个项目结构为DeepMIMODetection-master,支持直接加载预训练模型进行信号检测推理,也兼容用户自定义MIMO信号数据集的重新训练。.gitignore和__pycache__目录为标准开发缓存,不影响实际运行。
1. 这不是“拿来就能跑”的模型包,而是一套需要你亲手调校的MIMO信号识别工作台
我第一次拿到这个叫 DeepMIMODetection-master 的压缩包时,心里是有点打鼓的——它不像某些工业级SDK那样点开就出结果,目录里堆着十几个 .ckpt 文件、四份重复的 .meta/.index/.data、七八个 TensorBoard 日志文件,还有 code_test.py 和 DetNet_test.py 两个名字只差一个词的脚本。但正是这种“毛坯感”,恰恰说明它不是玩具,而是实打实从实验室里跑出来的工程产物。它面向的不是写论文时临时凑数的学生,而是真正要部署在基带处理单元、做信道状态反馈预判、或在干扰环境下做多用户信号分离的通信工程师。
核心关键词 DetNet模型、MIMO信号识别、深度学习训练,这三个词串起来,本质上是在解决一个经典但棘手的通信问题:当基站同时收发多个天线(比如4×4、8×8 MIMO)的信号时,接收端收到的是一堆混叠在一起的复数域波形。传统方法靠迫零(ZF)、最小均方误差(MMSE)等线性检测器,计算快但抗噪弱;而 DetNet 是一种把迭代检测过程“展开”成神经网络层的结构——它不是黑箱拟合,而是把每一轮符号判决、残差更新、信道补偿都做成可学习的模块,既保留了通信原理的物理可解释性,又通过数据驱动提升了鲁棒性。这决定了它的训练和推理,不能像图像分类那样“喂图出标签”,必须严格对齐通信链路的建模逻辑:复数输入、星座图约束、信噪比(SNR)分段采样、误码率(BER)导向的损失函数设计。
整个包的价值,不在于那几个 .ckpt 权重文件本身,而在于它提供了一整套可追溯、可干预、可复现的信号识别流水线。你可以直接用 DetNetmodel.cpkt 做快速原型验证,比如接入实时采集的LTE上行信号流,看它能否在20dB SNR下区分QPSK和16-QAM;也可以打开 settings.py,把 data_path 指向你自建的毫米波MIMO信道实测数据集,微调学习率后继续训练;甚至能删掉 checkpoint/model_save_20,从第20轮开始断点续训,对比不同正则化策略对过拟合的影响。它不承诺“一键部署”,但保证你每一步操作都有据可依——TensorBoard 日志里每个 loss_detnet 曲线拐点,都对应着某次学习率衰减;code_test.py 中那个看似简单的 test_ber() 函数,底层调用的是按块计算的硬判决误码统计,而非笼统的准确率。这才是通信领域深度学习落地该有的样子:严谨、可控、可调试。
2. DetNet模型设计与MIMO信号识别原理深度拆解
2.1 DetNet为何专为MIMO检测而生?——从通信原理到网络结构的映射
DetNet(Detection Network)不是凭空造出来的CNN变体,它的每一层都在模拟传统MIMO检测算法的数学步骤。我们先看一个典型的2×2 MIMO系统:基站发送两个独立符号 $x_1, x_2$,经过信道矩阵 $\mathbf{H} \in \mathbb{C}^{2\times2}$ 后,在接收端得到观测向量 $\mathbf{y} = \mathbf{Hx} + \mathbf{n}$,其中 $\mathbf{n}$ 是加性高斯白噪声。目标是从 $\mathbf{y}$ 中恢复出 $\mathbf{x}$。
传统MMSE检测器的输出是 $\hat{\mathbf{x}}{\text{MMSE}} = (\mathbf{H}^H\mathbf{H} + \sigma^2\mathbf{I})^{-1}\mathbf{H}^H\mathbf{y}$。DetNet做的,就是把这个公式“展开”成迭代形式:第 $k$ 层的输出 $\mathbf{x}^{(k)}$ 被定义为
$$
\mathbf{x}^{(k)} = \mathcal{P}{\mathcal{X}}\left( \mathbf{x}^{(k-1)} + \mu_k \mathbf{H}^H(\mathbf{y} - \mathbf{H}\mathbf{x}^{(k-1)}) \right)
$$
其中 $\mathcal{P}_{\mathcal{X}}(\cdot)$ 是投影到合法星座点(如QPSK的 ${\pm1\pm j}$)的操作,$\mu_k$ 是可学习的步长参数。看到没?第一项 $\mathbf{x}^{(k-1)}$ 是上一轮估计,第二项 $\mathbf{H}^H(\mathbf{y} - \mathbf{H}\mathbf{x}^{(k-1)})$ 就是经典的梯度方向(残差乘以信道共轭转置),而 $\mu_k$ 不再是固定值,而是由网络根据当前SNR、信道条件动态调整。这就是DetNet的精髓:它把优化算法的迭代过程变成了神经网络的前向传播,把超参数变成了可学习权重。
在 model.py 中,你会看到 DetNetBlock 类的实现:输入是复数张量(shape [B, 2*Nt],实部虚部分开存储),先经过线性变换 self.linear_hh 对应 $\mathbf{H}^H\mathbf{H}$,再用 self.linear_hy 处理 $\mathbf{H}^H\mathbf{y}$,最后通过 self.proj_layer 实现星座投影。注意,这里的投影不是简单的 torch.round(),而是查表式硬判决——self.constellation 存储了所有合法星座点坐标,self.proj_layer 计算输入点到每个星座点的欧氏距离,取最近的那个。这种设计确保了输出永远落在物理可行的符号集合内,避免了纯回归式网络输出无效符号的问题。
2.2 为什么用 .ckpt 而非 .pt 或 .h5?——权重格式背后的工程权衡
包里所有模型文件都是 .ckpt 格式(含 .meta, .index, .data 三件套),这明确指向 TensorFlow 生态。虽然摘要提到“PyTorch 或 TensorFlow”,但从文件结构看,这是 TensorFlow 1.x 风格的保存方式(TF 2.x 默认用 SavedModel)。.ckpt 的优势在于跨平台兼容性与调试友好性:.meta 文件记录了完整的计算图结构,你能用 tf.train.import_meta_graph('DetNetmodel.cpkt.meta') 直接加载图定义;.index 是变量名到存储位置的索引;.data 则是二进制权重数据。这意味着,即使你没有原始训练环境,也能用 tf.train.NewCheckpointReader 逐个读取 W_conv1, b_fc2 等变量的数值,做权重分布分析或故障定位。
相比之下,PyTorch 的 .pt 文件是序列化后的 state_dict,轻量但缺乏图结构信息;Keras 的 .h5 虽包含架构,但对复数运算支持较弱。MIMO检测涉及大量复数矩阵运算,TensorFlow 1.x 的 tf.complex64 类型和 tf.nn.conv2d 对复数卷积的支持更成熟。这也是为什么 settings.py 中 framework = 'tensorflow' 是默认选项——它不是技术债,而是针对通信信号处理场景的务实选择。
提示:如果你坚持用 PyTorch,
model.py中的DetNet类已预留了from_tf_checkpoint()方法,它会解析.ckpt文件中的变量名(如detnet/block_3/proj_layer/weights),映射到 PyTorch 的self.proj_layer.weight,完成权重迁移。但注意,TensorFlow 的变量命名规则(下划线分隔+层级路径)和 PyTorch 的nn.Sequential命名不完全一致,需手动核对维度。
2.3 MIMO信号识别的数据本质:不是图片,是带物理约束的复数序列
很多人初学时会误以为 MIMO 信号识别就是“把IQ数据当图片处理”。错。图像像素是独立同分布的,而MIMO接收信号的每个采样点 $y_i$ 都满足 $\mathbf{y} = \mathbf{Hx} + \mathbf{n}$,其协方差矩阵 $\mathbb{E}[\mathbf{yy}^H] = \mathbf{H}\mathbf{H}^H + \sigma^2\mathbf{I}$ 直接编码了信道特性。因此,数据预处理绝不是简单的归一化:
- 复数表示:输入必须是
[B, 2*Nr, T]张量,其中Nr是接收天线数,T是符号周期数,前Nr行存实部,后Nr行存虚部。DetNet_train.py中的load_mimo_data()函数会检查data_path下的.mat文件,提取y_real,y_imag,x_true字段,并拼接成此格式。 - SNR 分段采样:训练集必须按 SNR 分桶。包里
settings.py的snr_list = [8, 12, 16, 20, 24]不是随意写的——每个 SNR 段落生成独立的 mini-batch,确保网络在不同噪声强度下都能学到鲁棒特征。若混在一起训练,网络会偏向高 SNR 样本(损失更小),导致低 SNR 下性能骤降。 - 标签不是类别ID,而是符号向量:
code_test.py中的generate_labels()函数生成的是[B, Nt]的复数标签(如 QPSK 下每个元素是 $\pm1\pm j$),而非[B]的整数类别。因为检测目标是恢复具体符号值,不是判断“这是哪种调制”。
3. 完整训练与推理流程实操详解
3.1 环境准备与依赖确认:避开框架冲突的深坑
别急着 python DetNet_train.py。先执行 python -c "import tensorflow as tf; print(tf.__version__)"。这个包要求 TensorFlow 1.15.0(TF 2.x 会因 tf.Session 废弃而报错)。如果你的环境是 TF 2.x,创建新 conda 环境:
conda create -n detnet-tf1 python=3.7
conda activate detnet-tf1
pip install tensorflow==1.15.0 scikit-learn scipy matplotlib
为什么是 Python 3.7?因为 TF 1.15.0 的 wheel 包只编译了 3.7 的 CPython ABI。用 3.8 会提示 ImportError: DLL load failed。
接着检查 settings.py:
# settings.py 关键配置段
framework = 'tensorflow' # 必须为 'tensorflow',PyTorch 支持未启用
data_path = './data/mimo_dataset/' # 确保此路径存在且含 .mat 文件
checkpoint_dir = './checkpoint/' # 权重保存目录,已存在
log_dir = './logs/' # TensorBoard 日志目录
device = '/GPU:0' # 若无GPU,改为 '/CPU:0'
batch_size = 128
num_epochs = 50
snr_list = [8, 12, 16, 20, 24] # 必须与数据集SNR匹配
特别注意 device:TensorFlow 1.x 的 GPU 设备名是 /GPU:0,不是 PyTorch 的 cuda:0。若设错,程序会静默退回到 CPU,训练速度慢 10 倍以上,且日志里毫无提示。
实操心得:我在一台 2080Ti 上首次运行时,发现 GPU 内存占用仅 30%,训练速度却比预期慢。排查发现
settings.py中device = '/gpu:0'(小写 gpu),TensorFlow 无法识别,自动fallback到CPU。改回/GPU:0后,内存占用升至 95%,单 epoch 从 12 分钟降至 1.8 分钟。这种细节,文档不会写,只有踩过才记得住。
3.2 数据集构建规范:如何准备你的自定义MIMO信号
包里没附带数据集,./data/mimo_dataset/ 是空目录。你需要自己生成或转换数据。标准流程如下:
- 生成仿真数据(推荐入门):用 MATLAB 或 Python 生成符合 MIMO 信道模型的数据。关键参数:
-Nt=4, Nr=4(天线数)
-modulation='QPSK'(调制方式,支持'QPSK','16QAM','64QAM')
-channel_model='rayleigh'(信道模型,'rayleigh'或'rician')
-snr_db=[8,12,16,20,24](SNR列表,必须与settings.py一致)
MATLAB 示例代码片段:
% generate_mimo_data.m
Nt = 4; Nr = 4;
modu = pskmod(randi([0,3],10000,1),4); % QPSK symbols
H = (randn(Nr,Nt)+1j*randn(Nr,Nt))/sqrt(2); % Rayleigh channel
for snr_db = [8,12,16,20,24]
sigma2 = 1/10^(snr_db/10);
n = sqrt(sigma2/2)*(randn(Nr,10000)+1j*randn(Nr,10000));
y = H * reshape(modu, Nt, []) + n;
save(['mimo_data_snr',num2str(snr_db),'.mat'], 'y', 'modu', 'H');
end
生成的 .mat 文件必须包含三个变量:y([Nr, num_symbols] 复数矩阵)、modu([Nt, num_symbols] 发送符号)、H([Nr, Nt] 信道矩阵)。
- 实测数据转换(进阶):若你有 USRP 或 NI USRP 采集的
.bin文件,需用 Python 转换:
import numpy as np
# 读取IQ数据(假设是int16格式,实部虚部交替)
raw = np.fromfile('usrp_capture.bin', dtype=np.int16)
iq = raw[::2] + 1j * raw[1::2] # 转为复数
# Reshape为 [Nr, T],例如4天线则每4个样本为一组
y = iq.reshape(-1, 4).T # shape [4, T]
# 保存为.mat
scipy.io.savemat('./data/mimo_dataset/mimo_real_snr20.mat', {'y': y})
注意:实测数据必须已做过载波同步和定时同步,否则 y 中的相位抖动会导致训练失败。
3.3 训练脚本 DetNet_train.py 核心逻辑与参数调优
运行 python DetNet_train.py 后,主流程如下:
-
数据加载与分批:
DataLoader按snr_list顺序读取.mat文件,对每个 SNR 段落做 shuffle,组成 batch。关键技巧:batch_size=128是针对 4×4 MIMO 的经验值,若用 8×8,需降至 64,否则 GPU 显存溢出。 -
损失函数设计:不是交叉熵!
model.py中detnet_loss()计算的是符号误差率(SER)的平滑近似:
def detnet_loss(y_pred, y_true):
# y_pred, y_true: [B, Nt] complex tensors
mse = tf.reduce_mean(tf.abs(y_pred - y_true)**2) # 均方误差
# 加入 SER 正则项:对每个样本,计算预测符号与真实符号的欧式距离
dist = tf.sqrt(tf.reduce_sum(tf.abs(y_pred - y_true)**2, axis=1))
ser_approx = tf.reduce_mean(tf.sigmoid(10.0 * (dist - 0.1))) # 距离>0.1时惩罚
return mse + 0.5 * ser_approx
这里 0.5 是 SER 权重系数,0.1 是星座点最小间距(QPSK下为2)。若你用 64-QAM,需将 0.1 改为 0.25(64-QAM 最小间距为 0.5)。
- 学习率调度:
DetNet_train.py使用阶梯式衰减:
initial_lr = 1e-3
lr = tf.train.piecewise_constant(global_step,
boundaries=[20000, 40000],
values=[initial_lr, initial_lr*0.1, initial_lr*0.01])
即前 2 万步用 0.001,2-4 万步降为 0.0001,之后为 0.00001。这个 schedule 是基于 50 epoch、batch_size=128 的收敛实验确定的。若你数据量少,可缩短边界点。
- 检查点保存机制:每
save_freq=10个 epoch 保存一次model_save_{epoch}。注意,checkpoint/目录下已有model_save_10/20/30,这是作者在不同训练阶段保存的快照,可用于:
-model_save_10:观察早期收敛行为(是否震荡)
-model_save_20:作为微调起点(--restore_from=./checkpoint/model_save_20)
-model_save_30:最终模型(通常 BER 最低)
注意事项:训练中若中断,下次运行会自动从最新检查点恢复(
tf.train.latest_checkpoint(checkpoint_dir))。但global_step变量会从上次停止处继续计数,可能导致学习率跳过某个衰减点。安全做法是手动删除checkpoint/下除model_save_30外的所有文件,重新开始。
3.4 推理与测试:从 DetNet_test.py 到 code_test.py 的分工
包里有两个测试脚本,用途截然不同:
-
DetNet_test.py:端到端性能评估。它加载完整模型,对测试集做前向推理,输出整体 BER 和 SER。核心代码:
python # DetNet_test.py 片段 saver.restore(sess, tf.train.latest_checkpoint('./checkpoint/')) for snr in snr_list: y_test, x_test = load_test_data(snr) # 加载该SNR的测试数据 pred_x = sess.run(model.output, feed_dict={model.y: y_test}) ber = calculate_ber(pred_x, x_test) # 按符号硬判决计算误码率 print(f'SNR {snr} dB: BER = {ber:.6f}')
输出是标准通信性能曲线,可直接绘图。 -
code_test.py:模块级功能验证。它不加载训练好的权重,而是用随机初始化的网络,测试model.py中每个组件是否正常工作:
python # code_test.py 片段 net = DetNet(Nt=4, Nr=4, constellation='QPSK') dummy_y = np.random.randn(1, 8, 100).astype(np.float32) # [B, 2*Nr, T] with tf.Session() as sess: sess.run(tf.global_variables_initializer()) out = sess.run(net.output, feed_dict={net.y: dummy_y}) assert out.shape == (1, 4) # 输出应为 [B, Nt] 复数符号
这是开发时的“单元测试”,确保模型结构没写错。若code_test.py报错,说明model.py有语法或维度错误,必须修复后再训练。
实操心得:有一次我修改了
model.py中DetNetBlock的层数,code_test.py通过了,但DetNet_test.py在加载权重时崩溃。查了很久才发现,.ckpt文件里的变量名(如detnet/block_4/proj_layer/weights)与新模型的block_5不匹配。正确做法是:先运行code_test.py验证结构,再用DetNet_train.py --restore_from=None从头训练,生成新权重,最后用DetNet_test.py测试。跳过任何一步,都会埋下隐患。
4. TensorBoard日志分析与常见问题排查
4.1 解析 events.out.tfevents:读懂训练健康度的密码
包里提供了 8 个 events.out.tfevents.* 文件,每个对应一次训练实验。用 tensorboard --logdir=./logs/ 启动后,在浏览器打开 http://localhost:6006,重点关注三个图表:
-
loss_total曲线:理想情况是平滑下降,50 epoch 内从 ~0.8 降至 ~0.05。若出现剧烈震荡(峰峰值 >0.2),说明学习率过大或 batch_size 过小;若长期停滞(>20 epoch 无下降),可能是数据噪声过大或信道模型不匹配。 -
accuracy_symbol曲线:这是符号级准确率(1-SER),应随 loss 下降而上升。若 loss 降但 accuracy 不升,大概率是constellation参数设错——比如数据是 16-QAM 却用了'QPSK',投影层会把所有预测都拉到最近的 QPSK 点,导致 accuracy 虚高但实际 BER 很差。 -
learning_rate曲线:验证学习率是否按预期衰减。若曲线是直线,说明piecewise_constant的boundaries设置错误(如global_step未正确传递)。
提示:TensorBoard 默认只显示最新日志。若要对比多次实验,在
--logdir后指定子目录:tensorboard --logdir=logs/exp1:./logs/exp1,logs/exp2:./logs/exp2,即可并排查看不同超参下的曲线。
4.2 典型问题速查表与独家避坑指南
| 问题现象 | 可能原因 | 排查命令/操作 | 解决方案 |
|---|---|---|---|
ImportError: No module named 'tensorflow' | 环境未安装 TF 1.15 | pip list \| grep tensorflow | pip uninstall tensorflow; pip install tensorflow==1.15.0 |
NotFoundError: Key detnet/block_1/linear_hh/weights not found | 权重文件与模型结构不匹配 | python -c "import tensorflow as tf; r=tf.train.NewCheckpointReader('DetNetmodel.cpkt'); print(r.get_variable_to_shape_map().keys())" | 用 code_test.py 验证模型结构,或下载原始训练代码重新生成权重 |
CUDA_ERROR_OUT_OF_MEMORY | GPU 显存不足 | nvidia-smi 查看显存占用 | 降低 batch_size(如从 128→64),或在 settings.py 中设 device='/CPU:0' |
BER = 0.5(随机猜测水平) | 数据标签错误或星座投影失效 | python code_test.py 检查 calculate_ber() | 检查 .mat 文件中 x_true 是否为复数;确认 settings.py 中 constellation 与数据调制方式一致 |
loss_total 一直为 nan | 输入数据含 inf 或 nan | python -c "import scipy.io as sio; d=sio.loadmat('./data/mimo_dataset/mimo_data_snr20.mat'); print(np.isnan(d['y']).any())" | 清洗数据:y = np.nan_to_num(y) |
独家避坑技巧:
- 权重文件重复问题:目录里有四个 DetNetmodel.cpkt.* 文件,其实是同一模型的不同保存时间点(作者训练了四次)。用 ls -lt checkpoint/ 查看修改时间,选最新的那个。不要试图合并它们——.ckpt 不是模型集成,而是不同训练阶段的快照。
- .gitignore 和 __pycache__ 的作用:.gitignore 里写了 *.ckpt 和 logs/,说明作者不希望权重和日志被 Git 追踪(体积大且敏感);__pycache__ 是 Python 编译缓存,删除不影响运行,但首次运行会重建。若遇到 ImportError,可尝试 rm -rf __pycache__/ 后重试。
- 多轮检查点的妙用:model_save_10/20/30 不只是备份。model_save_10 的 BER 可能比 model_save_30 高(过拟合前),适合部署在信道变化快的场景;model_save_30 更稳定,适合静态信道。这不是 bug,而是通信系统对“泛化”与“瞬时性能”的权衡。
5. 从实验室到现场:DetNet模型的工程化部署建议
5.1 推理加速:如何让 DetNet 在嵌入式设备上跑起来
训练好的模型不能直接扔进 FPGA 或 DSP。TensorFlow 1.x 的 .ckpt 需转换为轻量格式:
- 冻结图(Freeze Graph):将变量固化为常量,生成单一
.pb文件:
python -m tensorflow.python.tools.freeze_graph \
--input_graph=./logs/frozen_graph.pbtxt \
--input_checkpoint=./checkpoint/last_checkpoint \
--output_graph=./frozen_detnet.pb \
--output_node_names="detnet/output"
frozen_detnet.pb 只有几 MB,可部署到 Jetson Nano 等边缘设备。
- 量化(Quantization):将 float32 权重转为 int8,提速 3 倍:
converter = tf.lite.TFLiteConverter.from_frozen_graph(
'./frozen_detnet.pb', ['detnet/y'], ['detnet/output'])
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
open("./detnet_quant.tflite", "wb").write(tflite_model)
tflite_model 可在 Android 或 iOS 上用 TensorFlow Lite 运行。
注意:量化会引入精度损失,需在
DetNet_test.py中验证量化后 BER 是否 <1e-3。若超标,可尝试converter.experimental_new_converter = True启用新版转换器。
5.2 自定义扩展:添加新调制方式与信道模型
想支持 256-QAM?只需两步:
1. 在 model.py 的 constellation_dict 中添加:
'256QAM': np.array([...]) # 256 个星座点坐标,按格雷码排序
- 在
settings.py中新增modulation='256QAM',并确保数据集.mat文件中的modu是 256-QAM 符号。
想加入 3GPP 38.901 信道模型?修改 data_loader.py 中的 generate_channel() 函数,用 scipy.stats.rayleigh 替换为 3gpp_uma_channel(),传入 LOS/NLOS 参数即可。
5.3 性能边界测试:你的 DetNet 能扛住多大噪声?
别只信作者给的 BER 曲线。自己做极限测试:
- 低 SNR 极限:将 snr_list 扩展到 [0, 4, 8],看 BER 是否在 0dB 时 <0.4(理论香农限)。
- 高维 MIMO:把 Nt, Nr 改为 8,观察 loss_total 是否仍收敛。若不收敛,需增加 DetNet 的层数(num_blocks 参数)。
- 实测干扰:在 .mat 数据中注入脉冲噪声(n += 10*impulse_noise),测试鲁棒性。
我在某次实测中发现,DetNet 在 AWGN 下 BER 优秀,但遇到窄带干扰时性能骤降。解决方案是在 model.py 的输入层后加一个 tf.keras.layers.Conv1D 滤波器,学习抑制干扰频段——这正是 DetNet 的优势:它不是封闭系统,而是可插拔的信号处理模块。
最后分享一个小技巧:部署时,别把整个 DeepMIMODetection-master 目录拷过去。只需提取 model.py, DetNet_test.py, settings.py, frozen_detnet.pb 四个文件,加上你的 .mat 数据,总大小 <10MB。真正的工程,是把复杂留给自己,把简洁留给用户。
简介:一套开箱即用的MIMO通信信号识别工具包,基于DetNet网络结构实现,支持PyTorch或TensorFlow框架(具体依赖见settings.py)。内含预训练权重文件DetNetmodel.cpkt(含.meta、.index、.data三部分),以及多轮训练保存的检查点model_save_10/20/30,方便继续训练或对比实验。提供完整的训练脚本DetNet_train.py、测试脚本DetNet_test.py和验证脚本code_test.py,配合settings.py可快速配置数据路径、超参数和GPU/CPU设备选项。TensorBoard日志文件events.out.tfevents已打包,便于可视化训练过程中的损失、准确率等指标变化。整个项目结构为DeepMIMODetection-master,支持直接加载预训练模型进行信号检测推理,也兼容用户自定义MIMO信号数据集的重新训练。.gitignore和__pycache__目录为标准开发缓存,不影响实际运行。

208

被折叠的 条评论
为什么被折叠?



