这篇文章主要基于Tim O’Shea的论文:Convolutional Radio Modulation Recognition
复现经典调制信号数据集进行深度学习时,使用了2018.01.OSC.0001_1024x2M.h5和RML2016.10a_dict_unix.pkl数据集进行实验。作者的源码已公开,地址如下:RML2016.10a_VTCNN2_example.ipynb。
在运行该代码时,遇到了很多bug问题。解决过程中发现,其实很多问题跟环境配置、版本兼容、tf1和tf2语言不同的关系很大。现总结如下:
1.读取数据(RML2016.10a_dict_unix.pkl数据集)
代码替换成:
trainy = list(map(lambda x: mods.index(lbl[x][0]), train_idx))
Y_train = to_onehot(trainy)
Y_test = to_onehot(list(map(lambda x: mods.index(lbl[x][0]), test_idx)))
另外,我自己补充了一段代码
classes = mods
print('数据集总数:',n_examples)
print('调制方式' , len(mods),'种:' ,mods)
print('信噪比:',snrs)
可以看到,输出
数据集总数: 220000
调制方式 11 种: ['8PSK', 'AM-DSB', 'AM-SSB', 'BPSK', 'CPFSK', 'GFSK', 'PAM4', 'QAM16', 'QAM64', 'QPSK', 'WBFM']
信噪比: [-20, -18, -16, -14, -12, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
数据集的调制方式及信噪比设置一目了然,更为直观。
2.测试段代码,查看数据是否正常,但输出图像是直线。(RML2016.10a_dict_unix.pkl数据集)
将
plt_data = X_train[sample_idx].T
改成
plt_data = X_train[sample_idx]
.T是转置,去掉即可成功显示。
3.model.summary()部分报错(RML2016.10a_dict_unix.pkl数据集)
正常运行时,应该能够输出所建网络结构,但运行源代码时,提示“没有定义网络”,百思不得其解。多次调试,发现第一层网络的Output Shape就有问题,终于找到了问题所在。
在每一层网络中补充定义语句
data_format = 'channels_first'
完美解决。
原因:作者在代码中首先将2×128的数据reshape成1×2×128,对应图像中的channel×width×height,可见是将IQ数据看成单通道的2×128大小的图像数据进行处理。“channels_first”或“channels_last”,则代表数据的通道维的位置。我所使用的是Tensorflow,默认是‘channels_last’。
用卷积神经网络处理一组彩色图片时,Caffe/Theano使用的数据格式是channels_first即:
(样本数,通道数,行数(高),列数(宽))
Tensorflow使用的数据格式是channels_last即:
(样本数,行数(高),列数(宽),通道数)
4.训练代码(RML2016.10a_dict_unix.pkl数据集)
show_accuracy=False
show_accuracy=True
两段代码删掉。
5.训练时,出现“The kernel appears to have died. It will restart automatically”问题。
几种解决思路:①选择CPU运行;
②硬件限制,batch_size和nb_epoch可能设置过大,改小一点;
③把jupyter notebook主页里所有其他running的文件全部shutdown。(重点)
6.出现'str' object has no attribute 'decode'的报错。
这个真的是困惑了半天,百度的解决方案都是说“删除decode(‘utf-8’)”,但是代码里并没有涉及decode及'utf-8'的编码模式,后来发现错误指向
model.load_weights(filepath)
参考查到的几个方法:
解决方法1:将'.h5'换成'.tf'模型存储。亲测失败,仅供参考。
解决方法2:h5py版本过高导致,降h5py版本。
pip install h5py==2.10.0
成功解决问题,亲测可行。
7. 报错“OOM when allocating tensor with shape[1000,32,1024,3] and type float on /job:localhost/replica:0/ta……”
原因是GPU OOM内存不够,OOM即ran out of memory。因此可尝试改成批处理,即将训练的数据块调小。最直观的方式就是减小batch_size或者hidden_layer中的单元数。参考博文
8.构建模型时,报错“module 'tensorflow' has no attribute 'get_default_graph'”、“ModelCheckpoint' object has no attribute 'on_train_batch_begin”等类似问题。
原因是keras和tensorflow版本不适配。但由于后面代码需要低版本的Keras,所以不能升级Keras版本。具体版本对应关系可参考:Python、tensorflow、Keras版本对应关系。
解决方法(适用于TF2):使用TensorFlow实现tf.keras。
必须确保使用正确的导入:
from tensorflow import keras
而不是直接使用:import keras。
在要使用keras下的其他模块时:
from tensorflow.keras import
而不是使用from keras import。
将代码中的keras.callbacks替换成tf.keras.callbacks(前面记得import tensorflow as tf)。
9.报错“Failed to get convolution algorithm. This is probably because cuDNN failed to initialize”
原因是GPU显存不够,添加代码段:
from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession
config = ConfigProto()
config.gpu_options.allow_growth = True
session = InteractiveSession(config=config)
对GPU动态分配。