{ "cells": [ { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "import math\n", "from os import makedirs\n", "import errno\n", "from keras.models import Sequential\n", "from keras.layers import Dense, Dropout, Activation\n", "from keras.losses import binary_crossentropy, mean_absolute_error\n", "from keras.callbacks import ModelCheckpoint, Callback\n", "from keras_tqdm import TQDMNotebookCallback\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "sns.set()\n", "\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def steering_matrix(doas, wavelength, sensor_locations):\n", " \"\"\"\n", " Generates a steering matrix.\n", " \n", " :param doas: A numpy array of DOAs. Must be a row vector.\n", " :param wavelength: Wavelength.\n", " :param sensor_locations: A numpy array of sensor locations.\n", " :returns: A steering matrix.\n", " \"\"\"\n", " return np.exp(1j * 2 * math.pi / wavelength * np.reshape(sensor_locations, (-1, 1)) * np.sin(doas))\n", "\n", "def generate_cov_mat(doas, wavelength, sensor_locations, noise_power=1., snr=0., n_snapshots=1):\n", " \"\"\"\n", " Generates a sample covariance matrix.\n", " \n", " :param doas: A numpy array of DOAs. Must be a row vector.\n", " :param wavelength: Wavelength.\n", " :param sensor_locations: A numpy array of sensor locations.\n", " :param noise_power: Variance of the additive noise.\n", " :param snr: Signal-to-noise ratio in dB.\n", " :param n_snapshots: Number of snapshots.\n", " :returns: A sample covariance matrix.\n", " \"\"\"\n", " noise_power = 10**(-snr / 10)\n", " A = steering_matrix(doas, wavelength, sensor_locations)\n", " # Noise\n", " N = 1j * np.random.randn(sensor_locations.size, n_snapshots)\n", " N += np.random.randn(sensor_locations.size, n_snapshots)\n", " N *= math.sqrt(noise_power)\n", " # Source\n", " S = 1j * np.random.randn(doas.size, n_snapshots)\n", " S += np.random.randn(doas.size, n_snapshots)\n", " S *= math.sqrt(0.5)\n", " # Snapshot model\n", " Y = A @ S + N\n", " return (Y @ Y.conj().T) / n_snapshots\n", "\n", "def process_cov_mat(R):\n", " \"\"\"\n", " Convert a sample covariance matrix for the input layer of our\n", " neural network.\n", " \n", " :param R: An MxM sample covariance matrix.\n", " :returns: Converted sample covariance matrix. An M^2 x 1 vector.\n", " \"\"\"\n", " R /= np.linalg.norm(R, 'fro')\n", " # Because R is Hermitian, we only need the upper triangular part.\n", " # Hence we can combine the real and imaginary part here.\n", " R_comb = np.triu(R.real) + np.tril(R.imag)\n", " # Vectorize\n", " return R_comb.reshape((-1,))\n", "\n", "# Generates flatten and normalized covariance matrices.\n", "class CovarianceMatrixGenerator:\n", " def __init__(self, batch_size, doa_grid, sensor_locations, wavelength=1, min_n_doas=1, max_n_doas=None,\n", " min_n_snapshots=50, max_n_snapshots=1000, min_snr=-10, max_snr=10):\n", " \"\"\"\n", " Creates a data generator that generates sample covariance matrices.\n", " Note: The data generation process is not cheap. Ideally we want to\n", " run the data generator on a separate thread. Overall the\n", " training process is CPU bound.\n", " \n", " :param batch_size: Batch size.\n", " :param doa_grid: A numpy vector representing the DOA grid.\n", " :param sensor_locations: A numpy array of sensor locations.\n", " :param wavelength: Wavelength.\n", " :param min_n_doas: Minimum number of DOAs.\n", " :param max_n_doas: Maximum number of DOAs.\n", " :param min_n_snapshots: Minimum number of snapshots.\n", " :param max_n_snapshots: Maximum number of snapshots.\n", " :param min_snr: Minimum SNR.\n", " :param max_snr: Maximum SNR.\n", " \"\"\"\n", " self.batch_size = batch_size\n", " self.doa_grid = doa_grid\n", " self.sensor_locations = sensor_locations\n", " self.wavelength = wavelength\n", " self.min_n_doas = min_n_doas\n", " if max_n_doas is None:\n", " self.max_n_doas = sensor_locations.size - 1\n", " else:\n", " # Cannot have too many source.\n", " self.max_n_doas = min(sensor_locations.size - 1, max_n_doas)\n", " self.min_n_snapshots = min_n_snapshots\n", " self.max_n_snapshots = max_n_snapshots\n", " self.min_snr = min_snr\n", " self.max_snr = max_snr\n", " \n", " def __pick_doas(self):\n", " \"\"\"\n", " Picks doas on grid.\n", " \"\"\"\n", " k = np.random.randint(self.min_n_doas, self.max_n_doas + 1)\n", " while True:\n", " ind = np.random.choice(self.doa_grid.size, k)\n", " # ensure minimal separation\n", " if k == 1 or np.min(np.diff(np.sort(ind))) > 2:\n", " break\n", " return self.doa_grid[ind], ind\n", " \n", " def generate(self):\n", " \"\"\"\n", " Generate a batch of training samples.\n", " \"\"\"\n", " r_dim = self.sensor_locations.size**2\n", " n_grid_points = self.doa_grid.size\n", " # An infinite generator.\n", " while True:\n", " x = np.zeros((self.batch_size, r_dim), dtype=np.float32)\n", " y = np.zeros((self.batch_size, n_grid_points), dtype=np.float32)\n", " for i in range(self.batch_size):\n", " doas, ind = self.__pick_doas()\n", " snr = np.random.uniform(self.min_snr, self.max_snr)\n", " n_snapshots = np.random.randint(self.min_n_snapshots, self.max_n_snapshots + 1)\n", " # We use normalized noise variance.\n", " R = generate_cov_mat(doas, self.wavelength, self.sensor_locations, 1., snr, n_snapshots)\n", " x[i,:] = process_cov_mat(R)\n", " y[i,ind] = 1.0\n", " yield x, y\n", "\n", "class CombinedLoss:\n", " def __init__(self, weight=0.5):\n", " \"\"\"\n", " Creates a combined loss function.\n", " \n", " :param weight: Weight between the binary cross entropy loss and the L1 loss.\n", " \"\"\"\n", " self.weight = weight\n", " \n", " def compute_loss(self, y_true, y_pred):\n", " return binary_crossentropy(y_true, y_pred) * self.weight + mean_absolute_error(y_true, y_pred) * (1.0 - self.weight)\n", " \n", "class PlotCallback(Callback):\n", " def __init__(self, doa_grid, x, true_doas, outputdir):\n", " \"\"\"\n", " Plots the result for a fixed input after each epoch.\n", " \n", " :param doa_grid: DOA grid.\n", " :param x: Input to the neural network.\n", " :param true_doas: True doas.\n", " \"\"\"\n", " super().__init__()\n", " self.doa_grid = doa_grid\n", " self.x = x\n", " self.true_doas = true_doas\n", " self.outputdir = outputdir\n", " \n", " def on_epoch_end(self, epoch, logs=None):\n", " plt.ioff()\n", " y_pred = self.model.predict(self.x, verbose=0)\n", " plt.figure()\n", " plt.plot(self.doa_grid, y_pred[0,:])\n", " plt.stem(self.true_doas, np.ones(self.true_doas.shape), '--', basefmt=' ')\n", " plt.legend(['Estimated', 'True DOAs'])\n", " plt.xlabel('DOA')\n", " plt.ylabel('Output')\n", " plt.savefig(self.outputdir + '/output_%d.png' % (epoch,))\n", " plt.close()\n", " plt.ion()" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "dense_50 (Dense) (None, 128) 32896 \n", "_________________________________________________________________\n", "activation_50 (Activation) (None, 128) 0 \n", "_________________________________________________________________\n", "dense_51 (Dense) (None, 256) 33024 \n", "_________________________________________________________________\n", "activation_51 (Activation) (None, 256) 0 \n", "_________________________________________________________________\n", "dense_52 (Dense) (None, 512) 131584 \n", "_________________________________________________________________\n", "activation_52 (Activation) (None, 512) 0 \n", "_________________________________________________________________\n", "dense_53 (Dense) (None, 180) 92340 \n", "_________________________________________________________________\n", "activation_53 (Activation) (None, 180) 0 \n", "=================================================================\n", "Total params: 289,844\n", "Trainable params: 289,844\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "# Create the DOA grid.\n", "n_grid_points = 180;\n", "doa_grid = np.linspace(-math.pi/2.1, math.pi/2.1, n_grid_points + 1)\n", "doa_grid = doa_grid[:-1]\n", "\n", "# Initialize parameters.\n", "wavelength = 1\n", "batch_size = 32\n", "n_epochs = 200\n", "steps_per_epoch = 500\n", "validation_steps = 50\n", "sensor_locations = np.linspace(0, 15, 16)\n", "\n", "# Initialize data generators.\n", "train_gen = CovarianceMatrixGenerator(batch_size, doa_grid, sensor_locations, wavelength, max_n_doas=8).generate()\n", "val_gen = CovarianceMatrixGenerator(batch_size, doa_grid, sensor_locations, wavelength, max_n_doas=8).generate()\n", "\n", "# Fixed DOAs for visualizing the output after each epoch.\n", "doa_vis = doa_grid[[50, 90, 130]]\n", "x_vis = process_cov_mat(generate_cov_mat(doa_vis, wavelength, sensor_locations, n_snapshots=500))[np.newaxis,:]\n", "\n", "# Setup the model.\n", "model = Sequential([\n", " Dense(128, input_shape=(sensor_locations.size**2,)),\n", " Activation('relu'),\n", " Dense(256),\n", " Activation('relu'),\n", " Dense(512),\n", " Activation('relu'),\n", " Dense(n_grid_points),\n", " Activation('sigmoid'),\n", "])\n", "loss_func = CombinedLoss(weight=0.9)\n", "model.compile(optimizer='adam', loss=loss_func.compute_loss)\n", "model.summary();\n", "\n", "# Setup the callbacks\n", "check_point_directory = 'mlp_doa_checkpoints'\n", "output_directory = 'output'\n", "try:\n", " makedirs(check_point_directory)\n", "except OSError as e:\n", " if e.errno != errno.EEXIST:\n", " raise\n", "try:\n", " makedirs(output_directory)\n", "except OSError as e:\n", " if e.errno != errno.EEXIST:\n", " raise\n", "check_pointer_callback = ModelCheckpoint(filepath=check_point_directory + '/model_{epoch:03d}.hdf5')\n", "plot_callback = PlotCallback(doa_grid, x_vis, doa_vis, output_directory)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Train!\n", "# Note: because the sample generation process not cheap on CPU.\n", "# the training speed is bounded by the CPU.\n", "history = model.fit_generator(generator=train_gen,\n", " steps_per_epoch=steps_per_epoch,\n", " validation_data=val_gen,\n", " validation_steps=validation_steps,\n", " epochs=n_epochs,\n", " verbose=0,\n", " callbacks=[TQDMNotebookCallback(leave_outer=True), check_pointer_callback, plot_callback])" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nDwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot the loss\n", "plt.figure()\n", "plt.plot(history.history['loss'])\n", "plt.plot(history.history['val_loss'])\n", "plt.ylabel('Loss')\n", "plt.xlabel('Epoch')\n", "plt.legend(['train', 'validation'])\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Let's test our model.\n", "# Randomly pick two doas. SNR = 0dB, n_snapshots = 500\n", "plt.figure(figsize=(10, 8))\n", "for i in range(4):\n", " doas = doa_grid[np.random.choice(n_grid_points, 2)]\n", " R = generate_cov_mat(doas, wavelength, sensor_locations, 1., 0, 500)\n", " x_te = process_cov_mat(R)[np.newaxis,:]\n", " y_pred = model.predict(x_te, verbose=0)\n", " plt.subplot(2, 2, i + 1)\n", " plt.plot(doa_grid, y_pred[0,:])\n", " plt.stem(doas, np.ones(doas.shape), '--', basefmt=' ')\n", " plt.legend(['Estimated', 'True DOAs'])\n", " plt.xlabel('DOA')\n", " plt.ylabel('Output')\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" }, "widgets": { "state": { "00a81163e02a47f5b378d4760abecf61": { "views": [ { "cell_index": 3 } ] }, "79996c27a24a4d679dbeecf09698bf7d": { "views": [ { "cell_index": 3 } ] }, "873537d23b6d4d67852c25b29b8a57cc": { "views": [ { "cell_index": 3 } ] }, "ad65889b3a0748cbb3683fdaed0f3e65": { "views": [ { "cell_index": 3 } ] } }, "version": "1.2.0" } }, "nbformat": 4, "nbformat_minor": 2 }