dianixn / Channelformer

Code for Channelformer: Attention based Neural Solution for Wireless Channel Estimation and Effective Online Training
GNU General Public License v2.0
47 stars 4 forks source link

Question #1

Open cherry-lyh opened 4 months ago

cherry-lyh commented 4 months ago

您好,我有个问题想要请教。 在训练数据生成的文件夹+Data_Generation中: 对于ReEsNet(或者InterpolateNet)的训练数据生成函数Data_Generation_Residual.m中第30行代码: [data_for_channel, ~] = OFDM.Pilot_Insert(1, Pilot_location_symbols, kron((1 : Num_of_subcarriers)', ones(1, Num_of_pilot)), Frame_size, Num_of_FFT, ones(Num_of_FFT, Num_of_symbols));(这段代码是用于得到真实的信道响应的第一步) kron((1 : Num_of_subcarriers)', ones(1, Num_of_pilot))中的参数为Num_of_subcarriers,其值为71。 而对于Channelformer的训练数据生成函数Data_generation_offline_version.m中第31行代码: [data_for_channel, ~] = OFDM.Pilot_Insert(1, Pilot_location_symbols, kron((1 : Num_of_FFT)', ones(1, Num_of_pilot)), Frame_size, Num_of_FFT, QPSK_signal_for_channel); kron((1 : Num_of_FFT)', ones(1, Num_of_pilot))中的参数为Num_of_FFT,其值为72。 我的问题是,为什么这两个地方的参数会不一样?这样得到的信道响应H将会是不一样的。

在后续的测试过程中,如在Demonstration_of_H_Rayleigh_Propogation_Channel.m脚本中第119行: [data_for_channel, ~] = OFDM.Pilot_Insert(1, Pilot_location_symbols, kron((1 : Num_of_FFT)', ones(1, Num_of_pilot)), Frame_size, Num_of_FFT, (ones(Num_of_FFT, Num_of_symbols))); kron((1 : Num_of_FFT)', ones(1, Num_of_pilot))中的参数为Num_of_FFT,其值为72。 在对训练完后的ReEsNet(或者InterpolateNet)的测试时,测试数据生成的真实信道响应H对应的参数是Num_of_FFT,而模型在训练时生成的真实信道响应H对应的参数是Num_of_subcarriers。俩者是否不匹配?这似乎会对最后的结果产生影响。

dianixn commented 4 months ago

没什么影响吧,我刚重新按着Num_of_FFT重训了一遍试了下,没什么影响的原因是,信道的频率响应是完全一样的,只是在72*14=1008个点中的2个点变成了1->0,而且这两个点还不在data symbol上

可能吧,应该是粘贴的时候贴错了,这个改动是别的paper里的

cherry-lyh commented 4 months ago

感谢答复!不知您按Num_of_FFT重新训练了哪个模型?按照您的回复,所有的模型训练时,生成data_for_channel时的参数都应该是Num_of_FFT,这是由于在测试(MSE)时生成测试数据使用的参数是Num_of_FFT。我针对ReEsNet模型做了以下实验: 1、按照您开源的代码,没有改动(即Data_Generation_Residual.m中生成data_for_channel的参数仍是Num_of_subcarriers), 首先运行ResNN_pilot_regression.m得到模型ReEsNet_71(71表示参数为Num_of_subcarriers),数据集、验证集按照您paper中进行设置。 2、将Data_Generation_Residual.m中生成data_for_channel的参数改为Num_of_FFT(您的回复中也认同这里应为Num_of_FFT,源码中是Num_of_subcarriers是因为粘贴发生错误)。再次运行ResNN_pilot_regression.m得到模型ReEsNet_72(72表示参数为Num_of_FFT),数据集、验证集按照您paper中进行设置。 3、在Demonstration_of_H_Rayleigh_Propogation_Channel_test.m中加载训练得到的两个模型,生成测试数据进行测试(生成data_for_channel的参数为Num_of_FFT),测试集大小按照您paper中进行设置。最后得到了两个模型的MSE。如下图所示: 屏幕截图 2024-05-26 201842 从我的实验结果来看,ReEsNet_71得到的MSE与您paper中ReEsNet的MSE完全一致,是否说明您paper中的结果ReEsNet训练时设置的参数为Num_of_subcarriers(但这里应该是Num_of_FFT,如您回复中所说的)。反观ReEsNet_72(该模型训练以及测试时生成data_for_channel的参数均为Num_of_FFT,两者是相匹配的)得到的结果,MSE在高信噪比时明显有所下降(其MSE在低信噪比时略高于channelformer,但在高信噪比时MSE比channelformer还低),是否说明这应该才是正确的ReEsNet模型得到MSE。 综上,我认为您paper中得到的ReEsNet(包括InterpolateNet)得到的MSE结果有误,这是由于您在训练是生成信道频率响应设置的参数为Num_of_subcarriers,而在测试时生成信道频率响应设置为Num_of_FFT,这导致了测试数据在结构上就与模型应当的输入不同。好比用A去训练模型后用B去测试,而不是用的A的子集,虽然A和B看起来差不多(如您所说的只有2个点变成了1->0),但本质上却有区别。最后导致了ReEsNet得到的MSE偏高。所以当您用这样得到的ReEsNet、InterpolateNet的MSE去与Channelformer(训练和测试时生成data_for_channel的参数均为Num_of_FFT,是相匹配的)的MSE进行对比,是否存在”不公平“的现象呢? 如果您有时间的话可以按照我所说的跑一下参数为Num_of_FFT的ReEsNet模型,看实验结果是否与我的一致,以判断我的疑惑是否成立,或者说我的实验哪里出现了问题。 如果我的言论有不当之处,请随时删除这个issue 望答复,再次感谢!

dianixn commented 4 months ago

在所有SNR上,ReEsNet仍然没有Channelformer结果好,在高信噪比下Channelformer也是要好,整体结果也差别不大,就按你说的“公平比较”。昨天试的InterpolateNet,今天我把两个都重训了一遍并且重新跑了一遍,结果如图。需要注意的是这图里的SNR是-10dB到30dB。

1

就是SNR = 25, 30的地方InterpolateNet和ReEsnet的MSE低了。*因为7214 = 1008个点里有2个点值很小,只占2/1008=0.19%的影响很难有“本质上”的区别。**但是从你发给我的看,你的72比我图里的低了不少,我今天重训的就是把71->72之后别的全都没改然后重训InterpolateNet和ReEsnet,但是应该就不大0.19%,所以我觉得你跑的东西有误,我可以把trained的发你但是评论里上传不了,你看看是不是你哪整错了。

到底是Num_of_FFT还是Num_of_subcarriers其实我记不清了,我就是看你昨天发的好像有道理然后我看了这个repo https://github.com/dianixn/Interpolation-ResNet里当时是no DC insert,所以以为是我复用那个repo代码的时候直接粘贴了,但我不确定

还行吧,反正就讨论被,你要是想删就删,你有微信?comment上传不了.m

dianixn commented 4 months ago

不是哥们,你那个结果图里的不太对吧,假设别的完全一致而且71的在那两个点上是完全不行的(100%随机预测),那分担的MSE就是2*(1-你72里的最后一个值)/1008,就按2/1008=0.0019算,你这两条线最后一个值的差比这个值还要大啊,这怎么可能呢(你这有0.002多?),减去你72里的最后一个值之后实际的差值应该还要更小,反推回去的结论就是在这两个点上的误差要比极限的最大值还要大才能实现你这个图。这有点不太对吧

我刚才想起来估算的可能不太准确,另外你这个72的线在30dB的时候还能剧烈下降,30dB是个unseen的地方,你这真不太对吧

--

可能测试的点少,增加Num_of_frame_each_SNR -> 15000,这种蒙特卡洛现象在Num_of_frame_each_SNR -> 50 的时候会更明显,但我觉得不是。

我觉得可能的是,你上面两的训练超参数不一致。你细调了optimizer的超参从而取得更好的效果72。今天微调了之后interpolateNet得出了比你那个72还要好的结果,但是30dB的地方不是剧烈下降。

超参设置应该和最原始的paper的一致,因为对optimizer超参优化几乎是完全没有意义的。grid search,只要你有足够多的时间/GPU做最细致的grid search你总能发现效果一直在提升,即使你什么也不做。一个经典的例子就是选seed acc能提升不少,但很难看出seed对acc有什么影响,你搜一下就明白了

我没做过grid search,随便选了一组,结果不错我就没改过,你要是有兴趣可以细致的寻找一下grid search的最优,每个神经网络都找找帮我的也找找,但是这几乎没意义的,所以超参设置应该和最原始的paper的一致。

grid search意思就是两个超参A = {a, b},B = {c, d},用 {a, c}做一组然后一直试下去,试的越多越接近但没意义,换个数据集grid search找的点可能就变了

--

没能解决,他说超参是一样的但是测出来还是和我的不一样但是和他自己之前发的也不一样,上述方法无法解决。

根据他提供的结果显示,ReEsNet的MSE表现(尤其在30dB时)会随着MATLAB版本明显变化的,版本越高MSE越大,我没验证过。他分别用23b,21a,21b版本并且其他完全一致进行了ReEsNet的训练和测试,这三条线在30dB差异明显。在23版本下Channelformer在全SNR下是最优方法只是差距在30dB的地方并不像我的明显,21a版本在30dB的情况下会明显下降并超过Channelformer。

--

当我下了这个代码忘了把训练ReEsNet使用的Training_Set_Rate改成0.95 (95%),而不是0.995的时候,我得到了和他发我的23b差不多的结果,因为训练ReEsNet的时候比Channelformer多用了6000多sample。新得到的结果比我之前的结果差一点,但是差异是很小很小的,看不出来重训重测/matlab版本会有什么影响。 没看到在30dB快速下降。但是他说他用的是0.95。

--

他又解决了,不知道怎么没有的。ReEsNet结果图比cf差了又

cherry-lyh commented 4 months ago

我相信极大概率是我的实验出现了问题,但是我解决不了,跑出来就是这样。 这是我的微信**,希望能私下再和您讨论一下,感谢您帮我解决我的问题!

dianixn commented 4 months ago

1