{ "cells": [ { "cell_type": "markdown", "metadata": { "_cell_guid": "e61ef2d8-f315-4f7f-b07e-1de0f4e8441a", "_uuid": "1677fddbb95f7545b6540e9201f3339a0fdbfc5d" }, "source": [ "# Intro\n", "Hello! This rather quick and dirty kernel shows how to get started on segmenting nuclei using a neural network in Keras. \n", "\n", "The architecture used is the so-called [U-Net](https://arxiv.org/abs/1505.04597), which is very common for image segmentation problems such as this. I believe they also have a tendency to work quite well even on small datasets.\n", "\n", "Let's get started importing everything we need!" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "_cell_guid": "c332549b-8d23-4bb5-8497-e7a8eb8b21d2", "_uuid": "5c38504af3a84bee68c66d3cde74443c58df422f", "collapsed": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] } ], "source": [ "import os\n", "import sys\n", "import random\n", "import warnings\n", "\n", "import numpy as np\n", "import pandas as pd\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "from tqdm import tqdm\n", "from itertools import chain\n", "from skimage.io import imread, imshow, imread_collection, concatenate_images\n", "from skimage.transform import resize\n", "from skimage.morphology import label\n", "\n", "from keras.models import Model, load_model\n", "from keras.layers import Input\n", "from keras.layers.core import Lambda\n", "from keras.layers.convolutional import Conv2D, Conv2DTranspose\n", "from keras.layers.pooling import MaxPooling2D\n", "from keras.layers.merge import concatenate\n", "from keras.callbacks import EarlyStopping, ModelCheckpoint\n", "from keras import backend as K\n", "\n", "import tensorflow as tf\n", "\n", "# Set some parameters\n", "IMG_WIDTH = 128\n", "IMG_HEIGHT = 128\n", "IMG_CHANNELS = 3\n", "TRAIN_PATH = '../input/stage1_train/'\n", "TEST_PATH = '../input/stage1_test/'\n", "\n", "warnings.filterwarnings('ignore', category=UserWarning, module='skimage')\n", "seed = 42\n", "random.seed = seed\n", "np.random.seed = seed" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "_cell_guid": "ffa0caf0-2d1b-40f2-865b-8e6db88526b6", "_uuid": "3fb9d6530fbbd0e22e41fc4fd9fd9fc0bff027ac", "collapsed": true }, "outputs": [], "source": [ "# Get train and test IDs\n", "train_ids = next(os.walk(TRAIN_PATH))[1]\n", "test_ids = next(os.walk(TEST_PATH))[1]" ] }, { "cell_type": "markdown", "metadata": { "_cell_guid": "59c4a25d-645f-4b74-9c53-145ac78cc481", "_uuid": "875af74f980236825de3a650825b46e25632422c" }, "source": [ "# Get the data\n", "Let's first import all the images and associated masks. I downsample both the training and test images to keep things light and manageable, but we need to keep a record of the original sizes of the test images to upsample our predicted masks and create correct run-length encodings later on. There are definitely better ways to handle this, but it works fine for now!" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "_cell_guid": "ca0cc34b-c26f-41ee-88d7-975aebdb634e", "_uuid": "9e389ba8bdb5b6fc03b231b6a6c84a8bde634053", "collapsed": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Getting and resizing train images and masks ... \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 670/670 [01:25<00:00, 7.87it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Getting and resizing test images ... \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "100%|██████████| 65/65 [00:00<00:00, 91.16it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Done!\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "# Get and resize train images and masks\n", "X_train = np.zeros((len(train_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)\n", "Y_train = np.zeros((len(train_ids), IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)\n", "print('Getting and resizing train images and masks ... ')\n", "sys.stdout.flush()\n", "for n, id_ in tqdm(enumerate(train_ids), total=len(train_ids)):\n", " path = TRAIN_PATH + id_\n", " img = imread(path + '/images/' + id_ + '.png')[:,:,:IMG_CHANNELS]\n", " img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)\n", " X_train[n] = img\n", " mask = np.zeros((IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)\n", " for mask_file in next(os.walk(path + '/masks/'))[2]:\n", " mask_ = imread(path + '/masks/' + mask_file)\n", " mask_ = np.expand_dims(resize(mask_, (IMG_HEIGHT, IMG_WIDTH), mode='constant', \n", " preserve_range=True), axis=-1)\n", " mask = np.maximum(mask, mask_)\n", " Y_train[n] = mask\n", "\n", "# Get and resize test images\n", "X_test = np.zeros((len(test_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)\n", "sizes_test = []\n", "print('Getting and resizing test images ... ')\n", "sys.stdout.flush()\n", "for n, id_ in tqdm(enumerate(test_ids), total=len(test_ids)):\n", " path = TEST_PATH + id_\n", " img = imread(path + '/images/' + id_ + '.png')[:,:,:IMG_CHANNELS]\n", " sizes_test.append([img.shape[0], img.shape[1]])\n", " img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)\n", " X_test[n] = img\n", "\n", "print('Done!')" ] }, { "cell_type": "markdown", "metadata": { "_cell_guid": "c0523b03-1fc5-4505-a1b8-eb35ee617c8a", "_uuid": "d4f8327802a1ec6139ce0585953986272ba62ce1" }, "source": [ "Let's see if things look all right by drawing some random images and their associated masks." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "_cell_guid": "88829b53-50ce-45d9-9540-77dd7384ad4c", "_uuid": "283af26f0860b7069bdfd133c746e5d20971542c", "collapsed": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f2facfca7f0>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nAABJRU5ErkJggg==\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f2facfa25f8>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Check if training data looks all right\n", "ix = random.randint(0, len(train_ids))\n", "imshow(X_train[ix])\n", "plt.show()\n", "imshow(np.squeeze(Y_train[ix]))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "_cell_guid": "2574ffe9-b911-4bfd-a00f-9ba5c25f45de", "_uuid": "938648da705689a0f940ff462477c801db3f0737" }, "source": [ "Seems good!\n", "\n", "# Create our Keras metric\n", "\n", "Now we try to define the *mean average precision at different intersection over union (IoU) thresholds* metric in Keras. TensorFlow has a mean IoU metric, but it doesn't have any native support for the mean over multiple thresholds, so I tried to implement this. **I'm by no means certain that this implementation is correct, though!** Any assistance in verifying this would be most welcome! \n", "\n", "*Update: This implementation is most definitely not correct due to the very large discrepancy between the results reported here and the LB results. It also seems to just increase over time no matter what when you train ... *" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "_cell_guid": "c1df6f3a-d58f-434b-9216-ef7be38637d4", "_uuid": "5abd38950ae99b60f8afec7656eb654a48d449fe", "collapsed": true }, "outputs": [], "source": [ "# Define IoU metric\n", "def mean_iou(y_true, y_pred):\n", " prec = []\n", " for t in np.arange(0.5, 1.0, 0.05):\n", " y_pred_ = tf.to_int32(y_pred > t)\n", " score, up_opt = tf.metrics.mean_iou(y_true, y_pred_, 2)\n", " K.get_session().run(tf.local_variables_initializer())\n", " with tf.control_dependencies([up_opt]):\n", " score = tf.identity(score)\n", " prec.append(score)\n", " return K.mean(K.stack(prec), axis=0)" ] }, { "cell_type": "markdown", "metadata": { "_cell_guid": "c3b9f148-1dba-4b6a-981b-6cdbf394fc3c", "_uuid": "986488a4c5223576be370e224426a30431911eb2" }, "source": [ "# Build and train our neural network\n", "Next we build our U-Net model, loosely based on [U-Net: Convolutional Networks for Biomedical Image Segmentation](https://arxiv.org/pdf/1505.04597.pdf) and very similar to [this repo](https://github.com/jocicmarko/ultrasound-nerve-segmentation) from the Kaggle Ultrasound Nerve Segmentation competition.\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "_cell_guid": "c1dbc57c-b497-4ccb-b077-2053203ab7ed", "_uuid": "0aa97d66c29f45dfac9b0f45fcf74ba0e778ba5d", "collapsed": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input_1 (InputLayer) (None, 128, 128, 3) 0 \n", "__________________________________________________________________________________________________\n", "lambda_1 (Lambda) (None, 128, 128, 3) 0 input_1[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_1 (Conv2D) (None, 128, 128, 8) 224 lambda_1[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_2 (Conv2D) (None, 128, 128, 8) 584 conv2d_1[0][0] \n", "__________________________________________________________________________________________________\n", "max_pooling2d_1 (MaxPooling2D) (None, 64, 64, 8) 0 conv2d_2[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_3 (Conv2D) (None, 64, 64, 16) 1168 max_pooling2d_1[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_4 (Conv2D) (None, 64, 64, 16) 2320 conv2d_3[0][0] \n", "__________________________________________________________________________________________________\n", "max_pooling2d_2 (MaxPooling2D) (None, 32, 32, 16) 0 conv2d_4[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_5 (Conv2D) (None, 32, 32, 32) 4640 max_pooling2d_2[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_6 (Conv2D) (None, 32, 32, 32) 9248 conv2d_5[0][0] \n", "__________________________________________________________________________________________________\n", "max_pooling2d_3 (MaxPooling2D) (None, 16, 16, 32) 0 conv2d_6[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_7 (Conv2D) (None, 16, 16, 64) 18496 max_pooling2d_3[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_8 (Conv2D) (None, 16, 16, 64) 36928 conv2d_7[0][0] \n", "__________________________________________________________________________________________________\n", "max_pooling2d_4 (MaxPooling2D) (None, 8, 8, 64) 0 conv2d_8[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_9 (Conv2D) (None, 8, 8, 128) 73856 max_pooling2d_4[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_10 (Conv2D) (None, 8, 8, 128) 147584 conv2d_9[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_transpose_1 (Conv2DTrans (None, 16, 16, 64) 32832 conv2d_10[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_1 (Concatenate) (None, 16, 16, 128) 0 conv2d_transpose_1[0][0] \n", " conv2d_8[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_11 (Conv2D) (None, 16, 16, 64) 73792 concatenate_1[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_12 (Conv2D) (None, 16, 16, 64) 36928 conv2d_11[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_transpose_2 (Conv2DTrans (None, 32, 32, 32) 8224 conv2d_12[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_2 (Concatenate) (None, 32, 32, 64) 0 conv2d_transpose_2[0][0] \n", " conv2d_6[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_13 (Conv2D) (None, 32, 32, 32) 18464 concatenate_2[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_14 (Conv2D) (None, 32, 32, 32) 9248 conv2d_13[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_transpose_3 (Conv2DTrans (None, 64, 64, 16) 2064 conv2d_14[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_3 (Concatenate) (None, 64, 64, 32) 0 conv2d_transpose_3[0][0] \n", " conv2d_4[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_15 (Conv2D) (None, 64, 64, 16) 4624 concatenate_3[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_16 (Conv2D) (None, 64, 64, 16) 2320 conv2d_15[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_transpose_4 (Conv2DTrans (None, 128, 128, 8) 520 conv2d_16[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_4 (Concatenate) (None, 128, 128, 16) 0 conv2d_transpose_4[0][0] \n", " conv2d_2[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_17 (Conv2D) (None, 128, 128, 8) 1160 concatenate_4[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_18 (Conv2D) (None, 128, 128, 8) 584 conv2d_17[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_19 (Conv2D) (None, 128, 128, 1) 9 conv2d_18[0][0] \n", "==================================================================================================\n", "Total params: 485,817\n", "Trainable params: 485,817\n", "Non-trainable params: 0\n", "__________________________________________________________________________________________________\n" ] } ], "source": [ "# Build U-Net model\n", "inputs = Input((IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))\n", "s = Lambda(lambda x: x / 255) (inputs)\n", "\n", "c1 = Conv2D(8, (3, 3), activation='relu', padding='same') (s)\n", "c1 = Conv2D(8, (3, 3), activation='relu', padding='same') (c1)\n", "p1 = MaxPooling2D((2, 2)) (c1)\n", "\n", "c2 = Conv2D(16, (3, 3), activation='relu', padding='same') (p1)\n", "c2 = Conv2D(16, (3, 3), activation='relu', padding='same') (c2)\n", "p2 = MaxPooling2D((2, 2)) (c2)\n", "\n", "c3 = Conv2D(32, (3, 3), activation='relu', padding='same') (p2)\n", "c3 = Conv2D(32, (3, 3), activation='relu', padding='same') (c3)\n", "p3 = MaxPooling2D((2, 2)) (c3)\n", "\n", "c4 = Conv2D(64, (3, 3), activation='relu', padding='same') (p3)\n", "c4 = Conv2D(64, (3, 3), activation='relu', padding='same') (c4)\n", "p4 = MaxPooling2D(pool_size=(2, 2)) (c4)\n", "\n", "c5 = Conv2D(128, (3, 3), activation='relu', padding='same') (p4)\n", "c5 = Conv2D(128, (3, 3), activation='relu', padding='same') (c5)\n", "\n", "u6 = Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same') (c5)\n", "u6 = concatenate([u6, c4])\n", "c6 = Conv2D(64, (3, 3), activation='relu', padding='same') (u6)\n", "c6 = Conv2D(64, (3, 3), activation='relu', padding='same') (c6)\n", "\n", "u7 = Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same') (c6)\n", "u7 = concatenate([u7, c3])\n", "c7 = Conv2D(32, (3, 3), activation='relu', padding='same') (u7)\n", "c7 = Conv2D(32, (3, 3), activation='relu', padding='same') (c7)\n", "\n", "u8 = Conv2DTranspose(16, (2, 2), strides=(2, 2), padding='same') (c7)\n", "u8 = concatenate([u8, c2])\n", "c8 = Conv2D(16, (3, 3), activation='relu', padding='same') (u8)\n", "c8 = Conv2D(16, (3, 3), activation='relu', padding='same') (c8)\n", "\n", "u9 = Conv2DTranspose(8, (2, 2), strides=(2, 2), padding='same') (c8)\n", "u9 = concatenate([u9, c1], axis=3)\n", "c9 = Conv2D(8, (3, 3), activation='relu', padding='same') (u9)\n", "c9 = Conv2D(8, (3, 3), activation='relu', padding='same') (c9)\n", "\n", "outputs = Conv2D(1, (1, 1), activation='sigmoid') (c9)\n", "\n", "model = Model(inputs=[inputs], outputs=[outputs])\n", "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=[mean_iou])\n", "model.summary()" ] }, { "cell_type": "markdown", "metadata": { "_cell_guid": "72330944-6ce7-4070-b276-c3c4b20c4fe5", "_uuid": "92350b6e18cc50f3fa7b6e9a02d39fcbff8238f7" }, "source": [ "Next we fit the model on the training data, using a validation split of 0.1. We use a small batch size because we have so little data. I recommend using checkpointing and early stopping when training your model. I won't do it here to make things a bit more reproducible (although it's very likely that your results will be different anyway). I'll just train for 10 epochs, which takes around 10 minutes in the Kaggle kernel with the current parameters. \n", "\n", "*Update: Added early stopping and checkpointing and increased to 30 epochs.*" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "_cell_guid": "9415b1c4-aa69-41b9-a1e3-d6053dbd4f64", "_uuid": "c060db22daa2abf12b28240cd81bbcbf1ce1bf87", "collapsed": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 603 samples, validate on 67 samples\n", "Epoch 1/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.4475 - mean_iou: 0.4181\n", "Epoch 00001: val_loss improved from inf to 0.29506, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 53s 88ms/step - loss: 0.4465 - mean_iou: 0.4181 - val_loss: 0.2951 - val_mean_iou: 0.4232\n", "Epoch 2/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.2412 - mean_iou: 0.4257\n", "Epoch 00002: val_loss improved from 0.29506 to 0.17167, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 51s 84ms/step - loss: 0.2414 - mean_iou: 0.4258 - val_loss: 0.1717 - val_mean_iou: 0.4368\n", "Epoch 3/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.1663 - mean_iou: 0.4589\n", "Epoch 00003: val_loss improved from 0.17167 to 0.14400, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 50s 83ms/step - loss: 0.1663 - mean_iou: 0.4590 - val_loss: 0.1440 - val_mean_iou: 0.4884\n", "Epoch 4/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.1290 - mean_iou: 0.5220\n", "Epoch 00004: val_loss improved from 0.14400 to 0.11136, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 50s 84ms/step - loss: 0.1285 - mean_iou: 0.5221 - val_loss: 0.1114 - val_mean_iou: 0.5523\n", "Epoch 5/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.1155 - mean_iou: 0.5768\n", "Epoch 00005: val_loss improved from 0.11136 to 0.10928, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 51s 84ms/step - loss: 0.1155 - mean_iou: 0.5769 - val_loss: 0.1093 - val_mean_iou: 0.5990\n", "Epoch 6/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.1007 - mean_iou: 0.6174\n", "Epoch 00006: val_loss improved from 0.10928 to 0.09795, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 50s 84ms/step - loss: 0.1006 - mean_iou: 0.6175 - val_loss: 0.0979 - val_mean_iou: 0.6340\n", "Epoch 7/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0998 - mean_iou: 0.6468\n", "Epoch 00007: val_loss improved from 0.09795 to 0.08905, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 50s 83ms/step - loss: 0.0998 - mean_iou: 0.6469 - val_loss: 0.0890 - val_mean_iou: 0.6590\n", "Epoch 8/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0921 - mean_iou: 0.6703\n", "Epoch 00008: val_loss did not improve\n", "603/603 [==============================] - 50s 83ms/step - loss: 0.0923 - mean_iou: 0.6703 - val_loss: 0.0918 - val_mean_iou: 0.6799\n", "Epoch 9/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0913 - mean_iou: 0.6889\n", "Epoch 00009: val_loss improved from 0.08905 to 0.08385, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 50s 84ms/step - loss: 0.0912 - mean_iou: 0.6889 - val_loss: 0.0839 - val_mean_iou: 0.6968\n", "Epoch 10/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0925 - mean_iou: 0.7038\n", "Epoch 00010: val_loss did not improve\n", "603/603 [==============================] - 50s 83ms/step - loss: 0.0922 - mean_iou: 0.7038 - val_loss: 0.0901 - val_mean_iou: 0.7101\n", "Epoch 11/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0861 - mean_iou: 0.7161\n", "Epoch 00011: val_loss did not improve\n", "603/603 [==============================] - 50s 83ms/step - loss: 0.0862 - mean_iou: 0.7162 - val_loss: 0.0927 - val_mean_iou: 0.7215\n", "Epoch 12/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0829 - mean_iou: 0.7268\n", "Epoch 00012: val_loss improved from 0.08385 to 0.08038, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 51s 84ms/step - loss: 0.0830 - mean_iou: 0.7268 - val_loss: 0.0804 - val_mean_iou: 0.7314\n", "Epoch 13/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0809 - mean_iou: 0.7357\n", "Epoch 00013: val_loss improved from 0.08038 to 0.07635, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 50s 83ms/step - loss: 0.0813 - mean_iou: 0.7357 - val_loss: 0.0763 - val_mean_iou: 0.7401\n", "Epoch 14/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0866 - mean_iou: 0.7439\n", "Epoch 00014: val_loss did not improve\n", "603/603 [==============================] - 56s 92ms/step - loss: 0.0864 - mean_iou: 0.7439 - val_loss: 0.0807 - val_mean_iou: 0.7473\n", "Epoch 15/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0818 - mean_iou: 0.7503\n", "Epoch 00015: val_loss did not improve\n", "603/603 [==============================] - 57s 95ms/step - loss: 0.0816 - mean_iou: 0.7504 - val_loss: 0.0771 - val_mean_iou: 0.7537\n", "Epoch 16/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0813 - mean_iou: 0.7569\n", "Epoch 00016: val_loss did not improve\n", "603/603 [==============================] - 57s 95ms/step - loss: 0.0812 - mean_iou: 0.7569 - val_loss: 0.0798 - val_mean_iou: 0.7596\n", "Epoch 17/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0782 - mean_iou: 0.7621\n", "Epoch 00017: val_loss improved from 0.07635 to 0.07304, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 57s 94ms/step - loss: 0.0783 - mean_iou: 0.7621 - val_loss: 0.0730 - val_mean_iou: 0.7649\n", "Epoch 18/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0843 - mean_iou: 0.7672\n", "Epoch 00018: val_loss did not improve\n", "603/603 [==============================] - 54s 89ms/step - loss: 0.0842 - mean_iou: 0.7672 - val_loss: 0.0775 - val_mean_iou: 0.7694\n", "Epoch 19/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0776 - mean_iou: 0.7716\n", "Epoch 00019: val_loss did not improve\n", "603/603 [==============================] - 53s 88ms/step - loss: 0.0778 - mean_iou: 0.7716 - val_loss: 0.0732 - val_mean_iou: 0.7737\n", "Epoch 20/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0791 - mean_iou: 0.7757\n", "Epoch 00020: val_loss did not improve\n", "603/603 [==============================] - 53s 87ms/step - loss: 0.0790 - mean_iou: 0.7757 - val_loss: 0.0766 - val_mean_iou: 0.7776\n", "Epoch 21/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0783 - mean_iou: 0.7792\n", "Epoch 00021: val_loss did not improve\n", "603/603 [==============================] - 54s 89ms/step - loss: 0.0781 - mean_iou: 0.7792 - val_loss: 0.0840 - val_mean_iou: 0.7811\n", "Epoch 22/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0753 - mean_iou: 0.7829\n", "Epoch 00022: val_loss improved from 0.07304 to 0.07093, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 55s 91ms/step - loss: 0.0755 - mean_iou: 0.7829 - val_loss: 0.0709 - val_mean_iou: 0.7846\n", "Epoch 23/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0745 - mean_iou: 0.7861\n", "Epoch 00023: val_loss did not improve\n", "603/603 [==============================] - 52s 86ms/step - loss: 0.0744 - mean_iou: 0.7861 - val_loss: 0.0725 - val_mean_iou: 0.7877\n", "Epoch 24/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0756 - mean_iou: 0.7891\n", "Epoch 00024: val_loss improved from 0.07093 to 0.06879, saving model to model-dsbowl2018-1.h5\n", "603/603 [==============================] - 52s 86ms/step - loss: 0.0756 - mean_iou: 0.7891 - val_loss: 0.0688 - val_mean_iou: 0.7906\n", "Epoch 25/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0755 - mean_iou: 0.7920\n", "Epoch 00025: val_loss did not improve\n", "603/603 [==============================] - 52s 86ms/step - loss: 0.0756 - mean_iou: 0.7920 - val_loss: 0.0857 - val_mean_iou: 0.7933\n", "Epoch 26/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0803 - mean_iou: 0.7944\n", "Epoch 00026: val_loss did not improve\n", "603/603 [==============================] - 51s 85ms/step - loss: 0.0803 - mean_iou: 0.7944 - val_loss: 0.0723 - val_mean_iou: 0.7955\n", "Epoch 27/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0743 - mean_iou: 0.7967\n", "Epoch 00027: val_loss did not improve\n", "603/603 [==============================] - 51s 85ms/step - loss: 0.0744 - mean_iou: 0.7967 - val_loss: 0.0757 - val_mean_iou: 0.7979\n", "Epoch 28/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0725 - mean_iou: 0.7990\n", "Epoch 00028: val_loss did not improve\n", "603/603 [==============================] - 53s 87ms/step - loss: 0.0723 - mean_iou: 0.7991 - val_loss: 0.0710 - val_mean_iou: 0.8002\n", "Epoch 29/30\n", "600/603 [============================>.] - ETA: 0s - loss: 0.0714 - mean_iou: 0.8013\n", "Epoch 00029: val_loss did not improve\n", "603/603 [==============================] - 53s 88ms/step - loss: 0.0712 - mean_iou: 0.8013 - val_loss: 0.0703 - val_mean_iou: 0.8023\n", "Epoch 00029: early stopping\n" ] } ], "source": [ "# Fit model\n", "earlystopper = EarlyStopping(patience=5, verbose=1)\n", "checkpointer = ModelCheckpoint('model-dsbowl2018-1.h5', verbose=1, save_best_only=True)\n", "results = model.fit(X_train, Y_train, validation_split=0.1, batch_size=8, epochs=30, \n", " callbacks=[earlystopper, checkpointer])" ] }, { "cell_type": "markdown", "metadata": { "_cell_guid": "1f381f5b-1b71-4daa-a417-e02f4894540b", "_uuid": "bb15226ea617cf91ed8f43179fccb5a15809e5a0" }, "source": [ "All right, looks good! Loss seems to be a bit erratic, though. I'll leave it to you to improve the model architecture and parameters! \n", "\n", "# Make predictions\n", "\n", "Let's make predictions both on the test set, the val set and the train set (as a sanity check). Remember to load the best saved model if you've used early stopping and checkpointing." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "_cell_guid": "2daa48d5-ac98-4e18-af3f-a582baaa44f0", "_uuid": "f841760b4abca1a25cb750822f88268bd79bf2ce", "collapsed": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "603/603 [==============================] - 16s 26ms/step\n", "67/67 [==============================] - 2s 25ms/step\n", "65/65 [==============================] - 2s 26ms/step\n" ] } ], "source": [ "# Predict on train, val and test\n", "model = load_model('model-dsbowl2018-1.h5', custom_objects={'mean_iou': mean_iou})\n", "preds_train = model.predict(X_train[:int(X_train.shape[0]*0.9)], verbose=1)\n", "preds_val = model.predict(X_train[int(X_train.shape[0]*0.9):], verbose=1)\n", "preds_test = model.predict(X_test, verbose=1)\n", "\n", "# Threshold predictions\n", "preds_train_t = (preds_train > 0.5).astype(np.uint8)\n", "preds_val_t = (preds_val > 0.5).astype(np.uint8)\n", "preds_test_t = (preds_test > 0.5).astype(np.uint8)\n", "\n", "# Create list of upsampled test masks\n", "preds_test_upsampled = []\n", "for i in range(len(preds_test)):\n", " preds_test_upsampled.append(resize(np.squeeze(preds_test[i]), \n", " (sizes_test[i][0], sizes_test[i][1]), \n", " mode='constant', preserve_range=True))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "_cell_guid": "649248cd-a1fb-4da6-ade2-4bebad44bcab", "_uuid": "7e06242a50870e07a080064a4912b761775990fa", "collapsed": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f2facf8e4a8>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAASEAAAEYCAYAAAATaEB+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAElpJREFUeJzt3WusZXV5x/Hvr4xo1RhAwYwzpGAy\n8VJTq0wsal8Q0QjUiE00wZg6sSSTJrbiJVGoL0zfaWq8JZZ2IiptCEqRFkJaLRlpTF9IPaNWgRGZ\nSgsjCBhvjSaN1Kcv9jrhOJwzZ1/Pf+21v5/kZO+19tpnP/u/937Ws/7/dUlVIUmt/EbrACStNpOQ\npKZMQpKaMglJasokJKkpk5CkpkxCkppaWBJKclGSe5IcS3Llol5H0nLLInZWTHIK8F3gNcBx4GvA\nm6vq7rm/mKSltmtB//dlwLGq+h5Aks8BlwKbJqEkvdxt+7zzzpto+SNHjiwoEmkp/bCqztxuoUUl\noT3AAxumjwO/t3GBJAeBgwt6/blYW1ubaPkkC4pEWkr/Pc5Ci0pCm/0af63aqapDwCHoZyW008fU\nbfV6JjYN3aI6po8DZ2+Y3gs8uKDXkrTEFpWEvgbsS3JuklOBy4BbFvRavVFVE1dQ2z1nmv8pLZOF\nbI5V1WNJ/hT4EnAK8OmqumsRryVpuS1kiH7iIHrUJzSP9pikH2fS17OPSEvkSFXt324h95iW1JRJ\nSFJTJiFJTS1qPyFJCzJJP+Iy9CFaCUlqykpoyayvBZdhDXcyQ3kfO6kPI9mLYBLSjjrxh3TitEnp\niYaafNa5OSapKSuhxtbX/ENf2437/qyMHjf078Q6KyFJTZmE1GurUg1stGoHLZuEJDVln9Ac7WT/\nhUPcGgorIUlNmYQkNWUSktSUfUInmGa/HftlFsv+r8ktU1tZCUlqyiS0hb6vSZL0PkZpHCYhSU3Z\nJ3QS2/UPzbMSWZVjyLRYy1gdWwlJaspKaAzLuHbpGyu98a1aW1kJSWqqV5XQdpl/FSqSVVsLamur\n8H0HKyFJjfUiCZ133nljrflX6TwrW+0HtOz7By17/Jq/XiQhSaurV31C46qqlVmbDvV92veldVNX\nQknOTnJ7kqNJ7kpyRTf/jCS3Jbm3uz19fuFKGppZNsceA95TVS8AzgfenuSFwJXA4araBxzupqWp\n2Y80bFMnoap6qKq+3t3/H+AosAe4FLi2W+xa4A2zBqnhWk8wJprVNZeO6STnAC8B7gCeXVUPwShR\nAWdt8ZyDSdaSrD366KPzCEPSEpo5CSV5OvAF4J1V9bNxn1dVh6pqf1XtP/PMM2cNQwNxYmVkdTR8\nMyWhJE9ilICuq6qbutkPJ9ndPb4beGS2ECUN2SyjYwGuAY5W1Uc2PHQLcKC7fwC4efrwJA3dLPsJ\nvRL4I+DbSb7Zzftz4IPADUkuB+4H3jRbiJKGbOokVFX/Bmy1wX7htP9X0mrxsA1JTZmEJDVlEpLU\nlElIUlMmIUlNLeWpPNTGyU674Z7NmpaVkKSm0oeTSiUpGP8EV651d9Yk3xE/G21wpKr2b7eQlZCk\npnrVJ+RatF/6UCVr+KyEJDVlEtJcrdJlmTQfJiFJTZmEJDVlEpLUlElIUlO9GqKXlsV2ne/ubjI+\nKyFJTVkJSRMYd/eD9eWsiLZnJSSpKZOQtEDuuLk9k5CkpgbfJ3TimshtdO00v4MnZyUkqanBVkJb\nbYu7VlJrjpz9OishSU0NphJyFGL+1tfUtu1iWBGNWAlJamowlZAWZ5KKaOhrdavD+bMSktTUzEko\nySlJvpHk1m763CR3JLk3yeeTnDp7mOqDJFtWOid7bIjm+X5X/ZS486iErgCObpj+EPDRqtoH/Bi4\nfA6vIWmgZkpCSfYCfwB8qpsO8Crgxm6Ra4E3zPIa25l2LbJqa+55Wm+7jX+ratXf/zzMWgl9DHgv\n8Ktu+pnAT6rqsW76OLBnsycmOZhkLcnajDFIWmJTJ6EkrwMeqaojG2dvsuimZUpVHaqq/eNcJnae\nXHNpEfxeTW+WIfpXAq9PcgnwFOAZjCqj05Ls6qqhvcCDs4cpaaimroSq6qqq2ltV5wCXAV+uqrcA\ntwNv7BY7ANw8c5Rz4JpKO2Ga79mqfzcXsZ/Q+4B3JznGqI/omgW8hqSBSB/2T0gycxBe/UB9tcLf\nzSPj9Pm6x7Skpjx2TFqwAVc6c2ElJKkpk5CkpgazOXZiyesJo6TlYCUkqanBVEInsgKSloOVkKSm\nTEKSmjIJSWrKJCSpKZOQpKZMQpKaMglJasokJKkpk5CkpkxCkpoyCUlqarDHjklDM+1FPvvOSkhS\nUyYhacCmvUz6TjIJSWrKPiGp5+ZRyfT5TKNWQpKashJaUit8QT3NoI8VkZWQpKZMQktm3NGOvo+I\naHxJelW5zJtJaMCWYXhWbfTpu2ESktTUTEkoyWlJbkzynSRHk7w8yRlJbktyb3d7+ryC1XT6tNbT\n9Ia6WTZrJfRx4ItV9XzgxcBR4ErgcFXtAw5305K0qUy7hkzyDOA/gOfWhn+S5B7ggqp6KMlu4F+r\n6nnb/C9X02OapaIZ4lq0la0+h51s4yX4Lhypqv3bLTRLJfRc4FHgM0m+keRTSZ4GPLuqHgLobs/a\n7MlJDiZZS7I2QwySltwsSWgX8FLg6qp6CfBzJtj0qqpDVbV/nEyp+bBvaHbbteH647b1+GZJQseB\n41V1Rzd9I6Ok9HC3GUZ3+8hsIUoasqmTUFX9AHggyXp/z4XA3cAtwIFu3gHg5pki1KD0sVI4MaZ5\nxrXI97g+WjZJ/04fR9hmPXbsz4DrkpwKfA94G6PEdkOSy4H7gTfN+BqSBmzq0bG5BuHo2Njm8Xm1\nWBOOG3ffRpfW41mCkag+WvjomCTNzFN5qFf6dqqJoZ9QrA+shCQ1ZRJaMn0c3ZBmYRKS1JRJSL3U\np/2ItFgmIUlNOTq2pOax/8qqss36xUpIUlNWQktukorIUbURq8jFmnS/KCshSU1ZCQ3EiWudjWv5\nZa6Aqmqp49f2rIQkNWUlNFBWD1oWVkLSBDxsZv5MQpKacnNMWrBVq5wmfb9WQpKaMglpRwytL2Vo\n76clk5CkpuwTksawVdXjISCzsxKS1JRJSL22LP0uW/URLUv8LZmEJDVln5B21Lh9KDtRQYwTy6Rx\nWPlMzkpIUlNWQmqiTxVDkidUQ32Kb+ishCQ1ZSUkYeXT0kyVUJJ3JbkryZ1Jrk/ylCTnJrkjyb1J\nPp/k1HkFK2l4pk5CSfYA7wD2V9WLgFOAy4APAR+tqn3Aj4HL5xGopGGatU9oF/CbSXYBTwUeAl4F\n3Ng9fi3whhlfQ9KATZ2Equr7wIeB+xkln58CR4CfVNVj3WLHgT2zBilpuGbZHDsduBQ4F3gO8DTg\n4k0W3XRPsCQHk6wlWZs2BknLb5bRsVcD91XVowBJbgJeAZyWZFdXDe0FHtzsyVV1CDjUPddDkKUV\nNUuf0P3A+UmemtH45oXA3cDtwBu7ZQ4AN88WoqQhm6VP6A5GHdBfB77d/a9DwPuAdyc5BjwTuGYO\ncUoaqPThZExujkmDdKSq9m+3kIdtSGrKJCSpKZOQpKaW9gDWPpwUS9LsrIQkNbWUSWicEb2q8jIs\n0hJYyiQkaThMQpKaMglJamqpRsem6eNZf46jZVI/WQlJasokJKkpk5CkppaiT8j9faThshKS1JRJ\nSFJTJiFJTZmEJDVlEpLU1FKMji27E0f3hrj39iq8Ry2GlZCkpqyEFmir/ZuqahCVwsn23/KYPY3L\nSkhSU4OvhFqsicc98yMMv1JYlfep6Q0+CfXdMv5IPYxG8+TmmKSmlqISWq8SJlkDL1NlsSysgLQI\nVkKSmlqKSkhqbdwq0Ap8clZCkpraNgkl+XSSR5LcuWHeGUluS3Jvd3t6Nz9JPpHkWJJvJXnpPINN\n0us1zSwXXPRijf2y/nlM+rn4OU5unEros8BFJ8y7EjhcVfuAw900wMXAvu7vIHD1fMKUNFTbJqGq\n+grwoxNmXwpc292/FnjDhvl/WyNfBU5Lsntewa5br4hO9idNY16VjBXR+KbtE3p2VT0E0N2e1c3f\nAzywYbnj3bwnSHIwyVqStSljkDQA8x4d26wE2XR1UFWHgEMASVxlqCmrlnamrYQeXt/M6m4f6eYf\nB87esNxe4MHpw5M0dNMmoVuAA939A8DNG+a/tRslOx/46fpm2yoYen/UNO9vGdrEKqitbTfHklwP\nXAA8K8lx4APAB4EbklwO3A+8qVv8n4BLgGPAL4C3LSBmSQOSPqwFhtYnNEub9r1qgOEcw7cT3/0+\nv/8dcKSq9m+3kHtMS2rKY8c0sRVfu2vOrIQkNWUSktSUSUhSU/YJaeX0YURYj7MSktSUldACTHNO\nbA2LI4jjsxKS1JRJSCtnGY5nWyVujvWEPwqtKishSU1ZCS2QHdSrx4p2clZCkpqyEtoBVkT9NM/P\nxQpoelZCkpqyEmrENWd/JJm6GvJznJ2VkKSmrIR2kGvN/trqs1mvkPzsFsdKSFJTVkLSSVgBLZ6V\nkKSmTEKSmjIJSWrKJCSpKZOQpKZMQpKaMglJasokJKmpbZNQkk8neSTJnRvm/WWS7yT5VpJ/SHLa\nhseuSnIsyT1JXruowCUNwziV0GeBi06Ydxvwoqr6HeC7wFUASV4IXAb8dvecv0pyytyilTQ42yah\nqvoK8KMT5v1LVT3WTX4V2NvdvxT4XFX9b1XdBxwDXjbHeCUNzDz6hP4Y+Ofu/h7ggQ2PHe/mPUGS\ng0nWkqzNIQZp5VTVln/LZKYDWJO8H3gMuG591iaLbdoiVXUIONT9n+VqNUlzM3USSnIAeB1wYT2e\neo8DZ29YbC/w4KT/e6tM7hHNWmWTVDjLdB6kqTbHklwEvA94fVX9YsNDtwCXJXlyknOBfcC/j/t/\ntysll7HUlHRy21ZCSa4HLgCeleQ48AFGo2FPBm7rMu1Xq+pPququJDcAdzPaTHt7Vf3fooKXtPzS\nh8pi//79tbY2Wf/0MpSZ0jzM8htt/Ds5UlX7t1vIPaYlNeXpXaWe6sNWyk6wEpLUlElIUlMmIUlN\n2Sck9cyq9AWtsxKS1NRSJiH3EZKGYymTkKTh6MUe00keBX4O/LB1LFt4Fv2Mzbgm19fY+hoXTB/b\nb1XVmdst1IskBJBkbZxdvFvoa2zGNbm+xtbXuGDxsbk5Jqkpk5CkpvqUhA61DuAk+hqbcU2ur7H1\nNS5YcGy96ROStJr6VAlJWkEmIUlN9SIJJbmou2LrsSRXNozj7CS3Jzma5K4kV3Tzz0hyW5J7u9vT\nG8V3SpJvJLm1mz43yR1dXJ9PcmqjuE5LcmN3Vd6jSV7ehzZL8q7uc7wzyfVJntKqzba4kvGmbZSR\nT3S/h28leekOx7WjV1hunoS6K7R+ErgYeCHw5u5Kri08Brynql4AnA+8vYvlSuBwVe0DDnfTLVwB\nHN0w/SHgo11cPwYubxIVfBz4YlU9H3gxoxibtlmSPcA7gP1V9SLgFEZXB27VZp/liVcy3qqNLmZ0\nkYh9wEHg6h2Oa2evsHyyC6jtxB/wcuBLG6avAq5qHVcXy83Aa4B7gN3dvN3APQ1i2cvoi/oq4FZG\n13j7IbBrs3bcwbieAdxHN8ixYX7TNuPxC3GewehsEbcCr23ZZsA5wJ3btRHwN8CbN1tuJ+I64bE/\nBK7r7v/abxP4EvDyWV+/eSXEBFdt3UlJzgFeAtwBPLuqHgLobs9qENLHgPcCv+qmnwn8pB6/HHer\ndnsu8CjwmW5T8VNJnkbjNquq7wMfBu4HHgJ+ChyhH222bqs26tNvYqorLE+iD0lo7Ku27pQkTwe+\nALyzqn7WMpYuntcBj1TVkY2zN1m0RbvtAl4KXF1VL2F0DGCzfr11Xf/KpcC5wHOApzHazDlRH/dR\n6cVnO8sVlifRhyQ0l6u2zkuSJzFKQNdV1U3d7IeT7O4e3w08ssNhvRJ4fZL/Aj7HaJPsY8BpSdZP\nTNeq3Y4Dx6vqjm76RkZJqXWbvRq4r6oerapfAjcBr6AfbbZuqzZq/pvYcIXlt1S37bWouPqQhL4G\n7OtGLU5l1PF1S4tAMjpR0TXA0ar6yIaHbgEOdPcPMOor2jFVdVVV7a2qcxi1z5er6i3A7cAbW8XV\nxfYD4IEkz+tmXcjo4pdN24zRZtj5SZ7afa7rcTVvsw22aqNbgLd2o2TnAz9d32zbCVnQFZa3tFOd\nctt0jF3CqBf+P4H3N4zj9xmVl98Cvtn9XcKo/+UwcG93e0bDGC8Abu3uP7f7EhwD/h54cqOYfhdY\n69rtH4HT+9BmwF8A3wHuBP6O0VWDm7QZcD2jvqlfMqooLt+qjRht9nyy+z18m9EI307GdYxR38/6\nb+CvNyz//i6ue4CL5xGDh21IaqoPm2OSVphJSFJTJiFJTZmEJDVlEpLUlElIUlMmIUlN/T8B7UHi\n7uvCWgAAAABJRU5ErkJggg==\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f2d981b3ef0>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUQAAAEYCAYAAAAkpo9KAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAGoFJREFUeJzt3X2sXPV95/H3h+sAhcQF4yTrpyyO\n1rR1EYXI4qFZbWgga8Mi2JWSyk62MQmttVJI0zxsMcsqdFlFIk03NJUo7d3gQiMKITQtFnJ7Syko\nu1VxbILlYDsOd00LF7sxJA6NigrY97t/nN+Y8XjunTOP52E+L+nozjlz5sxvztz7vd/fw/kdRQRm\nZganFF0AM7OycEA0M0scEM3MEgdEM7PEAdHMLHFANDNLHBDNrJIkbZF0WNIzczwvSb8naVrSbknv\n6XTMoQVESesk7U+F2Tys9zGzsXUPsG6e568CVqVlE3BXpwMOJSBKmgDuTAVaDWyQtHoY72Vm4yki\nvgX8aJ5drgP+ODJPAmdJWjLfMRcMsoBNLgamI+IAgKQHUuH2ttv5VJ0Wp3PmkIrSu/MueDXXft/f\nfcaQS2JWPT/hyMsR8XaAtb90ZvzwR8dyv/ap3a/tAf6ladNkREx2WYRlwAtN6zNp26G5XjCsgNiu\nIJc07yBpE1kay+mcwSW6YkhF6d3U1K5c+61deuGQS2JWPX8dD/1D4/EPf3SMb0+9K/drJ5Y8+y8R\nsabPIqjNtnmvVR5WQOxYkBTtJwEWalHpLqieOpgvGDbv209gnOv9HGytDgKYZXbUbzsDrGhaXw4c\nnO8Fw+pU6bogZlZnwbGYzb0MyFbgo6m3+VLglYiYs7oMw8sQdwCrJK0EXgTWAx8e0ntVWqdMdBDZ\np1nRsgxxsBVBSfcDlwOLJc0AtwJvAYiIPwC2AVcD08CrwMc6HXMoATEijkq6EZgCJoAtEbFnGO9l\nZtUw6CpzRGzo8HwAn+jmmMPKEImIbWQRulK6aTuc67XDyOacKVqVBcGxCsy9OrSAaGbWbNBV5mFw\nQDSrgbLXIAI45oBoZpZxhmgDV/ZMwIZvvnbu1ufK8nsSwBtuQzQzS50qzhDN2itrJlNm/YyAKFzA\nsfLHQwdEG625/qjdFDC3SgfCJBuYXX4OiGY2AuJY2ykOysUBsWCNjKgOWcB88n4+Z4pvGsTvRFnO\nZwCzrjKbmWWcIZr1qCyZTREGWVsoy/nLBmY7IJqZATAbDohjpSz/jetk6uAun9cacIZoZpYE4lgF\n7nrsgFhR49TGNk6ftc5cZTYzw1XmyuplXKAzF7NOxLFwldnMLF2654BoZgUoY63FVWYzMyDCVeZK\nW7v0wo7tiIP8L9xt22UZMwCz+cw6QzQza/QyO0OsNGdhgzMus/oUrby/s64ym5kB7mXuynkXvMrU\nVOfMobz//QbHmZS1/p6Psi17mI75ShUzM1/LPBS+prX6n90ZcPeq/p1D4zak5Q835S+hmVVeIFeZ\nh2Uc5sir++ez8eNOFTMzIIJKDLvpuYSSVkh6XNI+SXskfSptXyTpUUnPpp9nD664Vhdrl17oLHis\niNkulqL0kyEeBT4bEd+R9DbgKUmPAtcDj0XE7ZI2A5uBm/ovqtVRniEmDpzVF1QjQ+w5IEbEIeBQ\nevwTSfuAZcB1wOVpt3uBJ3BANBt7YzPsRtK5wEXAduCdKVgSEYckvWOO12wCNgG8a1n3xfAQnHry\n91lPgSpxC4G+Q7aktwJ/CvxGRPxT3tdFxGRErImINW8/Z6LfYphZyR3jlNxLUfrKECW9hSwY3hcR\n30ybfyBpScoOlwCH+y2kmVVbALMVaEPsp5dZwN3Avoj4ctNTW4GN6fFG4OHei2dm9SCOdbEUpZ8M\n8b3ArwDfldToGvxvwO3Ag5JuAJ4HPtRfEc2s6qqSIfbTy/x/Yc5QfkWvxzWzeqrCPVXKH7LNrPIi\nxGycknvJQ9I6SfslTacxz63PvytdPPK0pN2Sru50TF+6Z2YjMciB2ZImgDuBDwAzwA5JWyNib9Nu\n/x14MCLukrQa2AacO99xnSGa2dBlM2YP9NK9i4HpiDgQEa8DD5BdFNL6tgvT458GDnY6qDNEMxuB\nru+psljSzqb1yYiYbFpfBrzQtD4DXNJyjN8C/krSJ4EzgSs7vWllA6KvaBidPJO5+vuw+WS9zF11\nqrwcEWvmeb7dwaJlfQNwT0T8L0mXAV+TdH5EzM510MoGRDOrlgFfgTIDrGhaX87JVeIbgHUAEfF3\nkk4HFjPPxSJuQ7SBmDq4y7cFsDk1rmXOu+SwA1glaaWkU4H1ZBeFNHueNARQ0s8BpwMvzXdQZ4hm\nNhKDnDE7Io5KuhGYAiaALRGxR9JtwM6I2Ap8Fvjfkj5NVp2+PiJaq9UnKEVA/P7uM05og5or03A7\n1Wj1kvF5FiJrJ5sxe7ADsyNiG9lQmuZtn296vJfsirrcShEQzaz+qjD9VykDorMLs3oJxBtR/mn+\nShkQzaxeehh2UwgHRDMbAdV7thszs24UeTe9vBwQzWzohtHLPAwOiGY96DQkyR2DJ3OV2cyM6tx1\nzwHRrAt5B6s37+dsMeM2RDMzPOzGzBJfzphxG6KZGUD+WWwKVfuA6IkirCzGOVNs3EKg7GofEM2s\nHJwhFqDbXsBx/G9txRrH3z13qpiZNXFAHCFPXz94jQzG53Y4xilT9MBsM7Mm7lSxWugmU6x7tuOs\nuUfhKrOZGVCdTpW+h45LmpD0tKRH0vpKSdslPSvp6+kWgVYDa5deWPsMMK9BnotxuYXrgG9DOhSD\nuJbmU8C+pvUvAndExCrgCNnNos1sjA3hvsxD0VeVWdJy4D8AXwA+I0nA+4EPp13uBX4LuKuf95nP\nOPxnLRtniW9ym2J+UYEqc79tiL8L/CbwtrR+DvDjiDia1meAZe1eKGkTsAngdM7osxhmVna17mWW\ndA1wOCKeknR5Y3ObXaPd6yNiEpgEWKhFbfcZJmc5ZqMTY9DL/F7gWklXA6cDC8kyxrMkLUhZ4nLg\nYP/FNLNqE8dmazz9V0TcDNwMkDLEz0XERyR9A/gg8ACwEXh4AOUcGGeGNgytv1duUzxZFdoQhxGy\nbyLrYJkma1O8ewjvYWYV0hiHWOte5oaIeAJ4Ij0+AFw8iOOaVZWv7mkRWTti2flKFTMbiVr3MpeF\nx4FZmY1F9pdDUI02xMoHRDOrAk//ZWZ2nNsQR6hT1dlVF7NiucpsZkaWHTogFsCZoFk5uQ3RzCxx\nG6KZWeIqs5kZ2QSxDohmZkkFasxDmdzBzOxEqZc575KHpHWS9kualrR5jn1+WdJeSXsk/UmnYzpD\nNLPRGGCKKGkCuBP4ANnM/DskbY2IvU37rCKbovC9EXFE0js6HdcZopmNxIAzxIuB6Yg4EBGvk82/\nel3LPr8G3BkRR7L3j8OdDuqAaGYjEZF/yWEZ8ELTerv7N50HnCfpbyU9KWldp4O6ymxmQ9fDbDeL\nJe1sWp9M92FqyHP/pgXAKuBystuZ/B9J50fEj+d6UwdEMxu+ALoLiC9HxJp5np8BVjStt7t/0wzw\nZES8ATwnaT9ZgNwx10FdZTazkRhwlXkHsErSSkmnAuuBrS37/DnwSwCSFpNVoQ/Md1BniGYV0csk\nyKW6tn+AvcwRcVTSjcAUMAFsiYg9km4DdkbE1vTcv5e0FzgG/NeI+OF8x3VANLMREDE72CtVImIb\nsK1l2+ebHgfwmbTk4oBoVmOtWWVhGaOn/zIza1KBa/ccECuuNBmADU19bqDmDNHMLOMM0YZlrqyh\nsd2ZorVT6O+HA6KZGb0MzC6EA2LF5G1Pmjq4y1liTXS6o2RV+BYCVihXn20uhfxuOCCamSUVqDL3\ndS2zpLMkPSTpe5L2SbpM0iJJj0p6Nv08e1CFtd5MHdxV+eqWZdlclbN9Rf6lKP1O7vAV4C8j4meB\nXwD2AZuBxyJiFfBYWjezcRZdLgXpucosaSHw74DrAdKsta9Luo5s/jGAe4EngJv6KaRVv0G9bjp9\nH1XO5IZDta8yvxt4CfgjSU9L+qqkM4F3RsQhgPSz7X0MJG2StFPSzjd4rY9imFkl1DlDTK99D/DJ\niNgu6St0UT1Os99OAizUogr0P1Wfe537182wJxjOuR7EMBwPzG6vnwxxBpiJiO1p/SGyAPkDSUsA\n0s+ON3YxszFQ5wwxIv5R0guSfiYi9gNXAHvTshG4Pf18eCAltVqYK6spe9baazY2zAHylRqwPSZX\nqnwSuC9N4X0A+BhZ1vmgpBuA54EP9fkeZlYDRQ6nyauvgBgRu4B2N4K5op/j2skqlQ200ancRbZv\nDvucDvuzNR+31Bl4BQKibzJlZpb40j0rFfeE96fM5632VWYzs9zGoFPFRqzqbYll4nM4QgUPp8nL\nAdHMRkKzRZegMwdEKyW3JdaQM0Qzs8QB0YbFbYnVM85Zb9HzHOblgGhmo+FeZhu2bjLFKmYmvllW\njThDNDPLuMpsI+M2RSuLxu/gxJKWJxwQzcwAd6pYEdzeVl5j/904IJqZJQ6IZmYZV5nNaqK1uuvO\nq7m9ea6mCy1HLxwQzWw0nCGaZeo2LKhun2fo3MtsZtbEAdGs3vJkimM/3KbBAdHMDEQ1qsy+656V\n2jCzq7VLL3T2NkrRxZKDpHWS9kualrR5nv0+KCkktbtl8gkcEM1s+OLNORHzLJ1ImgDuBK4CVgMb\nJK1us9/bgF8HtucppqvMNlJV653Nm0HO9bmcgTYZbJX5YmA6Ig4ASHoAuA7Y27Lf/wR+G/hcnoM6\nQzSz0RhslXkZ8ELT+kzadpyki4AVEfFI3iI6Q7RCzHXlRxEZ1dqlFw4ss3NGOLcuO1UWS9rZtD4Z\nEZPNh2vzmuPvIOkU4A7g+m7e1AHRzIYvgO5uQ/pyRMzXCTIDrGhaXw4cbFp/G3A+8IQkgH8FbJV0\nbUQ0B9oTOCBaKRSdWRX9/uNgwMNudgCrJK0EXgTWAx9uPBkRrwCLj7+39ATwufmCIbgN0cxGZYBt\niBFxFLgRmAL2AQ9GxB5Jt0m6ttci9pUhSvo08KtkH+G7wMeAJcADwCLgO8CvRMTr/byPmVXfoAdm\nR8Q2YFvLts/Pse/leY7Zc4YoaRnZ+J41EXE+MEGWtn4RuCMiVgFHgBt6fQ8zq5EBD8wehn6rzAuA\nn5K0ADgDOAS8H3goPX8v8B/7fA8zq7pugmEVA2JEvAj8DvA8WSB8BXgK+HGq30ObsUENkjZJ2ilp\n5xu81msxzKwC1OVSlH6qzGeTjQxfCSwFziS7jKZV23gfEZMRsSYi1ryF03othplVRQUyxH46Va4E\nnouIlwAkfRP4ReAsSQtSltg6NsjMxlTdZ7t5HrhU0hnKRj5eQXYd4ePAB9M+G4GH+yuimdVCBTLE\nftoQt5N1nnyHbMjNKcAkcBPwGUnTwDnA3QMop5lVXQUCYl/jECPiVuDWls0HyGaiMDPL+J4qZmZN\nHBDNzDLOEIeo0wSjvljfrGQcEM3MMs4QhyTP9PNFTjhqZi0K7j3Oq5IB0cwqyAGxeM4UzYpXlfsy\n1z4gmllJOCAOVlVuXWlmJ1OUPyJWKiCaWUW5U8XM7E1uQzQzS9TdbUgLUYmA6LZDsxpwhmhmhme7\nMTM7gQOimZkHZpuZncjjEM3MMs4QDWjfS16Xa6s9L6Xl4oHZZmZv8jjEMTdf9lSHWXg8L6V1xRmi\nmVnGbYhjqpsra6qYQfnKIeta4F7mMqhSoDGrM2eIZmYNDohWJ64qW698pYqZWUOE2xAHpdEOWPYM\npZ/yVbFzZRz0+p36ezyZM0Qzs4Y6BERJW4BrgMMRcX7atgj4OnAu8PfAL0fEEUkCvgJcDbwKXB8R\n3xlUYbvJFP0f2npR9lpIlVUhQzwlxz73AOtatm0GHouIVcBjaR3gKmBVWjYBdw2mmGZWaQHMRv6l\nIB0zxIj4lqRzWzZfB1yeHt8LPAHclLb/cUQE8KSksyQtiYhDgyowZNnfXP/JnRlaLwadGbpNuI2a\nZIjtvLMR5NLPd6Tty4AXmvabSdtOImmTpJ2Sdr7Baz0Ww8yqQpF/KcqgO1XUZlvbjxcRk8AkwEIt\n6voU+D+vDYrbDUdkwMNuJK0j67OYAL4aEbe3PP8Z4FeBo8BLwMcj4h/mO2avGeIPJC1Jb7oEOJy2\nzwArmvZbDhzs8T3MrC4im/4r79KJpAngTrJ+i9XABkmrW3Z7GlgTERcADwG/3em4vQbErcDG9Hgj\n8HDT9o8qcynwyqDbD+tu6uCuWmUsa5de6Gze0pUqkXvJ4WJgOiIORMTrwANkfRjHRcTjEfFqWn2S\nLEGbV55hN/eTdaAsljQD3ArcDjwo6QbgeeBDafdtZENupsmG3Xys8+cys7HQ3QSxiyXtbFqfTM1s\nDe36Ky6Z53g3AH/R6U3z9DJvmOOpK9rsG8AnOh2zrqpyRU2v6vb56vI5qiJn5tfwckSsme9wbba1\nfQNJ/xlYA7yv05v6ShUzG77B31MlV3+FpCuBW4D3RUTH4SwOiDYUbje0Ew18cocdwCpJK4EXgfXA\nh5t3kHQR8IfAuog4fPIhTuaAaGYjMcjxhRFxVNKNwBTZsJstEbFH0m3AzojYCnwJeCvwjeyqYp6P\niGvnO64DonWt6tmf2w4LMuBxiBGxjawjt3nb55seX9ntMR0QzWz4wrchtR5UPfsym5MniDUzS8of\nDx0Qh6Fu4/XMBqHLcYiFcEA0s9FwQDQbT24LbhF0e+leIRwQbey4SWP0RO5JGwrlgGhmo+GAON58\nU6zx4+9xHg6IZma4DdGs7NyWOFpuQzQza3BANJg/E3GbUz34e+xk4NN/DYUDopkNX+CAaCdyFlFO\nzd9L3vZEf5c9cKeKmVlGs+WPiA6IZk2c+Q1JALOuMpuZ4U4VM7NmDohmZokDopkZbkM0M3tTQLiX\n2cws4yqzmRmuMpuZnaACGeIpnXaQtEXSYUnPNG37kqTvSdot6c8kndX03M2SpiXtl7R2WAU3s4qJ\nyL8UpGNABO4B1rVsexQ4PyIuAL4P3AwgaTWwHvj59JrflzQxsNKaWUV1EQzLHBAj4lvAj1q2/VVE\nHE2rTwLL0+PrgAci4rWIeA6YBi4eYHnNrIoCmJ3NvxRkEG2IHwe+nh4vIwuQDTNp20kkbQI2AZzO\nGQMohtl4mW9mnlJek12BNsS+AqKkW4CjwH2NTW12a3sWImISmARYqEXlP1Nm1p86B0RJG4FrgCsi\njn/SGWBF027LgYPdHrvTnHSl/O9nNmTd3PulsW95/laivsNuJK0DbgLeFxGvNj21FfgTSV8GlgKr\ngG93Ot55F7zK1JRv9GNWWwFRhytVJN0PXA4sljQD3ErWq3wa8KgkgCcj4r9ExB5JDwJ7yarSn4iI\nY8MqvJlVSB0yxIjY0Gbz3fPs/wXgC/0UqpOpg7tKVBUwG67a3Ca1zm2IZma5RRQ6nCYvB0SzkqpN\nZtjgDNHMLBPOEM3MwPdUMTNr8PRfZtaL2rUdksXDOFb+EXh5ZrsxM+tPpFsI5F1ykLQuTTM4LWlz\nm+dPk/T19Px2Sed2OqYDopmNRMxG7qWTNK3gncBVwGpgQ5p+sNkNwJGI+DfAHcAXOx3XAdHMRmOw\nGeLFwHREHIiI14EHyKYfbHYdcG96/BBwhdKldXMpRRviU7tfe3liyfQ/Ay/nf9X00MrTxmK6KtvI\nuFzdK2vZjpdrYskgD9v330k/5+tfNx78hCNTfx0PLe7itadL2tm0PplmyGpYBrzQtD4DXNJyjOP7\nRMRRSa8A5zDP5ylFQIyIt0vaGRFrii5LO2Utm8vVvbKWre7liojWWff7lWeqwdzTETa4ymxmVZRn\nqsHj+0haAPw0LbP/t3JANLMq2gGskrRS0qlk93La2rLPVmBjevxB4G+a5m5tqxRV5mSy8y6FKWvZ\nXK7ulbVsLlcXUpvgjcAUMAFsSdMP3gbsjIitZLNyfU3SNFlmuL7TcdUhYJqZjQ1Xmc3MEgdEM7Ok\nFAGx0yU4IyzHCkmPS9onaY+kT6XtiyQ9KunZ9PPsgso3IelpSY+k9ZXpkqRn0yVKpxZUrrMkPSTp\ne+ncXVaGcybp0+l7fEbS/ZJOL+qcSdoi6bCkZ5q2tT1Hyvxe+nvYLek9Iy7Xl9J3uVvSn0k6q+m5\nm1O59ktaO6xyFaXwgJjzEpxROQp8NiJ+DrgU+EQqy2bgsYhYBTyW1ovwKWBf0/oXgTtSuY6QXapU\nhK8AfxkRPwv8AlkZCz1nkpYBvw6siYjzyRre11PcObsHaB2LN9c5uorsBm2ryO5dfteIy/UocH5E\nXAB8n+weSqS/hfXAz6fX/H76+62PiCh0AS4DpprWbwZuLrpcqSwPAx8A9gNL0rYlwP4CyrKc7I/m\n/cAjZINOXwYWtDuPIyzXQuA5Ugdd0/ZCzxlvXqWwiGw0xSPA2iLPGXAu8EyncwT8IbCh3X6jKFfL\nc/8JuC89PuFvk6yH97JR/84Ncyk8Q6T9JTjLCirLcWlmjIuA7cA7I+IQQPr5jgKK9LvAbwKNCz3P\nAX4cEUfTelHn7d3AS8Afper8VyWdScHnLCJeBH4HeB44BLwCPEU5zlnDXOeoTH8THwf+Ij0uU7mG\nogwBsevLa4ZN0luBPwV+IyL+qciypPJcAxyOiKeaN7fZtYjztgB4D3BXRFwE/DPFNSkcl9rjrgNW\nkt0j/EyyqmirMo47K8V3K+kWsmak+xqb2uxWxvPXszIExDyX4IyMpLeQBcP7IuKbafMPJC1Jzy8B\nDo+4WO8FrpX092SzeryfLGM8K12SBMWdtxlgJiK2p/WHyAJk0efsSuC5iHgpIt4Avgn8IuU4Zw1z\nnaPC/yYkbQSuAT4SqX5chnINWxkCYp5LcEYiTQ10N7AvIr7c9FTzJUAbydoWRyYibo6I5RFxLtn5\n+ZuI+AjwONklSYWUK5XtH4EXJP1M2nQFsJeCzxlZVflSSWek77VRrsLPWZO5ztFW4KOpt/lS4JVG\n1XoUJK0DbgKujYhXW8q7XtnEqyvJOn2+PapyjUTRjZjpn8/VZL1Z/w+4pcBy/FuyKsBuYFdariZr\nr3sMeDb9XFRgGS8HHkmP3032CzkNfAM4raAyXQjsTOftz4Gzy3DOgP8BfA94BvgacFpR5wy4n6wt\n8w2yTOuGuc4RWdX0zvT38F2ynvJRlmuarK2w8TfwB03735LKtR+4qojft2EuvnTPzCwpQ5XZzKwU\nHBDNzBIHRDOzxAHRzCxxQDQzSxwQzcwSB0Qzs+T/A+Q33i31tT3VAAAAAElFTkSuQmCC\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f2d9816a518>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Perform a sanity check on some random training samples\n", "ix = random.randint(0, len(preds_train_t))\n", "imshow(X_train[ix])\n", "plt.show()\n", "imshow(np.squeeze(Y_train[ix]))\n", "plt.show()\n", "imshow(np.squeeze(preds_train_t[ix]))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "_cell_guid": "af602aea-5e56-42a8-9331-54b4b2650593", "_uuid": "5fcee2b9aee2fba5c60d43ad48a14139e9c1318c" }, "source": [ "The model is at least able to fit to the training data! Certainly a lot of room for improvement even here, but a decent start. How about the validation data?" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "_cell_guid": "4f66b75c-c694-41a1-8c91-34bb6595837b", "_uuid": "d4ccbb559375bc2777ffb692a20adc313159f2cc", "collapsed": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAASEAAAEYCAYAAAATaEB+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJztnX+sZddV37/rvje/x+MZe+zBvxQ7\nkhtKo9IgCwKp2ohASdKIUImgpIgaiGRVAhooFXHKH6hSkYKKgFSC0FECBJTGCSFtopQSUhOE+kdc\n7AAhiTFx7GRm7PH8cObNeH545r2Z3T/uXe+et9/ee62197nvnLHXRxq9Oefus/c6+56793evtc45\nFEKA4zjOUEyGNsBxnJc3Pgg5jjMoPgg5jjMoPgg5jjMoPgg5jjMoPgg5jjMoPgg5jjMoCxuEiOiN\nRPQEET1JRA8uqh3Hca5vaBHJikS0BODvAXw/gGMA/hLAO0IIX+m9McdxrmuWF1TvdwJ4MoTwFAAQ\n0UMA3gogOQgR0ZanbRNR8fOhMsnZLm4/t61hK88htjPev0hyfZWzodQvubK585DabqGl70ZyJ8Tp\nEMItUqFFDUJ3ADja2T4G4Lu6BYjoAQAP8PbS0pLpItJ+QbmLiLdzF13qS7Re7Ba4rslkUmwrZ3dc\nT8o+qy2M5rxa+6RUTuqLa9eumWxoGYTiNl4qg1DNJCextrb2DU25RQ1CqTPZ0CshhMMADgOblZCm\nI3IXmnTRaJUFEYkXc58XnlRX7sfBg1ZMajCyXmB9qC5NP5eOTx1n7XdNOWnwyQ06TG4gTNmv7ZO4\nfO677pbJ1ZErJ5VPHZv7bdWyKMf0MQB3dbbvBPDsgtpyHOc6ZlFK6C8B3EtE9wB4BsDbAfzr2spS\nI7C0zIqxlkst+eIRP2eDdb8GaYaNlyZdW63+rxq7JcUplS/ZVqOWrGhVr7aebnmrXylGo66s/S+R\nOt6yrLWwkEEohLBGRD8N4DMAlgD8Tgjhy4toy3Gc65uFhOjNRhCF5WV5PLQ4FA1tJ/92YXWhsWNR\nSI71lErLKbdcnTWOd60PLnc+lja1s3zN91N7/WjVsaYObfAk/rxUZ62vro9rfG1t7bEQwn1SOc+Y\ndhxnUBblEzKTWnuWZgjr2leamSxtLMr/oaEm3NyaSlCaLa3+I+v30G1DG53Uzu41katcXaXPJTsX\nEcmSkK6jRaQc5HAl5DjOoIxGCZU8/vF2KSGvdgQvJQNKuSKWWdFKi6/L6g/Qzv6aKKU1ImRVCaU6\n4zpy293jatVhq8rM2ZOqq6Qupf6r9Q/WYO0DV0KO4wzKaJSQxSfURbu2rYEzVOM6OFoWR83iXJ0+\n0PooNKqsVblp1KqW2jycUl1WFWw5H2sme03ZGvWXqzuHpFwtbfUVnRzNINSVlBonc25ppF0WSHJ6\n+/bt2Lt3LwDgxhtvBACsra0BAF588UUAwMrKCgDg8uXLxbZiWyxYL65SHX0OaFpydcS3INQsq/tK\nzCuhHbCty9HuZ60uhRAC4hSX3G8pnigt9mt/n1Z8OeY4zqCMRgl1WURIWztr8gx9++2349ChQwCA\nAwcOAACuXLkCYD6LnDx5EgDw1FNPAQAuXryYrLvPmYPriu+21xwTb1vD5anja+viPoyXvCmFK6VG\n5NqQvvNU31mXcpLi0Ngh2RBvc5/x3127dmH37t0AgG3btgGYq/MLFy4AmF+7ufPI2Voq2xeuhBzH\nGZTRKKFUmLQ089WswTXw7LJ3717s2rULALBnzx4AwMGDBwHMfUH8Oc86Tz/9NIC576gPB3VuFtTM\n2H3PXKkZvdYhqk3wXF5eXp/duT9XV1c3bMdtaOyOP9f6DCX/Terz2qRE6XP2WR48eBDbt28HML8+\nWPns3LkTAPD8889v2B9fRzX+zL6SKV0JOY4zKKNRQiX/Qmo7foiURUWV4BliaWlpfXa5evXqhjKs\ngHhGvvXWWwEAJ06cAACcO3euaIuF2AeUQ5qRLe0vIgFPsiH+Hjnas2/fvvXvgeF+537mbW20qSYF\nJL7ecudTqkvrm5NC93wt3HDDDQCmkVzuo6WlJQDAjh07AMx9RBzR5b7K2VDaln5ztb5PV0KO4wzK\naJQQYItuaGdnbWJVXN+VK1fWP+MZgNfTPEvzNs86vEY/f/78huMsESyrousjkmhRoKXyNeTqYF/G\n8vLyJgXAszvP+t/85jcBzH1xkv0ae7QKR9MX1lw2bVusfrZt27a+L+eP5GuU+yzuq1xb3e1YjWvV\noYQrIcdxBmVUSojRzsyWY6S8oHgmOXfuHC5dugRgPvPyNmdQ8zE8a8f+G80MUatgLLN6rq1cHTVR\nnFpFJvk/lpaW1svEszcrUs6RYQXKPjxLflDMInLVcpFBa6Q39vutrq5uUoms0nlb+q41tkiriVpc\nCTmOMyijUULdXI2aTF3trC/NirzOPX369Hp+EJeJs1J5/3PPPQdgnjEttVkqU5tVm6vX+lmqDel7\nAfL+AWsbDEdxutcFz+6xPfy9cAQol/uivSZy+1J1WnxF2lwpqQ9Z6XE29PLy8roa7yrIblnumxyS\nLV0fUx/qsIsrIcdxBmU0Ssjq47DO5rnjcrPl5cuXcfTo9CWyPOPs378fwDw/44UXXgAwV0KcOW2x\nMdd+rb+ghCX6qGmjJloZk7ubnlXP2traehSIfUA8u8c+OFZE/L3E+V2xrSUFVNsnqfriY+L75qw2\n8PbZs2cBTJU5K5+4T/jaZX+m9roq5Zv1jSshx3EGZTRKqBZtFmz8uTQLXbt2bX0dzXfLcz4Kzzo8\no3HUJpejUZp5rREqC1q/kdV/1vVpaO89kmzMqYW1tbV1BcR/+TP+HvhvfC9f7COKqfEJaUn1gzbq\npVVhrBZPnz697o/kfCDuK1ZAfG3GuW9xmxrfXo2PrYQrIcdxBmUUSoiIknkIpchRbY5LbsRPzfrs\nU4gVjzVDNM74vXbtmmnmKbVVUoDSzGT1d6Q+t+Zl5ciphLW1tU3RJPYRxZEgroMjRfETL3NtppC+\nH63yK0V9rX6Y3DV85cqVTRGzWK3HfjTr+ZSifK1Pi3Al5DjOoIxCCeUo5fRYfRG1/o/u/3OzojYb\ntbs/9k1J+Us1uT2STyd3bAvaOnLnH/+9dOnSurKJn5mTU4FxOem5Q0SULZPrK+vzeKT2U+cTl4/b\n7JaPX74QRwYldaWNyGnqtOJKyHGcQRmFEgohFHNONGt3TRvWuiXVpM2ezR0vtV/Comq0fVTrz7HY\nlWurFCXjvB9+1nfc37EK4MiQ1l/V9dtor5MapWrN0ckdn9ru6472kl9K6oPaCGm1EiKiu4joc0T0\nOBF9mYjeNdt/ExF9loi+Ovt7oLYNx3Fe+rQooTUAPx9C+AIR3QDgMSL6LIAfB/BwCOG9RPQggAcB\nvLtUERFtyNspRcVSx3Y/0+YNWYhnGemdWXG0RmO3diaunUVLtESyWpWcxLVr19bzYfhJivv27dtQ\nJu6TXKb0VvRNKWJUq0glRZdS1tbol2Wl0EcOW5fqQSiEcBzA8dn/XyCixwHcAeCtAF4/K/YhAH8O\nYRAC0hd0rvO7IW7pmNyAYfmyUkuEUluaL6k2zB9TcmJqHLKlOlsuSGlwtThheR8nH/Igw7dpsCOa\nz5cT9GpCx60pB5pyrROlpQ1Gex41dbfSi0+IiO4G8BoAjwA4NBugEEI4TkS3Zo55AMADfbTvOM71\nS/MgRER7AfwRgJ8NIZwzjOaHARwGgMlkEmZ1xXVz2Q37J5PJphmzU29y2xpW19gh1RWX7yqo2pkq\nrrtGLebsi+vQ7i+VrQkIxMfx/+PH7HLyaKxAY0e1ZFuuXY2dFizn3N3WKCepn2uXlSX7+qIpRE9E\n2zAdgD4cQvjEbPcJIrpt9vltAE62meg4zkuZaiVE0+HwgwAeDyH8WuejTwG4H8B7Z38/aagTQH70\n7o7E0itwYiQ1kJr5pBFfO/toZpBan0NOUaV8Wq2zfM0MLJXTtpmCfUPx41wlf2Fqf98KSNNHMVrV\n3kc6gPb4LlJibW3ftSzHXgfgxwD8LRH99Wzff8R08PkYEb0TwBEAb2tow3GclzjUt6e7hslkErqv\nLWFy26X1arwt7S9FaSyh0dl5qMql1JZ21tbOqprweSoS1coi/Aal7z1VLmdTDotvqMZ3Zw2X16qX\nUht9ROC0So65evXqYyGE+6S2/LYNx3EGZRS3bQDTUTY3y8Svdtm1a9f6Ps4d4dwQjpzEjy5ItWfZ\n361LmqksN0NKERFNHVr7c2VbFFAu/6dPpPwmbf5TSZFoI4h9qEVtblWf34+VPvyXWlwJOY4zKKNR\nQik/Cb9a51u+5VsAALfccguA6UOrWG10Xw0DTB91CcwfycrKKPcQs5q1vqSI4nyV0nHaPA7JN5Gy\nZRG5LnF9Wp9JbVRMox61yiJlf+6YvmiJZLUoIu31UuPDs/qGJFwJOY4zKKNUQhytuemmmwAAd9xx\nB4D5CLxz5871R3fyA6/4plF+Hc/evXsBAEeOHAEw9xkx8SuFa21NId2z1OdsWxNJkdRgXFcpammd\nWbVZ3N1yfeUWWdRVyZ7UdqkeyS8p5ZktMlqWq9OilFojoq6EHMcZlNEooS6savhlg6x2mOXl5fXo\nGI/C8etfbr755vWyAPC1r30NwNyHFD8GszQ7WpWChtqIT01kSIq81UQKc3XnkPpSQ66NXJ6TNq+r\nVNbqjymdV+31Y8lVkvxlteelobYuV0KO4wzKqJRQnMHLeUGsbnj/8vLyuu+H9/EjQNnXw5E1jqix\nD+kb3/gGgPlMkHsYepfaaEBptrHm+0jqRbOG1yqiFrViVVXSzF06j7gOqa1c26k6tFnkGn9NrQLq\nI29IW0efysh63bgSchxnUEahhEKYPj2PZ5/4pYNMV72w8mF/UTzSx49YveuuuwAAZ86cATB/pXPp\nAeFxvo/VL9OSc2Q9rhSVyc2C2ghWzWxfKluyKVWfNgdJ+3lc72QyMfvNtD6w0nnk9muikjlbtNFH\nLd02rVFVLa6EHMcZlFEoIaKNr4FmJbSysgJgni/E/p7z58+vj7788HOOgvFD0FkJxbCPiOvWqBat\nSmnJbM3RmoNRqqt2/W/Js7HOkhofUI4+fVlaJSFFrrqKWqP6UuVyStxyzfaRKZ1D8utJuBJyHGdQ\nRqGEmHiUfv755wEABw8eBDC9ex6Yqhz2H8V/c6/BZWXUrQMoZ07HI3zOR2XJ4+DPNZm2qW2pnCU6\nJqGZTaXZTztLtszIVl9L7nhLG1JdqXK1uWHa7VQdkk9O2t89D6391u9yVINQfJIXL14EADz77LMA\n5rdvLC8vr4fg41D7hQsXNtTFn3N5S0fFZaSwrXYw6v54reHaeFtzHn2HY0tt9xEul47ry4nf/Tz3\nfeRufM7ZXbK1rx9tXF9qUpPoYznW15LOl2OO4wzKqJRQDC+p+PEc7Hy+9dZb11UJL6vi18Dwfh6l\n+fP4xXglKZ8LSdaGWkvSXIt22VMqY3VQl9qsnQVrkgNbFUO8XWqr1onforS1aQ7cV6zuJ5PJputf\n+51q3QAataVJ/E0eZyrtOI7TM6NUQvGMzTednjhxAsBUId1+++0ANiclslqKHc/sX+KHncWO65RP\noi+nXh/UJrKV6tKi8UdpE9dyDuqatAato9miErVhdO21kVKLVj9g3GcHDhwAME9d2b59+3rKyXPP\nPQdg/pvRKjkpgJBS8X35uFwJOY4zKKNWQnGEgte9p06dWo+C8WzAN7Tu2bNnQx3nz59fP6a7nfMJ\naW5k1UabamaGvmbN0metM3FqVu1TqVls1ByjSZmI65Da0GKpOy4Xnwf7gDhKzOkmk8lk/TNW/Hxb\nUl++x+7vok+FD7gSchxnYEaphHJ0H27PN7DyyM8zAfuE2FPPa2P+m7s5NncjKyArn9rZRtNG7vN4\nv0YBaWmJwFnVVlx3ygarP0P6PFVf6ftP2ZWrU+Mvk6KsuTb5b+qWJL7eb7zxRgDz25n4upfqjrct\nCZy5urS4EnIcZ1CuCyWU8rXEPh2OguW8+3H5mFKeSm3ERKMKtP6amllUm3di/XwRWNSVhNQ3cT6L\nJoNd6wfURMdydeSuXYavcX7hJ5/Hjh071v/PfqLt27dvOEbbdxoF3lemNONKyHGcQRm1EirNSto8\njZwikmadlB2SfdromSYHSYq01foXLG3WlNNmjVv8N7nvqlYhpWjJWyrZkjrPWgXB/kxWQqx6Ll++\nvOlG7viOAWtfWbOeu1j7zpWQ4ziD0qyEiGgJwKMAngkhvIWI7gHwEICbAHwBwI+FEK6U6mBlwyNo\n7J9p8VFIUY+SyqmN7DAlVSMpBSuW2dXavzV5Tto+kZRrVzVKasWa/yTtS9lrbVvzfVqvM35EMUfC\n2P8DbH6UjfU7tlx/feWE9aGE3gXg8c72rwD49RDCvQDOAHhnD204jvMSpWkQIqI7AfxLAB+YbROA\n7wXw8VmRDwH4IUU9G/5J+4GN6qn0L0ZbvjSap8qm7C75rnJ1ps41Rdw3peNieyx2dW2z2CjZpbE7\nLts3qX6IzzEuI/VBqq8s7WvsPX/+PM6fP4+VlRWsrKzg6tWrWF1dxerqKs6ePYuzZ8+ub8do7bZQ\nc0yXViX0GwB+AQB7sW4GsBJC4McVHgNwR+pAInqAiB4lokeHCAk7jjMOqn1CRPQWACdDCI8R0et5\nd6JocoQJIRwGcBgAJpNJmNUZl4nbTNmxoaw2kpX7PFW35L+x+gtSM0ffuTAp+6xqIheR6yJF6Wr6\nXUIbhczt15yP1LbWtq4ayj0e2Arn/hw/fhzA/GmiQP7eyEWQ+71az6vFMf06AD9IRG8GsBPAPkyV\n0X4iWp6poTsBPNvQhuM4L3Goj5FypoT+wyw69ocA/iiE8BAR/TaAL4YQfqt0/GQyCXzPlxat3dpo\njaaOnA0tOSa10bG4zVTESxvZqaVrQ6vqypHyq1j7u6R84jqsEbhWRWshto1zgbr3krECiv8yOXsl\nlZb6HiTVu7a29lgI4T7pvBaRJ/RuAP+eiJ7E1Ef0wQW04TjOS4RelFArQyiheL/m3rFWmyx+nJyd\ncTm221Jna7kapPNoyUWyqt0++0rjL6xVhZJfjbf5Gojb7f6NP4/R+O6uJyXkOI6jZlT3juVG1lil\npHwRjHZWtPhJrP4kjfrS+jW051Ga7XOfSfcHaXwtUsRQUgq5CKQG7TGSv2cymYjvF9O2XaPsrP6o\n2IaW+7ziujTXk6aMhVENQrmTKn0ZuYtf+6PWhpI1dWn3W5zhWntT27Fc371794a/nMzGYV1+fK72\nPCxYB4pu+VpntzagoFmC564r69KwZIeV0vHawTF3Pqn6+nJLxPhyzHGcQRmVEmqhZYTPHd+ikjRt\nWOy01t3d5hsc+TVJrIQ46Y2T3fiVSvzI3NyNrqXzkJaoOXJL7lKqgVSnpBa75eKljfWV3zX0pey6\nWAMb8Xbt91dbFnAl5DjOwIxCCYUQTMqj6xDt7isdGzu5Uzbk9llDwJoZ2zqDSjak9sevC96xY0fy\n786dOwHMFdPRo0cBzBWRxlbJn5erQ/NYEe0sLfW75vqq8UtKttaqJen60/i0anxVOVtyQYTWFYMr\nIcdxBmUUSoho86Mwun81s1Ctb0UzQ1gjOxpfhXX20M5oqahS/MrruA5WRJz+z1EzVkSXL18u2qY5\nD61PLvbNlPpFalO6JjTfuTYMrVVKJbTH1PiGWlVLKh2jD78Y4ErIcZyBGYUSYrQJb6nPtPQRzZD8\nTprEL+usJ/lWUnBZfjA6vxCPo2Oxfeyf2bdvH4D5K7XjF0dq2ozrtNqfUsZapPK1UU6gzk+jVQwt\nkdG+fw+a3Knc554n5DjOdcWolFCfo7JEzagtrfutkRRLWy32sn/l1KlTAOavimFFlFNuub85GzXn\n0VquhHQeubZS2cC16kXjr2zFonpac9wsPjmPjjmOc10yKiWkhYhU0ZMSllyemkiCdJxWVeU+l9pO\nHcu+IY563XLLLQCAG264YUO5lZUVAMClS5c21FlSB9o+kvxo8f7SPu33oYnAab9rbXRskaSuL6u/\nUttGCkkBuU/IcZzriutSCaXW8LURq9JxWj9BTTazRF9Ztt19HN1ihfPss9PHf3OeEMP3lPHf3GMu\nSlEZbfayVD4VZdK2Ie3P1dPd10cuTF/5NBp1Em9L0VUpIm2xy31CjuNcl1z3SkgbvbBmwJbqSNlj\nIaVStG1ZPs8pB1ZErHA4Dyi+ry7us9KDv6T+1fpaNPlE2hm31odUqkOi1pdXQyqXyhqZla6/VJ/1\nfY6uhBzHGZRRKKEQpnfR554pE8/ANdm0uQhPyc+jVSladcKkVEruGGskosa/wf3LCimX7Vzy0+Rm\nR0k9aqM6XWrUbKqNPqJ9Gt/RotSQJU+rto+2AldCjuMMyiiUEOc5SB7+3LGA7q7rbp257VTdrTk8\nlvPQKgLLDByXkZ4amGszZjKZbFI81u+wRpFKdfQR8Wkl5fezXqupurr11RzbR3mLotTgSshxnEEZ\nhRLKURphtVEvrU+itkyprVLER6sYaiNzpSxgrV8pN+NpfHK1+UOWuqxYfXkaGyzKeysU2Va0UZuP\nlcOVkOM4gzJqJaTJFan9XDOD9T3zltqX/Be1UY5SHZaIVI5cXbV5K6UIXIy2rzRquDWCpYkg1qry\n2JdUovWatUT5tD5TiVEPQqULOedcbXWSWdAmetWEbXM/6hyptlsvesnWrmM6Z0euTctbQ2sv9ppr\nwJqGkUvwLO3TJASm9rdMFtpJrHSLTs4Oab+EL8ccxxmUJiVERPsBfADAqwEEAD8J4AkAHwVwN4Cv\nA/iREMIZRV3qzzSjcvy51TmrGdWtoeAWqS5RWvZYl3Kx+lpenl4mPEt2z1ebpGh16LYo2pbvtDZg\nUKNKtKkFrLZq3jlf+92ntrXLXqsialVC7wPwJyGEbwXw7QAeB/AggIdDCPcCeHi27TiOk4RqfSdE\ntA/A3wB4ZehUQkRPAHh9COE4Ed0G4M9DCK8q1TWZTMK2bdtMjlPt+ti6ju62LR27FX6nmJrZRlIG\nOeUTP/SMPz9zZipsV1ZWNj3uI7aTySXo9eFjic+n5MPKoVVAueMs11mtOin5lqQ6tyJ0H7d19erV\nx0II90nlW5TQKwGcAvC7RPRXRPQBItoD4FAI4fjMmOMAbk0dTEQPENGjRPToED9mx3HGQYsSug/A\n5wG8LoTwCBG9D8A5AD8TQtjfKXcmhHCgVNdkMgnLy8vqNXxpNJfW8FLKfGnGaA1p9znYWnwmkrLk\nbVYK/KqfV71qKmD5NdL8l9XPysoKnnrqKQDAlStXNrSR85VIvriUWpGO0fr3Yh9Lir6+y62M0nbR\npi1oj0+pLUa6rtbW1hauhI4BOBZCeGS2/XEA3wHgxGwZhtnfkw1tOI7zEqc6OhZCeI6IjhLRq0II\nTwB4A4CvzP7dD+C9s7+fVNRVXPtrZhVrPo10fKot6+xWyvVpnSE1fSPZK/XVzp07AcxfD82wUtq5\ncycuXLgAAHjmmWcAzB8Hoo1G1kQhtblGlogjqyP+mzsPSUGntmtVUR/+P+3vQrKh6yPNRfdq/U6t\nyYo/A+DDRLQdwFMAfgJTdfUxInongCMA3tbYhuM4L2GaBqEQwl8DSK353tBSr5SDoVFNcV0tvqCc\nfSV7rGjtlI4v5Qdpc3jYv3P69GkAwJ133glgrhK2b98OYOobuvnmmwEAx48fX99nsZ9tiXORcrZ1\nkR5JolUt3X2xfywX9dN+5y3RKMlvZlk9aK97jR+2xldbwjOmHccZlFHeO6aJPGijAJJHP96f2y7Z\np61TQ+va3aLkcmXZH8J+Hp55Dx06tKGtblnpIflW+0uKQ+tnsihULiv5mSzqSrJB20eaPpGOrf08\nRd85R66EHMcZlFEqIYmU3yNXJp5FpMzdmmhNvF+iG2moRcqZSZXV5ohwH/Fro48cOQIAeOGFFwAA\nBw4cWC9/6tQpAHNfUK5Oyf5S/2t9cFaVkjpOuj5Y8UkROktEV4vmmu1LndTYUYsrIcdxBmVUSsjq\nx6lBW0fqWTkx2ohDSTFJaqqlL1qzZnmWv3z5MgCsqx6+d4yINt07plE2pTZLs7s20hOjmbm1Ph2t\nkq65Vq191m1L+11b1Xu3HikCXesrciXkOM6gjEoJ1Xj9tT4Hqa2Uj0Ia2bVtpGYja4RNioxYfBDa\n2TBWN7zd9f9IdmmjkKVIl1Yt5urmCF7peKtKjNG+RqlUZ20k0YJWwaX8iH3k2KVwJeQ4zqCMSglZ\nIj7aDGgtqTbj2UCacWNKGa9xZm6sKOLZO2dnab/WXm1f9ZEHpW2jFCWL/8Z9GPcd3/sWK7vSLK/1\nB7Yo01zbOSzXX22GtMYWSa27T8hxnOuKUSghImrOmWD6yuZM+Qmk3BGpbS63bds27Nq1C8Dme6bY\n38J3p8ezuhT1KEXeWvKaFkWNH5Cfa8RPfNyxY8eGctx3nNfEfdhnfotUVyqXrSbqVWozhdWPWaNi\nWnLsUrgSchxnUEahhLSUZnnGGqUo+aG0/qbYP5U7jlXP3r171/8fZ96y/4L/Xrp0CcA8V8cSRbOu\n97V5OF2bc36a+JhcHZIfsFsf9wlnbMfPvmb4OUhMrIhS52XN77Hkb1kVQp/5cK3qT3M+rT6hUQxC\nvPSpDY8C9UliFkdv3Ja2zngZsbS0tMkRzcuw7pINmA9c/MM6f/78hvJxG6mQec6e3MVkeViYNUFQ\nO4imEvF4CcsPVeNBKV5ucZ/t3z99yjAP5LnHcqQS8bTXUfzIj9rrsBXtACAt07T7U236csxxnOuS\nUSihFsd0LlmudUbSLP1anOk5p3a8ZODPWQnx9tmzZwHkHwKWaitWCqwsWHVxOVZbq6urG9ooSXut\nQzTezn1/3fq47O7duwHMHdF8HqwK+WFsXJ4fvsbnyedTUj21imgRCkgKyXfbWkS6hETrMoxxJeQ4\nzqCMQgl1w+FAP+H3VgVkcUxr/RzdR5/GiXY8q+fsZjXC5dgvwk7XkgMxbotfanjrrdNXwsUPJmOV\ndeLECQDzR3rkVEsXqd+1junSdxwrGvYNseKJVWXpFT9xW5pzlOrIfRbX3dIHObS/kZYQfYt9KVwJ\nOY4zKKNQQkRUfOlditq1u4SbkTfSAAAZnElEQVTGz6FN1or38wy+tra27odhhcP+i1xyYhwJ4vK8\nn1VWSRGxiuIQN/uZ+Fi2iffz9tGjRwHM0wRSbbSGhEtqIX7IGqvA3Plx+dQNt6U2c/tSx0gRRk10\nMve5hCVyq72GW1SXxb4UroQcxxmUUSghQDd6diNJQ0QDGOvszvDMfPHiRdx4443Jz3JRszhCxQoo\n5+/o+tm4LB8bR5die1ll8et8+DYI9hGl/CbWvKAaJct28PnEfch1sfJhf1lJwTG5JNecnZJ/RxNd\n1aL1TZbsaaWbS9U3roQcxxmU0SghzczRx0hsmXlb/U25WenKlSu4ePEigLn/JReVySmd2AdUspVV\nFOfR8GNaX/GKVwCYK5/Yhu5tJt3juhnK1mhYvD8mNXPH0UWO3nEm9L59+wDMFR7vZ+UkPYS/26ZF\ndZTs34p8oVL7Ul015VuzsnO4EnIcZ1BGo4Qmk4l4/013v5RrIfkiFoGUJ8TbV69eXZ+l+TNWRJJi\n4G1WNbk2UyqF+/fkyZMA5grh4MGDAOaKh49jX8q5c+ey51UbKZQUQ6qeODuc7Xv++ecBbH54We7h\n+6k+tebqaDK9S+fXBzVtWPOHNMd6xrTjONc1o1FCpbVnTRZr64zUVRLWkT6nAro2sF+FfUO8zbk5\n7KeJozY8+3POTO7esZJdnK90+vRpAHMfC/tU2AZWW7m70FNqS5s9nlNEGpUSRwz5b3w3veW6kcrU\nzvIlv5nWX1bjp6pVJ33kD1lpUkJE9HNE9GUi+hIRfYSIdhLRPUT0CBF9lYg+SkTb+zLWcZyXHlS7\nZiWiOwD8XwDfFkK4REQfA/DHAN4M4BMhhIeI6LcB/E0I4f2luiaTSeCZH5BnpZRPqFR2LKSiMPHf\n+KFmsRKK75sqzbLWTO9cX8a+lVx7pe0+kbKWc+VzPqJuGSnDWIpepvxP1r6oyfVpjeDmsCih2O61\ntbXHQgj3Sce1+oSWAewiomUAuwEcB/C9AD4++/xDAH6osQ3HcV7CVPuEQgjPENGvAjgC4BKAPwXw\nGICVEAInZhwDcEdF3QDKa2Vp5qqlJeLAM23uwffd7XjG5GNY6eQeRZpD0w+5cyo9cTD1OaPxP0lt\nW/KItJG4+POcSkt9H1q7GenVUxr7cuW117jF5yUpvJbf0ZZHx4joAIC3ArgHwO0A9gB4U6JosoeI\n6AEiepSIHh3TkslxnK2lJTr2fQCeDiGcAgAi+gSA7wGwn4iWZ2roTgDPpg4OIRwGcBiY+oS6n0kz\nXh9ree1xqWMT51JsK1e+SzyjWtVHzUDemlPVfdC9ZF8OKWqWIpf/lDtGM9vzvpbXOWvR1q1VJ6Vr\ntaTGW9osYe27Fp/QEQCvJaLdNLX4DQC+AuBzAH54VuZ+AJ9saMNxnJc4LT6hR4jo4wC+AGANwF9h\nqmz+F4CHiOg/z/Z90FDnhr+5WbG0hs+hzR1ZxAxYqlNSIS0zluTnkJRDjpLykGZeyQ8S12OxK4ek\n8CaTyaYnDfDfOBoptVG6Vq1ovx/N9aVV0H34Vs1qeAz+GA7R5wahFNYlUHxcTI1Dug+kH6vVkVha\najBWJ6x1+VOys+V7kn6U2os/Xur2MQjFtnTL16Yv1AxC1ut7EYMQow3RjyZjuotm1I7LSGv5mgjD\nVgxM1rqlAcBSn+Qni/cz8T1aqTpb81ZqfHJxpDF3HvHfpaWl9WP43OK646cWtPx4a6+rlknZqkAt\n59PqRxrNIKQZzVPlS0u2VF3aiyjldJXq1rZtcbpqQ8SpH55VZWkHJWYymTQvNTQDjHZw7B6j2d+9\nduLrSLputD/2EPKJtVL/x4NqCe31r62ndJ5aJ7cWv4HVcZxBGY0SAtrCzLXJfbnEwpJDUbs8iOlz\nvW1RTH0uUbvlU5/H/VmjBlNtldq3OGqltrWvc9Yqaovqzdlp6TNphaBtO2dLq30pXAk5jjMoo1JC\nWh9Gd52dO1aqU3qwuca+RVA7q2iiUFZfkNSWpqw0E9eozVpll/L7ARt9LrFduZt3tVGm1LWao0Up\na/1Ocfk+bLGovxSuhBzHGZTRKCEiyoafUyMrz165mcoaidCwCAWkjZD0HZFItSXZljouVybnG7Km\nUnSjY7kyUh0pu7ufX716ddMx8QPT4v0SpT6qDe9rVHq8nbtu4v1Sn2lsdJ+Q4zjXJaNRQqkZL1Um\n/n9tZGcs9BEt6u7X9JE2updTYZqbPGujRhbFp1Wmmmsl9zgTSZ3X+qdKZbURrvj4ErV+G60NLbgS\nchxnUEathDSzolXxWPw6fUXDLLN6a6ShVHcO7UxbUlu5uqw+rTh62UXzmNlSnSWb+3p0iiXaaq2z\n1Idan472+yqhjURrcSXkOM6gjEYJAZtH7Vz2aiqbWXsvj2Xkr8kYTp1HjV/AiiW/KRcZictr2sjl\n3mj7SNpPRJvUUVx3TsVoVXI3l2cRGcbW60iKYDGlG4itiihlt/RZHxFnwJWQ4zgDMyolxORG/JpI\niTbvwZJprF1n95FjsYg8IWm2tOThpLKOu7T6tEr+p1wbi+wj6/FdtCqk9jorHVuyS9NGiVafqSsh\nx3EGZZRKKKZm7SnNIto1cqp9rR2LmIkt2bXSq4ekmVWjBrS+uJz9mhlb289xHlOM5rxqlYIlhypX\nd84Gy6u+rf0uUaNyPDrmOM51xXWlhFK+CCnfxNpGF+us2IcvomSP9XhrzorVH1CTqZuLHJYUkTW7\n1/q5pa+lOiw5Vb3l2UwmolrS1tnHqsOKKyHHcQblulBCqTWyNtKgjS6VVIDkS2EkH4wGSSlYsPiP\nUuVbox6lNnJK1jKr1s7AqfLWc7dERrXR1Za8NK1Ck/a3XKu1uBJyHGdQRqGEOGPVElnQKpzcdjwj\n58pb6GPN3+q36PZDax5TH9nDlpyjXBvajOIctbkzJSzRpbjdnGKW6DNK2Qd9KedRDEKMJimRP9c6\nWa0Xavf4lqVQySYNfSwxpM+0g0zpR2ztG2kgsJx3X4NP6nz6DGlLg6Y0gWoms9p0EcsALS2lqx3r\nptKO4zg9MwolxEsHKZmsO9LWziqptnP7tUsJKyUl15dq6S7H4lccM/EjTFuc39bwv1SP5ruW0C5N\nUvulAIFFudWmDrSE8LVKs48+yrWpxZWQ4ziDMgolxM47i4OOR2Hrg9OlGaK73u1bAXWP1zqHc+TO\nh7e3bduGvXv3AgB27doFYPOjMPj96ufOnQMAXLx4EcBmZZRTUKXwc2yPVQml/B2WtIq+0CrWklKq\nvV5qnfqAnAKRQ5M2YA0GSbgSchxnUEQlRES/A+AtAE6GEF4923cTgI8CuBvA1wH8SAjhDE2HwPcB\neDOAiwB+PITwBUUbpgSyVHnrulvrSyqVyc3EuQd7dVVbTfua8jt27AAAHDx4EHv27AEwVUUpe9lO\n/pyV0eXLl4tt5W4QLdnfp6rsM8Im1a1VeBpVZvVtWZRffI3Vtl1SftrVhhWNEvo9AG+M9j0I4OEQ\nwr0AHp5tA8CbANw7+/cAgPdXWeU4zssGUQmFEP6CiO6Odr8VwOtn//8QgD8H8O7Z/t8P06Hx80S0\nn4huCyEctxglzT6lvI7cTBark1I0Jq47xpJHUzofDVplwdv79u0DMPUDLS8vb/iMo2SseFgB7d69\nGwDWldPq6ioA3Yv++vD5SMdLM2wfCkjbVtzmIpHUVZ++oBw1im6r8oQO8cAy+3vrbP8dAI52yh2b\n7dsEET1ARI8S0aNb8YU6jjNO+o6OpaaR5AgTQjgM4DAATCaTZJnSiJubSaUZNnebRhwRKvk9rKRm\namt0TPqc7WWf0Pbt2zepPi7DCunKlSsbbLD6E0rRsdx2/PpujdrSRtxacpGksnEb2u9Lc7O1ZF+O\nkt0Slr6Q6ijZo6H2l3aCiG6bGXIbgJOz/ccA3NUpdyeAZyvbcBznZUCtEvoUgPsBvHf295Od/T9N\nRA8B+C4AZy3+IG20ozS7WKIVpXI1PgrJL1VSRLXnEx936dIlAMDevXvXfUCsPq5evbqhDlYhnB90\n4cKFog2lWTb33XHbuXwuyf9XssdKyWdnjRpJ37HFTyXlIsUvE9Ccv9VvI213I9J9+z41IfqPYOqE\nPkhExwD8EqaDz8eI6J0AjgB426z4H2Mann8S0xD9T5iscRznZQeNwSlMRGF5ebkqujES+wG0RWms\nvpW4bf7L/p49e/asR73YT8R1sCJi1cRKiH1E/HnNzCbN6jlll6sn1ZfavrKgVeHS/ri+EPLZ8Vq1\nHtNnNFBqI5Xbps2dWltbeyyEcJ/UlmdMO44zKKO4d4yRZobuSNwyk7Yirf8lNVAqYz2v2AbOAXrh\nhRfWfTxx1IvLxhGqOFIl+aO6s7xErm5JUViUhFaFlbDY1S2nUUx9XYupNrXqz6qwS8/4alV0jCsh\nx3EGZVRKKEajFnKjsfXu+tQaWLJL8nOUPtfmoVijSd18p9i3E7dRq8a65ayzoKRQNRE4ax9pFFKr\nX6nUl/G11ReaJ5Fa1HkXiyJtxZWQ4ziDMiol1Gc0RqpDk+PQEm3pHpeqJ/5M+zJHrTJKzVxx23Ed\nORYRtdT6XlJl+pqBU231pYC6SDlSUp0t/Z/zXVkVUqmvWr8PV0KO4wzKKJQQZ2NaohutKkWDdjZv\nqac1qqFRVK3nYYkqMdrvR+Ozk64Lq3rcaqyqUKssLBnskk0tylTbZg5XQo7jDMoolBBTk8+xiLrj\nNhaZmcpYs2Xj41K2WvKuUuUtaGbQlvpSaNuI79xPtaWNokos8hqutUlzjMZubY6R9bxGNQgxGkep\n9scohWlb7OiT2gGv1A+50LA2yc/SfryU0L7Isk9yP6SWt+y2fh/dOqQ+0V4DNX1a+z1YEmxrr2Ff\njjmOMyijUULd2To3U2sesN6nE7J1OWZJgNTOjpJNNY7pXFsaNLcrLBpLQCNXPhe6rr2euvVIj1zV\nLpOHdAuU0ktalbUrIcdxBmUUSmgymWD37t2bHiVRMwPEaqlltO7LGVlKJLTaYPEnaB+CZXWKp8r3\nndhpQZv0p2k/Vq+1yiiVThJjvcVlkYqoJkihDfNLuBJyHGdQRqGEduzYgXvuuQcrKysAgBMnTgCY\nj6zxQ+gB/eyi9aHE1MyiMdZ0/RZSdS4qSU+TDlAb2u7brlpyfpy+UxFSSOfRcp6SuuozTUOLKyHH\ncQZlFEpoaWkJN954I3bu3AkAOHv2LID5Y0eZ0khrnYmlHJrJZFL9IC5pfx9oZkOrndItIYvMr2lh\nK3wlTE4ZaRRFbR5QzXVUq3Asya+5Nq24EnIcZ1BGoYSICNu2bat6CJd2FrfYkvp/ikUqHYnY35Sa\nwXJKRqvcpOMsUT6JReR5LYIhfCY5LPlOUpRPcweC9B25T8hxnOuSUSiha9eu4cUXX1yPil2+fBnA\n5nwhpjsD55SPtJ/R5GBYI3FS3ZYcpT5m3lp/AFOa+WoV5xBRGU1b1vPp8zxydVteeqjNCZOu1ZRi\nsmZ8a3El5DjOoIxCCV2+fBlPPfUUzp8/DwBYXV0F0OYLspa3RDVyM4AlM1Z7v5CmrtznfUVIFoFF\nOWnViTYiarFHqrPFz6OtuyZnTbq+rBG6lB199YkrIcdxBmUUSujq1as4c+bMug9Iev5Ld0SWZvs+\n1+zaiILEZDJR55/k2orLpcpLPimrD6jUfis1Prk+bWlVnq1RWY1tmjpbVVUf5+M+IcdxritGoYRC\nCOt+IA0pv0etKonr0bZb+jwul8rpyWVjS3VLUY1UnVKWby0teUKW8+gz+iXZ03rd9JlV3qeq0vaJ\n5nysKl5CVEJE9DtEdJKIvtTZ91+I6O+I6ItE9D+IaH/ns/cQ0ZNE9AQR/YDJGsdxXnaQYgb+ZwDO\nA/j9EMKrZ/v+BYA/CyGsEdGvAEAI4d1E9G0APgLgOwHcDuD/APgHIYSrpTYmk0lYXq4TZdJaXhst\n0PiOYqUT/92+fXvxb7fOtbU1APOcqAsXLgDY7A+L7+a2zLy1s5/EIvJtcraUon1WWvwbLW22KhmN\nDYvwRWnbyrW9trb2WAjhPqk+UQmFEP4CwDejfX8aQlibbX4ewJ2z/78VwEMhhMshhKcBPInpgOQ4\njpOkD5/QTwL46Oz/d2A6KDHHZvs2QUQPAHiAt/vKSdFGfDT5ONKswr6effv2AQAOHDgAANi1a9eG\ncvx0AFY1a2tr68dyRPD5558HAJw6dWrD/tw9Yprn3WhzqKz04T/LUcoOXtQsT5R/e0sfdW9FHbWK\ns8a+Vh9QTNMgRES/CGANwId5V6JY8ooNIRwGcHhWz+Ky4hzHGTXVgxAR3Q/gLQDeEObTyDEAd3WK\n3Qng2Xrz7EiztDYfROMTYgV06NAhAHMFtLS0tOG4OPK3a9eudSXDZW+//XYAc98QZ49LeU8a+ooU\navpoK30TuTat/rPU/VGLzBbX+lQWSZ8KrTVHqmoQIqI3Ang3gH8eQug+eexTAP47Ef0apo7pewH8\nv5o2DLYAaL/toXTB5kLuN998MwBgz549G8qxI/rFF1/csL9rW7zvhhtuAADs3bsXwPyBbuzAluxO\nSeTapWm8JNIs5/oKN9f8+Gt/UKXjNANuLbnlTB8DoNTPfQ54sUugtk5xECKijwB4PYCDRHQMwC8B\neA+AHQA+O2v48yGEfxtC+DIRfQzAVzBdpv2UFBlzHOfljTgIhRDekdj9wUL5Xwbwyy1GWWi55SCF\nZnbkJdS2bdsAzJ3IvM1w2gF/zgqp2wYrnbhs3GZtGD3+v6ZO7TIm5dAt2bFVaNMyNHUwW7lMa0E6\ntz6/j74c1H7bhuM4gzKK2zZiNLNO68zUEvbktTD7fNhBnXvxIu9PvbqIPzt27BiAvEM6RprVU0l+\nufC3pHwkZVE6tk+s33mNItL6UlpUi+Q4z6Vf5GzR2Kn9XrRO/j5xJeQ4zqCMSglJvos+U/hzbeRs\n6cIzFScW7tixA8A8whXbGN+Ksbq6ikuXLgGYh+T5xY98G0dKNZW2U30lzd45hSApiFIbOaSZVTOD\n187GluRKrV3a4y12WPtS85lVEWmUNdNH+gjgSshxnIEZhRLq5rTkPs/tiz+T1tMxlvyguCyrmSNH\njgCYJyvGUbC4nhdffHFd8XAiI0fF4of71yZfrq6urvuApNlRGwlqmeW1SqL0vWl9WhIt/sAcLX1j\nZSsSVi115vxIWlwJOY4zKKNQQi1Ifo6WtXzOR8LbrFo4SnblypUN5XIz97Vr17L+ImvkR7vdtStX\nV5+3iNT6VlLltN9hri6Nzdrrw9qHksov0RrpqmmjVE6bF2RVfq6EHMcZlFEooRDC6dXV1QsATg9t\nS4aDGKdtbpedsdo2VruAetteoSkkPllxqyCiR4PiKWxDMFbb3C47Y7VtrHYBi7fNl2OO4wyKD0KO\n4wzKmAahw0MbUGCstrlddsZq21jtAhZs22h8Qo7jvDwZkxJyHOdliA9CjuMMyigGISJ6I03f2Pok\nET04oB13EdHniOhxIvoyEb1rtv8mIvosEX119vfAQPYtEdFfEdGnZ9v3ENEjM7s+SkTbB7JrPxF9\nnKZv5X2ciL57DH1GRD83+x6/REQfIaKdQ/UZpd9knOwjmvJfZ7+HLxLRd2yxXVv6huXBByEiWgLw\nmwDeBODbALyDpm9yHYI1AD8fQviHAF4L4KdmtjwI4OEQwr0AHp5tD8G7ADze2f4VAL8+s+sMgHcO\nYhXwPgB/EkL4VgDfjqmNg/YZEd0B4N8BuC9M3xy8BODtGK7Pfg/AG6N9uT56E6YvibgX03fzvX+L\n7fosgFeHEP4xgL/H9JnymP0W3g7gH82O+a3Z77eNEMKg/wB8N4DPdLbfA+A9Q9s1s+WTAL4fwBMA\nbpvtuw3AEwPYciemF+r3Avg0AMI0i3U51Y9baNc+AE9jFuTo7B+0zzB96eZRADdhemfApwH8wJB9\nBuBuAF+S+gjAfwPwjlS5rbAr+uxfAfjw7P8bfpsAPgPgu1vbH1wJYX6xMNm3tm4lRHQ3gNcAeATA\noRDCcQCY/b11AJN+A8AvAOA7Xm8GsBLmr+Meqt9eCeAUgN+dLRU/QER7MHCfhRCeAfCrAI4AOA7g\nLIDHMI4+Y3J9NKbfxE8C+N+z/y/ErjEMQqlbcQfNGyCivQD+CMDPhhDODWnLzJ63ADgZQnisuztR\ndIh+WwbwHQDeH0J4DYALGG65us7Mv/JWAPdg+g68PZguc2LGmKMyiu+WGt6wbGEMg9Dgb23tQkTb\nMB2APhxC+MRs9wkium32+W0ATm6xWa8D8INE9HUAD2G6JPsNAPuJiG9CHqrfjgE4FkJ4ZLb9cUwH\npaH77PsAPB1COBVCWAXwCQDfg3H0GZPro8F/EzR/w/KPhtnaa1F2jWEQ+ksA986iFtsxdXx9aghD\naPqAlA8CeDyE8Gudjz4F4P7Z/+/H1Fe0ZYQQ3hNCuDOEcDem/fNnIYQfBfA5AD88lF0z254DcJSI\nXjXb9QZMX345aJ9hugx7LRHtnn2vbNfgfdYh10efAvBvZlGy1wI4y8u2rYDmb1j+wbD5DctvJ6Id\nRHQP+nrD8lY55QTH2Jsx9cJ/DcAvDmjHP8VUXn4RwF/P/r0ZU//LwwC+Ovt704A2vh7Ap2f/f+Xs\nIngSwB8C2DGQTf8EwKOzfvufAA6Moc8A/CcAfwfgSwD+ANO3Bg/SZwA+gqlvahVTRfHOXB9huuz5\nzdnv4W8xjfBtpV1PYur74d/Ab3fK/+LMricAvKkPG/y2DcdxBmUMyzHHcV7G+CDkOM6g+CDkOM6g\n+CDkOM6g+CDkOM6g+CDkOM6g+CDkOM6g/H+9DNq4sLabLAAAAABJRU5ErkJggg==\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f2d98085198>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nSU39Pwy0S6EVqIskAAAAAElFTkSuQmCC\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f2d980eee48>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f2d94fe5320>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Perform a sanity check on some random validation samples\n", "ix = random.randint(0, len(preds_val_t))\n", "imshow(X_train[int(X_train.shape[0]*0.9):][ix])\n", "plt.show()\n", "imshow(np.squeeze(Y_train[int(Y_train.shape[0]*0.9):][ix]))\n", "plt.show()\n", "imshow(np.squeeze(preds_val_t[ix]))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "_cell_guid": "a6690535-b2e4-49ac-98d9-7191bfabfb6f", "_uuid": "6a34c98de7c6ae473f676a34fe7e099b46764eca" }, "source": [ "Not too shabby! Definitely needs some more training and tweaking.\n", "\n", "# Encode and submit our results\n", "\n", "Now it's time to submit our results. I've stolen [this](https://www.kaggle.com/rakhlin/fast-run-length-encoding-python) excellent implementation of run-length encoding." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "_cell_guid": "59a0af60-a7d7-41ef-a6fe-9e3c72defa07", "_uuid": "4f99c1bf852e82b60bd4f982ca0df293f712cdf0", "collapsed": true }, "outputs": [], "source": [ "# Run-length encoding stolen from https://www.kaggle.com/rakhlin/fast-run-length-encoding-python\n", "def rle_encoding(x):\n", " dots = np.where(x.T.flatten() == 1)[0]\n", " run_lengths = []\n", " prev = -2\n", " for b in dots:\n", " if (b>prev+1): run_lengths.extend((b + 1, 0))\n", " run_lengths[-1] += 1\n", " prev = b\n", " return run_lengths\n", "\n", "def prob_to_rles(x, cutoff=0.5):\n", " lab_img = label(x > cutoff)\n", " for i in range(1, lab_img.max() + 1):\n", " yield rle_encoding(lab_img == i)" ] }, { "cell_type": "markdown", "metadata": { "_cell_guid": "31133f8c-3f40-4dff-8e1d-898d56672332", "_uuid": "2e07f6afc4787b068ba714428145dcb3951d718f" }, "source": [ "Let's iterate over the test IDs and generate run-length encodings for each seperate mask identified by skimage ..." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "_cell_guid": "22fe24a1-7659-4cc9-9d23-211f38e5b99f", "_uuid": "089587843ed6a3955fdcb9b23a6ec3bf5d703688", "collapsed": true }, "outputs": [], "source": [ "new_test_ids = []\n", "rles = []\n", "for n, id_ in enumerate(test_ids):\n", " rle = list(prob_to_rles(preds_test_upsampled[n]))\n", " rles.extend(rle)\n", " new_test_ids.extend([id_] * len(rle))" ] }, { "cell_type": "markdown", "metadata": { "_cell_guid": "20b6b627-0fd6-425d-888f-da7f39efb124", "_uuid": "849184a40a2c9c21506d8b8eb10ad9155fa229e8" }, "source": [ "... and then finally create our submission!" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "_cell_guid": "1ba0ee3a-cca0-4349-83f6-09a1ac6fcb44", "_uuid": "ba589f56f5be1e6886bc88f5bf9e7d0a408e4048", "collapsed": true }, "outputs": [], "source": [ "# Create submission DataFrame\n", "sub = pd.DataFrame()\n", "sub['ImageId'] = new_test_ids\n", "sub['EncodedPixels'] = pd.Series(rles).apply(lambda x: ' '.join(str(y) for y in x))\n", "sub.to_csv('sub-dsbowl2018-1.csv', index=False)" ] }, { "cell_type": "markdown", "metadata": { "_cell_guid": "222475b9-3171-461a-90f0-a820a6bd2634", "_uuid": "fb5e6f8cca872f1bd7036f6d9ac2ed2cab615536", "collapsed": true }, "source": [ "This scored 0.233 on the LB for me. That was with version 2 of this notebook; be aware that the results from the neural network are extremely erratic and vary greatly from run to run (version 3 is significantly worse, for example). Version 7 scores 0.277!\n", "\n", "You should easily be able to stabilize and improve the results just by changing a few parameters, tweaking the architecture a little bit and training longer with early stopping.\n", "\n", "**Have fun!**\n", "\n", "LB score history:\n", "- Version 7: 0.277 LB" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "_cell_guid": "3f5e5a47-6133-4870-976a-a8e4fa7bf46c", "_uuid": "2a83eab66bf55194f300953bea5534b6a043130f", "collapsed": true }, "outputs": [], "source": [] } ], "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.6.4" } }, "nbformat": 4, "nbformat_minor": 1 }