{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3D Time/Frequency/Phase Representation of Audio for Speech Recognition.\n",
    "\n",
    "I recently participated in a <a href=https://www.kaggle.com/c/tensorflow-speech-recognition-challenge> speech recognition </a> kaggle competition. Although I didn't come close to the top of the leaderboard (238th place with 87% accuracy vs 91% accuracy for the winners) I learned quite a bit about handling audio data and had a lot of fun. One of the more novel things I tried during the competition was to spatially encode the phase information in the audio and pass the results into a 3D CNN.\n",
    "\n",
    "A common pre-processing step in speech recognition is to turn the 1D audio into a 2D <a href=\"https://en.wikipedia.org/wiki/Spectrogram\">spectrogram</a>. The spectrogram the volume of the audio as a function of time and at a particular frequency. Spectrograms are a great way of summarizing the important information in an audio clip in a way that makes it accessible visually. Here is a spectrogram of an utterance of the word \"marvin\".\n",
    "\n",
    "![marvin_specgram](../images/marvin_specgram.jpg)\n",
    "\n",
    "<!-- TEASER_END -->"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Although the plot of the audio trace is interesting it is nothing compared to the richness of the visual information available from the spectrogram. Since spectrograms are not only beautiful but are also intuitively interpretable it is no wonder that they would be a popular choice for preprocessing audio data before digesting with a neural network.\n",
    "\n",
    "However not all information in the input audio makes it into the output spectrogram. To find the volume at a particular time and frequency we first decompose the audio into a sum of windowed sinusoids using a short time Fourier transform (STFT). The STFT gives us a set of complex numbers with the magnitude of those numbers represnting a magnitude of the associated sinusoid and the angle of the complex number representing its phase. To get the spectrogram you want just the volume information which is the magnitude of the STFT and you throw away the phase information entirely.\n",
    "\n",
    "If you look at the phase information corresponding to the same audio sample as above it is easy to see why the phase is usually just thrown away.\n",
    "\n",
    "![phase_angle_example](../images/marvin_phase_angle.jpg)\n",
    "\n",
    "You might be able to see some weak signs of structure in the raw phase data but you could be forgiven for assuming that it was all just structureless random noise. The fact that we can do good word classification without incorporating the phase information seems to back this idea up. However if the phase information really were just random noise which carried no additional information then any 2 sound clips which share the same spectrogram should sound the same to our ear. Lets listen to the example sound clip."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import numpy as np\n",
    "import scipy.signal\n",
    "\n",
    "import IPython.display as ipd\n",
    "import tf_speech_recognition as tsr #local python library written for the competition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "                <audio controls=\"controls\" >\n",
       "                    <source src=\"data:audio/wav;base64,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\" type=\"audio/wav\" />\n",
       "                    Your browser does not support the audio element.\n",
       "                </audio>\n",
       "              "
      ],
      "text/plain": [
       "<IPython.lib.display.Audio object>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "example_file = os.path.join(tsr.data_dir, \"raw\", \"train\", \"audio\", 'marvin/fda46b78_nohash_0.wav')\n",
    "audio = tsr.read_wav(example_file)\n",
    "ipd.Audio(audio, rate=16000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Nice and understandable and human sounding. Now lets see what happens to the audio when we replace the phase information with random phases. We simply generate white noise in the time domain and then apply the same STFT to both noise and voice audio. But at reconstruction time we take the phase information from the noise and the magnitude information from the noise. The resulting audio sample will have exactly the same spectrogram as the original audio but truely randomized phases. Will it sound the same?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "                <audio controls=\"controls\" >\n",
       "                    <source src=\"data:audio/wav;base64,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\" type=\"audio/wav\" />\n",
       "                    Your browser does not support the audio element.\n",
       "                </audio>\n",
       "              "
      ],
      "text/plain": [
       "<IPython.lib.display.Audio object>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stft = scipy.signal.stft(audio)[2]\n",
    "stft_mag = np.abs(stft)\n",
    "\n",
    "noise_stft = scipy.signal.stft(np.random.normal(size=audio.shape))[2]\n",
    "random_phase = noise_stft/(np.abs(noise_stft)+1e-5)\n",
    "phase_randomized_audio = scipy.signal.istft(stft_mag*random_phase)[1]\n",
    "ipd.Audio(phase_randomized_audio, rate=16000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The sound clip is still understandable but now the speaker has seemingly been assimilated by the borg. Instead of sounding like a single coherent voice it suddenly sounds like a cacophony of many nearly coherent voices but all with tiny random offsets. Although the second clip is certainly still understandable it no longer sounds much like a normal human voice. That may be enough to show that that the phases are not random but it isn't enough to show that the phase information adds anything above and beyond the regular spectrogram when it comes to speech recognition. After all we can still make out what the word is supposed to be just fine even with totally random phases.\n",
    "\n",
    "A good way to address whether or not the phase information adds anything to the classification problem is to try and incorporate it into a machine learning system and see if we can get improved classification performance using phase information than without it.\n",
    "\n",
    "The first problem we have to solve is how to best process the audio to make the phase information available to our models. We can of course simply feed the raw audio in to our neural network but then we lose all the nice aspects of using spectrogram inputs. We can simply directly feed the phase in radians in to the network as an extra channel along with the magnitude but as we saw above the phase information as a raw phase angle doesn't have any apparent image like structure, it just looks like a random mess. \n",
    "\n",
    "An interesting idea is to try and map the audio into a 3D time/frequency/phase space just in the same way that audio is commonly mapped to a 2D time/frequency space. Just like frequency and time there is a natural sense in which one phase is closer to another, $\\pi$ radians is close to $7/8 \\pi$ radians and far from 0 radians. We can somewhat naturally then encode the phase information as an index along the third dimension of a 3D tensor in the same way that the STFT encodes frequency by an index along the second dimension of a 2D tensor. We can either then treat the resulting phase information as extra channels in a 2D input image to a 2D CNN or double down on the spatial representation and feed the result as a 1 channel 3D \"image\" into a 3D CNN. The 3D CNN idea is too juicy to ignore and so that is what I decided to do. I also experimented with passing the phase information as channels into a 2D CNN and the results seemed comparable but the idea just isn't as much fun. Unfortunately the 3D CNN is much more memory greedy and so takes longer to train and requires that smaller batch sizes be used.\n",
    "\n",
    "No implementation that I attempted \n",
    "\n",
    "## Base TF Phased Spectrogram Code.\n",
    "\n",
    "Here is some base code for processing the audio inputs and generating a \"phased\" spectrogram in which the magntidue of the spectrogram is modulated by how closely aligned it is to a target phase angle, one phase angle per slice in a 3D output tensor.\n",
    "\n",
    "The amount which the spectrogram gets attenuated is determined by ak \"phase_kernel\" which takes as an input the euclidean distance between the location on the unit circle of the target phase and the central phase of the corresponding index in the 3D tensor. \n",
    "\n",
    "The reason for taking the linear distance in the 2D plane is to handle the fact that 0.9$\\pi$ radians and $3.1\\pi$ radians are equally close to $\\pi$ radians since any difference of $2\\pi$ radians is the same as a difference of 0. Ideally we would take a \"distance\" between phase angles directly in radians since that would cause a minimum of distortion but I can't think of a way to express that in TensorFlow code that will be totally free of jump discontinuities. Just so long as our phase kernel drops off fast enough the 2D euclidean distance should be a servicable approximation to the phase difference in radians. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import time, copy\n",
    "\n",
    "import keras\n",
    "import keras.backend as K\n",
    "import tensorflow as tf\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_length = 16000\n",
    "target_length = 16384\n",
    "\n",
    "sound_in = keras.layers.Input(shape=(target_length,), name=\"audio\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_spectrogram_function(\n",
    "    frame_length, \n",
    "    frame_step,\n",
    "    magnitude_activation=lambda x: tf.log(1+x),\n",
    "    fft_length=None\n",
    "):\n",
    "    \"helper function for making spectrogram Lambda layers in keras\"\n",
    "    def _spectrogram(x):\n",
    "        stft = tf.contrib.signal.stft(\n",
    "            x,\n",
    "            frame_length=frame_length,\n",
    "            frame_step=frame_step,\n",
    "            fft_length=fft_length,\n",
    "            pad_end=True,\n",
    "        )\n",
    "        mag = tf.abs(stft)\n",
    "        return magnitude_activation(mag)        \n",
    "    return _spectrogram\n",
    "\n",
    "def make_phased_spectrogram_function(\n",
    "    frame_length, \n",
    "    frame_step, \n",
    "    phase_kernel,\n",
    "    fft_length=None,\n",
    "    phase_mag_damp=1e-5,\n",
    "    phase_resolution=8,\n",
    "    phase_only=False,\n",
    "    magnitude_activation=lambda x: tf.log(1.0+x),\n",
    "):\n",
    "    \"helper function for making phased spectrogram Lambda layers in keras\"\n",
    "    def _spectrogram(x):\n",
    "        stft = tf.contrib.signal.stft(\n",
    "            x,\n",
    "            frame_length=frame_length,\n",
    "            frame_step=frame_step,\n",
    "            fft_length=fft_length,\n",
    "            pad_end=True,\n",
    "        )\n",
    "        mag = tf.abs(stft)\n",
    "        real_part = tf.real(stft)\n",
    "        imag_part = tf.imag(stft)\n",
    "        xpos = real_part/(mag+phase_mag_damp)\n",
    "        ypos = imag_part/(mag+phase_mag_damp)\n",
    "        \n",
    "        #generate phase_resolution equally spaced angles\n",
    "        phi_knots = np.linspace(0, 2*np.pi, phase_resolution+1)[:-1]\n",
    "        x_knots = np.cos(phi_knots)\n",
    "        y_knots = np.sin(phi_knots)\n",
    "        \n",
    "        mag_act = magnitude_activation(mag)\n",
    "        \n",
    "        if phase_only:\n",
    "            activations = []\n",
    "        else:\n",
    "            activations = [mag_act]\n",
    "        for i in range(phase_resolution):\n",
    "            dist_sq = (xpos-x_knots[i])**2 + (ypos-y_knots[i])**2\n",
    "            phase_act = phase_kernel(dist_sq)\n",
    "            if phase_only:\n",
    "                act = mag_act*phase_act\n",
    "            activations.append(act)\n",
    "        \n",
    "        activations = tf.stack(activations, axis=3)\n",
    "        \n",
    "        return activations        \n",
    "    return _spectrogram"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Picking a phase kernel\n",
    "\n",
    "To encode the phase information spatially we need to pick both a number of phase slices to use and how rapidly the activation of a particular phase slice should fall off as the phase of the input spectrogram becomes more distant. Since we are using the 2D euclidean distance as an approximation it makes sense to simply plot up the value of a proposed kernel in 2D. We want to pick enough points on the unit circle so that we can get a good approximation to the phase angle but not so many that we will run out of memory resources when building our network. We also need to make sure that the kernel function we choose drops off fast enough so that the euclidean distance approximation is still roughly valid (we don't want $-\\pi$ and $\\pi$ to start both simultaneously having high non-zero activations) but we don't want it to drop off so fast that a phase half way in between two slices in our phase grid wont significantly activate its two neighboring slices. The ever ubiquitous Gaussian kernel seems like as good as any to use and I tuned the kernel width and the number of phase slices by tweaking the look of the plot below. The larger the number of phase slices the better resolution in phase but also the more redundant our representation and the less well the 2D euclidean distance between adjacent phases approximates the phase difference in radians."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f5fbc8182b0>]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f5fbe5d2f60>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "phase_resolution = 10\n",
    "phase_sigma = 0.8*2*np.pi/phase_resolution\n",
    "\n",
    "xc, yc = np.meshgrid(np.linspace(-1.0, 1.0, 100), np.linspace(-1.0, 1.0, 100))\n",
    "target_x, target_y = 1, 0\n",
    "theta_grid = np.linspace(0, 2*np.pi, phase_resolution+1)[:-1]\n",
    "radii_squared = (xc-target_x)**2 + (yc-target_y)**2\n",
    "phase_similarity = np.exp(-0.5*radii_squared/phase_sigma**2)\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(8, 5))\n",
    "\n",
    "kernel_value_img = ax.imshow(phase_similarity, extent=(-1, 1, -1, 1))\n",
    "cbar = plt.colorbar(kernel_value_img)\n",
    "cbar.set_label(\"Phase Kernel \\n Centered on 0 radians\", fontsize=16)\n",
    "ax.plot(np.cos(theta_grid), np.sin(theta_grid), linestyle=\"none\", marker=\"o\", color=\"r\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now to load in some helpers for data loading and batching from a python helper module I wrote for the speech competition."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/tim/anaconda3/lib/python3.6/site-packages/scipy/io/wavfile.py:273: WavFileWarning: Chunk (non-data) not understood, skipping it.\n",
      "  WavFileWarning)\n"
     ]
    }
   ],
   "source": [
    "command_words = [\"yes\", \"no\", \"up\", \"down\", \"left\", \"right\", \"on\", \"off\", \"stop\", \"go\"]\n",
    "command_encoder = tsr.preprocessing.LimitedVocabularyEncoder(\n",
    "    vocabulary=command_words,\n",
    "    encoding_type=\"onehot\",\n",
    ")\n",
    "\n",
    "preprocessor = tsr.SoundPreprocessor(\n",
    "    input_transforms={\"audio\":lambda x, y: x},\n",
    "    output_transforms={\n",
    "        \"command_probs\":lambda x, y: command_encoder.encode(x[\"word\"]),\n",
    "    },\n",
    "    input_length=input_length,\n",
    "    target_length=target_length,\n",
    "    downsampling_rate=1,\n",
    "    t_shift_max=0,\n",
    "    silence_fraction=0.1,\n",
    "    additive_bg_fraction=0.3,\n",
    "    bg_mag_range=(0.01, 0.1),\n",
    "    stretch_fraction=0,\n",
    "    stretch_range=None,\n",
    "    stretch_center=0.5,\n",
    "    repitching_fraction=0,\n",
    "    repitching_range=None,\n",
    "    relabel_fraction=0.0,\n",
    "    bg_noise_samples=tsr.get_background_noise_samples(),\n",
    "    mean_subtract=True,\n",
    "    norm_type=\"rms\",\n",
    "    norm_damp=1e-4,\n",
    ")\n",
    "\n",
    "load_batch = tsr.data_loading.simple_sound_batch_loader\n",
    "\n",
    "train_labels = tsr.get_labels_df(\"train\")\n",
    "\n",
    "train_loading_kwargs = dict(\n",
    "    labels_df=train_labels,\n",
    "    preprocessor=preprocessor,\n",
    "    augment=True,\n",
    "    data_directory=os.path.join(tsr.data_dir, \"raw\", \"train\", \"audio\"),\n",
    "    forcing_kwargs={},\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Phased Spectrogram Visualizations\n",
    "\n",
    "Because these phased spectrograms are 3D tensors they are significantly more difficult to visualize than regular spectrograms which you can just visualize as images. The easiest way to visualize the 3D tensor is to simply take slices and look at them one at a time. But it is difficult to get a sense of the global structure that way. Chain the slice visualizations together and you have a movie. \n",
    "\n",
    "With a little work we can make a nice animation in matplotlib which takes a 3D array and animates a movie of slices through it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib.animation import FuncAnimation\n",
    "from IPython.display import HTML\n",
    "plt.rc('animation', html='html5')\n",
    "\n",
    "class SlicingAnimation():\n",
    "    \n",
    "    def __init__(\n",
    "        self,\n",
    "        data,\n",
    "        animation_axis,\n",
    "        reduction_axis,\n",
    "        axis_labels,\n",
    "        extents,\n",
    "        vmin=None,\n",
    "        vmax=None,\n",
    "        reducer=np.mean,\n",
    "        figsize=(10, 6),\n",
    "    ):\n",
    "        assert reduction_axis != animation_axis\n",
    "        left_over_axis ,= list(set(range(3)) - set([animation_axis, reduction_axis]))\n",
    "        \n",
    "        #permute the input data so we won't have to do any reindexing later\n",
    "        axis_order = [animation_axis, reduction_axis, left_over_axis]\n",
    "        self.axis_order = axis_order\n",
    "        self.axis_labels = [axis_labels[ao] for ao in axis_order]\n",
    "        self.extents = [extents[ao] for ao in axis_order]\n",
    "        data = data.transpose(axis_order)\n",
    "        \n",
    "        #extract a reduced 2D form of the input data to aid with orienting ourselves\n",
    "        reduction_axis = axis_order[reduction_axis]\n",
    "        self.reduced_approx = reducer(data, axis=1)\n",
    "        \n",
    "        self.data = data\n",
    "        \n",
    "        if vmin is None:\n",
    "            vmin = np.min(data)\n",
    "        self.vmin = vmin\n",
    "        if vmax is None:\n",
    "            vmax = np.max(data)\n",
    "        self.vmax = vmax\n",
    "        \n",
    "        fig, axes = plt.subplots(2, 1, figsize=figsize)\n",
    "        self.fig = fig\n",
    "        self.axes = axes\n",
    "    \n",
    "    def plot_init(self):\n",
    "        im_kwargs = {\n",
    "            \"vmin\":self.vmin,\n",
    "            \"vmax\":self.vmax,\n",
    "            \"aspect\":\"auto\",\n",
    "            \"origin\":\"lower\",\n",
    "        }\n",
    "        self.axes[0].set_xlabel(self.axis_labels[0])\n",
    "        self.axes[0].set_ylabel(self.axis_labels[2])\n",
    "        self.axes[1].set_xlabel(self.axis_labels[2])\n",
    "        self.axes[1].set_ylabel(self.axis_labels[1])\n",
    "        \n",
    "        extent = []\n",
    "        extent.extend(self.extents[0])\n",
    "        extent.extend(self.extents[1])\n",
    "        static_im = self.axes[0].imshow(\n",
    "            self.reduced_approx.transpose(),\n",
    "            extent=extent,\n",
    "            **im_kwargs\n",
    "        )\n",
    "        extent = []\n",
    "        extent.extend(self.extents[2])\n",
    "        extent.extend(self.extents[1])\n",
    "        changing_im = self.axes[1].imshow(\n",
    "            self.data[0],\n",
    "            extent=extent,\n",
    "            **im_kwargs,\n",
    "        )\n",
    "        \n",
    "        self.temporal_indicator = self.axes[0].plot([], [], alpha=0.8, c=\"r\")[0]\n",
    "        self.static_im = static_im\n",
    "        self.changing_im = changing_im\n",
    "        return [static_im, changing_im, self.temporal_indicator]\n",
    "    \n",
    "    def update(self, frame):\n",
    "        self.changing_im.set_data(self.data[frame])\n",
    "        delta = self.extents[0][1]-self.extents[0][0]\n",
    "        ind_coord = self.extents[0][0] + frame/len(self.data) * delta\n",
    "        span = self.axes[0].get_ylim()\n",
    "        self.temporal_indicator.set_data([ind_coord, ind_coord], span)\n",
    "        return [self.static_im, self.changing_im, self.temporal_indicator]\n",
    "    \n",
    "    def get_anim(self):\n",
    "        ani = FuncAnimation(\n",
    "            self.fig, \n",
    "            self.update, \n",
    "            frames=len(self.data),\n",
    "            init_func=self.plot_init, \n",
    "            blit=True,\n",
    "        )\n",
    "        return ani"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we have everything we need to visualize the phase structure in a way which hopefully will give us more insight than simply displaying a heat map of phase angle."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "time_resolution = 256\n",
    "size_ratio = int(target_length/time_resolution)\n",
    "phased_spectrogram = keras.layers.Lambda(\n",
    "    make_phased_spectrogram_function(\n",
    "        frame_length=4*size_ratio, \n",
    "        frame_step=size_ratio,\n",
    "        phase_resolution=phase_resolution,\n",
    "        phase_mag_damp=1e-5,\n",
    "        phase_kernel = lambda x: tf.exp(-0.5*x/phase_sigma**2),\n",
    "        phase_only=True,\n",
    "    )\n",
    ")(sound_in)\n",
    "\n",
    "phased_specgram_model = keras.models.Model(sound_in, phased_spectrogram)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "During training it will be desirable to add extra noise and/or stretch and repitch the input sounds but for the moment all that noise is just going to make it more difficult to understand the structure in our samples. So we want to turn augmentation off for these visualizations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_loading_kwargs_no_aug = copy.copy(train_loading_kwargs)\n",
    "train_loading_kwargs_no_aug[\"augment\"] = False"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "I've picked an example of the word \"sheila\" and cropped the time dimension down so that we don't spend much time looking at the silence before or after. If you animate the time axis and display frequency/phase slices for each time step you get the following. In order to save on filesize of this notebook I have saved the animation out to file instead of displaying it inline. The %%capture magic in the cell below is to suppress the usual inline output so that we don't see two versions of the same file. However you can embed the animation directly in the notebook without saving it out by removing the %%capture line at the top of the cell and ending the cell simply with phase_anim.get_anim(). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "%%capture\n",
    "word = \"sheila\"\n",
    "example_file = train_labels.index[train_labels.word.values == word][4]\n",
    "example_batch = load_batch([example_file], **train_loading_kwargs_no_aug)\n",
    "spec_out = phased_specgram_model.predict(example_batch[0])[0]\n",
    "\n",
    "print(\"word=\", word)\n",
    "\n",
    "t_keep = 0.7\n",
    "cur_dat = spec_out[:int(len(spec_out)*t_keep)]\n",
    "vmax = np.percentile(cur_dat, 99)\n",
    "extents = [\n",
    "    (0, 1000*t_keep),   \n",
    "    (0, 8000),\n",
    "    (0, 2*np.pi*(1-1.0/phase_resolution)), \n",
    "]\n",
    "phase_anim = SlicingAnimation(\n",
    "    data=cur_dat,\n",
    "    animation_axis=0,\n",
    "    reduction_axis=2,\n",
    "    axis_labels=[\"time\", \"frequency\", \"phase\"],\n",
    "    extents=extents,\n",
    "    vmin=0,\n",
    "    vmax=vmax,\n",
    "    reducer=np.max,\n",
    ")\n",
    "mpl_anim = phase_anim.get_anim()\n",
    "mpl_anim.save(\"../files/videos/sheila_phase_animation.mp4\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<video width=\"640\" height=\"480\" controls>\n",
       "  <source src=\"../videos/sheila_phase_animation.mp4\" type=\"video/mp4\">\n",
       "</video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%HTML\n",
    "<video width=\"640\" height=\"480\" controls>\n",
    "  <source src=\"../videos/sheila_phase_animation.mp4\" type=\"video/mp4\">\n",
    "</video>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Something you might notice is that the phases tend to form little groups which move somewhat coherently over a small band of frequencies. This behavior is particularly pronounced in the regions of the word which correspond to the vowel sounds. I think these coherent phase patterns are due to resonances of the vocal tract of the speaker (also apparently sometimes called <a href=https://en.wikipedia.org/wiki/Formant> formants </a>). \n",
    "\n",
    "## 3D Convolutional Neural Net\n",
    "\n",
    "Even though this representation of the phase information certainly makes it more accessible than a raw phase heatmap it still is difficult to grasp completely. Fortunately for us we don't really need to be able to clearly see the structure in our data in order for a neural network to exploit it. Now that we have transformed the phase information into a spatial dimension we can process it like volumetric data by passing it in to a 3D CNN. \n",
    "\n",
    "The phase dimension is different than the time and frequency dimensions in that it wraps around on itself. The 0'th slice is close to the n-1'th slice. In order to give the neural network access to the adjacent phase slices even at the edges of the phase grid we add Lambda layers which concatenate the last theta layer to the beginning of the phase stack and the first theta layer to the end. If we then use convolutions with padding=\"valid\" then we will recover the same result we would have ahieved if the convolutional kernel wrapped around the theta dimension.\n",
    "\n",
    "I have tinkered with a number of fairly different architectures. Most of the architectures I have tried peter out around an F1 score averaged over words of around 0.93-0.94. This is the generally same sort of performance that I get from 2D CNN models in which the phase information is thrown away. That seems to indicate that either the phase information isn't adding much or that the way I have coded up the network isn't able to take advantage of it. However all of my 2D CNN models benefit from a greatly increased batch size which is something that I can't do as easily for the 3D CNN models since I run out of memory for even modestly sized batches. The fact that the 3D models do so well with a maximum batch size of 32 might be an indication that they could perform better than the 2D models if only I could train them effectively."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def concat_theta_layer(activation):\n",
    "    #n_theta = activation.shape[3]\n",
    "    return K.concatenate([activation[:, :, :, :1], activation, activation[:, :, :, -1:]], axis=3)\n",
    "\n",
    "def theta_concat_output_shape(input_shape):\n",
    "    nb, nr, nz, nt, nf = input_shape\n",
    "    return (nb, nr, nz, nt+2, nf)\n",
    "\n",
    "from keras.layers import Conv1D, Conv2D, Conv3D\n",
    "from keras.layers import MaxPooling1D, MaxPooling2D, MaxPooling3D\n",
    "from keras.layers import LeakyReLU, concatenate\n",
    "\n",
    "def make_conv(\n",
    "        x,\n",
    "        n_filters,\n",
    "        kernel_size,\n",
    "        conv_strides,\n",
    "        leak,\n",
    "        pool_size,\n",
    "        pool_strides,\n",
    "        conv_kwargs=None,\n",
    "):\n",
    "    n_dim = len(x.shape)\n",
    "    if n_dim == 3:\n",
    "        conv = Conv1D\n",
    "        pool = MaxPooling1D\n",
    "    elif n_dim == 4:\n",
    "        conv = Conv2D\n",
    "        pool = MaxPooling2D\n",
    "    elif n_dim == 5:\n",
    "        conv = Conv3D\n",
    "        pool = MaxPooling3D\n",
    "    else:\n",
    "        raise ValueError()\n",
    "    \n",
    "    default_conv_kwargs = {\n",
    "        \"padding\":\"same\",\n",
    "    }\n",
    "    \n",
    "    if conv_kwargs is None:\n",
    "        conv_kwargs={}\n",
    "    default_conv_kwargs.update(conv_kwargs)\n",
    "    x = conv(\n",
    "        n_filters, \n",
    "        kernel_size=kernel_size,\n",
    "        strides=conv_strides,\n",
    "        **default_conv_kwargs\n",
    "    )(x)\n",
    "    if not pool_size is None:\n",
    "        x = pool(\n",
    "            pool_size=pool_size,\n",
    "            strides=pool_strides,\n",
    "            padding=\"same\",\n",
    "        )(x)\n",
    "    else:\n",
    "        assert pool_strides is None\n",
    "    x = LeakyReLU(alpha=leak)(x)\n",
    "    return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = phased_spectrogram\n",
    "\n",
    "#add a channels dimension to the spectrogram data\n",
    "x = keras.layers.Lambda(lambda x:tf.expand_dims(x, axis=4))(x)\n",
    "\n",
    "x=keras.layers.Lambda(concat_theta_layer, output_shape=theta_concat_output_shape)(x)\n",
    "x = make_conv(x, 16,  (3, 3, 3),  (2, 2, 1), 0.2, None, None, conv_kwargs={\"padding\":\"valid\"})\n",
    "x=keras.layers.Lambda(concat_theta_layer, output_shape=theta_concat_output_shape)(x)\n",
    "x = make_conv(x, 32,  (3, 3, 3),  (2, 2, 1), 0.2, None, None, conv_kwargs={\"padding\":\"valid\"})\n",
    "x=keras.layers.Lambda(concat_theta_layer, output_shape=theta_concat_output_shape)(x)\n",
    "x = make_conv(x, 64,  (3, 3, 3),  1, 0.2, None, None, conv_kwargs={\"padding\":\"valid\"})\n",
    "x=keras.layers.Lambda(concat_theta_layer, output_shape=theta_concat_output_shape)(x)\n",
    "x = make_conv(x, 128,  (3, 3, 3),  1, 0.2, None, None, conv_kwargs={\"padding\":\"valid\"})\n",
    "\n",
    "#leave the concatenated theta dimensions padding=\"same\"\n",
    "x=keras.layers.Lambda(concat_theta_layer, output_shape=theta_concat_output_shape)(x)\n",
    "x = make_conv(x, 256,  (3, 3, 3),  1, 0.2, None, None)\n",
    "\n",
    "#reduce the size of the phase dimension by max pooling\n",
    "x = make_conv(x, 128,  1,  1, 0.2, (1, 3, 4), (1, 3, 4))\n",
    "\n",
    "#stack the phase and frequency dimensions together as extra channels\n",
    "reduction_shape = (int(x.shape[1]), int(x.shape[2])*int(x.shape[3])*int(x.shape[4]))\n",
    "x = keras.layers.Reshape(reduction_shape)(x)\n",
    "#now the convolutions will be 1D\n",
    "\n",
    "#collapse the channels down to a manageable number again\n",
    "#x = make_conv(x, 128, 1, 1, 0.2, None, None)\n",
    "x = make_conv(x, 32, 3, 1, 0.2, None, None)\n",
    "timewise_features = x\n",
    "\n",
    "dense_predictor = keras.layers.Dense(12)(keras.layers.Flatten()(timewise_features))\n",
    "\n",
    "time_indep_features = keras.layers.GlobalMaxPooling1D()(timewise_features)\n",
    "max_pooled_predictor = keras.layers.Dense(12)(time_indep_features)\n",
    "\n",
    "\n",
    "x = keras.layers.Add()([dense_predictor, max_pooled_predictor])\n",
    "x = keras.layers.Activation(\"softmax\", name=\"command_probs\")(x)\n",
    "\n",
    "command_probs = x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Model(sound_in, command_probs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "audio (InputLayer)              (None, 16384)        0                                            \n",
      "__________________________________________________________________________________________________\n",
      "lambda_1 (Lambda)               (None, 256, 129, 10) 0           audio[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "lambda_14 (Lambda)              (None, 256, 129, 10, 0           lambda_1[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "lambda_15 (Lambda)              (None, 256, 129, 12, 0           lambda_14[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv3d_13 (Conv3D)              (None, 127, 64, 10,  448         lambda_15[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "leaky_re_lu_15 (LeakyReLU)      (None, 127, 64, 10,  0           conv3d_13[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "lambda_16 (Lambda)              (None, 127, 64, 12,  0           leaky_re_lu_15[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "conv3d_14 (Conv3D)              (None, 63, 31, 10, 3 13856       lambda_16[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "leaky_re_lu_16 (LeakyReLU)      (None, 63, 31, 10, 3 0           conv3d_14[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "lambda_17 (Lambda)              (None, 63, 31, 12, 3 0           leaky_re_lu_16[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "conv3d_15 (Conv3D)              (None, 61, 29, 10, 6 55360       lambda_17[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "leaky_re_lu_17 (LeakyReLU)      (None, 61, 29, 10, 6 0           conv3d_15[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "lambda_18 (Lambda)              (None, 61, 29, 12, 6 0           leaky_re_lu_17[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "conv3d_16 (Conv3D)              (None, 59, 27, 10, 1 221312      lambda_18[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "leaky_re_lu_18 (LeakyReLU)      (None, 59, 27, 10, 1 0           conv3d_16[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "lambda_19 (Lambda)              (None, 59, 27, 12, 1 0           leaky_re_lu_18[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "conv3d_17 (Conv3D)              (None, 59, 27, 12, 2 884992      lambda_19[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "leaky_re_lu_19 (LeakyReLU)      (None, 59, 27, 12, 2 0           conv3d_17[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv3d_18 (Conv3D)              (None, 59, 27, 12, 1 32896       leaky_re_lu_19[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling3d_3 (MaxPooling3D)  (None, 59, 9, 3, 128 0           conv3d_18[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "leaky_re_lu_20 (LeakyReLU)      (None, 59, 9, 3, 128 0           max_pooling3d_3[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "reshape_3 (Reshape)             (None, 59, 3456)     0           leaky_re_lu_20[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_3 (Conv1D)               (None, 59, 32)       331808      reshape_3[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "leaky_re_lu_21 (LeakyReLU)      (None, 59, 32)       0           conv1d_3[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "flatten_3 (Flatten)             (None, 1888)         0           leaky_re_lu_21[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "global_max_pooling1d_2 (GlobalM (None, 32)           0           leaky_re_lu_21[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "dense_4 (Dense)                 (None, 12)           22668       flatten_3[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "dense_5 (Dense)                 (None, 12)           396         global_max_pooling1d_2[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "add_1 (Add)                     (None, 12)           0           dense_4[0][0]                    \n",
      "                                                                 dense_5[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "command_probs (Activation)      (None, 12)           0           add_1[0][0]                      \n",
      "==================================================================================================\n",
      "Total params: 1,563,736\n",
      "Trainable params: 1,563,736\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "def damped_log_loss(y_true, y_pred):\n",
    "    damp_param = 0.0001\n",
    "    clipped = (y_pred+damp_param)/(1.0+2.0*damp_param)\n",
    "    costs = -1.0*(y_true*K.log(clipped) + (1.0-y_true)*K.log(1.0-clipped))\n",
    "    return K.mean(costs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "optimizer = \"adadelta\"\n",
    "model.compile(loss=damped_log_loss, optimizer=optimizer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "dev_labels = tsr.get_labels_df(\"dev\")\n",
    "\n",
    "dev_loading_kwargs = dict(\n",
    "    labels_df=dev_labels,\n",
    "    preprocessor=preprocessor,\n",
    "    augment=False,\n",
    "    data_directory=os.path.join(tsr.data_dir, \"raw\", \"train\", \"audio\"),\n",
    "    forcing_kwargs={},\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "beginning training\n",
      "\n",
      " epoch 1\n",
      "0.28770 0.21902 0.17688 0.17231 0.14983 0.14786 0.13679 0.12461 0.11239 0.10515 0.09558 0.09674 0.09450 0.08528 0.07854 0.07652 0.07930 0.07123 0.06363 0.06660 0.05967 0.06002 0.05993 0.05732 0.05041 0.05183 0.05647 0.04738 0.04740 0.04375 0.04720 0.04538 \n",
      "\n",
      "17.87 minutes per epoch\n",
      "{'f1': [0.90243902439024382, 0.79078694817658346, 0.83089770354906045, 0.8125, 0.82823529411764707, 0.87688984881209509, 0.80266075388026625, 0.780287474332649, 0.90109890109890112, 0.76039603960396041, 0.9440276976341605]}\n",
      "{'f1': 0.83911088050868798}\n",
      "\n",
      " epoch 2\n",
      "0.04075 0.03771 0.04208 0.04154 0.04150 0.03635 0.03854 0.03568 0.03651 0.03064 0.03522 0.03248 0.03725 0.03486 0.03090 0.03479 0.03496 0.03141 0.02840 0.02984 0.03260 0.03188 0.03131 0.02726 0.02604 0.03027 0.02663 0.02936 0.02565 0.02692 0.02270 0.02711 \n",
      "\n",
      "18.20 minutes per epoch\n",
      "{'f1': [0.9158878504672896, 0.85211267605633811, 0.89494163424124507, 0.90258449304174948, 0.92693110647181631, 0.92213114754098358, 0.86680761099365744, 0.87475915221579958, 0.93775933609958517, 0.82560706401766004, 0.96501838017312946]}\n",
      "{'f1': 0.89859458648356849}\n",
      "\n",
      " epoch 3\n",
      "0.02822 0.02019 0.02083 0.02347 0.02319 0.02334 0.02501 0.02180 0.02407 0.02153 0.02536 0.02193 0.02637 0.02251 0.01991 0.02181 0.02035 0.02115 0.02259 0.02057 0.02520 0.02007 0.01940 0.02008 0.02340 0.02031 0.02051 0.01626 0.01762 0.02146 0.02298 0.02135 \n",
      "\n",
      "18.21 minutes per epoch\n",
      "{'f1': [0.90605427974947816, 0.88336520076481828, 0.90909090909090895, 0.88888888888888884, 0.9291666666666667, 0.92217898832684819, 0.9158110882956878, 0.8927875243664718, 0.93043478260869561, 0.8565488565488566, 0.96390608573764758]}\n",
      "{'f1': 0.90893029736772446}\n",
      "\n",
      " epoch 4\n",
      "0.01966 0.01882 0.01449 0.01423 0.01529 0.01621 0.01603 0.01693 0.01711 0.01669 0.01668 0.01837 0.01734 0.01734 0.01965 0.01532 0.01606 0.01958 0.01873 0.01839 0.01948 0.01473 0.01518 0.01338 0.01723 0.01506 0.01498 0.01726 0.01800 0.01742 0.01393 0.01679 \n",
      "\n",
      "17.77 minutes per epoch\n",
      "{'f1': [0.93885601577909283, 0.87050359712230208, 0.91015625, 0.91840607210626191, 0.91552062868369355, 0.91368421052631565, 0.92585170340681366, 0.90980392156862744, 0.94468085106382982, 0.91089108910891081, 0.97195817490494296]}\n",
      "{'f1': 0.92093750129734453}\n",
      "\n",
      " epoch 5\n",
      "0.02020 0.01273 0.01337 0.01409 0.01150 0.01457 0.01182 0.01302 0.01603 0.01285 0.01167 0.01661 0.01403 0.01350 0.01562 0.01359 0.01410 0.01394 0.01615 0.01301 0.01015 0.01165 0.01295 0.01611 0.01344 0.01204 0.01179 0.01152 0.01013 0.01240 0.01199 0.01491 \n",
      "\n",
      "17.73 minutes per epoch\n",
      "{'f1': [0.95256916996047425, 0.9020332717190388, 0.92187499999999989, 0.94716242661448136, 0.9347368421052632, 0.93581780538302273, 0.93787575150300595, 0.90522243713733075, 0.94042553191489364, 0.8701298701298702, 0.97260114259064945]}\n",
      "{'f1': 0.92913174991436653}\n",
      "\n",
      " epoch 6\n",
      "0.01529 0.00947 0.00957 0.00838 0.01003 0.00867 0.01384 0.01028 0.01080 0.00992 0.01239 0.01203 0.00943 0.01124 0.01363 0.01309 0.01269 0.01199 0.01346 0.01104 0.01096 0.00937 0.00944 0.01342 0.01545 0.00954 0.01273 0.01262 0.01176 0.01625 0.01039 0.01155 \n",
      "\n",
      "18.16 minutes per epoch\n",
      "{'f1': [0.96484375, 0.9050279329608939, 0.90945674044265601, 0.9477756286266924, 0.94845360824742264, 0.94093686354378814, 0.92957746478873238, 0.88848263254113335, 0.94514767932489441, 0.89539748953974907, 0.97408232672686756]}\n",
      "{'f1': 0.93174382879480255}\n",
      "\n",
      " epoch 7\n",
      "0.01171 0.00804 0.00551 0.00946 0.00902 0.00850 0.01049 0.01027 0.00999 0.00933 0.00904 0.00998 0.00891 0.01084 0.00777 0.00784 0.00846 0.00896 0.01018 0.00904 0.00884 0.01197 0.01120 0.01091 0.00652 0.00757 0.01041 0.01069 0.00941 0.00887 0.01258 0.01043 \n",
      "\n",
      "18.00 minutes per epoch\n",
      "{'f1': [0.94339622641509435, 0.9147005444646098, 0.90671641791044788, 0.9390962671905696, 0.94583333333333341, 0.95334685598377267, 0.93861386138613856, 0.905811623246493, 0.96265560165975106, 0.90041493775933601, 0.97617924528301891]}\n",
      "{'f1': 0.93516044678477861}\n",
      "\n",
      " epoch 8\n",
      "0.01114 0.00815 0.00735 0.00808 0.00703 0.00617 0.00875 0.00645 0.00729 0.00718 0.01046 0.00805 0.00744 0.00752 0.01164 0.00732 0.00752 0.00934 0.00899 0.00813 0.00665 0.00680 0.01227 0.00780 0.00832 0.00650 0.00744 0.00580 0.00848 0.00924 0.00831 0.00947 \n",
      "\n",
      "17.62 minutes per epoch\n",
      "{'f1': [0.95890410958904115, 0.91009174311926611, 0.90873786407766988, 0.9390962671905696, 0.94142259414225937, 0.94758064516129037, 0.92307692307692313, 0.90097087378640772, 0.94646680942184147, 0.90000000000000002, 0.97464064508589465]}\n",
      "{'f1': 0.93190804315010578}\n",
      "\n",
      " epoch 9\n",
      "0.00764 0.00580 0.00500 0.00893 0.00416 0.00964 0.00774 0.00561 0.00545 0.00792 0.00763 0.00629 0.00492 0.00574 0.00727 0.00963 0.00668 0.00738 0.00624 0.00738 0.00787 0.00650 0.00553 0.00620 0.00870 0.00745 0.00864 0.00674 0.00742 0.00553 0.00728 0.00706 \n",
      "\n",
      "18.14 minutes per epoch\n",
      "{'f1': [0.95057034220532322, 0.91461100569259968, 0.90076335877862601, 0.9242424242424242, 0.93495934959349591, 0.95445544554455441, 0.93253968253968256, 0.90000000000000002, 0.94824016563146996, 0.9117043121149897, 0.97541952257149611]}\n",
      "{'f1': 0.93159141899224207}\n",
      "\n",
      " epoch 10\n",
      "0.00692 0.00445 0.00445 0.00542 0.00458 0.00855 0.00604 0.00634 0.00525 0.00531 0.00630 0.00482 0.00437 0.00738 0.00532 0.00378 0.00556 0.00740 0.00651 0.00509 0.00541 0.00647 0.00514 0.00821 0.00591 0.01020 0.00697 0.00691 0.00586 0.00931 0.00678 0.00710 \n",
      "\n",
      "17.99 minutes per epoch\n",
      "{'f1': [0.96153846153846156, 0.91078066914498146, 0.91461100569259968, 0.94497153700189762, 0.96280991735537202, 0.94331983805668007, 0.92720306513409956, 0.89200000000000002, 0.94042553191489364, 0.91093117408906876, 0.97597173144876337]}\n",
      "{'f1': 0.93496026648880171}\n"
     ]
    }
   ],
   "source": [
    "import sklearn.metrics\n",
    "\n",
    "train_losses = []\n",
    "model_quality_results = []\n",
    "\n",
    "def do_training_iteration(): \n",
    "    train_hashes = train_batcher.make_batch(batch_size)\n",
    "    xi, yi, aug_dict = load_batch(\n",
    "        train_hashes, \n",
    "        **train_loading_kwargs,\n",
    "    )\n",
    "    ctime = time.time()\n",
    "    yres = model.train_on_batch(xi, yi)\n",
    "    train_losses.append(yres)\n",
    "\n",
    "batch_size = 32\n",
    "batches_per_epoch = len(train_labels)//batch_size + 1\n",
    "\n",
    "train_batcher = tsr.data_loading.BalancedBatcher([train_labels.index,])\n",
    "\n",
    "print(\"beginning training\")\n",
    "\n",
    "for epoch_idx in range(10):\n",
    "    stime = time.time()\n",
    "        \n",
    "    print(\"\\n epoch\", epoch_idx+1)\n",
    "    for iter_idx in range(batches_per_epoch):\n",
    "        do_training_iteration()\n",
    "        if (iter_idx % 50) == 0:\n",
    "            print(\"{:4.5f} \".format(np.mean(train_losses[-50:])), end=\"\")\n",
    "    print(\"\\n\")\n",
    "    etime = time.time()\n",
    "    print(\"{:4.2f} minutes per epoch\".format((etime-stime)/60.0))\n",
    "    mq_res = tsr.evaluate_command_model_quality(\n",
    "            eval_labels=dev_labels,\n",
    "            command_model=model,\n",
    "            metrics={\"f1\":lambda x, y: sklearn.metrics.f1_score(x, y>0.5)},\n",
    "            batch_loader=load_batch,\n",
    "            batch_size=batch_size,\n",
    "            loading_kwargs=dev_loading_kwargs,\n",
    "    )\n",
    "    print(mq_res)\n",
    "    avg_mq = {metric_name:np.mean(mq_res[metric_name]) for metric_name in mq_res}\n",
    "    print(avg_mq)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Final Thoughts\n",
    "\n",
    "Wrapping the phase convolutions around in the phase dimension so that the spots close to 0 phase interact with those close to 2$\\pi$ seemed like a good idea but it adds significant computational overhead since the entire tensor needs to get copied between the input and output of each layer. Also because the inputs can only ever have just one phase the phase dimension adds a huge amount of redundancy. If we have 10 phase slices then at most only around 1/10th of our numbers will be non-zero. \n",
    "\n",
    "Although the use of the 3D CNN is fun the time/frequency/phase structure of the speech data doesn't look enough like volumetric data to justify a using 3D CNN. The memory and computation constraints all go through the roof without much apparent benefit. I can train up a 1D CNN model with quality comparable to my 3D CNN in less than a 2% of the training time. It should be noted however that likely one of the places where incorporating the phase information would have one of the biggest advantages is in telling the difference between noise and speech. In speech the phases aren't random at all but in pure noise even noise with strange power spectra like brown or blue noise the phase information is usually still totally random. There is no pure noise in the held out dev set and so the way we are evaluating the 3D CNN does not include in a meaningful way the ability of the CNN to tell the difference between noise and speech.\n",
    "\n",
    "Phase information really may not be important for distinguishing words from each other but it clearly is still important to how we perceive sounds as humans. Because of the large amount of redundancy involved, transforming phase into position in a 3D tensor is probably not the right way to encode the phase information. Feeding a raw phase angle into a 2D convolution doesn't seem like a good way to do it either however since the value of that convolution would be dramatically changed by shifting a phase from -$\\pi$ to $\\pi$ when such a phase change represents absolutely no change in the corresponding efffective phase information. That problem could possibly be somewhat alleviated by a data augmentation strategy where we randomly add a global phase shift of between 0 and 2$\\pi$ and then normalize back to the -$\\pi$ to $\\pi$ range but there has to be a more elegant way."
   ]
  }
 ],
 "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.7.6"
  },
  "nikola": {
   "author": "Tim Anderton",
   "category": "",
   "date": "2018-1-22",
   "description": "",
   "link": "",
   "slug": "audio-3DCNN",
   "tags": "audio, neural networks, speech recognition",
   "title": "3D CNN for audio data",
   "type": "text"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
