目录

1.CsiNet网络模型 

2.CsiNet网络模型应用举例

3.CsiNet网络模型的训练

4.MATLAB仿真实例


1.CsiNet网络模型 

       CsiNet通过深度学习能显著提升CSI重建质量,即便在低压缩率下,也能保留足够信息以获得有效的波束成形增益。CsiNet模型中,用户侧接收空频域信道矩阵后,借助二维离散傅里叶变换(DFT)得到截断矩阵,随后通过编码器生成压缩码字s;之后码字s经反馈链路传输至基站,基站接收码字s后,利用译码器重建角度时延域的信道矩阵;最终,通过逆离散傅里叶变换(IDFT)获取空频域的恢复信道矩阵。

       CsiNet模型的基本结构如下图所示:

       从上述的CsiNet网络模型中可以看到CsiNet采用卷积神经网络作为编码器和译码器。卷积神经网络能够在相邻层的神经元之间,建立空间局部特征的连接,以此来挖掘覆盖范围内元素之间的关联性。

编码器

      CsiNet的编码器不像压缩感知算法那样使用随机投影,而是通过训练数据的学习,将原始信道矩阵转换成压缩表示 (码字)。因此,该算法不依赖于人类对信道分布的已有知识,而是直接从训练数据中学习如何有效利用信道结构。

       编码器的输入为生成的截断矩阵H ,由于H是复数矩阵,所以将其拆分为实部和虚部两层作为输入。编码器的第一层是卷积层,使用尺寸为3×3的核生成两个特征图。

译码器

       CsiNet的译码器是通过学习,实现将码字重建为原始信道矩阵的逆变换。与压缩感知所需要的迭代算法相比,CsiNet的逆变换是不需要迭代的,因此比迭代算法快几个数量级,时间复杂度远小于压缩感知的时间复杂度。

       译码器的第一层是全连接层,把接收到的M维码字s作为输入,输出两个维度为Nc×Nt的矩阵,作为H实部和虚部的初始估计值。之后将初始估计值输入RefineNet,这些单元持续优化重建的信道矩阵。每个RefineNet由4层CNN组成。在RefineNet单元中,第一层是输入层,剩下的3层均使用3×3的核来生成特征图。第二层和第三层分别生成8个和16个特征图。第四层的特征图数量与信道矩阵H的层数相同,并且通过适当的补零,使每一层的尺寸都保持为Nc×Nt的矩阵。

       在RefineNet单元中,引入了直接将数据流传递到后续层的快捷连接,即把第一层的数据与最后一层的数据相加后再输出,该方法的灵感来自深度残差网络 ,它避免了因多次叠加非线性激励函数而导致的梯度消失问题。

2.CsiNet网络模型应用举例

     假设大规模MIMO系统,假设Nc​=32,Nt​=32,压缩后码字维度M=256,编码器、译码器及 RefineNet的参数如下:

     编码器输入为复数信道矩阵H∈C32×32,拆分为实部和虚部两层,因此输入维度为2×32×32。

卷积层参数

核尺寸:3×3

输入通道数:2(实部+虚部)

输出通道数:2(生成2个特征图)

特征图尺寸:32×32(无步幅、补零保持尺寸)

参数数量:3×3×2×2+2=38(权重3×3×2×2+偏置2)

维度调整与全连接层参数

卷积层输出特征图总元素数:2×32×32=2048

全连接层输入维度:2048

全连接层输出维度(码字s):M=256

参数数量:2048×256+256=524,544(权重2048×256+ 偏置256)

译码器以码字s∈R256为输入,逐步重建信道矩阵。

全连接层参数

输入维度:256

输出维度:2×32×32=2048(对应H实部和虚部的初始估计)

参数数量:256×2048+2048=526,592(权重256×2048+偏置2048)

RefineNet单元参数

第一层(输入层):维度为2×32×32(无参数,仅传递初始估计)。

第二层

核尺寸:3×3输入通道数:2

输出通道数:8特征图尺寸:32×32(补零保持尺寸)

参数数量:3×3×2×8+8=152(权重 + 偏置)。

第三层

核尺寸:3×3

输入通道数:8

输出通道数:16

特征图尺寸:32×32(补零保持尺寸)

参数数量:3×3×8×16+16=1,168(权重 + 偏置)。

第四层

核尺寸:3×3

输入通道数:16

输出通道数:2(与输入通道数一致,对应H的实部和虚部)

特征图尺寸:32×32(补零保持尺寸)

参数数量:3×3×16×2+2=290(权重 + 偏置)。

最后一层CNN参数

若采用2层RefineNet 单元,最终将信道矩阵输入最后一层CNN:

核尺寸:3×3

输入通道数:2

输出通道数:2

特征图尺寸:32×32

参数数量:3×3×2×2+2=38(权重 + 偏置),后接 Sigmoid 激活函数将输出缩放到[0,1]。

3.CsiNet网络模型的训练

训练CsiNet,对编码器和译码器的所有核与偏差进行端到端学习,训练参数集记为Θ={Θen​,Θde​}。当输入信道矩阵为Hi​时,第i个重建信道矩阵可表示为:

与自编码器类似,CsiNet属于无监督学习算法,其训练参数由 ADAM 算法优化,损失函数采用均方误差,计算方式为:

4.MATLAB仿真实例

clear; clc; close all;

%% 1. 参数设置
% 信道参数(大规模MIMO场景)
Nt = 32;          % 发射天线数
Nr = 32;          % 接收天线数
M = 256;          % 压缩码字维度(反馈开销)
num_refine = 2;   % RefineNet单元数量
batch_size = 128; % 批处理大小
epochs = 50;      % 训练轮数
lr = 1e-4;        % 学习率

% 数据集参数(假设已生成复数信道矩阵数据集)
data_path = './csi_dataset.mat'; % 数据集路径(需自行准备)
load(data_path); % 加载数据集,假设包含:
                 % - train_H: 训练集复数信道矩阵 (Nt×Nr×num_train)
                 % - test_H: 测试集复数信道矩阵 (Nt×Nr×num_test)

%% 2. 数据预处理
% 将复数信道矩阵拆分为实部和虚部(输入格式:实部+虚部,维度:2×Nt×Nr)
[train_input, test_input] = preprocess_data(train_H, test_H, Nt, Nr);

%% 3. 构建CsiNet网络
net = build_CsiNet(Nt, Nr, M, num_refine);

%% 4. 网络训练
% 定义训练选项
options = trainingOptions('adam', ...
    'MaxEpochs', epochs, ...
    'MiniBatchSize', batch_size, ...
    'InitialLearnRate', lr, ...
    'Shuffle', 'every-epoch', ...
    'ValidationData', {test_input, test_input}, ... % 无监督学习:输入=标签
    'ValidationFrequency', 100, ...
    'Verbose', true, ...
    'Plots', 'training-progress');

% 训练网络
trained_net = trainNetwork(train_input, train_input, net, options);

%% 5. 测试与性能评估
% 重建测试集信道
recon_test = predict(trained_net, test_input);

% 计算均方误差(MSE)和归一化均方误差(NMSE)
[mse_val, nmse_val] = calculate_metrics(recon_test, test_input, Nt, Nr);
fprintf('测试集NMSE: %.4f dB\n', nmse_val);

% 可视化重建结果(随机选一个样本)
sample_idx = randi(size(test_input,4));
visualize_results(test_input(:,:,:,sample_idx), recon_test(:,:,:,sample_idx), Nt, Nr);

子函数如下:

%% 子函数:构建CsiNet网络
function net = build_CsiNet(Nt, Nr, M, num_refine)
    % 输入层:实部+虚部(2通道,尺寸Nt×Nr)
    input_layer = imageInputLayer([Nt, Nr, 2], 'Name', 'input');
    
    %% 编码器
    % 卷积层:3×3核,2个特征图
    conv1 = convolution2dLayer(3, 2, 'Padding', 1, 'Name', 'conv1');
    batch1 = batchNormalizationLayer('Name', 'batch1');
    relu1 = reluLayer('Name', 'relu1');
    
    % 展平特征图,全连接层生成码字s
    flatten = flattenLayer('Name', 'flatten');
    fc1 = fullyConnectedLayer(M, 'Name', 'fc_encoder'); % 输出维度M(码字)
    
    %% 译码器
    % 全连接层:将码字映射回初始估计(实部+虚部,尺寸Nt×Nr×2)
    fc2 = fullyConnectedLayer(2*Nt*Nr, 'Name', 'fc_decoder'); % 2*Nt*Nr = 实部+虚部
    reshape1 = reshapeLayer([Nt, Nr, 2], 'Name', 'reshape_initial'); % 恢复空间维度
    batch2 = batchNormalizationLayer('Name', 'batch2');
    
    % 堆叠RefineNet单元
    layers = [input_layer; conv1; batch1; relu1; flatten; fc1; fc2; reshape1; batch2];
    
    for i = 1:num_refine
        [refine_layers, layer_names] = refine_net_unit(i, Nt, Nr);
        layers = [layers; refine_layers];
    end
    
    % 最后一层CNN:输出与输入同维度(实部+虚部),Sigmoid激活
    final_conv = convolution2dLayer(3, 2, 'Padding', 1, 'Name', 'final_conv');
    sigmoid = sigmoidLayer('Name', 'sigmoid_output'); % 缩放至[0,1]
    layers = [layers; final_conv; sigmoid];
    
    % 构建网络
    net = layerGraph(layers);
    
    % 添加RefineNet单元的快捷连接(残差连接)
    for i = 1:num_refine
        input_name = ['refine_', num2str(i), '_input'];
        output_name = ['refine_', num2str(i), '_output'];
        net = addLayers(net, additionLayer(2, 'Name', ['add_', num2str(i)]));
        net = connectLayers(net, input_name, ['add_', num2str(i), '/in1']);
        net = connectLayers(net, ['refine_', num2str(i), '_conv4'], ['add_', num2str(i), '/in2']);
        net = connectLayers(net, ['add_', num2str(i)], output_name);
    end
end
%% 子函数:定义RefineNet单元
function [refine_layers, layer_names] = refine_net_unit(idx, Nt, Nr)
    prefix = ['refine_', num2str(idx), '_'];
    layer_names.input = [prefix, 'input'];
    layer_names.output = [prefix, 'output'];
    
    % RefineNet单元结构:4层CNN + 快捷连接
    refine_layers = [
        % 输入层(占位,实际由前层连接)
        convolution2dLayer(1, 2, 'Padding', 0, 'Name', layer_names.input); % 仅作为连接节点
        % 第二层:3×3核,8个特征图
        convolution2dLayer(3, 8, 'Padding', 1, 'Name', [prefix, 'conv2']);
        batchNormalizationLayer('Name', [prefix, 'batch2']);
        reluLayer('Name', [prefix, 'relu2']);
        % 第三层:3×3核,16个特征图
        convolution2dLayer(3, 16, 'Padding', 1, 'Name', [prefix, 'conv3']);
        batchNormalizationLayer('Name', [prefix, 'batch3']);
        reluLayer('Name', [prefix, 'relu3']);
        % 第四层:3×3核,2个特征图(与输入通道一致)
        convolution2dLayer(3, 2, 'Padding', 1, 'Name', [prefix, 'conv4']);
        batchNormalizationLayer('Name', [prefix, 'batch4']);
    ];
end

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐