├── Communication_Autoencoder_with_WGAN_alternating_Training.ipynb ├── Communication_Autoencoder_with_WGAN_and_pre_Autoencoder.ipynb ├── README.md └── WGAN_Channel_Estimation.ipynb /Communication_Autoencoder_with_WGAN_alternating_Training.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Communication Autoencoder with WGAN alternating Training.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "include_colab_link": true 10 | }, 11 | "kernelspec": { 12 | "name": "python3", 13 | "display_name": "Python 3" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "markdown", 19 | "metadata": { 20 | "id": "view-in-github", 21 | "colab_type": "text" 22 | }, 23 | "source": [ 24 | "\"Open" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "metadata": { 30 | "id": "Y3Mvn1V30ejH", 31 | "colab_type": "code", 32 | "outputId": "59ff20e9-dd59-4b2d-ee0b-135f013940ab", 33 | "colab": { 34 | "base_uri": "https://localhost:8080/", 35 | "height": 644 36 | } 37 | }, 38 | "source": [ 39 | "!pip install tensorflow==2.0.0\n", 40 | "import numpy as np\n", 41 | "%matplotlib inline\n", 42 | "import matplotlib.pyplot as plt \n", 43 | "import warnings\n", 44 | "with warnings.catch_warnings():\n", 45 | " warnings.filterwarnings(\"ignore\",category=FutureWarning)\n", 46 | " import tensorflow as tf\n", 47 | "import os\n", 48 | "tf.__version__\n", 49 | "from tensorflow import keras\n", 50 | "import time\n", 51 | "from __future__ import absolute_import, division, print_function, unicode_literals\n", 52 | "import pandas as pd\n", 53 | "import sys\n", 54 | "assert sys.version_info >= (3, 5)\n", 55 | "%matplotlib inline\n", 56 | "import matplotlib as mpl\n", 57 | "mpl.rc('axes', labelsize=14)\n", 58 | "mpl.rc('xtick', labelsize=12)\n", 59 | "mpl.rc('ytick', labelsize=12)\n", 60 | "import tensorflow as tf\n", 61 | "from tensorflow import keras\n", 62 | "from sklearn.preprocessing import OneHotEncoder\n", 63 | "import pandas as pd\n", 64 | "from scipy import special\n", 65 | "from tensorflow.keras import layers\n", 66 | "np.random.seed(42)\n", 67 | "tf.random.set_seed(42)" 68 | ], 69 | "execution_count": 0, 70 | "outputs": [ 71 | { 72 | "output_type": "stream", 73 | "text": [ 74 | "Requirement already satisfied: tensorflow==2.0.0 in /usr/local/lib/python3.6/dist-packages (2.0.0)\n", 75 | "Requirement already satisfied: google-pasta>=0.1.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (0.1.8)\n", 76 | "Requirement already satisfied: wrapt>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.11.2)\n", 77 | "Requirement already satisfied: tensorboard<2.1.0,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (2.0.2)\n", 78 | "Requirement already satisfied: protobuf>=3.6.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (3.10.0)\n", 79 | "Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.15.0)\n", 80 | "Requirement already satisfied: gast==0.2.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (0.2.2)\n", 81 | "Requirement already satisfied: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (0.8.1)\n", 82 | "Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (3.1.0)\n", 83 | "Requirement already satisfied: numpy<2.0,>=1.16.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.17.4)\n", 84 | "Requirement already satisfied: tensorflow-estimator<2.1.0,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (2.0.1)\n", 85 | "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.1.0)\n", 86 | "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.12.0)\n", 87 | "Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (0.33.6)\n", 88 | "Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.1.0)\n", 89 | "Requirement already satisfied: absl-py>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (0.8.1)\n", 90 | "Requirement already satisfied: keras-applications>=1.0.8 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.0.8)\n", 91 | "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (3.1.1)\n", 92 | "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.4.1)\n", 93 | "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.16.0)\n", 94 | "Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (2.21.0)\n", 95 | "Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (42.0.2)\n", 96 | "Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (1.10.0)\n", 97 | "Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.8->tensorflow==2.0.0) (2.8.0)\n", 98 | "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (1.3.0)\n", 99 | "Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.21.0->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (2.8)\n", 100 | "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.21.0->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (3.0.4)\n", 101 | "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.21.0->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (2019.11.28)\n", 102 | "Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.21.0->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (1.24.3)\n", 103 | "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.2.7)\n", 104 | "Requirement already satisfied: rsa<4.1,>=3.1.4 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (4.0)\n", 105 | "Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (4.0.0)\n", 106 | "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (3.1.0)\n", 107 | "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.6/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.4.8)\n" 108 | ], 109 | "name": "stdout" 110 | } 111 | ] 112 | }, 113 | { 114 | "cell_type": "markdown", 115 | "metadata": { 116 | "id": "1wlZswcMF7Rt", 117 | "colab_type": "text" 118 | }, 119 | "source": [ 120 | "#### Vergleich\n", 121 | "Als erstes für feste $k$ und $n$, was sich ändert ist die Samplesize, Anzahl der Samples und SNR" 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": { 127 | "id": "4qpY-gawAf-9", 128 | "colab_type": "text" 129 | }, 130 | "source": [ 131 | "###Systemparameter\n", 132 | "ACHTUNG: CHANNELANZAHL WURDE UNTERSCHIEDLICH VERWENDET \\\\\n", 133 | "$k$ - die Anzhal der bits \\\\\n", 134 | "$M$ - Anzahl der unterschiedlichen Nachrichten \\\\\n", 135 | "$n$ - channel uses\\\\\n", 136 | "$N$ - Länge des Rauschvektors" 137 | ] 138 | }, 139 | { 140 | "cell_type": "code", 141 | "metadata": { 142 | "colab_type": "code", 143 | "id": "czeNNfpY1qc2", 144 | "outputId": "19e61ac6-dbb9-4cd8-94fc-cc935b01f438", 145 | "colab": { 146 | "base_uri": "https://localhost:8080/", 147 | "height": 35 148 | } 149 | }, 150 | "source": [ 151 | "k = 4 # Number of information bits per message, i.e., M=2**k\n", 152 | "M = 2**k\n", 153 | "n = 2 # Number of real channel uses per message\n", 154 | "#k = int(np.log2(M))\n", 155 | "#n = 2\n", 156 | "print(M)\n", 157 | "\n", 158 | "SNR = 7\n" 159 | ], 160 | "execution_count": 0, 161 | "outputs": [ 162 | { 163 | "output_type": "stream", 164 | "text": [ 165 | "16\n" 166 | ], 167 | "name": "stdout" 168 | } 169 | ] 170 | }, 171 | { 172 | "cell_type": "markdown", 173 | "metadata": { 174 | "id": "BA4TqJBOXXIg", 175 | "colab_type": "text" 176 | }, 177 | "source": [ 178 | "## Training Parameter" 179 | ] 180 | }, 181 | { 182 | "cell_type": "code", 183 | "metadata": { 184 | "id": "aJZ_cnp9V-Q6", 185 | "colab_type": "code", 186 | "colab": {} 187 | }, 188 | "source": [ 189 | "gen_learning_rate=0.0001 \n", 190 | "disc_learning_rate = 0.0001 # 0.0001 " 191 | ], 192 | "execution_count": 0, 193 | "outputs": [] 194 | }, 195 | { 196 | "cell_type": "markdown", 197 | "metadata": { 198 | "id": "tb-DiBwSN255", 199 | "colab_type": "text" 200 | }, 201 | "source": [ 202 | "### Different Layers" 203 | ] 204 | }, 205 | { 206 | "cell_type": "code", 207 | "metadata": { 208 | "id": "hFMMLrY0LthL", 209 | "colab_type": "code", 210 | "colab": {} 211 | }, 212 | "source": [ 213 | "randN_initial = keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)\n", 214 | "ones_initial = keras.initializers.GlorotNormal()\n", 215 | "\n", 216 | "EncIn = tf.keras.layers.Input(shape=(M,))#, dtype= tf.int32)\n", 217 | "e1 = tf.keras.layers.Dense(2*n, activation=None)\n", 218 | "e2 = tf.keras.layers.Lambda(lambda x:tf.reshape(x, shape=[-1,int(n/2),2]))\n", 219 | "EncOut = tf.keras.layers.Lambda(lambda x: x/tf.sqrt(2*tf.reduce_mean(tf.square(x))))\n", 220 | "GenIn = tf.keras.layers.Lambda(lambda x:tf.reshape(x,(tf.shape(x)[0],-1)))\n", 221 | "# = tf.keras.layers.Lambda(generator)\n", 222 | "DecIn = tf.keras.layers.Lambda(lambda x:tf.reshape(x, shape=[-1,int(n/2),2]))\n", 223 | "d1 = tf.keras.layers.Lambda(lambda x:tf.reshape(x, shape=[-1,n]))\n", 224 | "d2 = tf.keras.layers.Dense(M, activation='relu')\n", 225 | "DecOut = tf.keras.layers.Dense(M, activation='softmax')\n", 226 | "\n", 227 | "\n", 228 | "#noise_std = EbNo_to_noise(TRAINING_SNR)\n", 229 | "# custom functions / layers without weights\n", 230 | "norm_layer = keras.layers.Lambda(lambda x: tf.divide(x,tf.sqrt(2*tf.reduce_mean(tf.square(x)))))\n", 231 | "shape_layer = keras.layers.Lambda(lambda x: tf.reshape(x, shape=[-1,2,n]))\n", 232 | "shape_layer2 = keras.layers.Lambda(lambda x: tf.reshape(x, shape=[-1,n]))\n", 233 | "channel_layer = keras.layers.Lambda(lambda x: x + tf.random.normal(tf.shape(x), mean=0.0, stddev=noise_std))" 234 | ], 235 | "execution_count": 0, 236 | "outputs": [] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "metadata": { 241 | "id": "7J96hJhKO9VJ", 242 | "colab_type": "text" 243 | }, 244 | "source": [ 245 | "### Help functions" 246 | ] 247 | }, 248 | { 249 | "cell_type": "code", 250 | "metadata": { 251 | "id": "uV7pjryDv4M4", 252 | "colab_type": "code", 253 | "outputId": "79924a8e-3d6d-4005-a4e9-5e046efc7ecb", 254 | "colab": { 255 | "base_uri": "https://localhost:8080/", 256 | "height": 53 257 | } 258 | }, 259 | "source": [ 260 | "def EbNo2Sigma(ebnodb):\n", 261 | " '''Convert Eb/No in dB to noise standard deviation'''\n", 262 | " ebno = 10**(ebnodb/10)\n", 263 | " return 1/np.sqrt(2*(2*k/n)*ebno)\n", 264 | "\n", 265 | "def EbNo_to_noise(ebnodb):\n", 266 | " '''Transform EbNo[dB]/snr to noise power'''\n", 267 | " ebno = 10**(ebnodb/10)\n", 268 | " noise_std = 1/np.sqrt(2*(2*k/n)*ebno) \n", 269 | " return noise_std\n", 270 | "\n", 271 | "\n", 272 | "def real_channel(x,noise_std):\n", 273 | " # Black-box Channel\n", 274 | " #AWGN\n", 275 | " return x + tf.random.normal(tf.shape(x), mean=0.0, stddev=noise_std)\n", 276 | "\n", 277 | "def rayleigh_channel(x,noise_std):\n", 278 | " return x + tf.sqrt(tf.square(tf.random.normal(tf.shape(x), mean=0.0, stddev=noise_std)) + tf.square(tf.random.normal(tf.shape(x), mean=0.0, stddev=noise_std)))\n", 279 | " \n", 280 | " #Uniform U(-3;3) \n", 281 | " #return x + tf.random_uniform(tf.shape(x), minval=-2, maxval=2)\n", 282 | "\n", 283 | "def B_Ber(input_msg, msg):\n", 284 | " '''Calculate the Batch Bit Error Rate'''\n", 285 | " pred_error = tf.not_equal(tf.argmax(msg, 1), tf.argmax(input_msg, 1))\n", 286 | " bber = tf.reduce_mean(tf.cast(pred_error, tf.float32))\n", 287 | " return bber\n", 288 | "\n", 289 | "def random_sample(batch_size=32):\n", 290 | " msg = np.random.randint(M, size=batch_size)\n", 291 | " return msg\n", 292 | "\n", 293 | "\n", 294 | "\n", 295 | "\n", 296 | "def B_Ber_m(input_msg, msg):\n", 297 | " '''Calculate the Batch Bit Error Rate'''\n", 298 | " pred_error = tf.not_equal(input_msg, tf.argmax(msg, 1)) \n", 299 | " bber = tf.reduce_mean(tf.cast(pred_error, tf.float32))\n", 300 | " return bber\n", 301 | "\n", 302 | "def SNR_to_noise(snrdb):\n", 303 | " '''Transform EbNo[dB]/snr to noise power'''\n", 304 | " snr = 10**(snrdb/10)\n", 305 | " noise_std = 1/np.sqrt(2*snr)\n", 306 | " return noise_std\n", 307 | "\n", 308 | "noise_std = EbNo2Sigma(SNR)\n", 309 | "\n", 310 | "print(EbNo2Sigma(SNR))\n", 311 | "print(EbNo_to_noise(SNR))" 312 | ], 313 | "execution_count": 0, 314 | "outputs": [ 315 | { 316 | "output_type": "stream", 317 | "text": [ 318 | "0.15792649852735607\n", 319 | "0.15792649852735607\n" 320 | ], 321 | "name": "stdout" 322 | } 323 | ] 324 | }, 325 | { 326 | "cell_type": "code", 327 | "metadata": { 328 | "id": "OBGMgdDEh7uX", 329 | "colab_type": "code", 330 | "colab": {} 331 | }, 332 | "source": [ 333 | "def test_encoding(M=16, n=1):\n", 334 | " inp = np.arange(0,M)\n", 335 | " coding = encoder.predict(inp)\n", 336 | " fig = plt.figure(figsize=(4,4))\n", 337 | " plt.plot(coding[:,0], coding[:, 1], \"b.\")\n", 338 | " plt.xlabel(\"$x_1$\", fontsize=18)\n", 339 | " plt.ylabel(\"$x_2$\", fontsize=18, rotation=0)\n", 340 | " plt.grid(True)\n", 341 | " plt.gca().set_ylim(-2, 2)\n", 342 | " plt.gca().set_xlim(-2, 2)\n", 343 | " plt.show()\n", 344 | " \n" 345 | ], 346 | "execution_count": 0, 347 | "outputs": [] 348 | }, 349 | { 350 | "cell_type": "markdown", 351 | "metadata": { 352 | "id": "AOoYuK_jR9rH", 353 | "colab_type": "text" 354 | }, 355 | "source": [ 356 | "# Models" 357 | ] 358 | }, 359 | { 360 | "cell_type": "markdown", 361 | "metadata": { 362 | "id": "PQxhmgOa0_7c", 363 | "colab_type": "text" 364 | }, 365 | "source": [ 366 | "#### Generator Model" 367 | ] 368 | }, 369 | { 370 | "cell_type": "code", 371 | "metadata": { 372 | "id": "LXbS5lM9Tb9B", 373 | "colab_type": "code", 374 | "colab": {} 375 | }, 376 | "source": [ 377 | "def get_generator(n):\n", 378 | " input1 = tf.keras.layers.Input(shape=(n,))\n", 379 | " x1 = tf.keras.layers.Dense(n,kernel_initializer=randN_initial)(input1)\n", 380 | " input2 =tf.random.normal(shape=tf.shape(input1))\n", 381 | " #input2 =tf.random.normal([tf.shape(input1)[0],n])\n", 382 | " x2 = tf.keras.layers.Dense(n,kernel_initializer=randN_initial)(input2)\n", 383 | " subtracted = tf.keras.layers.Concatenate(1)([x1, x2])\n", 384 | " h1 = tf.keras.layers.Dense(64,use_bias=True, activation='relu')(subtracted)\n", 385 | " h2 = tf.keras.layers.Dense(64,use_bias=True,kernel_initializer=ones_initial, activation='relu')(h1)\n", 386 | " out = tf.keras.layers.Dense(n, use_bias= True, activation='linear')(h2)\n", 387 | " generator = tf.keras.models.Model(inputs=[input1], outputs=out)\n", 388 | " return generator\n" 389 | ], 390 | "execution_count": 0, 391 | "outputs": [] 392 | }, 393 | { 394 | "cell_type": "markdown", 395 | "metadata": { 396 | "id": "Vt2rTP7hSFt4", 397 | "colab_type": "text" 398 | }, 399 | "source": [ 400 | "#### Discriminator Model " 401 | ] 402 | }, 403 | { 404 | "cell_type": "code", 405 | "metadata": { 406 | "id": "97h2eMLeXS68", 407 | "colab_type": "code", 408 | "colab": {} 409 | }, 410 | "source": [ 411 | "def get_discriminator(n):\n", 412 | " model = tf.keras.Sequential()\n", 413 | " model.add(tf.keras.layers.Dense(32,use_bias=True, activation='relu',input_shape=((2*n,))))\n", 414 | " model.add(tf.keras.layers.Dense(32,use_bias=True, activation='relu'))\n", 415 | " model.add(tf.keras.layers.Dense(1,use_bias=False, activation='sigmoid'))\n", 416 | " return model\n", 417 | " \n", 418 | "number_of_disc_layers = 5" 419 | ], 420 | "execution_count": 0, 421 | "outputs": [] 422 | }, 423 | { 424 | "cell_type": "code", 425 | "metadata": { 426 | "id": "CUkLPv0gvn-o", 427 | "colab_type": "code", 428 | "colab": {} 429 | }, 430 | "source": [ 431 | "generator = get_generator(n)\n", 432 | "discriminator=get_discriminator(n)" 433 | ], 434 | "execution_count": 0, 435 | "outputs": [] 436 | }, 437 | { 438 | "cell_type": "markdown", 439 | "metadata": { 440 | "id": "lcIzLZj5Seh9", 441 | "colab_type": "text" 442 | }, 443 | "source": [ 444 | "## Encoder Model" 445 | ] 446 | }, 447 | { 448 | "cell_type": "code", 449 | "metadata": { 450 | "id": "8M9_yJ1i9oW2", 451 | "colab_type": "code", 452 | "colab": {} 453 | }, 454 | "source": [ 455 | "" 456 | ], 457 | "execution_count": 0, 458 | "outputs": [] 459 | }, 460 | { 461 | "cell_type": "code", 462 | "metadata": { 463 | "id": "sNHtzAC4SPBq", 464 | "colab_type": "code", 465 | "colab": {} 466 | }, 467 | "source": [ 468 | "def get_gan_encoder(M):\n", 469 | " model = keras.models.Sequential([\n", 470 | " keras.layers.Embedding(M, M, embeddings_initializer='glorot_normal'),\n", 471 | " keras.layers.Dense(M*2, activation=\"elu\"),\n", 472 | " keras.layers.Dense(M*2, activation=\"elu\"),\n", 473 | " keras.layers.Dense(n,kernel_initializer=ones_initial, activation=None),\n", 474 | " e2,\n", 475 | " EncOut,\n", 476 | " GenIn])\n", 477 | " return model" 478 | ], 479 | "execution_count": 0, 480 | "outputs": [] 481 | }, 482 | { 483 | "cell_type": "markdown", 484 | "metadata": { 485 | "id": "G5iCDE4dSL35", 486 | "colab_type": "text" 487 | }, 488 | "source": [ 489 | "## Decoder Model" 490 | ] 491 | }, 492 | { 493 | "cell_type": "code", 494 | "metadata": { 495 | "id": "C5KjEhDvSWQR", 496 | "colab_type": "code", 497 | "colab": {} 498 | }, 499 | "source": [ 500 | "def get_gan_decoder(M):\n", 501 | " model= keras.models.Sequential([\n", 502 | " #DecIn,\n", 503 | " #d1,\n", 504 | " keras.layers.Input(shape=(n,)),\n", 505 | " keras.layers.Dense(M*2, activation=\"elu\"),\n", 506 | " keras.layers.Dense(M*2, activation=\"elu\"),\n", 507 | " keras.layers.Dense(M, activation=\"softmax\")\n", 508 | " ])\n", 509 | " return model" 510 | ], 511 | "execution_count": 0, 512 | "outputs": [] 513 | }, 514 | { 515 | "cell_type": "markdown", 516 | "metadata": { 517 | "id": "s-t76sYBtlP1", 518 | "colab_type": "text" 519 | }, 520 | "source": [ 521 | "### GAN Training functions" 522 | ] 523 | }, 524 | { 525 | "cell_type": "code", 526 | "metadata": { 527 | "id": "n15AvPFO05gd", 528 | "colab_type": "code", 529 | "colab": {} 530 | }, 531 | "source": [ 532 | "def gan_optimizers(gen_learning_rate ,disc_learning_rate):\n", 533 | " generator_optimizer = tf.keras.optimizers.RMSprop(gen_learning_rate) #RMSprop in oreder to test where the error comes from\n", 534 | " discriminator_optimizer = tf.keras.optimizers.RMSprop(disc_learning_rate) \n", 535 | " return generator_optimizer, discriminator_optimizer" 536 | ], 537 | "execution_count": 0, 538 | "outputs": [] 539 | }, 540 | { 541 | "cell_type": "code", 542 | "metadata": { 543 | "id": "ooDukkHvmduJ", 544 | "colab_type": "code", 545 | "outputId": "1972f202-a928-4f6b-8bd9-fd068ac97b65", 546 | "colab": { 547 | "base_uri": "https://localhost:8080/", 548 | "height": 53 549 | } 550 | }, 551 | "source": [ 552 | "%%time\n", 553 | "def train_gan(epochs,n_steps, batch_size, SNR_level):\n", 554 | " noise_std = EbNo2Sigma(SNR_level)\n", 555 | " start = time.time()\n", 556 | " x = tf.random.normal((batch_size,n),dtype=tf.dtypes.float32) \n", 557 | " x = x/tf.sqrt(2*tf.reduce_mean(tf.square(x)))\n", 558 | " counter = 0\n", 559 | " epoch = 0\n", 560 | " for epoch in range(epochs):\n", 561 | " counter += 1\n", 562 | " train_step(noise_std, n_steps,batch_size)\n", 563 | " if counter%100==0:\n", 564 | " tf.print(\"counter %d:\" % (counter))\n", 565 | " fake_c = generator(x)\n", 566 | " tf.print(fake_c[0])\n", 567 | " #print ('Time for epoch {} is {} sec,'.format(epoch + 1, time.time()-start))\n", 568 | " tf.print ('Time for epoch {},'.format(epoch + 1))\n", 569 | " loss.append(compute_loss(batch_size))\n", 570 | " losses.loc[len(losses)] = np.mean(loss, axis=0) \n", 571 | " tf.saved_model.save(generator,'/tmp/saved_model/')\n", 572 | " tf.print ('Time for the training is {} sec,'.format( time.time()-start))\n", 573 | " " 574 | ], 575 | "execution_count": 0, 576 | "outputs": [ 577 | { 578 | "output_type": "stream", 579 | "text": [ 580 | "CPU times: user 5 µs, sys: 0 ns, total: 5 µs\n", 581 | "Wall time: 7.87 µs\n" 582 | ], 583 | "name": "stdout" 584 | } 585 | ] 586 | }, 587 | { 588 | "cell_type": "code", 589 | "metadata": { 590 | "colab_type": "code", 591 | "id": "WE_JS7kgA1W-", 592 | "colab": {} 593 | }, 594 | "source": [ 595 | "@tf.function\n", 596 | "def train_step(noise_std,n_steps,batch_size):\n", 597 | " #x = tf.random.normal((batch_size,n),dtype=tf.dtypes.float32) \n", 598 | " #x = x/tf.sqrt(2*tf.reduce_mean(tf.square(x)))\n", 599 | " m =random_sample(batch_size)\n", 600 | " r = encoder(m)\n", 601 | " for i in range(n_steps):\n", 602 | " with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:\n", 603 | " real_training_data = tf.concat(values=[real_channel(r,noise_std), r], axis=1)\n", 604 | " fake_training_data = tf.concat(values=[generator(r),r], axis=1)\n", 605 | " real_output = discriminator(real_training_data)\n", 606 | " fake_output = discriminator(fake_training_data)\n", 607 | " \n", 608 | " \n", 609 | " #disc_loss = -tf.reduce_mean(tf.math.log(real_output) + tf.math.log(1. - fake_output))\n", 610 | " #gen_loss =-tf.reduce_mean(tf.math.log(fake_output))\n", 611 | " \n", 612 | " disc_loss = -tf.reduce_mean(real_output) + tf.reduce_mean(fake_output)\n", 613 | "\n", 614 | " #tf.print(disc_loss,gen_loss)\n", 615 | " \n", 616 | " if tf.math.is_nan(disc_loss) == False:\n", 617 | " gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)\n", 618 | " discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))\n", 619 | " t=0\n", 620 | " for t in range(number_of_disc_layers):\n", 621 | " y = tf.clip_by_value(discriminator.trainable_weights[t],clip_value_min=-0.05,clip_value_max=0.05,name=None)\n", 622 | " discriminator.trainable_weights[t].assign(y)\n", 623 | "\n", 624 | " #tf.print(discriminator.trainable_weights[1])\n", 625 | "\n", 626 | " \n", 627 | " if i == 4:\n", 628 | " fake_training_data = tf.concat(values=[generator(r),r], axis=1)\n", 629 | " fake_output = discriminator(fake_training_data)\n", 630 | " gen_loss = -tf.reduce_mean(fake_output)\n", 631 | " gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)\n", 632 | " generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))\n", 633 | "\n" 634 | ], 635 | "execution_count": 0, 636 | "outputs": [] 637 | }, 638 | { 639 | "cell_type": "code", 640 | "metadata": { 641 | "id": "y82FQj3Jmvxx", 642 | "colab_type": "code", 643 | "colab": {} 644 | }, 645 | "source": [ 646 | "def creating_and_train_gan(epochs,n_steps, batch_size, SNR_level , n ): #optional Leraning Rates\n", 647 | " generator.trainable = True\n", 648 | " train_gan(epochs, n_steps, batch_size, SNR_level)\n", 649 | " #4 after GAN training\n", 650 | " generator.trainable = False\n", 651 | " #tf.print(generator.trainable)" 652 | ], 653 | "execution_count": 0, 654 | "outputs": [] 655 | }, 656 | { 657 | "cell_type": "code", 658 | "metadata": { 659 | "id": "dLTtFoV0IoPj", 660 | "colab_type": "code", 661 | "colab": {} 662 | }, 663 | "source": [ 664 | "def gan_Test_AE(data):\n", 665 | " '''Calculate Bit Error for varying SNRs'''\n", 666 | " snr_range = np.linspace(0, 15, 31)\n", 667 | " bber_vec = [None] * len(snr_range)\n", 668 | " \n", 669 | " for db in range(len(snr_range)): \n", 670 | " noise_std = EbNo_to_noise(snr_range[db])\n", 671 | " code_word = encoder(data)\n", 672 | " rcvd_word = code_word + tf.random.normal(tf.shape(code_word), mean=0.0, stddev=noise_std)\n", 673 | " dcoded_msg = decoder(rcvd_word)\n", 674 | " bber_vec[db] = B_Ber_m(data, dcoded_msg)\n", 675 | " if (db % 6 == 0) & (db > 0):\n", 676 | " print(f'Progress: {db} of {30} parts')\n", 677 | "\n", 678 | " return (snr_range, bber_vec)\n", 679 | "\n", 680 | "def Test_AE_rayleigh(data):\n", 681 | " '''Calculate Bit Error for varying SNRs'''\n", 682 | " snr_range = np.linspace(0, 15, 31)\n", 683 | " bber_vec = [None] * len(snr_range)\n", 684 | " \n", 685 | " for db in range(len(snr_range)): \n", 686 | " noise_std = EbNo_to_noise(snr_range[db])\n", 687 | " code_word = encoder(data)\n", 688 | " rcvd_word = rayleigh_channel(code_word, noise_std)\n", 689 | " dcoded_msg = decoder(rcvd_word)\n", 690 | " bber_vec[db] = B_Ber_m(data, dcoded_msg)\n", 691 | " if (db % 6 == 0) & (db > 0):\n", 692 | " print(f'Progress: {db} of {30} parts')\n", 693 | "\n", 694 | " return (snr_range, bber_vec)\n" 695 | ], 696 | "execution_count": 0, 697 | "outputs": [] 698 | }, 699 | { 700 | "cell_type": "markdown", 701 | "metadata": { 702 | "id": "VI0Tj40kzY6X", 703 | "colab_type": "text" 704 | }, 705 | "source": [ 706 | "# Resiver Training" 707 | ] 708 | }, 709 | { 710 | "cell_type": "code", 711 | "metadata": { 712 | "id": "eS0X_xB4LBXa", 713 | "colab_type": "code", 714 | "colab": {} 715 | }, 716 | "source": [ 717 | "decoder = get_gan_decoder(M)\n", 718 | "encoder = get_gan_encoder(M)\n", 719 | "\n", 720 | "\n", 721 | "channel_layer = keras.layers.Lambda(lambda x: real_channel(x,noise_std))" 722 | ], 723 | "execution_count": 0, 724 | "outputs": [] 725 | }, 726 | { 727 | "cell_type": "markdown", 728 | "metadata": { 729 | "id": "_6ZV07BiRAlJ", 730 | "colab_type": "text" 731 | }, 732 | "source": [ 733 | "# Decoder Training" 734 | ] 735 | }, 736 | { 737 | "cell_type": "code", 738 | "metadata": { 739 | "id": "d8-PiMpOTXqL", 740 | "colab_type": "code", 741 | "colab": {} 742 | }, 743 | "source": [ 744 | "data = random_sample(100)" 745 | ], 746 | "execution_count": 0, 747 | "outputs": [] 748 | }, 749 | { 750 | "cell_type": "code", 751 | "metadata": { 752 | "id": "xx0FiLdHQ2m-", 753 | "colab_type": "code", 754 | "colab": {} 755 | }, 756 | "source": [ 757 | "loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)\n", 758 | "loss_object_a = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)\n", 759 | "decoder_optimizer = tf.keras.optimizers.Adam()\n", 760 | "\n", 761 | "def decoder_loss(decoder, x, y):\n", 762 | " x_ = encoder(x)\n", 763 | " y1= channel_layer(x_)\n", 764 | " #y1 = generator(x_)\n", 765 | " y_ = decoder(y1)\n", 766 | " return loss_object(y_true=y, y_pred=y_)\n", 767 | "\n", 768 | "#def decoder_loss2(decoder, x, y):\n", 769 | "# x_ = encoder(x)\n", 770 | "# y1 = generator(x_)\n", 771 | "# y_ = decoder(y1)\n", 772 | "# return loss_object(y_true=y, y_pred=y_)\n", 773 | "\n", 774 | "@tf.function\n", 775 | "def decoder_grad(model, inputs, targets):\n", 776 | " with tf.GradientTape() as decoder_tape:\n", 777 | " loss_value = decoder_loss(model, inputs, targets)\n", 778 | " return loss_value, decoder_tape.gradient(loss_value, model.trainable_variables)\n", 779 | "\n", 780 | "#@tf.function\n", 781 | "#def decoder_grad2(model, inputs, targets):\n", 782 | "# with tf.GradientTape() as decoder_tape:\n", 783 | "# loss_value = decoder_loss2(model, inputs, targets)\n", 784 | "# return loss_value, decoder_tape.gradient(loss_value, model.trainable_variables)\n", 785 | "\n" 786 | ], 787 | "execution_count": 0, 788 | "outputs": [] 789 | }, 790 | { 791 | "cell_type": "code", 792 | "metadata": { 793 | "id": "CJu-Y3eEQ4k3", 794 | "colab_type": "code", 795 | "colab": {} 796 | }, 797 | "source": [ 798 | "\n", 799 | "# Keep results for plotting\n", 800 | "train_loss_results = []\n", 801 | "train_accuracy_results = []\n", 802 | "\n", 803 | "def decoder_training(num_epochs,batch_size):\n", 804 | " for epoch in range(num_epochs):\n", 805 | " epoch_loss_avg = tf.keras.metrics.Mean()\n", 806 | " epoch_accuracy = tf.keras.metrics.SparseCategoricalAccuracy()\n", 807 | " data = random_sample(batch_size)\n", 808 | " loss_value = decoder_step_training()\n", 809 | " epoch_loss_avg(loss_value) # Add current batch loss\n", 810 | " # Compare predicted label to actual label\n", 811 | " epoch_accuracy(data, decoder(channel_layer(encoder(data)))) \n", 812 | " train_loss_results.append(epoch_loss_avg.result())\n", 813 | " train_accuracy_results.append(epoch_accuracy.result())\n", 814 | "\n", 815 | " if epoch % 500 == 0:\n", 816 | " print(\"Epoch {:03d}: Loss: {:.3f}, Accuracy: {:.3%}\".format(epoch,\n", 817 | " epoch_loss_avg.result(),\n", 818 | " epoch_accuracy.result()))\n", 819 | "@tf.function \n", 820 | "def decoder_step_training():\n", 821 | " loss_value, decoder_grads = decoder_grad(decoder, data, data)\n", 822 | " decoder_optimizer.apply_gradients(zip(decoder_grads, decoder.trainable_variables))\n", 823 | " return loss_value \n", 824 | "\n", 825 | "#@tf.function \n", 826 | "#def decoder_step_training2():\n", 827 | "# loss_value, decoder_grads = decoder_grad2(decoder, data, data)\n", 828 | "# decoder_optimizer.apply_gradients(zip(decoder_grads, decoder.trainable_variables))\n", 829 | "# return loss_value \n" 830 | ], 831 | "execution_count": 0, 832 | "outputs": [] 833 | }, 834 | { 835 | "cell_type": "code", 836 | "metadata": { 837 | "id": "fYGiMY4QeVrk", 838 | "colab_type": "code", 839 | "colab": {} 840 | }, 841 | "source": [ 842 | "@tf.function\n", 843 | "def compute_loss(batch_size):\n", 844 | " m =random_sample(batch_size)\n", 845 | " r = encoder(m)\n", 846 | " real_training_data = tf.concat(values=[real_channel(r,noise_std), r], axis=1)\n", 847 | " fake_training_data = tf.concat(values=[generator(r),r], axis=1)\n", 848 | " real_output = discriminator(real_training_data)\n", 849 | " fake_output = discriminator(fake_training_data)\n", 850 | " disc_loss = tf.reduce_mean(real_output) - tf.reduce_mean(fake_output)\n", 851 | " gen_loss = -tf.reduce_mean(fake_output)\n", 852 | "\n", 853 | " return disc_loss, gen_loss" 854 | ], 855 | "execution_count": 0, 856 | "outputs": [] 857 | }, 858 | { 859 | "cell_type": "markdown", 860 | "metadata": { 861 | "id": "dbAJL0v_sLUz", 862 | "colab_type": "text" 863 | }, 864 | "source": [ 865 | "# Transmitter Training" 866 | ] 867 | }, 868 | { 869 | "cell_type": "code", 870 | "metadata": { 871 | "colab_type": "code", 872 | "id": "_u4AHItRcsT1", 873 | "colab": {} 874 | }, 875 | "source": [ 876 | "encoder_optimizer = tf.keras.optimizers.Adam(lr=0.0001)\n", 877 | "\n", 878 | "def encoder_loss(encoder, x, y):\n", 879 | " x_ = encoder(x)\n", 880 | " y1= generator(x_)\n", 881 | " y_ = decoder(y1)\n", 882 | " return loss_object_a(y_true=y, y_pred=y_)\n", 883 | "\n", 884 | "@tf.function\n", 885 | "def encoder_grad(model, inputs, targets):\n", 886 | " with tf.GradientTape() as encoder_tape:\n", 887 | " loss_value = encoder_loss(model, inputs, targets)\n", 888 | " return loss_value, encoder_tape.gradient(loss_value, model.trainable_variables)\n", 889 | "\n" 890 | ], 891 | "execution_count": 0, 892 | "outputs": [] 893 | }, 894 | { 895 | "cell_type": "code", 896 | "metadata": { 897 | "id": "ZUxy6g9kEakF", 898 | "colab_type": "code", 899 | "outputId": "fbc03dc2-675f-4394-ceac-3e68874bc81f", 900 | "colab": { 901 | "base_uri": "https://localhost:8080/", 902 | "height": 53 903 | } 904 | }, 905 | "source": [ 906 | "loss_value, encoder_grads = encoder_grad(encoder,data, data)\n", 907 | "\n", 908 | "print(\"Step: {}, Initial Loss: {}\".format(encoder_optimizer.iterations.numpy(),\n", 909 | " loss_value.numpy()))\n", 910 | "\n", 911 | "encoder_optimizer.apply_gradients(zip(encoder_grads, encoder.trainable_variables))\n", 912 | "\n", 913 | "print(\"Step: {}, Loss: {}\".format(encoder_optimizer.iterations.numpy(),\n", 914 | " encoder_loss(encoder, data, data).numpy()))\n" 915 | ], 916 | "execution_count": 0, 917 | "outputs": [ 918 | { 919 | "output_type": "stream", 920 | "text": [ 921 | "Step: 0, Initial Loss: 2.772723913192749\n", 922 | "Step: 1, Loss: 2.7727227210998535\n" 923 | ], 924 | "name": "stdout" 925 | } 926 | ] 927 | }, 928 | { 929 | "cell_type": "code", 930 | "metadata": { 931 | "colab_type": "code", 932 | "id": "8buZRqXNdcZz", 933 | "colab": {} 934 | }, 935 | "source": [ 936 | "\n", 937 | "# Keep results for plotting\n", 938 | "train_loss_results = []\n", 939 | "train_accuracy_results = []\n", 940 | "\n", 941 | "def encoder_training(num_epochs, batch_size = 400):\n", 942 | " for epoch in range(num_epochs):\n", 943 | " epoch_loss_avg = tf.keras.metrics.Mean()\n", 944 | " epoch_accuracy = tf.keras.metrics.SparseCategoricalAccuracy()\n", 945 | " data = random_sample(batch_size)\n", 946 | "\n", 947 | " loss_value = encoder_step_training()\n", 948 | " #loss_value, encoder_grads = encoder_grad(encoder, data, data)\n", 949 | " #encoder_optimizer.apply_gradients(zip(encoder_grads, encoder.trainable_variables))\n", 950 | " epoch_loss_avg(loss_value) # Add current batch loss\n", 951 | " # Compare predicted label to actual label\n", 952 | " epoch_accuracy(data, decoder(generator(encoder(data)))) \n", 953 | " # train_loss_results.append(epoch_loss_avg.result())\n", 954 | " # train_accuracy_results.append(epoch_accuracy.result())\n", 955 | "\n", 956 | " if epoch % 500 == 0:\n", 957 | " print(\"Epoch {:03d}: Loss: {:.3f}, Accuracy: {:.3%}\".format(epoch,\n", 958 | " epoch_loss_avg.result(),\n", 959 | " epoch_accuracy.result()))\n", 960 | "@tf.function\n", 961 | "def encoder_step_training():\n", 962 | " loss_value, encoder_grads = encoder_grad(encoder, data, data)\n", 963 | " encoder_optimizer.apply_gradients(zip(encoder_grads, encoder.trainable_variables))\n", 964 | " return loss_value\n", 965 | "\n" 966 | ], 967 | "execution_count": 0, 968 | "outputs": [] 969 | }, 970 | { 971 | "cell_type": "markdown", 972 | "metadata": { 973 | "id": "3m0fQ6OXgPf1", 974 | "colab_type": "text" 975 | }, 976 | "source": [ 977 | "# GAN Training" 978 | ] 979 | }, 980 | { 981 | "cell_type": "code", 982 | "metadata": { 983 | "id": "rOWRdICCfSst", 984 | "colab_type": "code", 985 | "colab": {} 986 | }, 987 | "source": [ 988 | "losses = pd.DataFrame(columns = ['disc_loss', 'gen_loss'])\n", 989 | "loss =[]" 990 | ], 991 | "execution_count": 0, 992 | "outputs": [] 993 | }, 994 | { 995 | "cell_type": "code", 996 | "metadata": { 997 | "id": "nNFwwZrcgOkn", 998 | "colab_type": "code", 999 | "outputId": "fd288e8b-f82a-4db8-fdc3-c6c75b3bc230", 1000 | "colab": { 1001 | "base_uri": "https://localhost:8080/", 1002 | "height": 1000 1003 | } 1004 | }, 1005 | "source": [ 1006 | "%%time\n", 1007 | "generator_optimizer, discriminator_optimizer = gan_optimizers(gen_learning_rate=gen_learning_rate, disc_learning_rate = disc_learning_rate)\n", 1008 | "start = time.time()\n", 1009 | "\n", 1010 | "for i in range(3):\n", 1011 | " #test_encoding(M,n)\n", 1012 | " decoder_training(501, 100)\n", 1013 | " creating_and_train_gan(epochs= 2000,n_steps=5, batch_size =100, SNR_level = 7, n = n)\n", 1014 | " decoder_training(2001, 100)\n", 1015 | " #encoder_training(501,100)\n", 1016 | " #test_encoding(M,n)\n", 1017 | " encoder_training(1501,100)\n", 1018 | " #test_encoding(M,n)\n", 1019 | " creating_and_train_gan(epochs= 2000,n_steps=5, batch_size =100, SNR_level = 7, n = n)\n", 1020 | "\n", 1021 | "time_to_train_gan = time.time()-start\n", 1022 | "tf.print ('Time for the training is {} sec,'.format( time.time()-start))" 1023 | ], 1024 | "execution_count": 0, 1025 | "outputs": [ 1026 | { 1027 | "output_type": "stream", 1028 | "text": [ 1029 | "Epoch 000: Loss: 2.774, Accuracy: 12.000%\n", 1030 | "Epoch 500: Loss: 2.239, Accuracy: 54.000%\n", 1031 | "counter 100:\n", 1032 | "[-0.0888225734 -0.107247442]\n", 1033 | "Time for epoch 100,\n", 1034 | "counter 200:\n", 1035 | "[-0.232422978 -0.137678578]\n", 1036 | "Time for epoch 200,\n", 1037 | "counter 300:\n", 1038 | "[-0.373816 -0.240258873]\n", 1039 | "Time for epoch 300,\n", 1040 | "counter 400:\n", 1041 | "[-0.431057096 -0.1474085]\n", 1042 | "Time for epoch 400,\n", 1043 | "counter 500:\n", 1044 | "[-0.406098485 -0.046507135]\n", 1045 | "Time for epoch 500,\n", 1046 | "counter 600:\n", 1047 | "[-0.253698528 0.286785305]\n", 1048 | "Time for epoch 600,\n", 1049 | "counter 700:\n", 1050 | "[0.105296932 -0.539757967]\n", 1051 | "Time for epoch 700,\n", 1052 | "counter 800:\n", 1053 | "[-0.628919661 0.696365058]\n", 1054 | "Time for epoch 800,\n", 1055 | "counter 900:\n", 1056 | "[0.483534813 -0.357364088]\n", 1057 | "Time for epoch 900,\n", 1058 | "counter 1000:\n", 1059 | "[0.0853803456 0.397978097]\n", 1060 | "Time for epoch 1000,\n", 1061 | "counter 1100:\n", 1062 | "[1.14157474 -0.390530378]\n", 1063 | "Time for epoch 1100,\n", 1064 | "counter 1200:\n", 1065 | "[0.31605655 0.677879632]\n", 1066 | "Time for epoch 1200,\n", 1067 | "counter 1300:\n", 1068 | "[1.22089314 -0.624603868]\n", 1069 | "Time for epoch 1300,\n", 1070 | "counter 1400:\n", 1071 | "[1.06744766 -0.521334171]\n", 1072 | "Time for epoch 1400,\n", 1073 | "counter 1500:\n", 1074 | "[1.03949404 -1.00496078]\n", 1075 | "Time for epoch 1500,\n", 1076 | "counter 1600:\n", 1077 | "[1.00851476 -0.918129]\n", 1078 | "Time for epoch 1600,\n", 1079 | "counter 1700:\n", 1080 | "[0.931902766 0.0982708782]\n", 1081 | "Time for epoch 1700,\n", 1082 | "counter 1800:\n", 1083 | "[1.0800612 -0.763506353]\n", 1084 | "Time for epoch 1800,\n", 1085 | "counter 1900:\n", 1086 | "[1.04497206 -0.470196545]\n", 1087 | "Time for epoch 1900,\n", 1088 | "counter 2000:\n", 1089 | "[1.04986715 -0.548957765]\n", 1090 | "Time for epoch 2000,\n", 1091 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py:1781: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.\n", 1092 | "Instructions for updating:\n", 1093 | "If using Keras pass *_constraint arguments to layers.\n", 1094 | "INFO:tensorflow:Assets written to: /tmp/saved_model/assets\n", 1095 | "Time for the training is 34.64936542510986 sec,\n", 1096 | "Epoch 000: Loss: 2.261, Accuracy: 68.000%\n", 1097 | "Epoch 500: Loss: 2.247, Accuracy: 62.000%\n", 1098 | "Epoch 1000: Loss: 2.229, Accuracy: 69.000%\n", 1099 | "Epoch 1500: Loss: 2.197, Accuracy: 72.000%\n", 1100 | "Epoch 2000: Loss: 2.220, Accuracy: 66.000%\n", 1101 | "Epoch 000: Loss: 2.232, Accuracy: 65.000%\n", 1102 | "Epoch 500: Loss: 2.162, Accuracy: 64.000%\n", 1103 | "Epoch 1000: Loss: 2.170, Accuracy: 64.000%\n", 1104 | "Epoch 1500: Loss: 2.178, Accuracy: 72.000%\n", 1105 | "counter 100:\n", 1106 | "[-0.440798759 -0.734832466]\n", 1107 | "Time for epoch 100,\n", 1108 | "counter 200:\n", 1109 | "[-0.428212434 -0.71604532]\n", 1110 | "Time for epoch 200,\n", 1111 | "counter 300:\n", 1112 | "[-0.441498339 -0.654126048]\n", 1113 | "Time for epoch 300,\n", 1114 | "counter 400:\n", 1115 | "[-0.515821099 -0.550112963]\n", 1116 | "Time for epoch 400,\n", 1117 | "counter 500:\n", 1118 | "[-0.140691504 -0.769999444]\n", 1119 | "Time for epoch 500,\n", 1120 | "counter 600:\n", 1121 | "[-0.356787235 -0.702563]\n", 1122 | "Time for epoch 600,\n", 1123 | "counter 700:\n", 1124 | "[-0.245433882 -0.466908306]\n", 1125 | "Time for epoch 700,\n", 1126 | "counter 800:\n", 1127 | "[-0.537100494 -0.514152765]\n", 1128 | "Time for epoch 800,\n", 1129 | "counter 900:\n", 1130 | "[-0.349722683 -0.426028341]\n", 1131 | "Time for epoch 900,\n", 1132 | "counter 1000:\n", 1133 | "[-0.424007386 -0.633271337]\n", 1134 | "Time for epoch 1000,\n", 1135 | "counter 1100:\n", 1136 | "[-0.0540242828 -0.316687107]\n", 1137 | "Time for epoch 1100,\n", 1138 | "counter 1200:\n", 1139 | "[-0.334041446 -0.66029954]\n", 1140 | "Time for epoch 1200,\n", 1141 | "counter 1300:\n", 1142 | "[-0.870881438 -0.810103178]\n", 1143 | "Time for epoch 1300,\n", 1144 | "counter 1400:\n", 1145 | "[-0.292612374 -0.886321485]\n", 1146 | "Time for epoch 1400,\n", 1147 | "counter 1500:\n", 1148 | "[-0.367299289 -0.672870457]\n", 1149 | "Time for epoch 1500,\n", 1150 | "counter 1600:\n", 1151 | "[-0.314684629 -0.680145323]\n", 1152 | "Time for epoch 1600,\n", 1153 | "counter 1700:\n", 1154 | "[-0.397412747 -0.251146227]\n", 1155 | "Time for epoch 1700,\n", 1156 | "counter 1800:\n", 1157 | "[-0.593136847 -0.657455385]\n", 1158 | "Time for epoch 1800,\n", 1159 | "counter 1900:\n", 1160 | "[-0.309396684 -0.810093045]\n", 1161 | "Time for epoch 1900,\n", 1162 | "counter 2000:\n", 1163 | "[-0.527839184 -0.613809109]\n", 1164 | "Time for epoch 2000,\n", 1165 | "INFO:tensorflow:Assets written to: /tmp/saved_model/assets\n", 1166 | "Time for the training is 62.011308431625366 sec,\n", 1167 | "Epoch 000: Loss: 2.198, Accuracy: 63.000%\n", 1168 | "Epoch 500: Loss: 2.196, Accuracy: 72.000%\n", 1169 | "counter 100:\n", 1170 | "[-0.762344 -0.795210123]\n", 1171 | "Time for epoch 100,\n", 1172 | "counter 200:\n", 1173 | "[-0.781355917 -1.15897787]\n", 1174 | "Time for epoch 200,\n", 1175 | "counter 300:\n", 1176 | "[-0.586692452 -1.02226889]\n", 1177 | "Time for epoch 300,\n", 1178 | "counter 400:\n", 1179 | "[-0.700071037 -1.3599937]\n", 1180 | "Time for epoch 400,\n", 1181 | "counter 500:\n", 1182 | "[-1.04786587 -0.884922147]\n", 1183 | "Time for epoch 500,\n", 1184 | "counter 600:\n", 1185 | "[-0.49134928 -1.23991871]\n", 1186 | "Time for epoch 600,\n", 1187 | "counter 700:\n", 1188 | "[-0.420277923 -1.21964371]\n", 1189 | "Time for epoch 700,\n", 1190 | "counter 800:\n", 1191 | "[-0.459238976 -1.04678822]\n", 1192 | "Time for epoch 800,\n", 1193 | "counter 900:\n", 1194 | "[-0.71424669 -1.36222076]\n", 1195 | "Time for epoch 900,\n", 1196 | "counter 1000:\n", 1197 | "[-0.611230135 -1.11479092]\n", 1198 | "Time for epoch 1000,\n", 1199 | "counter 1100:\n", 1200 | "[-0.544437945 -1.0801897]\n", 1201 | "Time for epoch 1100,\n", 1202 | "counter 1200:\n", 1203 | "[-0.713532746 -0.980109811]\n", 1204 | "Time for epoch 1200,\n", 1205 | "counter 1300:\n", 1206 | "[-0.440592289 -1.23843753]\n", 1207 | "Time for epoch 1300,\n", 1208 | "counter 1400:\n", 1209 | "[-0.601854205 -1.2287544]\n", 1210 | "Time for epoch 1400,\n", 1211 | "counter 1500:\n", 1212 | "[-0.482204735 -1.10565531]\n", 1213 | "Time for epoch 1500,\n", 1214 | "counter 1600:\n", 1215 | "[-0.875161588 -1.01779556]\n", 1216 | "Time for epoch 1600,\n", 1217 | "counter 1700:\n", 1218 | "[-0.413834304 -1.53245747]\n", 1219 | "Time for epoch 1700,\n", 1220 | "counter 1800:\n", 1221 | "[-0.505536675 -1.06040072]\n", 1222 | "Time for epoch 1800,\n", 1223 | "counter 1900:\n", 1224 | "[-0.730596542 -1.26603985]\n", 1225 | "Time for epoch 1900,\n", 1226 | "counter 2000:\n", 1227 | "[-0.693947256 -1.10641181]\n", 1228 | "Time for epoch 2000,\n", 1229 | "INFO:tensorflow:Assets written to: /tmp/saved_model/assets\n", 1230 | "Time for the training is 93.02170491218567 sec,\n", 1231 | "Epoch 000: Loss: 2.211, Accuracy: 66.000%\n", 1232 | "Epoch 500: Loss: 2.193, Accuracy: 73.000%\n", 1233 | "Epoch 1000: Loss: 2.183, Accuracy: 65.000%\n", 1234 | "Epoch 1500: Loss: 2.209, Accuracy: 64.000%\n", 1235 | "Epoch 2000: Loss: 2.184, Accuracy: 64.000%\n", 1236 | "Epoch 000: Loss: 2.183, Accuracy: 68.000%\n", 1237 | "Epoch 500: Loss: 2.165, Accuracy: 64.000%\n", 1238 | "Epoch 1000: Loss: 2.178, Accuracy: 63.000%\n", 1239 | "Epoch 1500: Loss: 2.173, Accuracy: 60.000%\n", 1240 | "counter 100:\n", 1241 | "[0.18023324 -0.799806952]\n", 1242 | "Time for epoch 100,\n", 1243 | "counter 200:\n", 1244 | "[0.481187314 -0.682468]\n", 1245 | "Time for epoch 200,\n", 1246 | "counter 300:\n", 1247 | "[0.182730407 -0.631058931]\n", 1248 | "Time for epoch 300,\n", 1249 | "counter 400:\n", 1250 | "[0.145139769 -0.64759028]\n", 1251 | "Time for epoch 400,\n", 1252 | "counter 500:\n", 1253 | "[0.341997027 -0.726887703]\n", 1254 | "Time for epoch 500,\n", 1255 | "counter 600:\n", 1256 | "[0.359071136 -0.730572045]\n", 1257 | "Time for epoch 600,\n", 1258 | "counter 700:\n", 1259 | "[0.312189937 -0.67638129]\n", 1260 | "Time for epoch 700,\n", 1261 | "counter 800:\n", 1262 | "[0.15672335 -0.815606952]\n", 1263 | "Time for epoch 800,\n", 1264 | "counter 900:\n", 1265 | "[0.213258788 -0.723611355]\n", 1266 | "Time for epoch 900,\n", 1267 | "counter 1000:\n", 1268 | "[0.295567632 -0.998002708]\n", 1269 | "Time for epoch 1000,\n", 1270 | "counter 1100:\n", 1271 | "[-0.0267677289 -0.492047489]\n", 1272 | "Time for epoch 1100,\n", 1273 | "counter 1200:\n", 1274 | "[0.400616914 -0.701280355]\n", 1275 | "Time for epoch 1200,\n", 1276 | "counter 1300:\n", 1277 | "[0.296981961 -0.68645519]\n", 1278 | "Time for epoch 1300,\n", 1279 | "counter 1400:\n", 1280 | "[0.381790966 -0.914246]\n", 1281 | "Time for epoch 1400,\n", 1282 | "counter 1500:\n", 1283 | "[0.286089033 -0.739088178]\n", 1284 | "Time for epoch 1500,\n", 1285 | "counter 1600:\n", 1286 | "[0.42837891 -0.599752]\n", 1287 | "Time for epoch 1600,\n", 1288 | "counter 1700:\n", 1289 | "[0.217522293 -0.790921688]\n", 1290 | "Time for epoch 1700,\n", 1291 | "counter 1800:\n", 1292 | "[0.158241972 -0.963599443]\n", 1293 | "Time for epoch 1800,\n", 1294 | "counter 1900:\n", 1295 | "[0.0106270257 -1.03566039]\n", 1296 | "Time for epoch 1900,\n", 1297 | "counter 2000:\n", 1298 | "[0.447753 -0.535775959]\n", 1299 | "Time for epoch 2000,\n", 1300 | "INFO:tensorflow:Assets written to: /tmp/saved_model/assets\n", 1301 | "Time for the training is 123.1630630493164 sec,\n", 1302 | "Epoch 000: Loss: 2.185, Accuracy: 70.000%\n", 1303 | "Epoch 500: Loss: 2.173, Accuracy: 68.000%\n", 1304 | "counter 100:\n", 1305 | "[0.431338042 0.293790162]\n", 1306 | "Time for epoch 100,\n", 1307 | "counter 200:\n", 1308 | "[0.48071745 -0.210080594]\n", 1309 | "Time for epoch 200,\n", 1310 | "counter 300:\n", 1311 | "[0.618501604 -0.361382425]\n", 1312 | "Time for epoch 300,\n", 1313 | "counter 400:\n", 1314 | "[0.689783871 -0.24568063]\n", 1315 | "Time for epoch 400,\n", 1316 | "counter 500:\n", 1317 | "[0.540134072 -0.48873958]\n", 1318 | "Time for epoch 500,\n", 1319 | "counter 600:\n", 1320 | "[0.326502025 -0.192462265]\n", 1321 | "Time for epoch 600,\n", 1322 | "counter 700:\n", 1323 | "[0.35774371 -0.172302365]\n", 1324 | "Time for epoch 700,\n", 1325 | "counter 800:\n", 1326 | "[0.522854149 -0.271122098]\n", 1327 | "Time for epoch 800,\n", 1328 | "counter 900:\n", 1329 | "[0.533137798 -0.183640137]\n", 1330 | "Time for epoch 900,\n", 1331 | "counter 1000:\n", 1332 | "[0.45756495 -0.346443623]\n", 1333 | "Time for epoch 1000,\n", 1334 | "counter 1100:\n", 1335 | "[0.765031159 -0.19284907]\n", 1336 | "Time for epoch 1100,\n", 1337 | "counter 1200:\n", 1338 | "[0.617779374 -0.0728005618]\n", 1339 | "Time for epoch 1200,\n", 1340 | "counter 1300:\n", 1341 | "[0.292945504 -0.0215662029]\n", 1342 | "Time for epoch 1300,\n", 1343 | "counter 1400:\n", 1344 | "[0.531533241 -0.228310272]\n", 1345 | "Time for epoch 1400,\n", 1346 | "counter 1500:\n", 1347 | "[0.692569911 -0.0622891113]\n", 1348 | "Time for epoch 1500,\n", 1349 | "counter 1600:\n", 1350 | "[0.61314857 -0.259286731]\n", 1351 | "Time for epoch 1600,\n", 1352 | "counter 1700:\n", 1353 | "[0.58076036 -0.183444947]\n", 1354 | "Time for epoch 1700,\n", 1355 | "counter 1800:\n", 1356 | "[0.27255857 -0.368664086]\n", 1357 | "Time for epoch 1800,\n", 1358 | "counter 1900:\n", 1359 | "[0.510132313 -0.222843558]\n", 1360 | "Time for epoch 1900,\n", 1361 | "counter 2000:\n", 1362 | "[0.496895462 -0.262324214]\n", 1363 | "Time for epoch 2000,\n", 1364 | "INFO:tensorflow:Assets written to: /tmp/saved_model/assets\n", 1365 | "Time for the training is 153.8631513118744 sec,\n", 1366 | "Epoch 000: Loss: 2.183, Accuracy: 64.000%\n", 1367 | "Epoch 500: Loss: 2.175, Accuracy: 66.000%\n", 1368 | "Epoch 1000: Loss: 2.177, Accuracy: 72.000%\n", 1369 | "Epoch 1500: Loss: 2.186, Accuracy: 72.000%\n", 1370 | "Epoch 2000: Loss: 2.167, Accuracy: 63.000%\n", 1371 | "Epoch 000: Loss: 2.186, Accuracy: 69.000%\n", 1372 | "Epoch 500: Loss: 2.181, Accuracy: 73.000%\n", 1373 | "Epoch 1000: Loss: 2.171, Accuracy: 67.000%\n", 1374 | "Epoch 1500: Loss: 2.176, Accuracy: 63.000%\n", 1375 | "counter 100:\n", 1376 | "[0.457735 -0.770753145]\n", 1377 | "Time for epoch 100,\n", 1378 | "counter 200:\n", 1379 | "[0.30415684 -0.841622114]\n", 1380 | "Time for epoch 200,\n", 1381 | "counter 300:\n", 1382 | "[0.336995482 -1.14166653]\n", 1383 | "Time for epoch 300,\n", 1384 | "counter 400:\n", 1385 | "[0.397813827 -1.15424562]\n", 1386 | "Time for epoch 400,\n", 1387 | "counter 500:\n", 1388 | "[0.513137579 -0.756911099]\n", 1389 | "Time for epoch 500,\n", 1390 | "counter 600:\n", 1391 | "[0.362718821 -0.73536104]\n", 1392 | "Time for epoch 600,\n", 1393 | "counter 700:\n", 1394 | "[0.0556177534 -0.987460852]\n", 1395 | "Time for epoch 700,\n", 1396 | "counter 800:\n", 1397 | "[0.566305518 -1.0033884]\n", 1398 | "Time for epoch 800,\n", 1399 | "counter 900:\n", 1400 | "[0.27471891 -1.10159111]\n", 1401 | "Time for epoch 900,\n", 1402 | "counter 1000:\n", 1403 | "[0.457046539 -1.20635641]\n", 1404 | "Time for epoch 1000,\n", 1405 | "counter 1100:\n", 1406 | "[0.250429511 -1.13516355]\n", 1407 | "Time for epoch 1100,\n", 1408 | "counter 1200:\n", 1409 | "[0.613960266 -0.944131672]\n", 1410 | "Time for epoch 1200,\n", 1411 | "counter 1300:\n", 1412 | "[0.134820476 -1.18495774]\n", 1413 | "Time for epoch 1300,\n", 1414 | "counter 1400:\n", 1415 | "[0.437941909 -0.963677406]\n", 1416 | "Time for epoch 1400,\n", 1417 | "counter 1500:\n", 1418 | "[0.295972139 -0.772094131]\n", 1419 | "Time for epoch 1500,\n", 1420 | "counter 1600:\n", 1421 | "[0.371993363 -0.855375171]\n", 1422 | "Time for epoch 1600,\n", 1423 | "counter 1700:\n", 1424 | "[0.712407708 -0.79485178]\n", 1425 | "Time for epoch 1700,\n", 1426 | "counter 1800:\n", 1427 | "[0.217019051 -0.769711137]\n", 1428 | "Time for epoch 1800,\n", 1429 | "counter 1900:\n", 1430 | "[0.496837318 -0.97701925]\n", 1431 | "Time for epoch 1900,\n", 1432 | "counter 2000:\n", 1433 | "[0.271386415 -1.01878977]\n", 1434 | "Time for epoch 2000,\n", 1435 | "INFO:tensorflow:Assets written to: /tmp/saved_model/assets\n", 1436 | "Time for the training is 184.81708455085754 sec,\n", 1437 | "Time for the training is 851.51353764534 sec,\n", 1438 | "CPU times: user 14min 26s, sys: 5.05 s, total: 14min 31s\n", 1439 | "Wall time: 14min 11s\n" 1440 | ], 1441 | "name": "stdout" 1442 | } 1443 | ] 1444 | }, 1445 | { 1446 | "cell_type": "code", 1447 | "metadata": { 1448 | "id": "FyBawwHIQOJm", 1449 | "colab_type": "code", 1450 | "outputId": "943eee94-767b-4112-e9c1-1aee6f006caa", 1451 | "colab": { 1452 | "base_uri": "https://localhost:8080/", 1453 | "height": 395 1454 | } 1455 | }, 1456 | "source": [ 1457 | "fig = plt.figure(figsize=(10, 6))\n", 1458 | "plt.plot(losses.disc_loss.values) \n", 1459 | "plt.ylabel(\"Loss\", fontsize=14, rotation=90)\n", 1460 | "plt.xlabel(\"Iterations\", fontsize=14)\n", 1461 | "plt.legend(['WGAN training loss'],\n", 1462 | " prop={'size': 14}, loc='upper right');\n", 1463 | "plt.grid(True, which=\"both\")" 1464 | ], 1465 | "execution_count": 0, 1466 | "outputs": [ 1467 | { 1468 | "output_type": "display_data", 1469 | "data": { 1470 | "image/png": "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\n", 1471 | "text/plain": [ 1472 | "
" 1473 | ] 1474 | }, 1475 | "metadata": { 1476 | "tags": [] 1477 | } 1478 | } 1479 | ] 1480 | }, 1481 | { 1482 | "cell_type": "code", 1483 | "metadata": { 1484 | "id": "MUbnLX0y_p6E", 1485 | "colab_type": "code", 1486 | "outputId": "a04a2532-4284-478f-b542-23d8a3475cb6", 1487 | "colab": { 1488 | "base_uri": "https://localhost:8080/", 1489 | "height": 724 1490 | } 1491 | }, 1492 | "source": [ 1493 | "%%time\n", 1494 | "generator.trainable =False\n", 1495 | "encoder.trainable = True\n", 1496 | "decoder.trainable = True\n", 1497 | "gan_AE = tf.keras.models.Sequential([encoder,generator,decoder])\n", 1498 | "data = random_sample(10000000)\n", 1499 | "start = time.time()\n", 1500 | "gan_AE.compile(optimizer=keras.optimizers.Nadam(lr=0.0005),loss='sparse_categorical_crossentropy',metrics=['accuracy'])\n", 1501 | "history = gan_AE.fit(data, data, batch_size=500,steps_per_epoch=200, epochs=20)\n", 1502 | "\n", 1503 | "test_encoding(M,n)" 1504 | ], 1505 | "execution_count": 0, 1506 | "outputs": [ 1507 | { 1508 | "output_type": "stream", 1509 | "text": [ 1510 | "Train on 10000000 samples\n", 1511 | "Epoch 1/20\n", 1512 | " 100000/10000000 [..............................] - ETA: 5:15 - loss: 4.7938 - accuracy: 0.6723Epoch 2/20\n", 1513 | " 99000/10000000 [..............................] - ETA: 1:55 - loss: 0.5767 - accuracy: 0.8172Epoch 3/20\n", 1514 | " 98500/10000000 [..............................] - ETA: 2:02 - loss: 0.3269 - accuracy: 0.8861Epoch 4/20\n", 1515 | " 97500/10000000 [..............................] - ETA: 2:00 - loss: 0.2937 - accuracy: 0.8993Epoch 5/20\n", 1516 | " 97000/10000000 [..............................] - ETA: 2:00 - loss: 0.2780 - accuracy: 0.9059Epoch 6/20\n", 1517 | " 96000/10000000 [..............................] - ETA: 2:01 - loss: 0.2711 - accuracy: 0.9078Epoch 7/20\n", 1518 | " 96500/10000000 [..............................] - ETA: 2:00 - loss: 0.2565 - accuracy: 0.9120Epoch 8/20\n", 1519 | " 96000/10000000 [..............................] - ETA: 2:01 - loss: 0.2449 - accuracy: 0.9167Epoch 9/20\n", 1520 | " 97500/10000000 [..............................] - ETA: 2:03 - loss: 0.2382 - accuracy: 0.9174Epoch 10/20\n", 1521 | " 98000/10000000 [..............................] - ETA: 1:59 - loss: 0.2328 - accuracy: 0.9190Epoch 11/20\n", 1522 | " 96000/10000000 [..............................] - ETA: 1:54 - loss: 0.2307 - accuracy: 0.9194Epoch 12/20\n", 1523 | " 99500/10000000 [..............................] - ETA: 1:54 - loss: 0.2248 - accuracy: 0.9209Epoch 13/20\n", 1524 | " 96000/10000000 [..............................] - ETA: 1:53 - loss: 0.2205 - accuracy: 0.9227Epoch 14/20\n", 1525 | " 98000/10000000 [..............................] - ETA: 1:58 - loss: 0.2179 - accuracy: 0.9227Epoch 15/20\n", 1526 | " 98000/10000000 [..............................] - ETA: 2:04 - loss: 0.2131 - accuracy: 0.9248Epoch 16/20\n", 1527 | " 99500/10000000 [..............................] - ETA: 2:01 - loss: 0.2151 - accuracy: 0.9239Epoch 17/20\n", 1528 | " 98000/10000000 [..............................] - ETA: 2:07 - loss: 0.2123 - accuracy: 0.9250Epoch 18/20\n", 1529 | " 98000/10000000 [..............................] - ETA: 2:09 - loss: 0.2140 - accuracy: 0.9250Epoch 19/20\n", 1530 | " 99500/10000000 [..............................] - ETA: 2:07 - loss: 0.2117 - accuracy: 0.9247Epoch 20/20\n", 1531 | " 97500/10000000 [..............................] - ETA: 2:04 - loss: 0.2128 - accuracy: 0.9238" 1532 | ], 1533 | "name": "stdout" 1534 | }, 1535 | { 1536 | "output_type": "display_data", 1537 | "data": { 1538 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAASMAAAEWCAYAAAAtl/EzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAUjUlEQVR4nO3df5BdZX3H8feHBBMkIpWm6VgMmBkT\nTXCCI60T0TE1HTNxysCMVlFwSItGa5EOFltqk0lCMmbAMdWKpU1NGsKkAjNEqcrodCw7CuYfbAk1\n1MRfJNoYWhBJNpNuIPn2j3NvuSx3d+/N7jnPc8/5vGbuZO+9z26+Z3f2s+ec55znq4jAzCy1M1IX\nYGYGDiMzy4TDyMyy4DAysyw4jMwsCw4jM8uCw8jMspA8jCTNkLRV0gFJRyU9ImnFOONvkHRY0hFJ\n2yTNqLJeMytH8jACpgM/A94GvBxYDdwj6cLRAyUtB24ClgEXAPOA9VUVamblUY5XYEt6FFgfEfeO\nev2fgMcj4pOt58uAnRHxmwnKNLMpND11AaNJmgPMB/Z2eXsRcF/H8z3AHEnnRcRTo77OKmAVwMyZ\nM984d+7ckipO79SpU5xxRg47ueWo8/bVedsA9u/f/2REzO5lbFZhJOlMYCdwR0T8oMuQWcAzHc/b\nH78MeEEYRcQWYAvAggULYt++fVNfcCaGhoZYunRp6jJKU+ftq/O2AUg60OvYbCJZ0hnAncAJ4Lox\nhg0D53Q8b398tMTSzKwCWYSRJAFbgTnAuyLi2TGG7gUWdzxfDDwx+hDNzAZPFmEE3A68DrgsIo6P\nM24HcK2khZLOpZh5215BfWZWsuRhJOkC4MPAxcBhScOtx1WS5rY+ngsQEd8AbgUeAA4CB4C1qWo3\ns6mT/AR2RBwANM6QWaPGbwY2l1qUmVUu+Z6RmRk4jMwsEw4jM8uCw8jMsuAwMrMsOIzMLAsOIzPL\ngsPIzLLgMDKzLDiMzCwLDiMzy4LDyMyy4DAysyw4jMwsCw4jM8uCw8jMsuAwMrMsJA8jSddJeljS\niKTt44xbKelkx7K0w5KWVlepmZUp+bKzwCFgI7AcOGuCsbsj4i3ll2RmVUseRhGxC0DSJcD5icsx\ns0SSH6b16Q2SnpS0X9IaScnD1MymxiD9Mn8buIiiPdEi4G7gOWBTt8GSVgGrAGbPns3Q0FA1VSYw\nPDzs7RtQdd62fikiUtcAgKSNwPkRsbLH8VcCn4iIN040dsGCBbFv375JVpivuvdrr/P21XnbACR9\nLyIu6WXsoB2mdQrG77dmZgMkeRhJmi5pJjANmCZpZrdzQZJWSJrT+vi1wBrgvmqrNbOyJA8jYDVw\nHLgJuLr18erRra2BZcCjko4B9wO7gE+lKNjMpl7yE9gRsQ5YN8bbszrG3QjcWEFJZpZADntGZmYO\nIzPLg8PIzLLgMDKzLDiMzCwLDiMzy4LDyMyy4DAysyw4jMwsCw4jM8uCw8jMsuAwMrMsOIxsIO3e\nDZs2Ff9aPSS/a9+sX7t3w7JlcOIEvOQl8K1vwZIlqauyyfKekQ2coaEiiE6eLP71EtL14DCygbN0\nabFHNG1a8W+Nl5BuFB+m2cBZsqQ4NBsaKoLIh2j14DCygbRkiUOobpIfpkm6TtLDkkYkbZ9g7A2S\nDks6ImmbpBkVlWlmJUseRsAhYCOwbbxBkpZTLNq/DLgAmAesL706M6tE8jCKiF0R8RXgqQmGXgNs\njYi9EfE0sAFYWXZ9ZlaNQTpntIgX9knbA8yRdF5EvCjI3N66Puq8fXXetn4NUhjNAp7peN7++GV0\n2auKiC3AFijaW9e5hXDdWyTXefvqvG39Sn6Y1odh4JyO5+2Pjyaoxcym2CCF0V5gccfzxcAT3Q7R\nzGzwJA8jSdMlzQSmAdMkzZTU7fBxB3CtpIWSzqVoi729wlIbzzenTp6/h2PL4ZzRamBtx/OrgfWS\ntgGPAQsj4mBEfEPSrcADwFnAvaM+z0rkm1Mnr9v30J6XfM8oItZFhEY91rUCaFZEHOwYuzki5kTE\nORHxhxExkrL2JvHNqZPn7+H4koeRDQbfnDp5/h6OL4fDNBsAvjl18rp9D7139DyHkfXMN6dOnr+H\nY/NhmpllwWFkZllwGJlZFhxGZpYFh5GZZcFhZGZZcBiZWRYcRmaWBYeRmWXBYWRmWXAYZcrr3ljT\n+N60DHntIGsi7xllyOveWBM5jDLkdW+sibIII0mvkPRlScckHZD0/jHGrZP0rKThjse8qustW3vd\nmw0bfIhmzZHLOaMvACeAOcDFwNcl7YmIvV3G3h0RV1daXQJe98aaJvmekaSzgXcBayJiOCIeBP4Z\n+EDaysysSjnsGc0HnouI/R2v7QHeNsb4yyT9EvgFcFtE3N5tkNtb10edt6/O29avHMJoFnBk1GvP\nULStHu0eipbVTwBvAu6V9KuI+NLogW5vXR913r46b1u/kh+m8eK21bSev6htdUQ8FhGHIuJkRHwX\n+Bzw7gpqNLOS5RBG+4Hpkl7T8dpiinbWEwlApVRljeGr3fOQ/DAtIo5J2gXcLOmDFLNplwNvHj1W\n0uXAt4FfAb8NXA98ssJyrWZ8tXs+ctgzAvgoRcvq/wa+BPxxROyV9FZJwx3jrgR+RHEItwO4JSLu\nqLxaqw1f7Z6P5HtGABHxS+CKLq9/h+IEd/v5+6qsy+qvfbV7e8/I55LTySKMzFJxp9x8OIys8Xy1\nex5yOWdkZg3nMLLkPLVu4MM0S8xT69bmPSNLylPr1tZTGEk6S9LPJR2UNGPUe1+UdFLSleWUaHXm\nheSsracwiojjwFrgVRQXKAIgaRNwLfCxiLirlAqt1ryQnLX1c85oO3AD8JeS/gH4IHATsDYi/raE\n2qwhPLVu0Mc5o4g4SRE+s4H7gM3A5yPi5pJqswQ8s2Wp9DWbFhFfk/TvwNuBu4A/7Xy/dT7pNmAZ\nRWj9giKwPj815VqZPLNlKfU1mybpvRTLewAcjYgYNWQ6cBh4B/By4D3AaknvmWyhVj7PbFlKPYeR\npHdQ3Cn/ZYq9oj+S9LrOMRFxLCLWRMSPIuJURDxCsZ71W6ayaCuHZ7YspV6n9t8E7AIeAq4CVgOn\ngE0TfN6ZwFuBRydXplXBM1uW0oTnjCQtBO6nWJHxiogYAX4saSvwEUmXRsRDY3z6bTy/9pANAM9s\npbd7dzNXERg3jCTNBb4JPA2siIjOhfM3ANcAtwKXdvnczcAS4O0RcWLKKjarsSZPIowbRhFxkOJC\nx27vHQJe2u09SZ+lmFF7e0Q8OdkizZqi2yRCU8Joyu9Nk/Q3wO9RBNH/9Pg5vba3lqRbJD3Vetwi\nyQvyW200eRJhSu/al3QB8DFgBPhpR058JyJWjPOpvba3XkWxPO1iis4g/wL8FPi7KdsIs4SavPLk\nlIZRRBygz9ZBHe2tL4qIYeBBSe321jeNGn4N8JmI+Hnrcz8DfAiHkdVIUycRcljPqJ/21ota73WO\nW9Tti7q9dX3UefvqvG39yiGM+mlvPav1Xue4WZI0+mpwt7eujzpvX523rV85LK7Wc3vrLmPPAYa7\n3JZiZgMmhzDqp731Xp6/N268cWY2YJKHUUQco7jV5GZJZ0u6lKK99Z1dhu8APi7ptyS9EvgzinWW\nzGzAJQ+jll7bW/898FXgP4DvA19vvWZmAy6HE9j9tLcO4M9bDzOrkVz2jMys4RxGZpYFh5EZXvs7\nB1mcMzJLqcnLduTEe0aZ8V/o6nnt7zx4zygj/gudRnvZjvb33XdnpOEwykiTF9ZKqcnLduTEYZQR\n/4VOp6nLduTEYZQR/4W2JnMYZcZ/oa2pPJtm2fGMYjN5z8iy0m1G0ZrBe0aWFV/z01wOI8tKk1v1\nNJ3DyLLSnlHcsMEXfTaNzxlZdjyj2EzeM7IxeVbLqpQ8jHptbd0au07Ss5KGOx7zqqy3KdqzWmvW\nFP86kKxsycOIF7a2vgq4XVLXxowtd0fErI7HTyqpsmE8q2VVSxpGHa2t10TEcEQ8CLRbW1tCntWy\nqqU+gd1Pa+u2yyT9EvgFcFtE3N5tkNtbT96nP30OjzxyLhdf/CtGRo4k2zuqcwvoOm9b3yIi2QN4\nK3B41GsfAobGGL8QeCUwDXgzRSC9b6L/Z/78+VFnDzzwQOoSSlXn7avztkVEAA9Hj3lQ6mGapCFJ\nMcbjQfprbU1EPBYRhyLiZER8F/gc8O4yt8HMqlHqYVpELB3v/dY5o+mSXhMRP2y93E/L6gB0+hWa\nWS6SnsCO/lpbI+lySb+mwu8A1wP3VVexmZUlh6n9rq2tAbq0t74S+BHFYdwO4JaIuKPies2sBKln\n08Zsbd16b3R76/dVVZeZVSuHPSMzM4eRWU6afD9g8sM0Mys0vW+e94zMMtH0+wEdRmaZaPr9gD5M\nM8tE0/vmOYzMMtLkVS59mGZmWXAYmVkWHEZmlgWHkZllwWFkjdPkq5xz5tk0a5SmX+WcM+8ZWaM0\n/SrnnDmMrFGafpVzznyYZo3S9Kucc+YwssZp8lXOOUvdxPE6SQ9LGpG0vYfxN0g6LOmIpG2SZlRQ\npplVIPU5o0PARmDbRAMlLQduApYBFwDzgPWlVjdgPGVtgyzpYVpE7AKQdAlw/gTDrwG2dizWvwHY\nSRFQjecpaxt0g3TOaBEvbEu0B5gj6byIeGr04Ka1t9658yeMjLyaU6fEyMgptm17nJGRg6lLmxJ1\nbgFd523rl4oOtImLkDYC50fEynHG/Bj4k4j4Ruv5mcAJ4NUR8fh4X3/BggWxb9++qSs4M0NDQ8yY\nsbS2e0ZDQ0MsrekcfJ23DUDS9yLikl7GlrZnJGkIeNsYbz8UEW/p80uOboXd/rhrK+ym8ZS1DbrS\nwmii1tanYS9F6+t7Ws8XA090O0RrKk9Z2yBLPbU/XdJMYBowTdJMSWMF5A7gWkkLJZ0LrAa2V1Sq\nmZUs9dT+auA4xYzY1a2PVwNImitpWNJcgNa5oluBB4CDwAFgbYqi7fT58gMbS+qp/XXAujHeO0hH\na+vWa5uBzaUXZqXw5Qc2ntR7RtYgvmPexuMwssr4jnkbzyBd9GgDzpcf2HgcRlYpX35gY/Fhmpll\nwWFkZllwGJlZFhxGZpYFh5GZZcFhZGZZcBiZWRYcRmaWBYeRmWXBYWRmWXAYmVkWHEZmlgWHkZll\nIfUa2D23t5a0UtLJ1lK07cfSaio1s7KlXkKk3d56OXBWD+N3n0aLIzMbAKnXwO6nvbWZ1dignTN6\ng6QnJe2XtGactkZmNmAG6Zf528BFFC2KFgF3A88Bm7oNlrQKWAUwe/bsWvczr3u/9jpvX523rV+K\niHK+cB/trSVtBM6PiJV9fP0rgU9ExBsnGrtgwYLYt29fr1964NS9X3udt6/O2wYg6XsRcUkvYwep\nvfWL/gtAJf8fZlaR1FP7Pbe3lrRC0pzWx68F1gD3VVetmZUp9QnsnttbA8uARyUdA+4HdgGfqr5k\nMytD6qn9dfTY3joibgRurKQwM6tc6j0jMzPAYWRmmXAYmVkWHEZmlgWHkZllwWFkZllwGJlZFhxG\nZpYFh5GZZcFhZGZZcBiZWRYcRmaWBYeRmWXBYWRmWXAYmVkWHEZmlgWHkZllwWFkZllIFkaSZkja\nKumApKOSHpG0YoLPuUHSYUlHJG2TNKOqes2sXCn3jKYDP6PorfZyioX475F0YbfBkpZTLNy/DLgA\nmAesr6JQMytfsjCKiGMRsS4iHo+IUxHxNeCnwFhNGa8BtkbE3oh4GtgArKyoXDMrWTbtrVs90eYD\ne8cYsogX9knbA8yRdF5EPNXl6/1/e2tgRNL3p7LezPw68GTqIkpU5+2r87YBLOh1YBZhJOlMYCdw\nR0T8YIxhs4BnOp63P34Z8KIwiogtwJbW13+41xa7g8jbN7jqvG1QbF+vY0s7TJM0JCnGeDzYMe4M\n4E7gBHDdOF9yGDin43n746NTXryZVa60PaOIWDrRGEkCtgJzgHdGxLPjDN8LLAbuaT1fDDzR7RDN\nzAZP6uuMbgdeB1wWEccnGLsDuFbSQknnUsy+be/x/9ly+iUOBG/f4KrztkEf26eIKLOQsf9j6QLg\ncWAEeK7jrQ9HxE5Jc4HHgIWtVtdI+jjwF8BZwL3ARyJipNLCzawUycLIzKxT6sM0MzPAYWRmmWhE\nGJ3OfXCDRtJ1kh6WNCJpe+p6poKkV0j6sqRjrZ/d+1PXNFXq+PNqO93ftywueqxA531wB4F3UtwH\n9/qIeDxlYVPoELARWE5xgr8OvkBx/dkc4GLg65L2RMRYV+kPkjr+vNpO6/etsSewJT0KrI+Ie1PX\nMpUkbQTOj4iVqWuZDElnA08DF0XE/tZrdwL/FRE3JS1uCtXl5zWRXn7fGnGYNloP98FZevOB59pB\n1LKH4h5FGyC9/r41Lox6vA/O0psFHBn12jMU9yLagOjn960WYVTCfXBZ6XX7amb0vYi0nvtexAHR\n7+9bLU5gl3AfXFZ62b4a2g9Ml/SaiPhh67XF+NB6IJzO71st9ox61M99cANH0nRJM4FpwDRJMyUN\n7B+biDgG7AJulnS2pEuByyn+0g68uv28uuj/9y0iav+gWKY2gP+l2P1vP65KXdsUbuO61jZ2Ptal\nrmuS2/QK4CvAMYop4venrsk/r5627bR+3xo7tW9meWnSYZqZZcxhZGZZcBiZWRYcRmaWBYeRmWXB\nYWRmWXAYmVkWHEZmlgWHkZllwWFkyUk6S9LPJR2UNGPUe1+UdFLSlanqs2o4jCy5KG6kXAu8Cvho\n+3VJm4BrgY9FxF2JyrOK+N40y4KkaRQrOf4GMA/4IPDXwNqIuDllbVYNh5FlQ9LvA18F/hX4XeC2\niLg+bVVWFYeRZUXSvwFvAO6iWDIkRr3/HuB6im4hT0bEhZUXaaXwOSPLhqT3UqzmCHB0dBC1PA3c\nBvxVZYVZJbxnZFmQ9A6KQ7SvAs8CfwC8PiL+c4zxVwCf9Z5RfXjPyJKT9CaKJWYfAq4CVgOngE0p\n67JqOYwsKUkLgfspFuC/IiJGIuLHFIu5X95a+9oawGFkyUiaC3yT4jzQiojo7JO2ATgO3JqiNqte\nnboR2ICJiIMUFzp2e+8Q8NJqK7KUHEY2UFoXR57ZeqjV7iciYiRtZTZZDiMbNB8A/rHj+XHgAHBh\nkmpsynhq38yy4BPYZpYFh5GZZcFhZGZZcBiZWRYcRmaWBYeRmWXBYWRmWfg/SE3gIHFVDBcAAAAA\nSUVORK5CYII=\n", 1539 | "text/plain": [ 1540 | "
" 1541 | ] 1542 | }, 1543 | "metadata": { 1544 | "tags": [] 1545 | } 1546 | }, 1547 | { 1548 | "output_type": "stream", 1549 | "text": [ 1550 | "CPU times: user 34.1 s, sys: 1.36 s, total: 35.5 s\n", 1551 | "Wall time: 27.5 s\n" 1552 | ], 1553 | "name": "stdout" 1554 | } 1555 | ] 1556 | }, 1557 | { 1558 | "cell_type": "markdown", 1559 | "metadata": { 1560 | "id": "6GW2opX7SwMo", 1561 | "colab_type": "text" 1562 | }, 1563 | "source": [ 1564 | "\n", 1565 | "# AE training" 1566 | ] 1567 | }, 1568 | { 1569 | "cell_type": "code", 1570 | "metadata": { 1571 | "id": "ukO76l6yIoPc", 1572 | "colab_type": "code", 1573 | "colab": {} 1574 | }, 1575 | "source": [ 1576 | "# test msg sequence for normal encoding\n", 1577 | "N_test = 500000\n", 1578 | "test_msg = np.random.randint(M, size=N_test)" 1579 | ], 1580 | "execution_count": 0, 1581 | "outputs": [] 1582 | }, 1583 | { 1584 | "cell_type": "markdown", 1585 | "metadata": { 1586 | "id": "PK5wA-zzHScv", 1587 | "colab_type": "text" 1588 | }, 1589 | "source": [ 1590 | "### Comparison" 1591 | ] 1592 | }, 1593 | { 1594 | "cell_type": "code", 1595 | "metadata": { 1596 | "id": "7M-S0sbhIoPw", 1597 | "colab_type": "code", 1598 | "outputId": "b68adbf9-ed04-4060-8aaf-e27c38beecd9", 1599 | "colab": { 1600 | "base_uri": "https://localhost:8080/", 1601 | "height": 106 1602 | } 1603 | }, 1604 | "source": [ 1605 | "gan_bber_data = gan_Test_AE(test_msg)" 1606 | ], 1607 | "execution_count": 0, 1608 | "outputs": [ 1609 | { 1610 | "output_type": "stream", 1611 | "text": [ 1612 | "Progress: 6 of 30 parts\n", 1613 | "Progress: 12 of 30 parts\n", 1614 | "Progress: 18 of 30 parts\n", 1615 | "Progress: 24 of 30 parts\n", 1616 | "Progress: 30 of 30 parts\n" 1617 | ], 1618 | "name": "stdout" 1619 | } 1620 | ] 1621 | }, 1622 | { 1623 | "cell_type": "code", 1624 | "metadata": { 1625 | "id": "UYdEm0eQIoP2", 1626 | "colab_type": "code", 1627 | "outputId": "34241d83-1fc3-4562-9cb4-281aeebd1ecf", 1628 | "colab": { 1629 | "base_uri": "https://localhost:8080/", 1630 | "height": 406 1631 | } 1632 | }, 1633 | "source": [ 1634 | "# Approximate 16 QAM Error\n", 1635 | "def SIXT_QAM_sim(ebno):\n", 1636 | " return (3.0/2)*special.erfc(np.sqrt((4.0/10)*10.**(ebno/10)))\n", 1637 | "\n", 1638 | "ebnodbs = np.linspace(0,15,16)\n", 1639 | "fig = plt.figure(figsize=(10, 6))\n", 1640 | "plt.semilogy(gan_bber_data[0], gan_bber_data[1], '^-')\n", 1641 | "plt.semilogy(ebnodbs, SIXT_QAM_sim(ebnodbs), '*-');\n", 1642 | "plt.gca().set_ylim(1e-5, 1)\n", 1643 | "plt.gca().set_xlim(0, 15)\n", 1644 | "plt.ylabel(\"Batch Symbol Error Rate\", fontsize=14, rotation=90)\n", 1645 | "plt.xlabel(\"SNR [dB]\", fontsize=18)\n", 1646 | "plt.legend(['AE with WGAN', '16QAM'],\n", 1647 | " prop={'size': 14}, loc='upper right');\n", 1648 | "plt.grid(True, which=\"both\")\n", 1649 | "#print('time to train the AE Model with GAN',time_to_train_gan)\n" 1650 | ], 1651 | "execution_count": 0, 1652 | "outputs": [ 1653 | { 1654 | "output_type": "display_data", 1655 | "data": { 1656 | "image/png": "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\nhNYAAAAASUVORK5CYII=\n", 1657 | "text/plain": [ 1658 | "
" 1659 | ] 1660 | }, 1661 | "metadata": { 1662 | "tags": [] 1663 | } 1664 | } 1665 | ] 1666 | }, 1667 | { 1668 | "cell_type": "code", 1669 | "metadata": { 1670 | "id": "bBes21qLlcS8", 1671 | "colab_type": "code", 1672 | "outputId": "a5185103-70c0-47bd-9952-e270a34e3ea7", 1673 | "colab": { 1674 | "base_uri": "https://localhost:8080/", 1675 | "height": 106 1676 | } 1677 | }, 1678 | "source": [ 1679 | "bber_data_rayleigh = Test_AE_rayleigh(test_msg)" 1680 | ], 1681 | "execution_count": 0, 1682 | "outputs": [ 1683 | { 1684 | "output_type": "stream", 1685 | "text": [ 1686 | "Progress: 6 of 30 parts\n", 1687 | "Progress: 12 of 30 parts\n", 1688 | "Progress: 18 of 30 parts\n", 1689 | "Progress: 24 of 30 parts\n", 1690 | "Progress: 30 of 30 parts\n" 1691 | ], 1692 | "name": "stdout" 1693 | } 1694 | ] 1695 | }, 1696 | { 1697 | "cell_type": "code", 1698 | "metadata": { 1699 | "id": "q60pg9b9Rz7C", 1700 | "colab_type": "code", 1701 | "outputId": "9605e4cc-ba1d-4cef-e8cb-fc8097d4a184", 1702 | "colab": { 1703 | "base_uri": "https://localhost:8080/", 1704 | "height": 406 1705 | } 1706 | }, 1707 | "source": [ 1708 | "def SIXT_QAM_sim(ebno):\n", 1709 | " return (3.0/2)*special.erfc(np.sqrt((4.0/10)*10.**(ebno/10)))\n", 1710 | "\n", 1711 | "ebnodbs = np.linspace(0,15,16)\n", 1712 | "fig = plt.figure(figsize=(10, 6))\n", 1713 | "plt.semilogy(gan_bber_data[0], gan_bber_data[1], 'o-')\n", 1714 | "plt.semilogy(bber_data_rayleigh[0], bber_data_rayleigh[1], '+-')\n", 1715 | "#plt.semilogy(ebnodbs, SIXT_QAM_sim(ebnodbs), '^-');\n", 1716 | "plt.gca().set_ylim(1e-5, 1)\n", 1717 | "plt.gca().set_xlim(0, 15)\n", 1718 | "plt.ylabel(\"Batch Symbol Error Rate\", fontsize=14, rotation=90)\n", 1719 | "plt.xlabel(\"SNR [dB]\", fontsize=18)\n", 1720 | "plt.legend(['BSER for Gauss','BSER for Rayleigh'],\n", 1721 | " prop={'size': 14}, loc='upper right');\n", 1722 | "plt.grid(True, which=\"both\")\n", 1723 | "#plt.savefig('home/ben/Downloads/MineRayleigh.eps', format='eps')" 1724 | ], 1725 | "execution_count": 0, 1726 | "outputs": [ 1727 | { 1728 | "output_type": "display_data", 1729 | "data": { 1730 | "image/png": "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\n", 1731 | "text/plain": [ 1732 | "
" 1733 | ] 1734 | }, 1735 | "metadata": { 1736 | "tags": [] 1737 | } 1738 | } 1739 | ] 1740 | }, 1741 | { 1742 | "cell_type": "code", 1743 | "metadata": { 1744 | "id": "xR1kh-fxcASt", 1745 | "colab_type": "code", 1746 | "colab": {} 1747 | }, 1748 | "source": [ 1749 | "" 1750 | ], 1751 | "execution_count": 0, 1752 | "outputs": [] 1753 | } 1754 | ] 1755 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Comparison_MI_GAN 2 | Master Thesis compairing 2Communicationsystems Baised on GAN, Wasserstein GAN and on Mutual Information 3 | 4 | Baised on: 5 | "Deep Learning for Channel Coding via Neural Mutual Information Estimation" by Rick Fritschek, Rafael F. Schaefer and Gerhard Wunder 6 | https://github.com/Fritschek/Wireless_encoding_with_MI_estimation 7 | 8 | "Wasserstein GAN" by Martin Arjovsky1, Soumith Chintala, and L ́eon Bottou 9 | 10 | https://colab.research.google.com/drive/1Vhe3Ft4erub81VPp0-ZJHCakTrB5eVcj#scrollTo=00dI2M4iSYcE 11 | 12 | 13 | "An Introduction to Deep Learning for the Physical Layer" by Timothy O’Shea , Senior Member, IEEE, and Jakob Hoydis, Member, IEEE 14 | --------------------------------------------------------------------------------