{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Example 2 - A very simple chord recognition convnet\n", "\n", "We're gonna use synthesize data and use CQT as representation. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] } ], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import librosa\n", "import keras\n", "import keras.backend as K\n", "from matplotlib import pyplot as plt\n", "from future.utils import implements_iterator # for python 2 compatibility for __next__()\n", "\n", "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Utility function to generate data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def sin_wave(secs, freq, sr, gain):\n", " '''\n", " Generates a sine wave of frequency given by freq, with duration of secs.\n", " '''\n", " t = np.arange(sr * secs)\n", " return gain * np.sin(2 * np.pi * freq * t / sr)\n", "\n", "\n", "def whitenoise(gain, shape):\n", " '''\n", " Generates white noise of duration given by secs\n", " '''\n", " return gain * np.random.uniform(-1., 1., shape)\n", "\n", "def chord_wave(secs, f0, sr, gain, major):\n", " \"\"\"major: bool\"\"\"\n", " t = np.arange(sr * secs)\n", " sine_f0 = gain * np.sin(2 * np.pi * f0 * t / sr)\n", " if major:\n", " sine_third = gain * np.sin(2 * np.pi * f0 * 2. ** (4./12.) * t / sr)\n", " else:\n", " sine_third = gain * np.sin(2 * np.pi * f0 * 2. ** (3./12.) * t / sr)\n", " return sine_f0 + sine_third" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def add_channel_axis(cqt):\n", " if K.image_data_format == 'channels_first':\n", " return cqt[np.newaxis, :, :]\n", " else:\n", " return cqt[:, :, np.newaxis]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class DataGen:\n", " def __init__(self, sr=16000, batch_size=128):\n", " np.random.seed(1209)\n", " self.pitches = [440., 466.2, 493.8, 523.3, 554.4, 587.3,\n", " 622.3, 659.3, 698.5, 740., 784.0, 830.6]\n", "\n", " self.sr = sr\n", " self.n_class = 2 # major or minor\n", " self.secs = 1.\n", " self.batch_size = batch_size\n", " self.labels = np.eye(self.n_class)[range(0, self.n_class)] # 1-hot-vectors\n", " \n", " self.major_cqts = []\n", " self.minor_cqts = []\n", " \n", " for freq in self.pitches:\n", " cqt = librosa.cqt(chord_wave(self.secs, freq, self.sr, gain=0.5, major=True), sr=sr,\n", " fmin=220, n_bins=36, filter_scale=2)[:, 2:5] # use three frames!\n", " cqt = librosa.amplitude_to_db(cqt, ref=np.min)\n", " cqt = cqt / np.max(cqt) # cqt in 2d\n", " \n", " self.major_cqts.append(add_channel_axis(cqt))\n", " \n", " cqt = librosa.cqt(chord_wave(self.secs, freq, self.sr, gain=0.5, major=False), sr=sr,\n", " fmin=220, n_bins=36, filter_scale=2)[:, 2:5] # use three frame!\n", " cqt = librosa.amplitude_to_db(cqt, ref=np.min)\n", " cqt = cqt / np.max(cqt)\n", " self.minor_cqts.append(add_channel_axis(cqt))\n", "\n", " self.cqt_shape = add_channel_axis(cqt).shape # (1, 36, 3) or (36, 3, 1)\n", "\n", " def __next__(self): \n", " \"\"\"Yielding half Major, half minor\"\"\"\n", " choice = np.random.choice(12, size=self.batch_size // 2, # pick pitches for this batch\n", " replace=True)\n", " noise_gain = 0.1 * np.random.random_sample(1) # a random noise gain \n", " noise = whitenoise(noise_gain, self.cqt_shape) # generate white noise\n", " xs = [noise + self.major_cqts[i] for i in choice] # compose a batch with additive noise (Major)\n", " xs += [noise + self.minor_cqts[i] for i in choice] # compose a batch with additive noise (minor)\n", " \n", " ys = np.eye(2)[np.hstack((np.zeros(self.batch_size // 2, dtype=np.int), \n", " np.ones(self.batch_size // 2, dtype=np.int)))] # corresponding labels\n", "\n", " return np.array(xs, dtype=np.float32), np.array(ys, dtype=np.float32)\n", " \n", " next = __next__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So, Major is labeled as [1, 0], and minor as [0, 1]." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Experiment" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "datagen = DataGen()\n", "x, y = next(datagen)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How does input data look like?" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsUAAAGfCAYAAAC3Nq8UAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzt3X+w5WddH/DP55z7YzfJsrvZu4SY\nUPkh6FCrwW4jIDoIVYHOFBltR4pOikJUZCpTxhHtjFVHrE5VRqZqJw500xkr/kJBwLYUadWpBVcM\nyA8FjIQfJiS7+Z3sj3vvefrHXiQku9nnfp+z59xzn9dr5k7unvvsOc++93O+z2dP7j2fLKUEAAD0\nbDTvDQAAwLxpigEA6J6mGACA7mmKAQDonqYYAIDuaYoBAOiephgAgO5pigEA6J6mGACA7i3N8sH2\nHbi8rH3J1VVrH7O6XLUus/7xP/AX7z9eSjlc/zt2Dtm12Xfg8nLoyrr89u+R30PtP3ioXHHV46vW\nXrZad0mZbGOS5iJnR5uLcd0bbeOJe9Nf/PlC19488/vUpz4ZJ44f38ZVcmdxZrSZ57nx6U/dMrj2\nZtoUr33J1fGT//UdVWu/+amPq1q3NKr/c6/tW76levEOI7s2h668On7sxt+vWvstT72yat2e5fr/\n0bJ22eLmd8VVj49f/q3/VbX2a594edW6M5uT6sdf5Oxos/YlV8dPVF73vqXyure6VP+8PXjp0kLX\n3jzz+8Znf23Vup1qW2fGU+qy27Myrn78Rb/ubefceMaTKs+Njbpz47lfP7z2mr59IjOfn5l/nZmf\nyMzXttxXj+Q3nOzayI95UXvDyW442bXpJb/BTXFmjiPilyLiBRHxtIh4SWY+bVob2+3kN5zs2siP\neVF7w8luONm16Sm/lleKr42IT5RSbi6lnImIN0fEi6azrS7IbzjZtZEf86L2hpPdcLJr001+LU3x\nVRHx6Yf8+jNbt1FHfsPJro38mBe1N5zshpNdm27yu+hvyZaZ12fmscw8dt9dd17sh9tVZNfmofnd\nf7f8tuOh2d1z54l5b4eOuO61kd9wzow2u+HcaGmKPxsRD32/jau3bvsipZQbSilHSilH9h2s+wnD\nTlwwP9md17Zr77ID8nuIbdXe/ssPzXRz7Gque8M5c4dzZrTZdn6Lem60NMV/FhFPycwnZuZKRHxH\n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\neZ/jTqbFyq7NY9YOxnO++9uq1pZSl+BoG6OKf+8Vv1i9dieaTOoy2ay8v6Weio/BNsokTpyqve5N\n/3m76OaZ36TyOrpT7V87GM952Yur1tb+SbdTe7/78tdXr92pamtgslm3rnYUectT3CvFAAB0T1MM\nAED3NMUAAHRPUwwAQPc0xQAAdE9TDABA9zTFAAB0T1MMAED3NMUAAHRvphPtbv7bW+OlL/vpusW1\n03BW9g7f0AKRXZv9e5fiBV+5NtX73DOu/zfl7031kWerlIjNypqqLb3Sz1AxGtz8ydviO172H+oW\nl0nduo6ue/PM7/Qtn6u7vx1q/96leOFXHq5ae9t961XrvuLwJdWP/7vVK3emSSlx8kzdjNMzG3W1\nVzvRbrNyAuu5eKUYAIDuaYoBAOiephgAgO5pigEA6J6mGACA7mmKAQDonqYYAIDuaYoBAOiephgA\ngO5pigEA6N5MxzzvO3wonvny76xaO6mcF7uyVN/Xv+N9P1e9dqeRXZuzIycrx5hWOjMaPkpykZQo\nsblZ92etrb3acZ30bd/a5fHsV7y0am3taNflbVz33v7e/1i9dieaZ35//Lrfr1q3U33qltvi37yy\n8tyrnW+/tDJ8QwtoVHmdr62pcdbdX+Wyc/JKMQAA3btgU5yZb8rM2zPzQw+57ccz87OZedPWxwsv\n7jYXl/yGk10b+TEvam842Q0nuzbyq3ul+GhEPP8ct7++lHLN1sc7p7utXeVoyG+ooyG7FkdDfszH\n0VB7Qx0N2Q11NGTX4mh0nt8Fm+JSyh9FxJ0z2MuuJL/hZNdGfsyL2htOdsPJro382r6n+FWZ+cGt\nl9sPnm9RZl6fmccy89iZ++9ueLhd54L5ye68tl17D9zd9fP84bZVeyeOH5/1/ti9XPeGc+YOt+3s\nysbJWe5vp9t2fot6bgxtin8lIp4cEddExK0R8fPnW1hKuaGUcqSUcmTlsgMDH27XqcpPduc0qPYu\nPXD5rPa302279g6trc1yf+xernvDOXOHG5RdLu2d1f52ukH5Leq5MagpLqV8rpSyWUqZRMSvRsS1\n093W7ia/4WTXRn7Mi9obTnbDya5Nb/kNaooz88qH/PLFEfGh863lkeQ3nOzayI95UXvDyW442bXp\nLb8LDu/IzF+PiOdExFpmfiYi/n1EPCczr4mIEhGfjIjvvYh7XGjyG052beTHvKi94WQ3nOzayK+i\n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\n88xvUjl9bKdyZrT59C23xau//+fqFteeG+O6yXenP3VH3f2dQz9/QwAAcB6aYgAAuqcpBgCge5pi\nAAC6pykGAKB7mmIAALqnKQYAoHuaYgAAuqcpBgCge5piAAC6N9Mxz+NRxmP21o3pK5UjInsZmyi7\nNiVKbGzW5bK+MalatzRe7DGmtfatHYpnvPw7q9bWJrKyVF977/jTn6ley+4yGkVctqfumKqtvaXR\ndEf37mTzzC9jsXN2ZrTZd/hQPOv676paWzsRfLny3Pjj17217g7PoZ+uCAAAzkNTDABA9zTFAAB0\nT1MMAED3NMUAAHRPUwwAQPc0xQAAdE9TDABA9zTFAAB0T1MMAED3ZjrmeZQZq5Vj+jYmlaOKOxnZ\nKbs28hvu8Qf3xhu+7auq1taOGN+zPK5+/Hd8X/VSdplRZvVI8M3K5+24k+dtxHzzywWP2ZnR5nH7\nVuOHn/tlVWvXJ3VjsldGdefGx96wWrXuXC74N56Zj8/M92TmRzLzw5n5g1u3/3hmfjYzb9r6eOHg\nXexSsmsjv+Fkx7yovTbyG052beRX90rxRkS8ppTy/szcFxF/npnv2vra60spP3fxtrfwZNdGfsPJ\njnlRe23kN5zs2nSf3wWb4lLKrRFx69bn92XmRyPiqou9sd1Adm3kN5zsmBe110Z+w8mujfy2+YN2\nmfmEiHh6RLx366ZXZeYHM/NNmXlwynvbVWTXRn7DyY55UXtt5Dec7Nr0ml91U5yZl0XE70TEq0sp\n90bEr0TEkyPimjj7L4ufP8/vuz4zj2XmseN33DGFLS8e2bWR33DTyO6uE8dntl92D8/bNvIbTnZt\nppHfPXedmNl+p6mqKc7M5Tgb0K+VUt4SEVFK+VwpZbOUMomIX42Ia8/1e0spN5RSjpRSjqwdPjyt\nfS8M2bWR33DTyu7gobXZbZpdwfO2jfyGk12baeW3/+Ch2W16imrefSIj4o0R8dFSyi885PYrH7Ls\nxRHxoelvb7HJro38hpMd86L22shvONm1kV/du098XUR8V0T8ZWbetHXbj0bESzLzmogoEfHJiPje\ni7LDxSa7NvIbTnbMi9prI7/hZNem+/xq3n3iTyLiXO84/c7pb2d3kV0b+Q0nO+ZF7bWR33CyayO/\nGU+0i6ifclM796V2Cs9uILvhSqn/89bmd2azbgrPoju1sRkf/tw9VWsf3NisWlc7+Y6+bU5K3H9q\n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\nAED3/j+sEcMjaTISlAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(14, 7))\n", "if K.image_data_format == 'channels_first':\n", " for i in range(4):\n", " plt.subplot(1, 10, i+1)\n", " plt.imshow(x[i, 0], cmap=plt.get_cmap('Blues'))\n", " plt.subplot(1, 10, 6+i)\n", " plt.imshow(x[64 + i, 0], cmap=plt.get_cmap('Blues'))\n", "else:\n", " for i in range(4):\n", " plt.subplot(1, 10, i+1)\n", " plt.imshow(x[i, :, :, 0], cmap=plt.get_cmap('Blues'))\n", " plt.subplot(1, 10, 6+i)\n", " plt.imshow(x[64 + i, :, :, 0], cmap=plt.get_cmap('Blues'))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(Major inputs on left, minor inputs on right.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Buld a convnet model!" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "val_datagen = DataGen() # this is a generator for validation set" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* This convlayer takes `(36, 3)` with single channel input.\n", "* The kernel size is (5, 3) so that it can cover the spectral patterns of major and minor chords." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# even a simplet network -- one conv layer and that's it!\n", "# If you wanna try it. \n", "\n", "\n", "# model = keras.models.Sequential()\n", "# model.add(keras.layers.convolutional.Conv2D(datagen.n_class, (5, 3), use_bias=False, padding='same',\n", "# input_shape=datagen.cqt_shape)) # A conv2d layer (36 input nodes --> 8 output nodes)\n", "# model.add(keras.layers.pooling.GlobalMaxPooling2D())\n", "# model.add(keras.layers.Activation('softmax')) # Softmax because it's single-label classification\n", "\n", "# model.compile(optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, # a pretty standard optimizer\n", "# decay=1e-6, nesterov=True),\n", "# loss='categorical_crossentropy', # categorical crossentropy makes sense with Softmax\n", "# metrics=['accuracy']) # we'll also measure the performance but it's NOT a loss function " ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "np.random.seed(12345)\n", "model = keras.models.Sequential()\n", "model.add(keras.layers.convolutional.Conv2D(4, (5, 3), use_bias=False, padding='valid',\n", " input_shape=datagen.cqt_shape)) # A conv2d layer (36 input nodes --> 8 output nodes)\n", "model.add(keras.layers.pooling.GlobalMaxPooling2D())\n", "model.add(keras.layers.Activation('relu'))\n", "model.add(keras.layers.Dense(datagen.n_class, use_bias=False))\n", "model.add(keras.layers.Activation('softmax'))\n", "\n", "model.compile(optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, # a pretty standard optimizer\n", " decay=1e-6, nesterov=True),\n", " loss='categorical_crossentropy', # categorical crossentropy makes sense with Softmax\n", " metrics=['accuracy']) # we'll also measure the performance but it's NOT a loss function " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "conv2d_1 (Conv2D) (None, 32, 1, 4) 60 \n", "_________________________________________________________________\n", "global_max_pooling2d_1 (Glob (None, 4) 0 \n", "_________________________________________________________________\n", "activation_1 (Activation) (None, 4) 0 \n", "_________________________________________________________________\n", "dense_1 (Dense) (None, 2) 8 \n", "_________________________________________________________________\n", "activation_2 (Activation) (None, 2) 0 \n", "=================================================================\n", "Total params: 68\n", "Trainable params: 68\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "model.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Train it!" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/15\n", "200/200 [==============================] - 1s - loss: 0.6179 - acc: 0.8118 - val_loss: 0.4627 - val_acc: 1.0000\n", "Epoch 2/15\n", "200/200 [==============================] - 0s - loss: 0.2446 - acc: 1.0000 - val_loss: 0.1072 - val_acc: 1.0000\n", "Epoch 3/15\n", "200/200 [==============================] - 1s - loss: 0.0611 - acc: 1.0000 - val_loss: 0.0396 - val_acc: 1.0000\n", "Epoch 4/15\n", "200/200 [==============================] - 0s - loss: 0.0279 - acc: 1.0000 - val_loss: 0.0262 - val_acc: 1.0000\n", "Epoch 5/15\n", "200/200 [==============================] - 0s - loss: 0.0170 - acc: 1.0000 - val_loss: 0.0130 - val_acc: 1.0000\n", "Epoch 6/15\n", "200/200 [==============================] - 0s - loss: 0.0122 - acc: 1.0000 - val_loss: 0.0090 - val_acc: 1.0000\n", "Epoch 7/15\n", "200/200 [==============================] - 1s - loss: 0.0093 - acc: 1.0000 - val_loss: 0.0114 - val_acc: 1.0000\n", "Epoch 8/15\n", "200/200 [==============================] - 1s - loss: 0.0075 - acc: 1.0000 - val_loss: 0.0072 - val_acc: 1.0000\n", "Epoch 9/15\n", "200/200 [==============================] - 0s - loss: 0.0063 - acc: 1.0000 - val_loss: 0.0080 - val_acc: 1.0000\n", "Epoch 10/15\n", "200/200 [==============================] - 0s - loss: 0.0053 - acc: 1.0000 - val_loss: 0.0049 - val_acc: 1.0000\n", "Epoch 11/15\n", "200/200 [==============================] - 0s - loss: 0.0049 - acc: 1.0000 - val_loss: 0.0046 - val_acc: 1.0000\n", "Epoch 12/15\n", "200/200 [==============================] - 0s - loss: 0.0039 - acc: 1.0000 - val_loss: 0.0042 - val_acc: 1.0000\n", "Epoch 13/15\n", "200/200 [==============================] - 1s - loss: 0.0037 - acc: 1.0000 - val_loss: 0.0035 - val_acc: 1.0000\n", "Epoch 14/15\n", "200/200 [==============================] - 1s - loss: 0.0033 - acc: 1.0000 - val_loss: 0.0044 - val_acc: 1.0000\n", "Epoch 15/15\n", "200/200 [==============================] - 1s - loss: 0.0029 - acc: 1.0000 - val_loss: 0.0022 - val_acc: 1.0000\n" ] } ], "source": [ "history = model.fit_generator(datagen, steps_per_epoch=200, epochs=15, verbose=1,\n", " validation_data=val_datagen, validation_steps=4)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(12, 4))\n", "plt.subplot(1, 2, 1)\n", "plt.plot(history.history['acc'], label='training')\n", "plt.plot(history.history['val_acc'], label='validation', alpha=0.7)\n", "plt.title('Accuracy')\n", "plt.xlabel('epoch')\n", "plt.legend()\n", "plt.subplot(1, 2, 2)\n", "plt.plot(history.history['loss'], label='training')\n", "plt.plot(history.history['val_loss'], label='validation', alpha=0.7)\n", "plt.title('Loss')\n", "plt.xlabel('epoch')\n", "plt.legend()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "loss: 0.00349949840456, accuracy: 1.0\n" ] } ], "source": [ "loss = model.evaluate_generator(datagen, steps=10)\n", "print(\"loss: {}, accuracy: {}\".format(loss[0], loss[1]))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The Convolution2D layer weights shape is: (5, 3, 1, 4)\n" ] } ], "source": [ "weights = model.get_weights()[0]\n", "print(\"The Convolution2D layer weights shape is: {}\".format(weights.shape))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ", which is (height_kernel, width_kernel, input_channel_number, output_channel_number)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Understanding by visualising" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualising the kernels" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(20, 4))\n", "titles = ['minor chord positive', 'minor chord negative?', 'wth??', 'minor chord positive']\n", "for i in range(4):\n", " plt.subplot(1, 4, i+1)\n", " plt.imshow(weights[:, :, 0, i], cmap=plt.get_cmap('Blues'))\n", " plt.colorbar()\n", " plt.title(titles[i])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Okay, so out of four kernels, the 1st and 4th are definitely minor chord positive. Not sure for the other two.\n", "\n", "## Visualising the feature maps\n", "\n", "which is `conv(input, kernel)`." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x_major = np.squeeze(x[0])\n", "x_minor = np.squeeze(x[-1])\n", "from scipy import signal\n", "def plot_convolution(x, kernels):\n", " \"\"\"kernels: 3d, (height, width, channel) and four channels.\"\"\"\n", " n_kernels = kernels.shape[2]\n", " plt.figure(figsize=(9, 5))\n", " plt.subplot(1, n_kernels+1, 1)\n", " plt.imshow(x)\n", " plt.title('Input x')\n", " for idx in range(n_kernels):\n", " plt.subplot(1, n_kernels+1, idx+2)\n", " conved = signal.convolve2d(x, kernels[:, :, idx], mode='same')\n", " plt.imshow(conved)\n", " plt.title('max: {:4.2f}'.format(np.max(conved)))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Here's the feature map activation for a Major chord input\n" ] }, { "data": { "image/png": "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\nAABE7v8DRWDSuQ12dQUAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_convolution(x_major, weights[:, :, 0, :])\n", "print(\"Here's the feature map activation for a Major chord input\")" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Here's for a minor chord input\n" ] }, { "data": { "image/png": "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\nePrte8If2y65M2eq5In+nRK00ONbEwOV8Fh7r5RvrD1f0gAAEBmKNwAAkaF4AwAQGYo3AACRoXgD\nABAZijcAAJFpZZx3YY49Yrt+9snzgu0PTY91vO21X+t4VWQG9kkrN4WHpVwz8rRg28pt5RtKsdCY\nSbXB6WD7sspQsK1WCw+DsT6ecrJIu5KqvrP3oGD76G2rgm3HfHvWHwiTJG3eGc4crauOSytuD/9f\nv3ZF+Pg2sjk8b24lPIK2q3jnDQBAZCjeAABEhuINAEBkKN4AAESG4g0AQGQo3gAARIbiDQBAZHo6\nzvuW3av05Kv/ItieTOe8lqg3mxbvfZ11Co9Jltc1cerOYPtv13812PaUZW/I3/hnO+wUHuOTFU39\nLjyt5HnHHR1s27s9vF4yxWv4Iiyr1PUni0eD7f/juEeCbduff0iwbXp7Tw/TC1Z9eaKdp+wJtt97\n4heDbS+57U+Dbb/71vwM9GavBQAgMhRvAAAiQ/EGACAyFG8AACJD8QYAIDIUbwAAItPTMQiLtktH\nfzY8Jdsj/2Yw2ObV/KFiv+u4V9gvmapq9+bwlIZnHnZisG3o5sXd6BIa2GCi6tq9wfazV9wfbPvi\nEY8G2x4eDE8XitaZTFULvx/afUt4StCjv3JDsK06Ec4cbZioKLl7SbD5zCeGj2/33n1YsG1yfH6G\n8vHOGwCAyFC8AQCIDMUbAIDIULwBAIgMxRsAgMhQvAEAiAzFGwCAyDQdoGZmR0i6WNKhklzS+e7+\nKTP7kKQ3Sdqe3fX97n5l3raOOmqbLv7Kp4PtiyvVYNveJH8s6tpzc5sXrCLzqe6Tlt0WzuBHI08N\ntq3YFR6/38+KzCfdXvh5rnsSbJuuh1+n93NyReazx12/mpgMtlcnc36rop53fOvfhAo9vk1Iy+4O\nt//osGODbcMPhEulTTWbrro7WhldPi3pPe5+g5ktlfQrM7sqa/uEu3+0e91DC8in3Min3Min3Mgn\noGnxdveHJD2UXd5tZrdLWtPtjqE15FNu5FNu5FNu5BPW1nfeZnakpBMkXZ/d9A4zu9nMLjSzFQX3\nDW0in3Ijn3Ijn3IjnwO1XLzNbImkyyS9y91HJX1G0pMlHa/0ldHHAuudZWYbzWzjIzvC38lhborI\nZ3rfnp71t98UkU99lHy6pYh8du7gN+K7hePb47VUvM2spvSJ+7K7f1OS3H2ru9fdPZH0OUnrZ1vX\n3c9393Xuvm7VSk5u74ai8hkYHuldp/tIUflUDyKfbigqn+Urwyd7onMc32bXtJqamUm6QNLt7v7x\nhttXN9ztNEmbiu8emiGfciOfciOfciOfsFbONv8jSadLusXMbsxue7+k15rZ8UpP379P0pubbeiO\n0UP1/KvODrZX5jQ14QfmsG7UCsvHq9LksnD7ilVjwbZkIDzdYZ8rLp+piia3hqdevWTskGDbo1vD\nU73Wp/r6HWNh+Qyb9LRauH3i6PFgmx37lHDb3f/S7KEXssLySarSxIrwsK6lK8Mfq0/dH56uer60\ncrb5tZJm+4ubjklF95FPuZFPuZFPuZFPGF9CAwAQGYo3AACRoXgDABAZijcAAJGheAMAEBmKNwAA\nkWllnHdhKhOmJXeGx8t5zkuJpKc97U/VcWnlHeGx9qPj4bHch96wtxtdQoPqPmnlTeGd5K+HXhVs\nW3FDeAfavnd+pjRcaB6t13Tp2OHB9sW3DQXbkk03BNvcw+PD0bqBfa5Vt04F23ck4Z9HX/W78HHx\nwXmKh3feAABEhuINAEBkKN4AAESG4g0AQGQo3gAARIbiDQBAZCjeAABEpqejpwd3TuuI7z4SvoN7\nsMn27Mvd9p2ddgqPscQ1sC8Jtlf3hV/r2dRc5mJHK6oTrmW/nQy2T40sCrYtuze8XnUivN+hOHuO\nnA63vfo5wbbkn6/rRnf6jrlUHQ8fpwb2hsth3nHRkvnZf3jnDQBAZCjeAABEhuINAEBkKN4AAESG\n4g0AQGQo3gAARKanQ8V8YlLJ3fcF2yvDOVPmTYanckMxrO6qjYaHFC1+OPxarzo20Y0uoYHVE9V2\nhucfXLy9FmwbfDScj9UZKlaERKZxD095XF0aPobtXjscbKuHY0U76okGdof3g+GHc/afXeHs5mv/\n4Z03AACRoXgDABAZijcAAJGheAMAEBmKNwAAkaF4AwAQmabF28yGzOwXZnaTmd1qZh/Obj/KzK43\ns7vN7GtmFh4jga4hn3Ijn3Ijn3Ijn7BWxnlPSHqxu4+ZWU3StWb2PUnvlvQJd7/EzM6TdKakz+Ru\nyV0+FZ4WzwfCbTJroat9qbh8lD+9nYVnxZNX+BAnoLB8zJuMKc1pyp22MGcq3j5QWD4Vc41UwuOI\nlx20J9i2a214Otek78rSAQo9vinnGGZ5u0Hu/tP0Ubui6RHXU2PZ1Vq2uKQXS7o0u/0iSad2pYfI\nRT7lRj7lRj7lRj5hLb1dMrOqmd0oaZukqyTdI2mnu+9/q7xZ0prudBHNkE+5kU+5kU+5kc/sWire\n7l539+O4yBuJAAAHP0lEQVQlrZW0XtKxrT6AmZ1lZhvNbOOU+AnNbigsn6nwx3roXFH5TE7v7Vof\n+1lR+ezewU84d0Nhx7cFtv+09UWlu++U9GNJz5O03Mz2f2e+VtKDgXXOd/d17r6upvD3Opi7OedT\nG+lRT/vTXPMZHFjco572p7nms3QlP0LeTXM+vi2w/aeVs80PMbPl2eVhSS+TdLvSJ/HV2d3OkPTt\nbnUSYeRTbuRTbuRTbuQT1srZ5qslXWRmVaXF/uvufoWZ3SbpEjP7O0m/lnRBF/uJMPIpN/IpN/Ip\nN/IJaFq83f1mSSfMcvu9Sr9/aJmZqTIY/mjJBsNjInyC78tnU2Q+ajIUyfM+p6kylG82RebjJnmn\nQyb7ezhYUKH7TxO1anicUjKUk08fj8IstP64ZDn7geftWpWcxnk69PXxfwsAAOJE8QYAIDIUbwAA\nIkPxBgAgMhRvAAAiQ/EGACAyFG8AACLTyo+0FKdSkQ0PB5t9375gWzLJ7wZ3nTUZ64h5ZS5ZkjOn\nYe7KBNtt7tKUV4PtA5W8+Si70CEsaLzzBgAgMhRvAAAiQ/EGACAyFG8AACJD8QYAIDIUbwAAItPT\noWJer6u+azTYnjddaHXZQfkb39Fpr3CAnKnvGEZWAjlTGlreKDKmBO06M6lm9c5WJp6uc5M8Z+ri\n3CmPSyiy7gIAAIo3AACRoXgDABAZijcAAJGheAMAEBmKNwAAkaF4AwAQmd5OCToHydie+e7CgmcT\nk6retTnYvuyR5eGVtz7chR7hcfJmlcwbK9zhTKJo3bRXtH16abB99/iiYNvAWPh9VKdDx3Egm5hU\n5a4Hgu3Ldq0Kr7w7XH9sfH6mq+adNwAAkaF4AwAQGYo3AACRoXgDABAZijcAAJGheAMAEJmmQ8XM\nbEjSTyQtyu5/qbt/0Mw2SHqhpF3ZXd/g7jfmbqtaVfWgJcF2r4fHs1RGwtOFSpL6dKRSkfn4dF31\nR8Jzq1Ymw0Mikt272+t4nyg0n33jSjbdEWxf/vChwbbprdvCG07G8x52QSsynykf0EOT4eGUA9Xw\nmK/6YHicXz9PxVvo/lNPVB/NmZK6Hs7HJyZytjud97Bd08o47wlJL3b3MTOrSbrWzL6Xtb3X3S/t\nXvfQAvIpN/IpN/IpN/IJaFq83d0ljWVXa9nC1PElQT7lRj7lRj7lRj5hLX3nbWZVM7tR0jZJV7n7\n9VnT35vZzWb2CTML/3wQuop8yo18yo18yo18ZtdS8Xb3ursfL2mtpPVm9gxJ/13SsZKeLWmlpP82\n27pmdpaZbTSzjZO+r6Buo1FR+Uwp/L0OOkc+5VZUPnsfJZ9uYP+ZXVtnm7v7Tkk/lnSyuz/kqQlJ\nX5C0PrDO+e6+zt3XDdrw3HuMoLnmU1PfvXjtKfIpt7nms3gF+XQT+8+BmhZvMzvEzJZnl4clvUzS\nHWa2OrvNJJ0qaVM3O4rZkU+5kU+5kU+5kU9YK2ebr5Z0kZlVlRb7r7v7FWb2IzM7RJJJulHSW7rY\nT4SRT7mRT7mRT7mRT4ClJ/P16MHMtku6v+Gmg1XcCO2nunt4Pj40RT7l1sV8yKYAM/Jh3ymZhZZP\nT+fzdvdDGq+b2UZ3X1fEts1sYxHb6WfkU27dyodsitGYD/tO+Sy0fPh5VAAAIkPxBgAgMvNdvM8v\n6baQIp9yK+o5JZvise+UW/T59PSENQAAMHfz/c4bAAC0qevF28xONrM7zexuM3vfLO2LzOxrWfv1\nZnZkYDtHmNmPzew2M7vVzP5qlvucZGa7zOzGbPmb4v+ihYV8yo18yo18ym1B5+PuXVskVSXdI+lo\nSYOSbpJ03Iz7vE3Sednl10j6WmBbqyU9M7u8VNJvZtnWSZKu6ObftJAW8in3Qj7lXsin3MtCz6fb\n77zXS7rb3e9190lJl0g6ZcZ9TpF0UXb5UkkvMbPHTT/v6W/Z3pBd3i3pdklrutbz/kA+5UY+5UY+\n5bag8+l28V4j6YGG65v1+D/4sfu4+7SkXZJW5W00+2jjBEnXz9L8PDO7ycy+Z2ZP76zbfYN8yo18\nyo18ym1B59PTX1grgpktkXSZpHe5++iM5hskPcndx8zsFZL+SdIxve5jPyOfciOfciOfcitTPt1+\n5/2gpCMarq/Nbpv1PmY2IGmZpEdm25iZ1ZQ+cV9292/ObHf3UXcfyy5fKalmZgfP9Y9YwMin3Min\n3Min3BZ0Pt0u3r+UdIyZHWVmg0pPCLh8xn0ul3RGdvnVkn7k2bf/jbLvIS6QdLu7f3y2BzOzw/Z/\nX2Fm65X+fbMGAUnkU3bkU27kU24LO59unxEn6RVKz8y7R9IHstv+VtKfZpeHJH1D0t2SfiHp6MB2\nTpTkkm5WOgXcjdm23yLpLdl93iHpVqVnFV4n6fnd/vtiX8in3Av5lHshn3IvCzkffmENAIDI8Atr\nAABEhuINAEBkKN4AAESG4g0AQGQo3gAARIbiDQBAZCjeAABEhuINAEBk/h8Gvs+oijSuWgAAAABJ\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_convolution(x_minor, weights[:, :, 0, :])\n", "print(\"Here's for a minor chord input\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The 1st and 4th probably are most distinctive kernels. Now Let's move to the dense layer weights.\n", "\n", "## Dense layer weights" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-0.50099331 2.33464241]\n", " [ 2.9126389 -3.8759408 ]\n", " [-0.6134612 -0.3230224 ]\n", " [-3.05488276 3.24755979]]\n" ] } ], "source": [ "dense_weights = model.get_weights()[1]\n", "print(dense_weights)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Look at the dense layer weights! Each row-->input, each column-->output. \n", "\n", "1. The 1st feature map will have an high activation on minor chords. \n", " - After global maxpooling, this feature map will have large value on minor chord input, and small value on Major chord input. \n", " - The value is multiplied to `-0.496` on the Major output node, and `2.33` on the minor output node. \n", " - Seems alright, huh?\n", "\n", "2. The 2nd feature map will have a large negative activation on minor chord.\n", "\n", "3. Not sure what this kernel is doing. `[-0.6, -0.3]` weights also say this kernel is not too crucial.\n", "\n", "4. The 4th is minor chord positive. `[-3.05, 3.25` supports it again." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 1 }