使用RML2016.10a数据集进行深度学习时源代码出现的bug汇总(更新中)

  这篇文章主要基于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动态分配。


你可能感兴趣的:(深度学习,caffe,神经网络)