├── Modulation_Classification.ipynb
└── README.md
/Modulation_Classification.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "name": "Modulation_Classification.ipynb",
7 | "provenance": [],
8 | "collapsed_sections": [],
9 | "include_colab_link": true
10 | },
11 | "kernelspec": {
12 | "name": "python3",
13 | "display_name": "Python 3"
14 | },
15 | "accelerator": "GPU"
16 | },
17 | "cells": [
18 | {
19 | "cell_type": "markdown",
20 | "metadata": {
21 | "id": "view-in-github",
22 | "colab_type": "text"
23 | },
24 | "source": [
25 | "
"
26 | ]
27 | },
28 | {
29 | "cell_type": "code",
30 | "metadata": {
31 | "id": "sq1DUBUZEgXU",
32 | "colab_type": "code",
33 | "colab": {}
34 | },
35 | "source": [
36 | "# Import all the things we need ---\n",
37 | "# by setting env variables before Keras import you can set up which backend and which GPU it uses\n",
38 | "\n",
39 | "#Tried the new RAdam optimizer. Didn't seem to work as well as the \"normal\" adam optimizer.\n",
40 | "#!pip install keras-rectified-adam \n",
41 | "#from keras_radam import RAdam\n",
42 | "\n",
43 | "%matplotlib inline\n",
44 | "import os,random\n",
45 | "import pandas as pd\n",
46 | "import tensorflow as tf\n",
47 | "import numpy as np\n",
48 | "from keras.utils import np_utils\n",
49 | "import keras.models as models\n",
50 | "from keras.layers.core import Reshape,Dense,Dropout,Activation,Flatten\n",
51 | "from keras.layers.noise import GaussianNoise\n",
52 | "from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D\n",
53 | "from keras.regularizers import *\n",
54 | "from keras.optimizers import adam\n",
55 | "import matplotlib.pyplot as plt\n",
56 | "import seaborn as sns\n",
57 | "import pickle, random, sys, keras"
58 | ],
59 | "execution_count": 0,
60 | "outputs": []
61 | },
62 | {
63 | "cell_type": "code",
64 | "metadata": {
65 | "id": "u9IYOV5KHdHp",
66 | "colab_type": "code",
67 | "colab": {}
68 | },
69 | "source": [
70 | "tf.test.gpu_device_name() "
71 | ],
72 | "execution_count": 0,
73 | "outputs": []
74 | },
75 | {
76 | "cell_type": "code",
77 | "metadata": {
78 | "id": "RyRRA8rEsboc",
79 | "colab_type": "code",
80 | "colab": {}
81 | },
82 | "source": [
83 | "from google.colab import drive\n",
84 | "drive.mount('/content/gdrive/', force_remount=True)"
85 | ],
86 | "execution_count": 0,
87 | "outputs": []
88 | },
89 | {
90 | "cell_type": "code",
91 | "metadata": {
92 | "id": "3FPw5lblxOkO",
93 | "colab_type": "code",
94 | "colab": {}
95 | },
96 | "source": [
97 | "#This line checks that the drive was mounted\n",
98 | "!ls \"/content/gdrive/My Drive/Colab Notebooks/\""
99 | ],
100 | "execution_count": 0,
101 | "outputs": []
102 | },
103 | {
104 | "cell_type": "code",
105 | "metadata": {
106 | "id": "BrJzysKJFa_d",
107 | "colab_type": "code",
108 | "outputId": "43dbce2a-e359-48fc-e2a4-a6a5c56c9416",
109 | "colab": {
110 | "base_uri": "https://localhost:8080/",
111 | "height": 35
112 | }
113 | },
114 | "source": [
115 | "# Load the dataset ...\n",
116 | "# You will need to seperately download or generate this file\n",
117 | "# The output format looks like this\n",
118 | "# {('mod type', SNR): np.array(nvecs_per_key, 2, vec_length), etc}\n",
119 | "#Xd = pickle.load(open(\"gdrive/My Drive/Colab Notebooks/RML2016.10a_dict.pkl\",'rb'), encoding='Latin1')\n",
120 | "Xraw = pickle.load(open(\"gdrive/My Drive/Colab Notebooks/RML2016.10a_dict.pkl\",'rb'), encoding='Latin1')\n",
121 | "\n",
122 | "#This for loop takes out the low SNR signals and keeps only items with SNR greater than the SNR value\n",
123 | "Xd = {}\n",
124 | "SNR = 6\n",
125 | "for key in Xraw.keys():\n",
126 | " if key[1] > SNR:\n",
127 | " Xd[key] = Xraw[key]\n",
128 | "\n",
129 | "print(Xd[('QPSK', 10)].shape)"
130 | ],
131 | "execution_count": 0,
132 | "outputs": [
133 | {
134 | "output_type": "stream",
135 | "text": [
136 | "(1000, 2, 128)\n"
137 | ],
138 | "name": "stdout"
139 | }
140 | ]
141 | },
142 | {
143 | "cell_type": "code",
144 | "metadata": {
145 | "id": "MsM4S3MDwrnV",
146 | "colab_type": "code",
147 | "outputId": "cea2d3f9-e9cd-43b9-df7b-1e5029042507",
148 | "colab": {
149 | "base_uri": "https://localhost:8080/",
150 | "height": 53
151 | }
152 | },
153 | "source": [
154 | "#Separate out SNR and Modulation from the Xd.keys() and put into two lists\n",
155 | "snr = []\n",
156 | "mod = []\n",
157 | "for key in Xd.keys():\n",
158 | " snr.append(key[1])\n",
159 | " mod.append(key[0])\n",
160 | "LABELS = list(dict.fromkeys(mod))\n",
161 | "SNR = list(dict.fromkeys(snr))\n",
162 | "print(LABELS)\n",
163 | "print(SNR)"
164 | ],
165 | "execution_count": 0,
166 | "outputs": [
167 | {
168 | "output_type": "stream",
169 | "text": [
170 | "['PAM4', 'QAM64', 'AM-SSB', '8PSK', 'AM-DSB', 'CPFSK', 'QAM16', 'QPSK', 'GFSK', 'BPSK', 'WBFM']\n",
171 | "[8, 12, 16, 10, 14, 18]\n"
172 | ],
173 | "name": "stdout"
174 | }
175 | ]
176 | },
177 | {
178 | "cell_type": "code",
179 | "metadata": {
180 | "id": "E63snOOq8ht3",
181 | "colab_type": "code",
182 | "colab": {}
183 | },
184 | "source": [
185 | "test = np.asarray(Xd[('QPSK', 10)][0,:])\n",
186 | "test_reshaped = np.expand_dims(test.T,0)\n",
187 | "\n",
188 | "MULTI_LABELS = []\n",
189 | "lbl_multidict = {}\n",
190 | "snr = []\n",
191 | "i = 0\n",
192 | "\n",
193 | "#decimal encode all dictionary itesms\n",
194 | "for key in Xd.keys():\n",
195 | " lbl_multidict[key] = key[0]\n",
196 | " #snr.append(key[1])\n",
197 | " i += 1\n",
198 | "print('lbl_multidict:',lbl_multidict)\n",
199 | "#print(np.asarray(snr).shape)\n",
200 | " \n",
201 | "data_list = list()\n",
202 | "for key in Xd.keys():\n",
203 | " for i in range(1000):\n",
204 | " data_list.append(np.expand_dims(Xd[key][i,:].T,0)) #list.append(np.expand_dims(Xd[key][i,:].T,0)\n",
205 | " MULTI_LABELS.append(lbl_multidict[key])\n",
206 | " snr.append(key[1])\n",
207 | "print('MULTI_LABELS=', MULTI_LABELS)\n",
208 | "data_array = np.asarray(np.vstack(data_list))\n",
209 | "MULTI_LABELS = np.asarray(MULTI_LABELS).reshape(1, -1).T #MULTI_LABELS = np.asarray(MULTI_LABELS).reshape(1, -1).T\n",
210 | "print('shape of data to load into the CNN:', data_array.shape)\n",
211 | "print('shape of the ydata:', MULTI_LABELS.shape)\n",
212 | "print('shape of snr:', np.asarray(snr).reshape(1,-1).T.shape)\n",
213 | "#from keras.utils import to_categorical\n",
214 | "#ydata_binary = to_categorical(MULTI_LABELS)\n",
215 | "\n",
216 | "from sklearn.preprocessing import OneHotEncoder\n",
217 | "encode = OneHotEncoder()\n",
218 | "#lbl_encode = OneHotEncoder()\n",
219 | "ydata_binary = encode.fit_transform(MULTI_LABELS).toarray()\n",
220 | "#Y_LABELS = lbl_encode.fit_transform(np.asarray(LABELS).reshape(1,-1))\n",
221 | "print(ydata_binary[1])\n",
222 | "print(ydata_binary.shape)\n",
223 | "#print('LABELS:', LABELS)\n",
224 | "#print('Y_LABELS', Y_LABELS)"
225 | ],
226 | "execution_count": 0,
227 | "outputs": []
228 | },
229 | {
230 | "cell_type": "markdown",
231 | "metadata": {
232 | "id": "c9ePiMZx7jDD",
233 | "colab_type": "text"
234 | },
235 | "source": [
236 | "Data is processed. Column data are a two variable label composed of the Modulation and SNR, Row 0 is the binary encoded version of the Modulation and SNR,\n",
237 | "Row 1 is the actual data, each column is a 2, 128 array of I and Q data for the specified Modulation and SNR in the column label"
238 | ]
239 | },
240 | {
241 | "cell_type": "code",
242 | "metadata": {
243 | "id": "xIeCZyZ27_4S",
244 | "colab_type": "code",
245 | "outputId": "448f22cf-549b-4bd4-a592-6da953be74c8",
246 | "colab": {
247 | "base_uri": "https://localhost:8080/",
248 | "height": 125
249 | }
250 | },
251 | "source": [
252 | "#This splits the ENCODED_X dataframe into Train and Test sets\n",
253 | "from sklearn.model_selection import train_test_split, ShuffleSplit\n",
254 | "xTrain, xTest, yTrain, yTest = train_test_split(data_array, ydata_binary, test_size = 0.3, random_state = 0)\n",
255 | "snr_train, snr_test = train_test_split(np.asarray(snr), test_size = 0.3, random_state = 0) #This should work because I initialize the random state so it will always come up with the same indexes\n",
256 | "print('xTrain.shape:', xTrain.shape)\n",
257 | "print('xTest.shape:', xTest.shape)\n",
258 | "print('yTrain.shape:', yTrain.shape)\n",
259 | "print('yTest.shape:', yTest.shape)\n",
260 | "print('snr_train.shape:', snr_train.shape)\n",
261 | "print('snr_test.shape:', snr_test.shape)"
262 | ],
263 | "execution_count": 0,
264 | "outputs": [
265 | {
266 | "output_type": "stream",
267 | "text": [
268 | "xTrain.shape: (46200, 128, 2)\n",
269 | "xTest.shape: (19800, 128, 2)\n",
270 | "yTrain.shape: (46200, 11)\n",
271 | "yTest.shape: (19800, 11)\n",
272 | "snr_train.shape: (46200,)\n",
273 | "snr_test.shape: (19800,)\n"
274 | ],
275 | "name": "stdout"
276 | }
277 | ]
278 | },
279 | {
280 | "cell_type": "markdown",
281 | "metadata": {
282 | "id": "or2_fLuM9hAD",
283 | "colab_type": "text"
284 | },
285 | "source": [
286 | "Now we build the CNN"
287 | ]
288 | },
289 | {
290 | "cell_type": "code",
291 | "metadata": {
292 | "id": "-qHseXnJ9jfy",
293 | "colab_type": "code",
294 | "outputId": "e7a63b28-c00b-45ac-991d-7fc901760226",
295 | "colab": {
296 | "base_uri": "https://localhost:8080/",
297 | "height": 431
298 | }
299 | },
300 | "source": [
301 | "from keras.models import Sequential\n",
302 | "from keras.layers import Dense, Activation, Dropout, Conv1D, MaxPooling1D, GlobalAveragePooling1D, Flatten\n",
303 | "\n",
304 | "verbose, epochs, batch_size = 1, 256, 1024\n",
305 | "n_timesteps, n_features, n_outputs = xTrain.shape[1], xTrain.shape[2], yTrain.shape[1]\n",
306 | "print('timesteps=', n_timesteps, 'features=', n_features, 'outputs=', n_outputs)\n",
307 | "model = Sequential()\n",
308 | "model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_timesteps, n_features)))\n",
309 | "model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))\n",
310 | "model.add(Dropout(0.5))\n",
311 | "model.add(MaxPooling1D(pool_size=2))\n",
312 | "model.add(Flatten())\n",
313 | "model.add(Dense(100, activation='relu'))\n",
314 | "model.add(Dense(n_outputs, activation='softmax'))\n",
315 | "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
316 | "#model.compile(RAdam(), loss='categorical_crossentropy', metrics=['accuracy'])\n",
317 | "print(model.summary())"
318 | ],
319 | "execution_count": 0,
320 | "outputs": [
321 | {
322 | "output_type": "stream",
323 | "text": [
324 | "timesteps= 128 features= 2 outputs= 11\n",
325 | "_________________________________________________________________\n",
326 | "Layer (type) Output Shape Param # \n",
327 | "=================================================================\n",
328 | "conv1d_13 (Conv1D) (None, 126, 64) 448 \n",
329 | "_________________________________________________________________\n",
330 | "conv1d_14 (Conv1D) (None, 124, 64) 12352 \n",
331 | "_________________________________________________________________\n",
332 | "dropout_7 (Dropout) (None, 124, 64) 0 \n",
333 | "_________________________________________________________________\n",
334 | "max_pooling1d_7 (MaxPooling1 (None, 62, 64) 0 \n",
335 | "_________________________________________________________________\n",
336 | "flatten_7 (Flatten) (None, 3968) 0 \n",
337 | "_________________________________________________________________\n",
338 | "dense_13 (Dense) (None, 100) 396900 \n",
339 | "_________________________________________________________________\n",
340 | "dense_14 (Dense) (None, 11) 1111 \n",
341 | "=================================================================\n",
342 | "Total params: 410,811\n",
343 | "Trainable params: 410,811\n",
344 | "Non-trainable params: 0\n",
345 | "_________________________________________________________________\n",
346 | "None\n"
347 | ],
348 | "name": "stdout"
349 | }
350 | ]
351 | },
352 | {
353 | "cell_type": "code",
354 | "metadata": {
355 | "id": "px21qK2-Fvwr",
356 | "colab_type": "code",
357 | "colab": {}
358 | },
359 | "source": [
360 | "#Train the model\n",
361 | "print(xTrain.shape, yTrain.shape)\n",
362 | "model.fit(xTrain, yTrain, batch_size=batch_size, epochs=epochs, verbose=verbose)\n"
363 | ],
364 | "execution_count": 0,
365 | "outputs": []
366 | },
367 | {
368 | "cell_type": "code",
369 | "metadata": {
370 | "id": "9kMASu5OGrj7",
371 | "colab_type": "code",
372 | "colab": {}
373 | },
374 | "source": [
375 | "def save_model(model_name):\n",
376 | " # serialize model to JSON\n",
377 | " model_json = model.to_json()\n",
378 | " with open(\"gdrive/My Drive/Colab Notebooks/model.json\", \"w\") as json_file:\n",
379 | " json_file.write(model_json)\n",
380 | " print(\"JSON file saved\")\n",
381 | " # serialize weights to HDF5\n",
382 | " model.save_weights(\"gdrive/My Drive/Colab Notebooks/model.h5\")\n",
383 | " print(\"Saved model to disk\")\n",
384 | " \n",
385 | " from keras.utils import plot_model\n",
386 | " plot_model(model, to_file='/content/gdrive/My Drive/Colab Notebooks/model.png')\n",
387 | " "
388 | ],
389 | "execution_count": 0,
390 | "outputs": []
391 | },
392 | {
393 | "cell_type": "code",
394 | "metadata": {
395 | "id": "MGAboYMIHApc",
396 | "colab_type": "code",
397 | "colab": {}
398 | },
399 | "source": [
400 | "def load_model():\n",
401 | " # load json and create model\n",
402 | " from keras.models import model_from_json\n",
403 | " json_file = open('gdrive/My Drive/Colab Notebooks/model.json', 'r')\n",
404 | " loaded_model_json = json_file.read()\n",
405 | " json_file.close()\n",
406 | " loaded_model = model_from_json(loaded_model_json)\n",
407 | " # load weights into new model\n",
408 | " loaded_model.load_weights(\"gdrive/My Drive/Colab Notebooks/model.h5\")\n",
409 | " print(\"Loaded model from disk\")\n",
410 | " return loaded_model"
411 | ],
412 | "execution_count": 0,
413 | "outputs": []
414 | },
415 | {
416 | "cell_type": "code",
417 | "metadata": {
418 | "id": "EBW8Pt791FXv",
419 | "colab_type": "code",
420 | "colab": {}
421 | },
422 | "source": [
423 | "#save_model(model)"
424 | ],
425 | "execution_count": 0,
426 | "outputs": []
427 | },
428 | {
429 | "cell_type": "code",
430 | "metadata": {
431 | "id": "3953h_nzITaK",
432 | "colab_type": "code",
433 | "colab": {}
434 | },
435 | "source": [
436 | "#Loaded_model = load_model()\n",
437 | "# evaluate loaded model on test data\n",
438 | "#loaded_model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])\n",
439 | "#Loaded_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
440 | "#score = Loaded_model.evaluate(xTest, yTest, verbose=0)\n",
441 | "#print(\"%s: %.2f%%\" % (Loaded_model.metrics_names[1], score[1]*100))"
442 | ],
443 | "execution_count": 0,
444 | "outputs": []
445 | },
446 | {
447 | "cell_type": "code",
448 | "metadata": {
449 | "id": "129VO0TPxmlT",
450 | "colab_type": "code",
451 | "outputId": "c192e33a-c5aa-43cc-b4f0-f1ef411f8fd6",
452 | "colab": {
453 | "base_uri": "https://localhost:8080/",
454 | "height": 53
455 | }
456 | },
457 | "source": [
458 | "accuracy = model.evaluate(xTest, yTest, batch_size=batch_size, verbose=1)\n",
459 | "#print(accuracy)\n",
460 | "print(\"%s: %.2f%%\" % (model.metrics_names[1], score[1]*100))"
461 | ],
462 | "execution_count": 0,
463 | "outputs": [
464 | {
465 | "output_type": "stream",
466 | "text": [
467 | "19800/19800 [==============================] - 0s 15us/step\n",
468 | "acc: 79.12%\n"
469 | ],
470 | "name": "stdout"
471 | }
472 | ]
473 | },
474 | {
475 | "cell_type": "code",
476 | "metadata": {
477 | "id": "1538Lfseh714",
478 | "colab_type": "code",
479 | "colab": {}
480 | },
481 | "source": [
482 | "prediction = model.predict(xTest)\n",
483 | "Y_pred = []\n",
484 | "Y_test = []\n",
485 | "print(np.argmax(prediction[0,:]))\n",
486 | "print(np.argmax(yTest[0]))\n",
487 | "for i in range(len(prediction[:,0])):\n",
488 | " Y_pred.append(np.argmax(prediction[i,:]))\n",
489 | " Y_test.append(np.argmax(yTest[i]))\n",
490 | "print(Y_pred)\n",
491 | "print(Y_test)\n"
492 | ],
493 | "execution_count": 0,
494 | "outputs": []
495 | },
496 | {
497 | "cell_type": "code",
498 | "metadata": {
499 | "id": "Jy3hHRRmPdMo",
500 | "colab_type": "code",
501 | "colab": {}
502 | },
503 | "source": [
504 | "def show_confusion_matrix(validations, predictions):\n",
505 | " from sklearn.metrics import confusion_matrix\n",
506 | " matrix = confusion_matrix(validations, predictions)\n",
507 | " plt.figure(figsize=(6,4))\n",
508 | " sns.heatmap(matrix, cmap='Blues', linecolor = 'black', linewidth = '1', xticklabels = LABELS, yticklabels = LABELS, annot = True, fmt = 'd')\n",
509 | " plt.title(\"Confusion Matrix\")\n",
510 | " plt.ylabel('True Label')\n",
511 | " plt.xlabel('Predicted Label')\n",
512 | " plt.show()\n"
513 | ],
514 | "execution_count": 0,
515 | "outputs": []
516 | },
517 | {
518 | "cell_type": "code",
519 | "metadata": {
520 | "id": "Uhr9V46tfL9S",
521 | "colab_type": "code",
522 | "outputId": "c12f9f29-dd79-4e38-b418-d0f3f7ec7c18",
523 | "colab": {
524 | "base_uri": "https://localhost:8080/",
525 | "height": 325
526 | }
527 | },
528 | "source": [
529 | "show_confusion_matrix(Y_pred, Y_test)"
530 | ],
531 | "execution_count": 0,
532 | "outputs": [
533 | {
534 | "output_type": "display_data",
535 | "data": {
536 | "image/png": "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\nRU5ErkJggg==\n",
537 | "text/plain": [
538 | ""
539 | ]
540 | },
541 | "metadata": {
542 | "tags": []
543 | }
544 | }
545 | ]
546 | }
547 | ]
548 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Modulation_Classification
2 | Using CNN to classify RF modulation data.
3 |
4 |
5 | Dataset is from: https://www.deepsig.ai/datasets
6 |
7 | I attempted to recreate the results of Tim O'Shea in this paper:
8 | Over the Air Deep Learning
9 | Based Radio Signal Classification
10 | https://arxiv.org/pdf/1712.04578.pdf
11 |
12 |
13 | While I accomplished it slightly different I believe that it did verify
14 | and recreate the results in the paper.
15 |
16 | Enjoy.
17 |
--------------------------------------------------------------------------------