Mercurial > hg > chime-home-dataset-annotation-and-baseline-evaluation-code
view gmm_baseline_experiments/external_libs/librosa/librosa-0.3.1/examples/LibROSA sklearn feature pipeline.ipynb @ 5:b523456082ca tip
Update path to dataset and reflect modified chunk naming convention.
author | peterf |
---|---|
date | Mon, 01 Feb 2016 21:35:27 +0000 |
parents | cb535b80218a |
children |
line wrap: on
line source
{ "metadata": { "name": "", "signature": "sha256:b049305ace43fa4f576ace57f226cfdf60363323a51a752851311f5373ed0465" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# LibROSA - scikit-learn feature pipeline integration\n", "\n", "Often, in machine learning applications, the feature extraction and statistical modeling are treated as separate problems. In practice, this can create a disconnect between the implementations of the feature extraction methods and predictors. While this isn't a huge deal in laboratory settings, it can be inconvenient when the goal is to package a predictive model for external use.\n", "\n", "In this notebook, we'll demonstrate how to use scikit-learn's `Pipeline` module to connect feature extraction methods with statistical learning. For simplicity, we'll focus on k-means clustering of Mel-spectrogram features. \n", "\n", "By the end of this notebook, we'll have a single, self-contained object `ClusterPipeline` which can accept as input a time series signal (audio waveform), and produce as output a sequence of frame cluster membership predictions. This object will contain all of the necessary feature extraction parameters (e.g., frame length, hop length, frequency bounds, etc.), so that no additional feature code is necessary to make predictions for test signals.\n", "\n", "## librosa.util.FeatureExtractor\n", "\n", "The glue which allows librosa to interface with sklearn is the `FeatureExtractor` class. This class is a generic wrapper which allows virtually any function to be converted into an object for pipelined feature extraction. `FeatureExtractor` objects store a reference to the function, as well as keyword arguments to be used at extraction time, so that these values need not be stored externally." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import librosa\n", "import numpy as np\n", "\n", "import sklearn\n", "import sklearn.cluster\n", "import sklearn.pipeline\n", "\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "# We'll build the feature pipeline object here\n", "\n", "# First stage is a mel-frequency specrogram of bounded range\n", "MelSpec = librosa.util.FeatureExtractor(librosa.feature.melspectrogram, \n", " n_fft=2048,\n", " n_mels=128,\n", " fmax=librosa.midi_to_hz(116), \n", " fmin=librosa.midi_to_hz(24))\n", "\n", "# Second stage is log-amplitude; power is relative to peak in the signal\n", "LogAmp = librosa.util.FeatureExtractor(librosa.logamplitude, \n", " ref_power=np.max)\n", "\n", "\n", "# Third stage transposes the data so that frames become samples\n", "Transpose = librosa.util.FeatureExtractor(np.transpose)\n", "\n", "# Last stage stacks all samples together into one matrix for training\n", "Stack = librosa.util.FeatureExtractor(np.vstack, iterate=False)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "# Now, build a learning object. We'll use mini-batch k-means with default parameters.\n", "C = sklearn.cluster.MiniBatchKMeans()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "# Now, chain them all together into a pipeline\n", "ClusterPipe = sklearn.pipeline.Pipeline([('Mel spectrogram', MelSpec), \n", " ('Log amplitude', LogAmp),\n", " ('Transpose', Transpose),\n", " ('Stack', Stack),\n", " ('Cluster', C)])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "# Let's build a model using just the first 20 seconds of the example track\n", "\n", "y_train, sr = librosa.load(librosa.util.example_audio_file(), duration=20, offset=0.0)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "# Fit the model. \n", "# [y_train] will be passed through the entire feature pipeline before k-means is trained\n", "ClusterPipe.fit([y_train])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "Pipeline(steps=[('Mel spectrogram', FeatureExtractor(fmax=array([ 6644.87516]), fmin=array([ 32.7032]),\n", " function=<function melspectrogram at 0x7f9a48a41320>, n_fft=2048,\n", " n_mels=128, target=None)), ('Log amplitude', FeatureExtractor(function=<function logamplitude at 0x7f9a48a41ed8>,\n", " ...sters=8,\n", " n_init=3, random_state=None, reassignment_ratio=0.01, tol=0.0,\n", " verbose=0))])" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "# We can plot the resulting centroids\n", "plt.figure(figsize=(4, 4))\n", "\n", "librosa.display.specshow(C.cluster_centers_.T)\n", "\n", "plt.xticks(range(len(C.cluster_centers_)))\n", "plt.xlabel('Cluster #')\n", "\n", "plt.ylabel('Mel frequency')\n", "\n", "plt.colorbar(format='%+02.0f dB')\n", "\n", "plt.tight_layout()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "<matplotlib.figure.Figure at 0x7f9a3c2be590>" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "# Now we can make predictions, in this case, frame-level cluster identifiers.\n", "# Let's run it on the training data, just to be sure it worked.\n", "ClusterPipe.predict([y_train])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "array([4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0,\n", " 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 0,\n", " 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n", " 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n", " 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n", " 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n", " 4, 4, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3,\n", " 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3,\n", " 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3,\n", " 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n", " 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n", " 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n", " 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 2,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7,\n", " 7, 7, 7, 1, 1, 7, 1, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2,\n", " 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 1, 7, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,\n", " 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,\n", " 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 2, 2, 6,\n", " 6, 1, 1, 1, 1, 6, 6, 6, 6, 4, 3, 1, 1, 1, 0, 7, 7, 7, 7, 7, 7, 7, 7,\n", " 7, 7, 7, 7, 7, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 7, 7,\n", " 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 6, 6, 6, 6,\n", " 6, 6, 6, 6, 6, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n", " 6, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 2,\n", " 2, 2, 2, 6, 6, 6, 6, 6, 7, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,\n", " 7, 7, 5, 5, 5, 2, 2, 2, 2, 2, 6, 6, 2, 2, 6, 6, 2, 2, 2, 6, 6, 6, 6,\n", " 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6, 6,\n", " 6, 6, 6, 6, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 6,\n", " 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 2, 2, 2, 6, 6, 6, 6, 2, 7, 6, 6, 2, 2,\n", " 2, 6, 6, 2, 5, 2, 2, 6, 6, 6, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5,\n", " 5, 5, 5, 5, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 6, 6, 6, 6, 6,\n", " 6, 6, 2, 2, 6, 6, 6, 2, 6, 6, 6, 6, 6, 6, 6, 4, 5, 5, 5, 5, 5, 2, 2,\n", " 2, 2, 6, 6, 2, 7, 6, 6, 0, 2, 2, 2, 6, 6, 2, 2, 2, 6, 6, 6, 6, 4, 4,\n", " 4, 6, 6, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6, 6, 6, 6,\n", " 6, 4, 2, 2, 2, 6, 6, 6, 6, 6, 6, 4, 6, 6, 2, 2, 2, 2, 2, 2, 6, 6, 6,\n", " 6, 6, 4, 6, 5, 5, 5, 5, 2, 2, 2], dtype=int32)" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "# Now we can test it on a different portion of the track: [20s, 25s]\n", "\n", "y_test, sr = librosa.load(librosa.util.example_audio_file(), duration=5, offset=20.0)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "ClusterPipe.predict([y_test])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "array([6, 6, 6, 6, 6, 7, 6, 6, 6, 2, 2, 1, 1, 2, 2, 2, 2, 6, 6, 6, 4, 4, 4,\n", " 4, 4, 4, 4, 4, 4, 6, 6, 3, 2, 5, 5, 5, 5, 2, 2, 2, 2, 6, 6, 6, 6, 6,\n", " 6, 6, 2, 2, 2, 2, 6, 6, 6, 1, 1, 4, 6, 2, 6, 6, 6, 2, 2, 6, 1, 4, 4,\n", " 6, 4, 4, 4, 5, 5, 5, 5, 5, 2, 2, 2, 6, 6, 6, 2, 7, 0, 3, 6, 2, 2, 2,\n", " 1, 2, 2, 2, 6, 6, 6, 6, 4, 4, 4, 4, 6, 6, 4, 4, 4, 4, 4, 4, 4, 5, 5,\n", " 5, 5, 5, 2, 2, 2, 6, 6, 6, 6, 6, 4, 6, 2, 2, 6, 6, 6, 6, 6, 6, 4, 4,\n", " 6, 2, 2, 2, 2, 2, 7, 7, 6, 6, 6, 6, 6, 4, 6, 5, 5, 5, 5, 2, 2, 2, 6,\n", " 6, 6, 2, 7, 7, 0, 0, 2, 2, 2, 6, 2, 2, 2, 2, 6, 6, 6, 6, 4, 4, 4, 4,\n", " 4, 4, 4, 4, 6, 6, 0, 2, 5, 5, 5, 5, 5, 2, 2, 2, 6, 6, 6, 6, 6, 0, 3,\n", " 2, 2, 2, 2, 6, 6, 6, 1, 2], dtype=int32)" ] } ], "prompt_number": 20 } ], "metadata": {} } ] }