Skip to content

Instantly share code, notes, and snippets.

@ebenolson
Created March 29, 2015 14:39
Show Gist options
  • Save ebenolson/40205d53a1a27ed0cc08 to your computer and use it in GitHub Desktop.
Save ebenolson/40205d53a1a27ed0cc08 to your computer and use it in GitHub Desktop.
MNIST contrastive
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 269,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from __future__ import print_function\n",
"\n",
"import gzip\n",
"import itertools\n",
"import pickle\n",
"import os\n",
"import sys\n",
"import numpy as np\n",
"import lasagne\n",
"import theano\n",
"from lasagne.layers import dnn # fails early if not available\n",
"import theano.tensor as T\n",
"import time\n",
"\n",
"PY2 = sys.version_info[0] == 2\n",
"\n",
"if PY2:\n",
" from urllib import urlretrieve\n",
"\n",
" def pickle_load(f, encoding):\n",
" return pickle.load(f)\n",
"else:\n",
" from urllib.request import urlretrieve\n",
"\n",
" def pickle_load(f, encoding):\n",
" return pickle.load(f, encoding=encoding)\n",
"\n",
"\n",
"NUM_EPOCHS = 500\n",
"BATCH_SIZE = 600\n",
"LEARNING_RATE = 0.01\n",
"MOMENTUM = 0.9\n",
"\n",
"\n",
"DATA_URL = 'http://deeplearning.net/data/mnist/mnist.pkl.gz'\n",
"DATA_FILENAME = 'mnist.pkl.gz'\n",
"\n",
"\n",
"def _load_data(url=DATA_URL, filename=DATA_FILENAME):\n",
" if not os.path.exists(filename):\n",
" print(\"Downloading MNIST\")\n",
" urlretrieve(url, filename)\n",
"\n",
" with gzip.open(filename, 'rb') as f:\n",
" return pickle_load(f, encoding='latin-1')\n",
"\n",
"def aug_data(X, y):\n",
" X_aug = np.concatenate((X, X), axis=1)\n",
"\n",
" idx = range(len(X))\n",
" np.random.shuffle(idx)\n",
" X_aug[:, 1, :, :] = X[idx, 0]\n",
" \n",
" y_aug = y[idx] == y\n",
" return X_aug, y_aug\n",
"\n",
"def load_data():\n",
" data = _load_data()\n",
" X_train, y_train = data[0]\n",
" X_valid, y_valid = data[1]\n",
" X_test, y_test = data[2]\n",
"\n",
" # reshape for convolutions\n",
" X_train = X_train.reshape((X_train.shape[0], 1, 28, 28))\n",
" X_valid = X_valid.reshape((X_valid.shape[0], 1, 28, 28))\n",
" X_test = X_test.reshape((X_test.shape[0], 1, 28, 28))\n",
" \n",
" X_train, y_train_pair = aug_data(X_train, y_train)\n",
" X_valid, y_valid_pair = aug_data(X_valid, y_valid)\n",
"\n",
" return dict(\n",
" X_train=lasagne.utils.floatX(X_train),\n",
" y_train_pair=y_train_pair.astype('int32'),\n",
" y_train=y_train.astype('int32'),\n",
" X_valid=lasagne.utils.floatX(X_valid),\n",
" y_valid_pair=y_valid_pair.astype('int32'),\n",
" y_valid=y_valid.astype('int32'),\n",
" num_examples_train=X_train.shape[0],\n",
" num_examples_valid=X_valid.shape[0],\n",
" input_height=X_train.shape[2],\n",
" input_width=X_train.shape[3],\n",
" )\n",
"\n",
"\n",
"def build_model(input_width, input_height,\n",
" batch_size=BATCH_SIZE):\n",
" l_in = lasagne.layers.InputLayer(\n",
" shape=(None, 2, input_width, input_height),\n",
" )\n",
"\n",
" l_c2b = lasagne.layers.ReshapeLayer(l_in, (-1, 1, [2], [3]))\n",
" \n",
" l_conv1 = dnn.Conv2DDNNLayer(\n",
" l_c2b,\n",
" num_filters=20,\n",
" filter_size=(5, 5),\n",
" nonlinearity=lasagne.nonlinearities.rectify,\n",
" W=lasagne.init.Uniform(),\n",
" )\n",
" l_pool1 = dnn.MaxPool2DDNNLayer(l_conv1, ds=(2, 2))\n",
"\n",
" l_conv2 = dnn.Conv2DDNNLayer(\n",
" l_pool1,\n",
" num_filters=50,\n",
" filter_size=(5, 5),\n",
" nonlinearity=lasagne.nonlinearities.rectify,\n",
" W=lasagne.init.Uniform(),\n",
" )\n",
" l_pool2 = dnn.MaxPool2DDNNLayer(l_conv2, ds=(2, 2))\n",
"\n",
" l_hidden1 = lasagne.layers.DenseLayer(\n",
" l_pool2,\n",
" num_units=500,\n",
" nonlinearity=lasagne.nonlinearities.rectify,\n",
" W=lasagne.init.Uniform(),\n",
" )\n",
"\n",
" l_hidden2 = lasagne.layers.DenseLayer(\n",
" l_pool1,\n",
" num_units=2,\n",
" nonlinearity=lasagne.nonlinearities.identity,\n",
" W=lasagne.init.Uniform(),\n",
" )\n",
" \n",
" l_out = lasagne.layers.ReshapeLayer(l_hidden2, (-1, 2, [1]))\n",
"\n",
" return l_out\n",
"\n",
"\n",
"def create_iter_functions(output_layer,\n",
" learning_rate=LEARNING_RATE, \n",
" momentum=MOMENTUM): \n",
" X = T.tensor4()\n",
" y = T.ivector()\n",
" a = output_layer.get_output(X)\n",
" \n",
" d = T.sum((a[:, 0] - a[:, 1])**2, -1)\n",
" loss = T.mean(y * d + \n",
" (1 - y) * T.maximum(0, 1 - d))\n",
"\n",
" all_params = lasagne.layers.get_all_params(output_layer)\n",
" updates = lasagne.updates.nesterov_momentum(\n",
" loss, all_params, learning_rate, momentum)\n",
"\n",
" iter_train = theano.function(\n",
" [X, y], loss,\n",
" updates=updates,\n",
" )\n",
" \n",
" iter_valid = theano.function(\n",
" [X, y], loss,\n",
" )\n",
"\n",
" return dict(\n",
" train=iter_train,\n",
" valid=iter_valid,\n",
" )\n",
"\n",
"\n",
"def train(iter_funcs, dataset, batch_size=BATCH_SIZE):\n",
" num_batches_train = dataset['num_examples_train'] // batch_size\n",
" num_batches_valid = dataset['num_examples_valid'] // batch_size\n",
"\n",
" batch_train_losses = []\n",
" for batch_index in range(num_batches_train):\n",
" batch_slice = slice(\n",
" batch_index * batch_size, (batch_index + 1) * batch_size)\n",
" batch_train_loss = iter_funcs['train'](dataset['X_train'][batch_slice], \n",
" dataset['y_train_pair'][batch_slice])\n",
" batch_train_losses.append(batch_train_loss)\n",
"\n",
" avg_train_loss = np.mean(batch_train_losses)\n",
"\n",
" batch_valid_losses = []\n",
" for batch_index in range(num_batches_valid):\n",
" batch_slice = slice(\n",
" batch_index * batch_size, (batch_index + 1) * batch_size)\n",
" batch_valid_loss = iter_funcs['valid'](dataset['X_valid'][batch_slice], \n",
" dataset['y_valid_pair'][batch_slice])\n",
" batch_valid_losses.append(batch_valid_loss)\n",
"\n",
" avg_valid_loss = np.mean(batch_valid_losses)\n",
"\n",
" return {\n",
" 'train_loss': avg_train_loss,\n",
" 'valid_loss': avg_valid_loss,\n",
" }\n",
"\n",
"\n",
"def main(num_epochs=NUM_EPOCHS):\n",
" print(\"Loading data...\")\n",
" dataset = load_data()\n",
"\n",
" print(\"Building model and compiling functions...\")\n",
" output_layer = build_model(28, 28)\n",
"\n",
" iter_funcs = create_iter_functions(output_layer)\n",
"\n",
" print(\"Starting training...\")\n",
" now = time.time()\n",
" try:\n",
" i = 0\n",
" while 1:\n",
" epoch = train(iter_funcs, dataset)\n",
" i += 1\n",
" epoch['number'] = i\n",
" print(\"Epoch {} of {} took {:.3f}s\".format(epoch['number'], num_epochs, time.time() - now))\n",
" now = time.time()\n",
" print(\" training loss:\\t\\t{:.6f}\".format(epoch['train_loss']))\n",
" print(\" validation loss:\\t\\t{:.6f}\".format(epoch['valid_loss']))\n",
"# print(\" validation accuracy:\\t\\t{:.2f} %%\".format(\n",
"# epoch['valid_accuracy'] * 100))\n",
"\n",
" if epoch['number'] >= num_epochs:\n",
" break\n",
"\n",
" except KeyboardInterrupt:\n",
" pass\n",
"\n",
" return output_layer\n",
"\n",
"\n",
"#if __name__ == '__main__':\n",
"# main()\n"
]
},
{
"cell_type": "code",
"execution_count": 169,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"dataset = load_data()"
]
},
{
"cell_type": "code",
"execution_count": 237,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"l_out = build_model(28,28)"
]
},
{
"cell_type": "code",
"execution_count": 205,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"iter_funcs = create_iter_functions(l_out)"
]
},
{
"cell_type": "code",
"execution_count": 270,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Loading data...\n",
"Building model and compiling functions...\n",
"Starting training...\n",
"Epoch 1 of 25 took 1.523s\n",
" training loss:\t\t0.266293\n",
" validation loss:\t\t0.184540\n",
"Epoch 2 of 25 took 1.551s\n",
" training loss:\t\t0.174943\n",
" validation loss:\t\t0.170360\n",
"Epoch 3 of 25 took 1.536s\n",
" training loss:\t\t0.160561\n",
" validation loss:\t\t0.154442\n",
"Epoch 4 of 25 took 1.500s\n",
" training loss:\t\t0.146417\n",
" validation loss:\t\t0.137413\n",
"Epoch 5 of 25 took 1.521s\n",
" training loss:\t\t0.132241\n",
" validation loss:\t\t0.122444\n",
"Epoch 6 of 25 took 1.509s\n",
" training loss:\t\t0.121499\n",
" validation loss:\t\t0.113801\n",
"Epoch 7 of 25 took 1.576s\n",
" training loss:\t\t0.114960\n",
" validation loss:\t\t0.108911\n",
"Epoch 8 of 25 took 1.510s\n",
" training loss:\t\t0.110110\n",
" validation loss:\t\t0.105396\n",
"Epoch 9 of 25 took 1.513s\n",
" training loss:\t\t0.106369\n",
" validation loss:\t\t0.102437\n",
"Epoch 10 of 25 took 1.503s\n",
" training loss:\t\t0.103087\n",
" validation loss:\t\t0.100060\n",
"Epoch 11 of 25 took 1.530s\n",
" training loss:\t\t0.100183\n",
" validation loss:\t\t0.097917\n",
"Epoch 12 of 25 took 1.548s\n",
" training loss:\t\t0.097523\n",
" validation loss:\t\t0.095948\n",
"Epoch 13 of 25 took 1.501s\n",
" training loss:\t\t0.095170\n",
" validation loss:\t\t0.094461\n",
"Epoch 14 of 25 took 1.519s\n",
" training loss:\t\t0.093103\n",
" validation loss:\t\t0.092939\n",
"Epoch 15 of 25 took 1.510s\n",
" training loss:\t\t0.091082\n",
" validation loss:\t\t0.091414\n",
"Epoch 16 of 25 took 1.501s\n",
" training loss:\t\t0.089276\n",
" validation loss:\t\t0.090439\n",
"Epoch 17 of 25 took 1.500s\n",
" training loss:\t\t0.087537\n",
" validation loss:\t\t0.088928\n",
"Epoch 18 of 25 took 1.515s\n",
" training loss:\t\t0.086015\n",
" validation loss:\t\t0.087879\n",
"Epoch 19 of 25 took 1.499s\n",
" training loss:\t\t0.084656\n",
" validation loss:\t\t0.087149\n",
"Epoch 20 of 25 took 1.501s\n",
" training loss:\t\t0.083339\n",
" validation loss:\t\t0.086347\n",
"Epoch 21 of 25 took 1.505s\n",
" training loss:\t\t0.082137\n",
" validation loss:\t\t0.085612\n",
"Epoch 22 of 25 took 1.510s\n",
" training loss:\t\t0.080948\n",
" validation loss:\t\t0.085032\n",
"Epoch 23 of 25 took 1.502s\n",
" training loss:\t\t0.079899\n",
" validation loss:\t\t0.084310\n",
"Epoch 24 of 25 took 1.515s\n",
" training loss:\t\t0.078841\n",
" validation loss:\t\t0.083636\n",
"Epoch 25 of 25 took 1.500s\n",
" training loss:\t\t0.077810\n",
" validation loss:\t\t0.083232\n"
]
}
],
"source": [
"l_out = main(25)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 181,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fe6760d2ed0>"
]
},
"execution_count": 181,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": [
"iVBORw0KGgoAAAANSUhEUgAAAPwAAAD8CAYAAABTq8lnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n",
"AAALEgAACxIB0t1+/AAACzdJREFUeJzt3WGoXvV9wPHvbzYRmhRUKono3eKLdowQUQdhYEt1uJJS\n",
"sAbRGhiE6kpfdG3Zq+rAWXzTUmzxXd80hqwr1jAxywbbTGthjrK2GbXa1NQWDBiNN9Eq84KI019f\n",
"3HPZ3W3ueW6ee855TvL7fiDkuef/5N6fD/l6nueeJ/cfmYmkGv5g1gNIGo7BS4UYvFSIwUuFGLxU\n",
"iMFLhUwdfETsiojjEfHriPhyl0NJ6kdMcx0+Ii4CfgXcDLwE/BTYk5nPLbuPF/ilGcrMWHls2jP8\n",
"TuA3mXkiM98Bvgd8aj3DSerftMFfCby47OOTzTFJIzZt8D5dl85D0wb/EjC37OM5Fs/ykkZs2uCP\n",
"Ah+KiG0RsRH4NHC4u7Ek9eF90/yhzPzfiPhr4N+Bi4B9y79DL2mcprost6ZP7GU5aaa6vCwn6Txk\n",
"8FIhBi8VYvBSIQYvFWLwUiEGLxVi8FIhBi8VYvBSIQYvFWLwUiEGLxVi8FIhBi8VYvBSIQYvFWLw\n",
"UiEGLxVi8FIhBi8VYvBSIQYvFTLVRhS68G3btm3ifR588MHW9dtuu611/c4772xdf/TRRyfOoHPj\n",
"GV4qxOClQgxeKsTgpUIMXirE4KVCDF4qZF3X4SPiBPA/wLvAO5m5s4uhNHt33333xPvs3r27df29\n",
"995rXd+5s/2vi9fhu7feN94kcGNm/raLYST1q4un9NHB55A0gPUGn8D3I+JoRHy2i4Ek9We9T+lv\n",
"yMxTEXE5cCQijmfmU10MJql76zrDZ+ap5vczwOOA37STRmzq4CPi/RHxgeb2JuDjwLNdDSape+t5\n",
"Sr8FeDwilj7PdzPziU6mktSLqYPPzBeAazucRQOam5trXb/rrrsGmkRD8p12UiEGLxVi8FIhBi8V\n",
"YvBSIQYvFWLwUiH+XPqirrnmmtb1rVu3DjSJhuQZXirE4KVCDF4qxOClQgxeKsTgpUIMXirE6/BF\n",
"3X777bMegf379896hHI8w0uFGLxUiMFLhRi8VIjBS4UYvFSIwUuFeB1eM3PmzJlZj1COZ3ipEIOX\n",
"CjF4qRCDlwoxeKkQg5cKMXipkInX4SPiYeCTwOnM3NEcuwx4FPgj4ARwR2a+0eOcOkebN29uXd++\n",
"fftAk2hM1nKG3w/sWnHsHuBIZn4Y+EHzsaSRmxh8Zj4FvL7i8C3Ageb2AeDWjueS1INpX8Nvycz5\n",
"5vY8sKWjeST1aN3ftMvMBLKDWST1bNrg5yNiK0BEXAGc7m4kSX2ZNvjDwN7m9l7gUDfjSOrTxOAj\n",
"4hHgR8AfR8SLEfEZ4GvAX0TE88CfNx9LGrmJ1+Ezc88qSzd3PIs6tLCw0Lp+7Nix1vXrr7++y3E0\n",
"Er7TTirE4KVCDF4qxOClQgxeKsTgpUIMXirE4KVCDF4qxOClQgxeKsTgpUIMXirE4KVCDF4qxP3h\n",
"L1CXXnpp6/pNN93U+wxPPvlk6/obb7iVwdA8w0uFGLxUiMFLhRi8VIjBS4UYvFSIwUuFeB3+AnXx\n",
"xRe3rl911VW9z7Bjx47W9U2bNrWuv/32212OIzzDS6UYvFSIwUuFGLxUiMFLhRi8VIjBS4VMvA4f\n",
"EQ8DnwROZ+aO5thXgL8CzjR3uzcz/62vIXV+uvzyy1vXN2zYMNAkWrKWM/x+YNeKYwl8MzOva34Z\n",
"u3QemBh8Zj4FvH6Wpeh+HEl9Ws9r+C9ExM8jYl9EXNLZRJJ6M23w3wKuBq4FTgHf6GwiSb2ZKvjM\n",
"PJ0N4NvAzm7HktSHqYKPiCuWfbgbeLabcST1aS2X5R4BPgZ8MCJeBO4HboyIa1n8bv0LwOd6nVJS\n",
"JyYGn5l7znL44R5m0QXm4MGDreuvvvrqQJNoie+0kwoxeKkQg5cKMXipEIOXCjF4qRCDlwrx59Jf\n",
"oDZu3DjrEXjrrbda1999992BJtESz/BSIQYvFWLwUiEGLxVi8FIhBi8VYvBSIV6HP09FtP/Q4Pvu\n",
"u2+gSVZ35MiRWY+gFTzDS4UYvFSIwUuFGLxUiMFLhRi8VIjBS4XE4m5RPXziiH4+sYDJ/9590r9F\n",
"H8L27dtb148fPz7QJDVl5u+9WcMzvFSIwUuFGLxUiMFLhRi8VIjBS4UYvFRIa/ARMRcRP4yIYxHx\n",
"i4j4YnP8sog4EhHPR8QTEXHJMONKWo9JZ/h3gL/JzO3AnwGfj4g/Ae4BjmTmh4EfNB9LGrnW4DPz\n",
"lcx8urm9ADwHXAncAhxo7nYAuLXPISV1Y82v4SNiG3Ad8GNgS2bON0vzwJbOJ5PUuTUFHxGbgceA\n",
"L2Xmm8vXcvHN+L5vXjoPTAw+IjawGPt3MvNQc3g+IrY261cAp/sbUVJXJn2XPoB9wC8z86FlS4eB\n",
"vc3tvcChlX9W0vhM+jHVNwB/CTwTET9rjt0LfA04GBF3AyeAO3qbUFJnWoPPzP9k9WcBN3c/js4n\n",
"L7/8cuv6wsLCQJNorXynnVSIwUuFGLxUiMFLhRi8VIjBS4UYvFSI+8PrrObn5yfeZ/fu3a3rJ0+e\n",
"7GocdcQzvFSIwUuFGLxUiMFLhRi8VIjBS4UYvFSI1+GLeu2111rXH3jggYmf4+jRo12No4F4hpcK\n",
"MXipEIOXCjF4qRCDlwoxeKkQg5cKicWt4Xr4xBHuNyfNUGbGymOe4aVCDF4qxOClQgxeKsTgpUIM\n",
"XiqkNfiImIuIH0bEsYj4RUR8sTn+lYg4GRE/a37tGmZcSevReh0+IrYCWzPz6YjYDPw3cCtwB/Bm\n",
"Zn6z5c96HV6aobNdh2/9ARiZ+QrwSnN7ISKeA65sln/vk0katzW/ho+IbcB1wH81h74QET+PiH0R\n",
"cUkPs0nq2JqCb57O/yPwpcxcAL4FXA1cC5wCvtHbhJI6M/G99BGxAfgX4F8z86GzrG8D/jkzd6w4\n",
"7mt4aYbO+b30ERHAPuCXy2OPiCuW3W038GxXQ0rqz6Tv0n8E+A/gGWDpjn8L7GHx6XwCLwCfy8z5\n",
"FX/WM7w0Q2c7w/vPY6ULlP88VirO4KVCDF4qxOClQgxeKsTgpUIMXirE4KVCDF4qxOClQgxeKsTg\n",
"pUIMXirE4KVCDF4qxOClQgxeKqS3n3gjaXw8w0uFGLxUyCDBR8SuiDgeEb+OiC8P8TXPRUSciIhn\n",
"mo0xfzKCeR6OiPmIeHbZscsi4khEPB8RT8xyt59V5hvFBqMtG6CO4vGb9Qatvb+Gj4iLgF8BNwMv\n",
"AT8F9mTmc71+4XMQES8Af5qZv531LAAR8VFgAfj7pQ0+IuLrwKuZ+fXmf5qXZuY9I5rvfiZsMDrQ\n",
"bKttgPoZRvD4rWeD1i4McYbfCfwmM09k5jvA94BPDfB1z9VoNsfMzKeA11ccvgU40Nw+wOJfkplY\n",
"ZT4YwWOYma9k5tPN7QVgaQPUUTx+LfPBAI/fEMFfCby47OOT/N9/4Fgk8P2IOBoRn531MKvYsmyz\n",
"j3lgyyyHWcWoNhhdtgHqjxnh4zeLDVqHCP58uO53Q2ZeB3wC+HzzlHW0cvF12Nge11FtMNo8XX6M\n",
"xQ1Q31y+NobHb1YbtA4R/EvA3LKP51g8y49GZp5qfj8DPM7iy5CxmW9e/y3t7Xd6xvP8P5l5OhvA\n",
"t5nhY9hsgPoY8J3MPNQcHs3jt2y+f1iab6jHb4jgjwIfiohtEbER+DRweICvuyYR8f6I+EBzexPw\n",
"cca5OeZhYG9zey9wqOW+gxvLBqOrbYDKSB6/WW/QOsg77SLiE8BDwEXAvsz8au9fdI0i4moWz+oA\n",
"7wO+O+v5IuIR4GPAB1l8vfl3wD8BB4E/BE4Ad2TmGyOZ737gRiZsMDrQbGfbAPVe4CeM4PFbzwat\n",
"nXx931or1eE77aRCDF4qxOClQgxeKsTgpUIMXirE4KVCDF4q5HehqAPrklK1+AAAAABJRU5ErkJg\n",
"gg==\n"
],
"text/plain": [
"<matplotlib.figure.Figure at 0x7fe6760e0910>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(dataset['X_train'][i,1], cmap='gray', interpolation='nearest')"
]
},
{
"cell_type": "code",
"execution_count": 268,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<lasagne.layers.shape.ReshapeLayer at 0x7fe67c846210>,\n",
" <lasagne.layers.dense.DenseLayer at 0x7fe67ab72ed0>,\n",
" <lasagne.layers.dnn.MaxPool2DDNNLayer at 0x7fe685ee8f50>,\n",
" <lasagne.layers.dnn.Conv2DDNNLayer at 0x7fe67c846190>,\n",
" <lasagne.layers.dnn.MaxPool2DDNNLayer at 0x7fe685ee8650>,\n",
" <lasagne.layers.dnn.Conv2DDNNLayer at 0x7fe685ee8390>,\n",
" <lasagne.layers.shape.ReshapeLayer at 0x7fe685ee8710>,\n",
" <lasagne.layers.input.InputLayer at 0x7fe675be5750>]"
]
},
"execution_count": 268,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lasagne.layers.get_all_layers(l_out)"
]
},
{
"cell_type": "code",
"execution_count": 271,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X = T.tensor4()\n",
"out = theano.function([X],l_out.get_output(X))"
]
},
{
"cell_type": "code",
"execution_count": 272,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"p = out(dataset['X_valid'])"
]
},
{
"cell_type": "code",
"execution_count": 265,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from tsne import bh_sne"
]
},
{
"cell_type": "code",
"execution_count": 280,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X0 = dataset['X_valid'][:,0,:,:].reshape((10000,-1)).astype('float64')"
]
},
{
"cell_type": "code",
"execution_count": 279,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0., 0., 0., ..., 0., 0., 0.],\n",
" [ 0., 0., 0., ..., 0., 0., 0.],\n",
" [ 0., 0., 0., ..., 0., 0., 0.],\n",
" ..., \n",
" [ 0., 0., 0., ..., 0., 0., 0.],\n",
" [ 0., 0., 0., ..., 0., 0., 0.],\n",
" [ 0., 0., 0., ..., 0., 0., 0.]], dtype=float32)"
]
},
"execution_count": 279,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X0"
]
},
{
"cell_type": "code",
"execution_count": 281,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"p1 = bh_sne(X0)"
]
},
{
"cell_type": "code",
"execution_count": 284,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7fe6ce3d2610>]"
]
},
"execution_count": 284,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": [
"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\n"
],
"text/plain": [
"<matplotlib.figure.Figure at 0x7fe6ce296e90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(p1[:,0], p1[:,1],'.')"
]
},
{
"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.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment