This notebook is as an appendum to the talk given at PyCon 2015: http://www.pycon.se/#pieters


In [47]:
from IPython.display import Image
Image(url='http://image.slidesharecdn.com/catvsdogdlpycon15se-150512122612-lva1-app6891/95/deep-learning-as-a-catdog-detector-1-638.jpg?cb=1431434162')


Out[47]:

Libraries we will be using:

Want to know more?

or drop by the Deep Learning meetup if you're around in Stockholm

on we go...


CAFFE AND IMAGENET

First we start by importing all libraries:


In [3]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline


# Make sure that caffe is on the python path
# this ipynb file works from directory: <...>/caffe/examples/
caffe_root = '../'  # this file is expected to be in {caffe_root}/examples
import sys
sys.path.insert(0, caffe_root + 'python')

import caffe

# Set the right path to your model definition file, pretrained model weights,
# and the image you would like to classify.
MODEL_FILE = '../models/bvlc_reference_caffenet/deploy.prototxt'
PRETRAINED = '../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'
IMAGE_FILE = 'images/cat.jpg'

We will use a pretrained CNN model

pretrained Caffe models can be downloaded from the Model Zoo, (here) and (here)

We will be using the BVLC Reference CaffeNet model in models/bvlc_reference_caffenet: AlexNet trained on ILSVRC 2012, with a minor variation from the version as described in (ImageNet classification with deep convolutional neural networks) by Krizhevsky et al. in NIPS 2012. (Trained by Jeff Donahue @jeffdonahue)

If we havent't downloaded it, let's do so:


In [4]:
import os
if not os.path.isfile(PRETRAINED):
    print("Downloading pre-trained CaffeNet model...")
    !../scripts/download_model_binary.py ../models/bvlc_reference_caffenet

lets pass the model to Caffe


In [5]:
caffe.set_mode_gpu() #change this to set_mode_cpu() if you don't have a gpu to work on
net = caffe.Classifier(MODEL_FILE, PRETRAINED,
                       mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1),
                       channel_swap=(2,1,0),
                       raw_scale=255,
                       image_dims=(256, 256))

load an image:


In [6]:
input_image = caffe.io.load_image(IMAGE_FILE)
plt.imshow(input_image)


Out[6]:
<matplotlib.image.AxesImage at 0x7f95619f7b90>

the image gets loaded as a height x width x 3 channels matrix:


In [7]:
input_image.shape


Out[7]:
(360, 480, 3)

lets do our first prediction on the input image

net.predict() takes any number of images, and formats them for the Caffe net automatically


In [9]:
prediction = net.predict([input_image]) 
print 'prediction shape:', prediction[0].shape
plt.plot(prediction[0])
print 'predicted class:', prediction[0].argmax()


prediction shape: (1000,)
predicted class: 281

lets classify by the center crop alone by turning off oversampling:


In [355]:
prediction = net.predict([input_image], oversample=False)
print 'prediction shape:', prediction[0].shape
plt.plot(prediction[0])
print 'predicted class:', prediction[0].argmax()


prediction shape: (1000,)
predicted class: 281

so lets get some labels to those predicted classes:


In [10]:
# load labels
imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt'
try:
    labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')
except:
    !../data/ilsvrc12/get_ilsvrc_aux.sh
    labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')

# sort top k predictions from softmax output
top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]
print labels[top_k]


['n02127052 lynx, catamount' 'n02123159 tiger cat'
 'n02123045 tabby, tabby cat' 'n02124075 Egyptian cat'
 'n02119789 kit fox, Vulpes macrotis']

so how does our net actually look like? A picture says more than... you know what...


In [45]:
Image(url='http://image.slidesharecdn.com/22-01-15dlmeetup-150122111042-conversion-gate01/95/deep-learning-an-interactive-introduction-for-nlpers-62-638.jpg')


Out[45]:

lets print the various layers:


In [11]:
[(k, v.data.shape) for k, v in net.blobs.items()]


Out[11]:
[('data', (10, 3, 227, 227)),
 ('conv1', (10, 96, 55, 55)),
 ('pool1', (10, 96, 27, 27)),
 ('norm1', (10, 96, 27, 27)),
 ('conv2', (10, 256, 27, 27)),
 ('pool2', (10, 256, 13, 13)),
 ('norm2', (10, 256, 13, 13)),
 ('conv3', (10, 384, 13, 13)),
 ('conv4', (10, 384, 13, 13)),
 ('conv5', (10, 256, 13, 13)),
 ('pool5', (10, 256, 6, 6)),
 ('fc6', (10, 4096)),
 ('fc7', (10, 4096)),
 ('fc8', (10, 1000)),
 ('prob', (10, 1000))]

In [21]:
[(k, v[0].data.shape) for k, v in net.params.items()]


Out[21]:
[('conv1', (96, 3, 11, 11)),
 ('conv2', (256, 48, 5, 5)),
 ('conv3', (384, 256, 3, 3)),
 ('conv4', (384, 192, 3, 3)),
 ('conv5', (256, 192, 3, 3)),
 ('fc6', (4096, 9216)),
 ('fc7', (4096, 4096)),
 ('fc8', (1000, 4096))]

for the purpose of this tutorial we will use the features of fully connected layer 6 (fc6) and extract these 4096 features for each image. So in essence transforming a training image into a feature set.

why fc6? no particular reason, more intuition than anything, as fc6 should be the least fitted to the final fc layer (fc8) which transforms 4096 features into a probabilty over the 1000 imagenet classes.

feel free to experiment yourself, and let me know your results :)


In [12]:
feat = net.blobs['fc6'].data[0]
plt.subplot(2, 1, 1)
plt.plot(feat.flat)
plt.subplot(2, 1, 2)
_ = plt.hist(feat.flat[feat.flat > 0], bins=100)


Cat vs Dog time!

We will use the (Kaggle dogs vs cats) competition's dataset, which contains 25k images of cats and dogs.


In [13]:
from glob import glob
basedir = '/mnt/pet/train/'
#load all files:
files = glob(basedir + '*.jpg')

In [14]:
files[0]


Out[14]:
'/mnt/pet/train/dog.2231.jpg'

In [15]:
input_image = caffe.io.load_image(files[0])
plt.imshow(input_image)


Out[15]:
<matplotlib.image.AxesImage at 0x7f95600dc850>

In [18]:
#FEATURE OF FC6 (ONE BEFORE FINAL FC LAYER)
feat = net.blobs['fc6'].data[0]
plt.subplot(2, 1, 1)
plt.plot(feat.flat)
plt.subplot(2, 1, 2)
_ = plt.hist(feat.flat[feat.flat > 0], bins=100)



In [19]:
#s classify by the center crop alone by turning off oversampling. 
prediction = net.predict([input_image], oversample=False)
print 'prediction shape:', prediction[0].shape
plt.plot(prediction[0])
print 'predicted class:', prediction[0].argmax()


prediction shape: (1000,)
predicted class: 179

In [20]:
# load labels
imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt'
try:
    labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')
except:
    !../data/ilsvrc12/get_ilsvrc_aux.sh
    labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')

# sort top k predictions from softmax output
top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]
print labels[top_k]


['n02093256 Staffordshire bullterrier, Staffordshire bull terrier'
 'n02107312 miniature pinscher'
 'n02093428 American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier'
 'n02085620 Chihuahua' 'n02091032 Italian greyhound']

Googling these dogs, our image might be a miniature pinscher, so class #2, not bad...


VISUALIZE LAYERS

Lets see how our already trained (we loaded a pre-trained net remember?) layers look like.

But before we do so lets see how we can load an image into the network:


In [29]:
#normal loading/showing of image:
input_image = caffe.io.load_image(IMAGE_FILE)
plt.imshow(input_image)


Out[29]:
<matplotlib.image.AxesImage at 0x7f95618d1750>

In [32]:
#show the data, or whats inside the actual first data blob which gets fed into the first layer:
plt.imshow(net.transformer.deprocess('data', net.blobs['data'].data[0]))


Out[32]:
<matplotlib.image.AxesImage at 0x7f95618722d0>

yes its out previous dog! :)

which looks like this:


In [36]:
# 'data' is the input blob name in the model definition, so we preprocess for that input.
caffe_input = np.asarray([net.transformer.preprocess('data', in_) for in_ in input_oversampled])
caffe_input


Out[36]:
array([[[[ -54.16323853,  -56.55484009,  -53.93081665, ...,  -63.42398071,
           -50.97866821,  -42.82632446],
         [ -52.83608627,  -55.5880394 ,  -54.35561752, ...,  -59.63003159,
           -48.26577759,  -39.21109009],
         [ -54.42007446,  -55.31948853,  -55.19155884, ...,  -56.97085571,
           -45.43276596,  -36.91616058],
         ..., 
         [ -83.1065979 ,  -82.04116821,  -79.20718384, ...,   70.78599548,
            75.98324585,   85.99984741],
         [ -79.88394165,  -86.57925415,  -80.73062134, ...,   78.76939392,
            79.76548767,   82.11801147],
         [ -72.03530884,  -77.24429321,  -70.5909729 , ...,   86.47348022,
            86.65318298,   78.15414429]],

        [[ -59.23126602,  -61.46564102,  -59.24005508, ...,  -36.35724258,
           -14.76251793,   -2.41193175],
         [ -59.49786758,  -60.24982071,  -59.01739883, ...,  -29.34357262,
           -10.73126793,    2.49236512],
         [ -59.08185196,  -60.28887939,  -60.66583633, ...,  -24.18634605,
            -4.82990026,    5.82244349],
         ..., 
         [ -47.34552383,  -41.45294571,  -40.32208633, ...,   77.12419891,
            80.32146454,   92.3380661 ],
         [ -47.90802383,  -48.42853165,  -45.9558754 , ...,   85.10761261,
            85.3224411 ,   88.45623016],
         [ -47.10821915,  -49.0261879 ,  -42.62481308, ...,   92.81169891,
            92.99140167,   84.49236298]],

        [[ -96.24141693,  -96.86837006,  -93.30782318, ...,  -80.55489349,
           -64.27462006,  -51.49824142],
         [ -96.50801849,  -96.94747162,  -95.02754974, ...,  -75.10274506,
           -62.1505928 ,  -47.88301468],
         [ -96.09200287,  -95.38692474,  -94.23847961, ...,  -70.97286224,
           -59.14668655,  -45.18770218],
         ..., 
         [ -60.6584053 ,  -53.8380928 ,  -45.96602249, ...,   84.11405182,
            87.31131744,   99.32791901],
         [ -61.9943428 ,  -60.7755928 ,  -53.46016312, ...,   92.09746552,
            92.31229401,   95.44608307],
         [ -58.2209053 ,  -57.31758499,  -48.84101486, ...,   99.80155182,
            99.98123932,   91.48221588]]],


       [[[ -68.15640259,  -70.10268402,  -70.3663559 , ...,  -83.98745728,
           -76.34976196,  -62.85561752],
         [ -67.51187134,  -68.1690979 ,  -70.17886353, ...,  -78.27163696,
           -75.83999634,  -64.06850433],
         [ -67.64761353,  -69.01773071,  -70.89956665, ...,  -70.72573853,
           -75.7003479 ,  -67.60951996],
         ..., 
         [  29.82601929,   40.85824585,   44.13363647, ...,  127.2918396 ,
           128.16488647,  126.73324585],
         [  35.37191772,   38.55844116,   38.40316772, ...,  112.51742554,
           116.19418335,  116.91586304],
         [  43.23031616,   42.70005798,   40.53793335, ...,  107.19223022,
           106.26937866,  109.47348022]],

        [[ -48.85625839,  -49.31232071,  -50.11700058, ...,  -41.36993027,
           -40.15215683,  -25.3250103 ],
         [ -48.24688339,  -46.83086777,  -48.79278946, ...,  -35.43439102,
           -32.6433754 ,  -21.10333061],
         [ -49.26836777,  -46.99689102,  -47.65314102, ...,  -28.59356499,
           -24.4402523 ,  -14.84258842],
         ..., 
         [  27.86931801,   40.61541367,   47.67498398, ...,  130.83319092,
           131.56658936,  130.07147217],
         [  36.53826523,   40.53045273,   41.52264023, ...,  115.75115204,
           118.62615204,  119.03533173],
         [  45.56853867,   45.36152267,   41.24627304, ...,  110.56169891,
           109.60759735,  112.25798798]],

        [[ -85.86641693,  -83.74238586,  -82.94942474, ...,  -74.78633118,
           -76.97579193,  -68.89766693],
         [ -85.2570343 ,  -83.15352631,  -81.19454193, ...,  -71.16817474,
           -71.58223724,  -65.81856537],
         [ -84.66622162,  -80.92989349,  -80.26582336, ...,  -64.43477631,
           -67.60176849,  -64.51387787],
         ..., 
         [  31.85917091,   44.46561813,   49.07110214, ...,  130.78495789,
           131.78788757,  131.28007507],
         [  39.91875839,   43.6423912 ,   44.51249313, ...,  118.51248932,
           123.67850494,  125.02518463],
         [  48.55839157,   47.7048912 ,   44.78983688, ...,  116.53592682,
           116.28495026,  120.90897369]]],


       [[[ -72.09683228,  -73.61148071,  -74.75015259, ...,  -44.58804321,
           -53.60073471,  -63.80874252],
         [ -73.88198853,  -74.31948853,  -76.39761353, ...,  -41.5206604 ,
           -48.05679321,  -60.40151978],
         [ -73.08511353,  -74.61831665,  -74.76577759, ...,  -39.75112915,
           -49.84682846,  -60.74136353],
         ..., 
         [ -85.84585571,  -91.28237915,  -90.38198853, ...,   47.47447205,
            33.47250366,   51.26451111],
         [ -87.80679321,  -86.92007446,  -86.22573853, ...,   64.24594116,
            79.39047241,   88.68637085],
         [ -80.13687134,  -77.52456665,  -79.87710571, ...,   54.30259705,
            78.4793396 ,   79.39926147]],

        [[ -68.80548859,  -68.33673859,  -69.85919952, ...,    1.61249006,
           -16.83086967,  -30.40704155],
         [ -68.54376221,  -68.98126984,  -71.05939484, ...,    2.75408387,
           -11.84649467,  -26.89240074],
         [ -67.74688721,  -69.28009033,  -69.4275589 , ...,    2.41424012,
           -11.10528374,  -23.92755699],
         ..., 
         [ -70.23126221,  -72.36115265,  -70.48126221, ...,   53.87519455,
            38.9034996 ,   57.25896835],
         [ -67.07892609,  -64.05353546,  -61.00763321, ...,   62.84978867,
            78.80097198,   87.79607391],
         [ -55.53302383,  -51.10723495,  -48.88751602, ...,   54.36542892,
            78.33513641,   79.53435516]],

        [[ -91.80001068,  -91.33614349,  -92.85372162, ...,  -49.94453812,
           -64.87227631,  -79.42989349],
         [ -91.5539093 ,  -91.9914093 ,  -94.06954193, ...,  -45.64667892,
           -58.95332336,  -73.58419037],
         [ -90.75704193,  -92.29024506,  -92.43770599, ...,  -44.15839767,
           -57.05195999,  -68.06465912],
         ..., 
         [ -86.60958099,  -86.71406555,  -83.89180756, ...,   60.8962822 ,
            48.2322197 ,   65.87969208],
         [ -85.40157318,  -82.54804993,  -79.96993256, ...,   66.96562958,
            81.57207489,   91.78592682],
         [ -76.44551849,  -71.97774506,  -68.04023743, ...,   60.98907089,
            85.51248932,   86.71170807]]],


       ..., 
       [[[ -63.80874252,  -53.60073471,  -44.58804321, ...,  -74.75015259,
           -73.61148071,  -72.09683228],
         [ -60.40151978,  -48.05679321,  -41.5206604 , ...,  -76.39761353,
           -74.31948853,  -73.88198853],
         [ -60.74136353,  -49.84682846,  -39.75112915, ...,  -74.76577759,
           -74.61831665,  -73.08511353],
         ..., 
         [  51.26451111,   33.47250366,   47.47447205, ...,  -90.38198853,
           -91.28237915,  -85.84585571],
         [  88.68637085,   79.39047241,   64.24594116, ...,  -86.22573853,
           -86.92007446,  -87.80679321],
         [  79.39926147,   78.4793396 ,   54.30259705, ...,  -79.87710571,
           -77.52456665,  -80.13687134]],

        [[ -30.40704155,  -16.83086967,    1.61249006, ...,  -69.85919952,
           -68.33673859,  -68.80548859],
         [ -26.89240074,  -11.84649467,    2.75408387, ...,  -71.05939484,
           -68.98126984,  -68.54376221],
         [ -23.92755699,  -11.10528374,    2.41424012, ...,  -69.4275589 ,
           -69.28009033,  -67.74688721],
         ..., 
         [  57.25896835,   38.9034996 ,   53.87519455, ...,  -70.48126221,
           -72.36115265,  -70.23126221],
         [  87.79607391,   78.80097198,   62.84978867, ...,  -61.00763321,
           -64.05353546,  -67.07892609],
         [  79.53435516,   78.33513641,   54.36542892, ...,  -48.88751602,
           -51.10723495,  -55.53302383]],

        [[ -79.42989349,  -64.87227631,  -49.94453812, ...,  -92.85372162,
           -91.33614349,  -91.80001068],
         [ -73.58419037,  -58.95332336,  -45.64667892, ...,  -94.06954193,
           -91.9914093 ,  -91.5539093 ],
         [ -68.06465912,  -57.05195999,  -44.15839767, ...,  -92.43770599,
           -92.29024506,  -90.75704193],
         ..., 
         [  65.87969208,   48.2322197 ,   60.8962822 , ...,  -83.89180756,
           -86.71406555,  -86.60958099],
         [  91.78592682,   81.57207489,   66.96562958, ...,  -79.96993256,
           -82.54804993,  -85.40157318],
         [  86.71170807,   85.51248932,   60.98907089, ...,  -68.04023743,
           -71.97774506,  -76.44551849]]],


       [[[ -59.92007446,  -48.39761353,  -43.02651978, ...,  -57.88589478,
           -61.67300415,  -61.19448853],
         [ -62.2862854 ,  -54.83706284,  -47.62807846, ...,  -61.49234009,
           -62.69448853,  -65.61049652],
         [ -67.19937134,  -58.02456665,  -48.64761353, ...,  -62.79312134,
           -64.83608246,  -66.52456665],
         ..., 
         [  67.9480896 ,   40.04867554,   63.09654236, ...,   42.14633179,
            45.6043396 ,   51.64047241],
         [  59.09361267,   63.04283142,   88.3377533 , ...,   42.14926147,
            30.8855896 ,   43.49594116],
         [  54.67271423,   80.81137085,   88.42562866, ...,   39.82896423,
            36.31138611,   35.89048767]],

        [[   6.54314661,   16.9503727 ,   22.3371067 , ...,   -8.81134605,
           -11.29279137,  -12.05939293],
         [   3.17693543,    8.20720863,   14.73163795, ...,  -12.23224449,
           -12.10333061,  -15.49103355],
         [  -2.98126769,    2.25408387,    8.6144352 , ...,  -14.49103355,
           -15.78009605,  -15.83380699],
         ..., 
         [  72.28630829,   43.7619133 ,   65.43476105, ...,   47.59197617,
            49.9425621 ,   55.16621017],
         [  63.43181992,   66.75603485,   90.79021454, ...,   48.48748398,
            37.5900383 ,   49.78728867],
         [  59.01093674,   84.5246048 ,   90.76384735, ...,   46.16718674,
            45.23064804,   46.82244492]],

        [[ -36.46699905,  -26.0597744 ,  -20.67305565, ...,  -47.52852249,
           -52.5587883 ,  -53.6603508 ],
         [ -40.95820999,  -34.65644455,  -28.40840721, ...,  -51.50800705,
           -53.60078812,  -57.18379593],
         [ -45.17402267,  -39.88301468,  -34.37324905, ...,  -50.79317093,
           -52.74238968,  -55.08906937],
         ..., 
         [  75.27616119,   46.7517662 ,   68.42461395, ...,   54.58182907,
            56.93241501,   62.15606308],
         [  66.42166901,   69.74588776,   93.55155182, ...,   55.47733688,
            44.45780563,   56.38651657],
         [  62.00078964,   87.51444244,   93.75370026, ...,   53.15702438,
            51.36014938,   52.81229782]]],


       [[[ -71.3507309 ,  -70.64956665,  -67.98745728, ...,  -52.28921509,
           -50.00894165,  -48.80386353],
         [ -69.88589478,  -65.88589478,  -62.95620728, ...,  -55.03823853,
           -52.47085571,  -51.2550354 ],
         [ -65.57924652,  -63.29311752,  -60.31948471, ...,  -56.83999252,
           -54.27261353,  -51.69448853],
         ..., 
         [  79.24301147,   79.81430054,   72.32406616, ...,   51.37094116,
            59.65414429,   63.05648804],
         [  73.69711304,   73.48031616,   79.17857361, ...,   53.02426147,
            55.62974548,   51.67855835],
         [  56.82211304,   62.23031616,   86.69320679, ...,   60.75865173,
            59.23326111,   54.71078491]],

        [[ -35.32500839,  -33.87383652,  -29.02423668, ...,  -47.95098495,
           -45.12384415,  -43.07793808],
         [ -34.36114883,  -28.74103355,  -25.61798668, ...,  -50.82989883,
           -47.82500839,  -46.21368027],
         [ -32.95489883,  -30.27911949,  -24.6511898 , ...,  -53.64239883,
           -50.32989883,  -47.35625839],
         ..., 
         [  81.25310516,   84.48064423,   77.86540985, ...,   55.70916367,
            63.11736679,   65.39470673],
         [  77.4308548 ,   78.26677704,   83.90740204, ...,   56.36248398,
            58.96796799,   55.01678085],
         [  60.46795273,   65.69841766,   90.71894073, ...,   64.09687042,
            62.57148361,   58.04900742]],

        [[ -74.50801086,  -71.88399506,  -68.72188568, ...,  -97.07051849,
           -96.72676086,  -96.86347961],
         [ -73.76679993,  -68.58419037,  -65.00313568, ...,  -99.58028412,
           -98.59101868,  -98.33321381],
         [ -71.34981537,  -68.80391693,  -63.55293274, ..., -100.06368256,
           -98.67891693,  -96.66329193],
         ..., 
         [  92.08377838,   90.87578583,   82.17069244, ...,   58.69901657,
            66.10721588,   68.38455963],
         [  82.23418427,   81.14237213,   86.20877838, ...,   62.35233688,
            64.95781708,   61.00663376],
         [  67.16092682,   72.00174713,   96.79959869, ...,   70.08670807,
            68.5613327 ,   64.03885651]]]], dtype=float32)

In [39]:
# take an array of shape (n, height, width) or (n, height, width, channels)
# and visualize each (height, width) thing in a grid of size approx. sqrt(n) by sqrt(n)
def vis_square(data, padsize=1, padval=0):
    data -= data.min()
    data /= data.max()
    
    # force the number of filters to be square
    n = int(np.ceil(np.sqrt(data.shape[0])))
    padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((0, 0),) * (data.ndim - 3)
    data = np.pad(data, padding, mode='constant', constant_values=(padval, padval))
    
    # tile the filters into an image
    data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))
    data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])
    
    plt.imshow(data)

In [42]:
#or this as data in the blob, just before it gets pushed into the the actual first conv layer:
feat = net.blobs['data'].data[0, :36]
vis_square(feat, padval=1)


and like this in the first conv layer (the so called edge detectors):


In [43]:
# the parameters are a list of [weights, biases]
filters = net.params['conv1'][0].data
vis_square(filters.transpose(0, 2, 3, 1))


second conv layer:


In [44]:
feat = net.blobs['conv2'].data[0, :36]
vis_square(feat, padval=1)


etc...


RUN IMAGES THROUGH NET AND SAVE FEATURES

Now we know how the net operates, lets push all our training images through it. We use the fact that the network has already a pretty good idea of 1000 different classes of images, and will transform our WxHx3 channel pixel representation to a 4096 dimensional feature vector, by extracting the constructed features from the conv6 layer as we suggested earlier.


In [56]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# Make sure that caffe is on the python path:
caffe_root = '../'  # this file is expected to be in {caffe_root}/examples
import sys
sys.path.insert(0, caffe_root + 'python')

import caffe


#from decaf.util import transform
#from decaf.scripts import imagenet
import logging
import numpy as np
from glob import glob
import matplotlib.image as mpimg
from random import shuffle
import pickle

# Set the right path to your model definition file, pretrained model weights,
# and the image you would like to classify.
MODEL_FILE = '../models/bvlc_reference_caffenet/deploy.prototxt'
PRETRAINED = '../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'
#IMAGE_FILE = 'images/cat.jpg'

import os
if not os.path.isfile(PRETRAINED):
    print("Downloading pre-trained CaffeNet model...")
    !../scripts/download_model_binary.py ../models/bvlc_reference_caffenet
    

def activate(net, im):
    input_image = caffe.io.load_image(im)
    # Resize the image to the standard (256, 256) and oversample net input sized crops.
    input_oversampled = caffe.io.oversample([caffe.io.resize_image(input_image, net.image_dims)], net.crop_dims)
    # 'data' is the input blob name in the model definition, so we preprocess for that input.
    caffe_input = np.asarray([net.transformer.preprocess('data', in_) for in_ in input_oversampled])
    # forward() takes keyword args for the input blobs with preprocessed input arrays.
    predicted = net.forward(data=caffe_input)
    # Activation of all convolutional layers and first fully connected
    feat = net.blobs['fc6'].data[0]
    return feat


def png_to_np(basedir, fetch_target=False):
    logging.getLogger().setLevel(logging.INFO)
    caffe.set_mode_gpu()
    net = caffe.Classifier(MODEL_FILE, PRETRAINED,
                       mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1),
                       channel_swap=(2,1,0),
                       raw_scale=255,
                       image_dims=(256, 256))

    files = glob(basedir + '*.png') #converted from original jpg
    if fetch_target:
        shuffle(files)
        # Sort the files so they match the labels
        target = np.array([1. if 'dog' in f.split("/")[-1] else 0.
                           for f in files],
                          dtype='float32')
    else:
        #Must sort the files for the test sort to assure order!
        files = sorted(files,
                       key=lambda x: int(x.split("/")[-1].split(".")[-2]))
    
    #HACK: limit to 100 files
    #files = files[:100]
    
    feature_info = activate(net, files[0])
    feature_count = feature_info.shape[0]
    feature_dtype = feature_info.dtype
    data = np.zeros((len(files), feature_count), dtype=feature_dtype)
    for n, im in enumerate(files):
        data[n, :] = activate(net, im)
        if n % 1000 == 0:
            print 'Reading in image', n
    if fetch_target:
        return data, target, files
    else:
        return data, files

In [290]:
x, y, filenames = png_to_np(
    '/mnt/pet/train/', fetch_target=True)
pickle.dump(x, open('saved_x_v2.pkl', 'wb'))
pickle.dump(y, open('saved_y_v2.pkl', 'wb'))
pickle.dump(filenames, open('saved_filenames_v2.pkl', 'wb'))


Reading in image 0
Reading in image 1000
Reading in image 2000
Reading in image 3000
Reading in image 4000
Reading in image 5000
Reading in image 6000
Reading in image 7000
Reading in image 8000
Reading in image 9000
Reading in image 10000
Reading in image 11000
Reading in image 12000
Reading in image 13000
Reading in image 14000
Reading in image 15000
Reading in image 16000
Reading in image 17000
Reading in image 18000
Reading in image 19000
Reading in image 20000
Reading in image 21000
Reading in image 22000
Reading in image 23000
Reading in image 24000

ok now we got our features saved as a pickle file we can move on...


TRAIN MODEL ON TOP OF FEATURES

Now we got these features, we will train a RBM on top of it (see presentation slides+video for more details) to create a classifier which can seperate dog images from cat images, with the added benefit of deciding what "other" objects look like, ie: Does a particular individual look more like a dog or a cat? :)

we use pylearn2, a wrapper on top of theano. In the example below we run it for just 500 epochs:


In [396]:
from pylearn2.models import mlp
from pylearn2.costs.mlp.dropout import Dropout
from pylearn2.training_algorithms import sgd, learning_rule
from pylearn2.termination_criteria import EpochCounter
from pylearn2.datasets import DenseDesignMatrix
from pylearn2.train import Train
from pylearn2.train_extensions import best_params
from pylearn2.space import VectorSpace
import pickle
import numpy as np

def to_one_hot(l):
    out = np.zeros((len(l), len(set(l))))
    for n, i in enumerate(l):
        out[n, i] = 1.
    return out

x = pickle.load(open('saved_x_v2.pkl', 'rb'))
y = pickle.load(open('saved_y_v2.pkl', 'rb'))
filenames = pickle.load(open('saved_filenames_v2.pkl', 'rb'))
y = to_one_hot(y)
in_space = VectorSpace(dim=x.shape[1])
full = DenseDesignMatrix(X=x, y=y)

l1 = mlp.RectifiedLinear(layer_name='l1',
                         sparse_init=12,
                         dim=5000,
                         max_col_norm=1.)

l2 = mlp.RectifiedLinear(layer_name='l2',
                         sparse_init=12,
                         dim=5000,
                         max_col_norm=1.)

l3 = mlp.RectifiedLinear(layer_name='l3',
                         sparse_init=12,
                         dim=5000,
                         max_col_norm=1.)

output = mlp.Softmax(layer_name='y',
                     n_classes=2,
                     irange=.005)

layers = [l1, l2, l3, output]

mdl = mlp.MLP(layers,
              input_space=in_space)

lr = .0001
epochs = 500
trainer = sgd.SGD(learning_rate=lr,
                  batch_size=128,
                  learning_rule=learning_rule.Momentum(.5),
                  # Remember, default dropout is .5
                  cost=Dropout(input_include_probs={'l1': .8},
                               input_scales={'l1': 1.}),
                  termination_criterion=EpochCounter(epochs),
                  monitoring_dataset={'train': full})

watcher = best_params.MonitorBasedSaveBest(
    channel_name='train_y_misclass',
    save_path='saved_clf_v3.pkl')

velocity = learning_rule.MomentumAdjustor(final_momentum=.6,
                                          start=1,
                                          saturate=250)

decay = sgd.LinearDecayOverEpoch(start=1,
                                 saturate=250,
                                 decay_factor=lr*.05)

experiment = Train(dataset=full,
                   model=mdl,
                   algorithm=trainer,
                   extensions=[watcher, velocity, decay])

In [ ]:
#from sklearn.cross_validation import train_test_split
#X_train, X_test, y_train, y_test = train_test_split(x, y,
#                                                    test_size=.2,
#                                                    random_state=42)

# no sklearn.cross_validation > train_test_split
# own test/train split so we can also link filenames
splitter = round(len(x)*0.8)
X_train, X_test = x[:splitter], x[splitter:]
y_train, y_test = y[:splitter], y[splitter:]
filenames_train, filenames_test = filenames[:20000], filenames[20000:]

pickle.dump(X_train, open('saved_feat_x_train_v2.pkl', 'wb'))
pickle.dump(X_test, open('saved_feat_x_test_v2.pkl', 'wb'))
pickle.dump(y_train, open('saved_feat_y_train_v2.pkl', 'wb'))
pickle.dump(y_test, open('saved_feat_y_test_v2.pkl', 'wb'))
pickle.dump(filenames_train, open('saved_feat_filenames_train_v2.pkl', 'wb'))
pickle.dump(filenames_test, open('saved_feat_filenames_test_v2.pkl', 'wb'))

In [ ]:
trn = DenseDesignMatrix(X=X_train, y=y_train)
tst = DenseDesignMatrix(X=X_test, y=y_test)
trainer.monitoring_dataset={'valid': tst,
                            'train': trn}
experiment.main_loop()


Parameter and initial learning rate summary:
	l1_W: 9.99999974738e-05
	l1_b: 9.99999974738e-05
	l2_W: 9.99999974738e-05
	l2_b: 9.99999974738e-05
	l3_W: 9.99999974738e-05
	l3_b: 9.99999974738e-05
	softmax_b: 9.99999974738e-05
	softmax_W: 9.99999974738e-05
Compiling sgd_update...
Compiling sgd_update done. Time elapsed: 1.379007 seconds
compiling begin_record_entry...
compiling begin_record_entry done. Time elapsed: 0.432231 seconds
Monitored channels: 
	learning_rate
	momentum
	total_seconds_last_epoch
	train_l1_col_norms_max
	train_l1_col_norms_mean
	train_l1_col_norms_min
	train_l1_max_x_max_u
	train_l1_max_x_mean_u
	train_l1_max_x_min_u
	train_l1_mean_x_max_u
	train_l1_mean_x_mean_u
	train_l1_mean_x_min_u
	train_l1_min_x_max_u
	train_l1_min_x_mean_u
	train_l1_min_x_min_u
	train_l1_range_x_max_u
	train_l1_range_x_mean_u
	train_l1_range_x_min_u
	train_l1_row_norms_max
	train_l1_row_norms_mean
	train_l1_row_norms_min
	train_l2_col_norms_max
	train_l2_col_norms_mean
	train_l2_col_norms_min
	train_l2_max_x_max_u
	train_l2_max_x_mean_u
	train_l2_max_x_min_u
	train_l2_mean_x_max_u
	train_l2_mean_x_mean_u
	train_l2_mean_x_min_u
	train_l2_min_x_max_u
	train_l2_min_x_mean_u
	train_l2_min_x_min_u
	train_l2_range_x_max_u
	train_l2_range_x_mean_u
	train_l2_range_x_min_u
	train_l2_row_norms_max
	train_l2_row_norms_mean
	train_l2_row_norms_min
	train_l3_col_norms_max
	train_l3_col_norms_mean
	train_l3_col_norms_min
	train_l3_max_x_max_u
	train_l3_max_x_mean_u
	train_l3_max_x_min_u
	train_l3_mean_x_max_u
	train_l3_mean_x_mean_u
	train_l3_mean_x_min_u
	train_l3_min_x_max_u
	train_l3_min_x_mean_u
	train_l3_min_x_min_u
	train_l3_range_x_max_u
	train_l3_range_x_mean_u
	train_l3_range_x_min_u
	train_l3_row_norms_max
	train_l3_row_norms_mean
	train_l3_row_norms_min
	train_objective
	train_y_col_norms_max
	train_y_col_norms_mean
	train_y_col_norms_min
	train_y_max_max_class
	train_y_mean_max_class
	train_y_min_max_class
	train_y_misclass
	train_y_nll
	train_y_row_norms_max
	train_y_row_norms_mean
	train_y_row_norms_min
	training_seconds_this_epoch
	valid_l1_col_norms_max
	valid_l1_col_norms_mean
	valid_l1_col_norms_min
	valid_l1_max_x_max_u
	valid_l1_max_x_mean_u
	valid_l1_max_x_min_u
	valid_l1_mean_x_max_u
	valid_l1_mean_x_mean_u
	valid_l1_mean_x_min_u
	valid_l1_min_x_max_u
	valid_l1_min_x_mean_u
	valid_l1_min_x_min_u
	valid_l1_range_x_max_u
	valid_l1_range_x_mean_u
	valid_l1_range_x_min_u
	valid_l1_row_norms_max
	valid_l1_row_norms_mean
	valid_l1_row_norms_min
	valid_l2_col_norms_max
	valid_l2_col_norms_mean
	valid_l2_col_norms_min
	valid_l2_max_x_max_u
	valid_l2_max_x_mean_u
	valid_l2_max_x_min_u
	valid_l2_mean_x_max_u
	valid_l2_mean_x_mean_u
	valid_l2_mean_x_min_u
	valid_l2_min_x_max_u
	valid_l2_min_x_mean_u
	valid_l2_min_x_min_u
	valid_l2_range_x_max_u
	valid_l2_range_x_mean_u
	valid_l2_range_x_min_u
	valid_l2_row_norms_max
	valid_l2_row_norms_mean
	valid_l2_row_norms_min
	valid_l3_col_norms_max
	valid_l3_col_norms_mean
	valid_l3_col_norms_min
	valid_l3_max_x_max_u
	valid_l3_max_x_mean_u
	valid_l3_max_x_min_u
	valid_l3_mean_x_max_u
	valid_l3_mean_x_mean_u
	valid_l3_mean_x_min_u
	valid_l3_min_x_max_u
	valid_l3_min_x_mean_u
	valid_l3_min_x_min_u
	valid_l3_range_x_max_u
	valid_l3_range_x_mean_u
	valid_l3_range_x_min_u
	valid_l3_row_norms_max
	valid_l3_row_norms_mean
	valid_l3_row_norms_min
	valid_objective
	valid_y_col_norms_max
	valid_y_col_norms_mean
	valid_y_col_norms_min
	valid_y_max_max_class
	valid_y_mean_max_class
	valid_y_min_max_class
	valid_y_misclass
	valid_y_nll
	valid_y_row_norms_max
	valid_y_row_norms_mean
	valid_y_row_norms_min
Compiling accum...
graph size: 488
graph size: 472
Compiling accum done. Time elapsed: 11.103666 seconds
Monitoring step:
	Epochs seen: 0
	Batches seen: 0
	Examples seen: 0
	learning_rate: 0.000100000055681
	momentum: 0.499999403954
	total_seconds_last_epoch: 0.0
	train_l1_col_norms_max: 0.999998927116
	train_l1_col_norms_mean: 0.999998807907
	train_l1_col_norms_min: 0.999998807907
	train_l1_max_x_max_u: 42.5273017883
	train_l1_max_x_mean_u: 11.1278381348
	train_l1_max_x_min_u: 0.0
	train_l1_mean_x_max_u: 5.61080789566
	train_l1_mean_x_mean_u: 1.10889053345
	train_l1_mean_x_min_u: 0.0
	train_l1_min_x_max_u: 0.0
	train_l1_min_x_mean_u: 0.0
	train_l1_min_x_min_u: 0.0
	train_l1_range_x_max_u: 42.5273017883
	train_l1_range_x_mean_u: 11.1278381348
	train_l1_range_x_min_u: 0.0
	train_l1_row_norms_max: 1.88189017773
	train_l1_row_norms_mean: 1.0791426897
	train_l1_row_norms_min: 0.318118214607
	train_l2_col_norms_max: 0.999998927116
	train_l2_col_norms_mean: 0.999998807907
	train_l2_col_norms_min: 0.999998807907
	train_l2_max_x_max_u: 27.7847919464
	train_l2_max_x_mean_u: 6.76123094559
	train_l2_max_x_min_u: 0.0
	train_l2_mean_x_max_u: 5.11655807495
	train_l2_mean_x_mean_u: 0.907900452614
	train_l2_mean_x_min_u: 0.0
	train_l2_min_x_max_u: 0.220743700862
	train_l2_min_x_mean_u: 0.000109114509542
	train_l2_min_x_min_u: 0.0
	train_l2_range_x_max_u: 27.7844734192
	train_l2_range_x_mean_u: 6.76112270355
	train_l2_range_x_min_u: 0.0
	train_l2_row_norms_max: 1.73010361195
	train_l2_row_norms_mean: 0.971638917923
	train_l2_row_norms_min: 0.169261693954
	train_l3_col_norms_max: 0.999998927116
	train_l3_col_norms_mean: 0.999998807907
	train_l3_col_norms_min: 0.999998807907
	train_l3_max_x_max_u: 18.1165657043
	train_l3_max_x_mean_u: 4.14223861694
	train_l3_max_x_min_u: 0.0
	train_l3_mean_x_max_u: 4.84004878998
	train_l3_mean_x_mean_u: 0.669926404953
	train_l3_mean_x_min_u: 0.0
	train_l3_min_x_max_u: 0.884425997734
	train_l3_min_x_mean_u: 0.00179350981489
	train_l3_min_x_min_u: 0.0
	train_l3_range_x_max_u: 18.0776939392
	train_l3_range_x_mean_u: 4.1404466629
	train_l3_range_x_min_u: 0.0
	train_l3_row_norms_max: 1.79987382889
	train_l3_row_norms_mean: 0.970920622349
	train_l3_row_norms_min: 0.0710862055421
	train_objective: 0.777565002441
	train_y_col_norms_max: 0.205148860812
	train_y_col_norms_mean: 0.203807756305
	train_y_col_norms_min: 0.202466651797
	train_y_max_max_class: 0.685008943081
	train_y_mean_max_class: 0.548430621624
	train_y_min_max_class: 0.500529170036
	train_y_misclass: 0.478850126266
	train_y_nll: 0.693315804005
	train_y_row_norms_max: 0.00692991446704
	train_y_row_norms_mean: 0.00381852476858
	train_y_row_norms_min: 5.19508721482e-05
	training_seconds_this_epoch: 0.0
	valid_l1_col_norms_max: 1.00000059605
	valid_l1_col_norms_mean: 1.00000011921
	valid_l1_col_norms_min: 1.00000011921
	valid_l1_max_x_max_u: 44.6676139832
	valid_l1_max_x_mean_u: 11.1327066422
	valid_l1_max_x_min_u: 0.0
	valid_l1_mean_x_max_u: 5.53667449951
	valid_l1_mean_x_mean_u: 1.10811650753
	valid_l1_mean_x_min_u: 0.0
	valid_l1_min_x_max_u: 0.00136688165367
	valid_l1_min_x_mean_u: 2.06092249755e-06
	valid_l1_min_x_min_u: 0.0
	valid_l1_range_x_max_u: 44.6676139832
	valid_l1_range_x_mean_u: 11.1327037811
	valid_l1_range_x_min_u: 0.0
	valid_l1_row_norms_max: 1.88189184666
	valid_l1_row_norms_mean: 1.07914412022
	valid_l1_row_norms_min: 0.318118393421
	valid_l2_col_norms_max: 1.00000059605
	valid_l2_col_norms_mean: 1.00000011921
	valid_l2_col_norms_min: 1.00000011921
	valid_l2_max_x_max_u: 27.9632701874
	valid_l2_max_x_mean_u: 6.76596689224
	valid_l2_max_x_min_u: 0.0
	valid_l2_mean_x_max_u: 5.10104942322
	valid_l2_mean_x_mean_u: 0.907007038593
	valid_l2_mean_x_min_u: 0.0
	valid_l2_min_x_max_u: 0.195981904864
	valid_l2_min_x_mean_u: 0.000132603876409
	valid_l2_min_x_min_u: 0.0
	valid_l2_range_x_max_u: 27.9612922668
	valid_l2_range_x_mean_u: 6.76583385468
	valid_l2_range_x_min_u: 0.0
	valid_l2_row_norms_max: 1.73010504246
	valid_l2_row_norms_mean: 0.971637248993
	valid_l2_row_norms_min: 0.169261857867
	valid_l3_col_norms_max: 1.00000059605
	valid_l3_col_norms_mean: 1.00000011921
	valid_l3_col_norms_min: 1.00000011921
	valid_l3_max_x_max_u: 18.3735523224
	valid_l3_max_x_mean_u: 4.14790439606
	valid_l3_max_x_min_u: 0.0
	valid_l3_mean_x_max_u: 4.82184171677
	valid_l3_mean_x_mean_u: 0.669239103794
	valid_l3_mean_x_min_u: 0.0
	valid_l3_min_x_max_u: 0.872671663761
	valid_l3_min_x_mean_u: 0.00186477031093
	valid_l3_min_x_min_u: 0.0
	valid_l3_range_x_max_u: 18.3443069458
	valid_l3_range_x_mean_u: 4.14603996277
	valid_l3_range_x_min_u: 0.0
	valid_l3_row_norms_max: 1.79987382889
	valid_l3_row_norms_mean: 0.970920026302
	valid_l3_row_norms_min: 0.0710862055421
	valid_objective: 0.784043550491
	valid_y_col_norms_max: 0.205148786306
	valid_y_col_norms_mean: 0.203807681799
	valid_y_col_norms_min: 0.202466577291
	valid_y_max_max_class: 0.683053672314
	valid_y_mean_max_class: 0.548033833504
	valid_y_min_max_class: 0.500677227974
	valid_y_misclass: 0.482399970293
	valid_y_nll: 0.695437133312
	valid_y_row_norms_max: 0.006929917261
	valid_y_row_norms_mean: 0.00381852244027
	valid_y_row_norms_min: 5.19507957506e-05
Saving to saved_clf_v3.pkl...
Saving to saved_clf_v3.pkl done. Time elapsed: 46.700408 seconds
Time this epoch: 16.212949 seconds
Monitoring step:
	Epochs seen: 1
	Batches seen: 196
	Examples seen: 25000
	learning_rate: 9.95999216684e-05
	momentum: 0.499999403954
	total_seconds_last_epoch: 0.0
	train_l1_col_norms_max: 0.999998807907
	train_l1_col_norms_mean: 0.999977886677
	train_l1_col_norms_min: 0.999923825264
	train_l1_max_x_max_u: 42.5494422913
	train_l1_max_x_mean_u: 11.1346120834
	train_l1_max_x_min_u: 0.0
	train_l1_mean_x_max_u: 5.61136770248
	train_l1_mean_x_mean_u: 1.1120454073
	train_l1_mean_x_min_u: 0.0
	train_l1_min_x_max_u: 0.000216507949517
	train_l1_min_x_mean_u: 4.48069599202e-08
	train_l1_min_x_min_u: 0.0
	train_l1_range_x_max_u: 42.5494422913
	train_l1_range_x_mean_u: 11.1346120834
	train_l1_range_x_min_u: 0.0
	train_l1_row_norms_max: 1.88184916973
	train_l1_row_norms_mean: 1.07912135124
	train_l1_row_norms_min: 0.318110048771
	train_l2_col_norms_max: 0.999998807907
	train_l2_col_norms_mean: 0.999977886677
	train_l2_col_norms_min: 0.999926030636
	train_l2_max_x_max_u: 27.8247299194
	train_l2_max_x_mean_u: 6.77153301239
	train_l2_max_x_min_u: 0.0
	train_l2_mean_x_max_u: 5.11808443069
	train_l2_mean_x_mean_u: 0.910972177982
	train_l2_mean_x_min_u: 0.0
	train_l2_min_x_max_u: 0.226196631789
	train_l2_min_x_mean_u: 0.00011349387205
	train_l2_min_x_min_u: 0.0
	train_l2_range_x_max_u: 27.8244571686
	train_l2_range_x_mean_u: 6.77141809464
	train_l2_range_x_min_u: 0.0
	train_l2_row_norms_max: 1.73006641865
	train_l2_row_norms_mean: 0.971613585949
	train_l2_row_norms_min: 0.169258341193
	train_l3_col_norms_max: 0.999998807907
	train_l3_col_norms_mean: 0.999977886677
	train_l3_col_norms_min: 0.999954044819
	train_l3_max_x_max_u: 18.2209949493
	train_l3_max_x_mean_u: 4.15588521957
	train_l3_max_x_min_u: 0.0
	train_l3_mean_x_max_u: 4.86183547974
	train_l3_mean_x_mean_u: 0.673390626907
	train_l3_mean_x_min_u: 0.0
	train_l3_min_x_max_u: 0.887790739536
	train_l3_min_x_mean_u: 0.00181364652235
	train_l3_min_x_min_u: 0.0
	train_l3_range_x_max_u: 18.1855182648
	train_l3_range_x_mean_u: 4.15407037735
	train_l3_range_x_min_u: 0.0
	train_l3_row_norms_max: 1.79983663559
	train_l3_row_norms_mean: 0.970896363258
	train_l3_row_norms_min: 0.0710894316435
	train_objective: 0.347513705492
	train_y_col_norms_max: 0.210423201323
	train_y_col_norms_mean: 0.210288509727
	train_y_col_norms_min: 0.210153490305
	train_y_max_max_class: 0.996396958828
	train_y_mean_max_class: 0.796227097511
	train_y_min_max_class: 0.50633007288
	train_y_misclass: 0.0612999945879
	train_y_nll: 0.26631385088
	train_y_row_norms_max: 0.0136984791607
	train_y_row_norms_mean: 0.00388306030072
	train_y_row_norms_min: 4.11203618569e-05
	training_seconds_this_epoch: 16.2129383087
	valid_l1_col_norms_max: 1.00000011921
	valid_l1_col_norms_mean: 0.999977171421
	valid_l1_col_norms_min: 0.999923825264
	valid_l1_max_x_max_u: 44.7073059082
	valid_l1_max_x_mean_u: 11.139497757
	valid_l1_max_x_min_u: 0.0
	valid_l1_mean_x_max_u: 5.5360827446
	valid_l1_mean_x_mean_u: 1.11124837399
	valid_l1_mean_x_min_u: 0.0
	valid_l1_min_x_max_u: 0.00155671907123
	valid_l1_min_x_mean_u: 2.32701790992e-06
	valid_l1_min_x_min_u: 0.0
	valid_l1_range_x_max_u: 44.7071800232
	valid_l1_range_x_mean_u: 11.1394948959
	valid_l1_range_x_min_u: 0.0
	valid_l1_row_norms_max: 1.88184940815
	valid_l1_row_norms_mean: 1.07911896706
	valid_l1_row_norms_min: 0.318109601736
	valid_l2_col_norms_max: 1.00000011921
	valid_l2_col_norms_mean: 0.999977231026
	valid_l2_col_norms_min: 0.999927937984
	valid_l2_max_x_max_u: 28.0416641235
	valid_l2_max_x_mean_u: 6.7764043808
	valid_l2_max_x_min_u: 0.0
	valid_l2_mean_x_max_u: 5.10279846191
	valid_l2_mean_x_mean_u: 0.910056114197
	valid_l2_mean_x_min_u: 0.0
	valid_l2_min_x_max_u: 0.200884237885
	valid_l2_min_x_mean_u: 0.00013578562357
	valid_l2_min_x_min_u: 0.0
	valid_l2_range_x_max_u: 28.0395107269
	valid_l2_range_x_mean_u: 6.77626800537
	valid_l2_range_x_min_u: 0.0
	valid_l2_row_norms_max: 1.73006784916
	valid_l2_row_norms_mean: 0.971614539623
	valid_l2_row_norms_min: 0.169257983565
	valid_l3_col_norms_max: 1.00000011921
	valid_l3_col_norms_mean: 0.99997729063
	valid_l3_col_norms_min: 0.999956309795
	valid_l3_max_x_max_u: 18.5198974609
	valid_l3_max_x_mean_u: 4.16177225113
	valid_l3_max_x_min_u: 0.0
	valid_l3_mean_x_max_u: 4.84308624268
	valid_l3_mean_x_mean_u: 0.672675192356
	valid_l3_mean_x_min_u: 0.0
	valid_l3_min_x_max_u: 0.873954474926
	valid_l3_min_x_mean_u: 0.00188406812958
	valid_l3_min_x_min_u: 0.0
	valid_l3_range_x_max_u: 18.4853401184
	valid_l3_range_x_mean_u: 4.15988826752
	valid_l3_range_x_min_u: 0.0
	valid_l3_row_norms_max: 1.79983663559
	valid_l3_row_norms_mean: 0.970897316933
	valid_l3_row_norms_min: 0.0710894241929
	valid_objective: 0.354278683662
	valid_y_col_norms_max: 0.210423588753
	valid_y_col_norms_mean: 0.210288584232
	valid_y_col_norms_min: 0.210153654218
	valid_y_max_max_class: 0.996896147728
	valid_y_mean_max_class: 0.790925085545
	valid_y_min_max_class: 0.505907893181
	valid_y_misclass: 0.0697999969125
	valid_y_nll: 0.276169896126
	valid_y_row_norms_max: 0.0136984912679
	valid_y_row_norms_mean: 0.00388305145316
	valid_y_row_norms_min: 4.1120347305e-05
Saving to saved_clf_v3.pkl...
Saving to saved_clf_v3.pkl done. Time elapsed: 27.992265 seconds
Time this epoch: 16.187747 seconds
Monitoring step:
	Epochs seen: 2
	Batches seen: 392
	Examples seen: 50000
	learning_rate: 9.91998094833e-05
	momentum: 0.500400722027
	total_seconds_last_epoch: 54.6139144897
	train_l1_col_norms_max: 0.999998807907
	train_l1_col_norms_mean: 0.999952316284
	train_l1_col_norms_min: 0.999886453152
	train_l1_max_x_max_u: 42.5775337219
	train_l1_max_x_mean_u: 11.140619278
	train_l1_max_x_min_u: 0.0
	train_l1_mean_x_max_u: 5.61163377762
	train_l1_mean_x_mean_u: 1.11436891556
	train_l1_mean_x_min_u: 0.0
	train_l1_min_x_max_u: 0.000402111065341
	train_l1_min_x_mean_u: 8.16698459971e-08
	train_l1_min_x_min_u: 0.0
	train_l1_range_x_max_u: 42.5775337219
	train_l1_range_x_mean_u: 11.140619278
	train_l1_range_x_min_u: 0.0
	train_l1_row_norms_max: 1.88180792332
	train_l1_row_norms_mean: 1.07909440994
	train_l1_row_norms_min: 0.318102568388
	train_l2_col_norms_max: 0.999998807907
	train_l2_col_norms_mean: 0.999952316284
	train_l2_col_norms_min: 0.999887049198
	train_l2_max_x_max_u: 27.8678092957
	train_l2_max_x_mean_u: 6.7819108963
	train_l2_max_x_min_u: 0.0
	train_l2_mean_x_max_u: 5.12344503403
	train_l2_mean_x_mean_u: 0.913700938225
	train_l2_mean_x_min_u: 0.0
	train_l2_min_x_max_u: 0.228032961488
	train_l2_min_x_mean_u: 0.000113738438813
	train_l2_min_x_min_u: 0.0
	train_l2_range_x_max_u: 27.867767334
	train_l2_range_x_mean_u: 6.78179788589
	train_l2_range_x_min_u: 0.0
	train_l2_row_norms_max: 1.73002994061
	train_l2_row_norms_mean: 0.971592903137
	train_l2_row_norms_min: 0.169253930449
	train_l3_col_norms_max: 0.999998807907
	train_l3_col_norms_mean: 0.999953508377
	train_l3_col_norms_min: 0.999930799007
	train_l3_max_x_max_u: 18.3199043274
	train_l3_max_x_mean_u: 4.16935062408
	train_l3_max_x_min_u: 0.0
	train_l3_mean_x_max_u: 4.88227987289
	train_l3_mean_x_mean_u: 0.676566839218
	train_l3_mean_x_min_u: 0.0
	train_l3_min_x_max_u: 0.887374043465
	train_l3_min_x_mean_u: 0.00182023923844
	train_l3_min_x_min_u: 0.0
	train_l3_range_x_max_u: 18.2920837402
	train_l3_range_x_mean_u: 4.1675286293
	train_l3_range_x_min_u: 0.0
	train_l3_row_norms_max: 1.7997982502
	train_l3_row_norms_mean: 0.970875799656
	train_l3_row_norms_min: 0.0710900723934
	train_objective: 0.290220558643
	train_y_col_norms_max: 0.219035938382
	train_y_col_norms_mean: 0.218796268106
	train_y_col_norms_min: 0.218557491899
	train_y_max_max_class: 0.999540567398
	train_y_mean_max_class: 0.844219207764
	train_y_min_max_class: 0.508629620075
	train_y_misclass: 0.0585999973118
	train_y_nll: 0.212770998478
	train_y_row_norms_max: 0.0168196894228
	train_y_row_norms_mean: 0.0040036290884
	train_y_row_norms_min: 5.26779222128e-05
	training_seconds_this_epoch: 16.1877307892
	valid_l1_col_norms_max: 1.00000011921
	valid_l1_col_norms_mean: 0.99995392561
	valid_l1_col_norms_min: 0.999886393547
	valid_l1_max_x_max_u: 44.7436904907
	valid_l1_max_x_mean_u: 11.1455488205
	valid_l1_max_x_min_u: 0.0
	valid_l1_mean_x_max_u: 5.53299856186
	valid_l1_mean_x_mean_u: 1.11355340481
	valid_l1_mean_x_min_u: 0.0
	valid_l1_min_x_max_u: 0.00180149904918
	valid_l1_min_x_mean_u: 2.48344736065e-06
	valid_l1_min_x_min_u: 0.0
	valid_l1_range_x_max_u: 44.7434654236
	valid_l1_range_x_mean_u: 11.1455469131
	valid_l1_range_x_min_u: 0.0
	valid_l1_row_norms_max: 1.88180673122
	valid_l1_row_norms_mean: 1.0790938139
	valid_l1_row_norms_min: 0.318102568388
	valid_l2_col_norms_max: 1.00000011921
	valid_l2_col_norms_mean: 0.999953985214
	valid_l2_col_norms_min: 0.9998883605
	valid_l2_max_x_max_u: 28.1134490967
	valid_l2_max_x_mean_u: 6.7869386673
	valid_l2_max_x_min_u: 0.0
	valid_l2_mean_x_max_u: 5.10933494568
	valid_l2_mean_x_mean_u: 0.912763655186
	valid_l2_mean_x_min_u: 0.0
	valid_l2_min_x_max_u: 0.205501928926
	valid_l2_min_x_mean_u: 0.000135781709105
	valid_l2_min_x_min_u: 0.0
	valid_l2_range_x_max_u: 28.1119709015
	valid_l2_range_x_mean_u: 6.78680229187
	valid_l2_range_x_min_u: 0.0
	valid_l2_row_norms_max: 1.73003304005
	valid_l2_row_norms_mean: 0.971592903137
	valid_l2_row_norms_min: 0.169253930449
	valid_l3_col_norms_max: 1.00000011921
	valid_l3_col_norms_mean: 0.999954104424
	valid_l3_col_norms_min: 0.999928593636
	valid_l3_max_x_max_u: 18.640794754
	valid_l3_max_x_mean_u: 4.17549848557
	valid_l3_max_x_min_u: 0.0
	valid_l3_mean_x_max_u: 4.86330127716
	valid_l3_mean_x_mean_u: 0.675824284554
	valid_l3_mean_x_min_u: 0.0
	valid_l3_min_x_max_u: 0.875259935856
	valid_l3_min_x_mean_u: 0.00189617555588
	valid_l3_min_x_min_u: 0.0
	valid_l3_range_x_max_u: 18.6080551147
	valid_l3_range_x_mean_u: 4.17360210419
	valid_l3_range_x_min_u: 0.0
	valid_l3_row_norms_max: 1.79979515076
	valid_l3_row_norms_mean: 0.970875799656
	valid_l3_row_norms_min: 0.071089990437
	valid_objective: 0.30036881566
	valid_y_col_norms_max: 0.219036057591
	valid_y_col_norms_mean: 0.218796730042
	valid_y_col_norms_min: 0.218557104468
	valid_y_max_max_class: 0.999598145485
	valid_y_mean_max_class: 0.838107526302
	valid_y_min_max_class: 0.508867502213
	valid_y_misclass: 0.0619999989867
	valid_y_nll: 0.223649427295
	valid_y_row_norms_max: 0.0168196950108
	valid_y_row_norms_mean: 0.00400362350047
	valid_y_row_norms_min: 5.26779003849e-05
Saving to saved_clf_v3.pkl...
Saving to saved_clf_v3.pkl done. Time elapsed: 27.882387 seconds
Time this epoch: 16.209518 seconds
Monitoring step:
	Epochs seen: 3
	Batches seen: 588
	Examples seen: 75000
	learning_rate: 9.87998719211e-05
	momentum: 0.500803768635
	total_seconds_last_epoch: 54.4901351929
	train_l1_col_norms_max: 0.999998807907
	train_l1_col_norms_mean: 0.999931335449
	train_l1_col_norms_min: 0.999851167202
	train_l1_max_x_max_u: 42.5998039246
	train_l1_max_x_mean_u: 11.1458396912
	train_l1_max_x_min_u: 0.0
	train_l1_mean_x_max_u: 5.61173725128
	train_l1_mean_x_mean_u: 1.11636257172
	train_l1_mean_x_min_u: 0.0
	train_l1_min_x_max_u: 0.000600440136623
	train_l1_min_x_mean_u: 1.21499709849e-07
	train_l1_min_x_min_u: 0.0
	train_l1_range_x_max_u: 42.5998039246
	train_l1_range_x_mean_u: 11.1458396912
	train_l1_range_x_min_u: 0.0
	train_l1_row_norms_max: 1.88175976276
	train_l1_row_norms_mean: 1.07906806469
	train_l1_row_norms_min: 0.318093597889
	train_l2_col_norms_max: 0.999998807907
	train_l2_col_norms_mean: 0.999931335449
	train_l2_col_norms_min: 0.999851703644
	train_l2_max_x_max_u: 27.9066505432
	train_l2_max_x_mean_u: 6.79118013382
	train_l2_max_x_min_u: 0.0
	train_l2_mean_x_max_u: 5.12395429611
	train_l2_mean_x_mean_u: 0.916153490543
	train_l2_mean_x_min_u: 0.0
	train_l2_min_x_max_u: 0.229600831866
	train_l2_min_x_mean_u: 0.000115131573693
	train_l2_min_x_min_u: 0.0
	train_l2_range_x_max_u: 27.9066505432
	train_l2_range_x_mean_u: 6.79106426239
	train_l2_range_x_min_u: 0.0
	train_l2_row_norms_max: 1.7299926281
	train_l2_row_norms_mean: 0.971571981907
	train_l2_row_norms_min: 0.169249460101
	train_l3_col_norms_max: 0.999997675419
	train_l3_col_norms_mean: 0.999931335449
	train_l3_col_norms_min: 0.999904692173
	train_l3_max_x_max_u: 18.4007091522
	train_l3_max_x_mean_u: 4.18138313293
	train_l3_max_x_min_u: 0.0
	train_l3_mean_x_max_u: 4.89635562897
	train_l3_mean_x_mean_u: 0.679396808147
	train_l3_mean_x_min_u: 0.0
	train_l3_min_x_max_u: 0.883519470692
	train_l3_min_x_mean_u: 0.00182587676682
	train_l3_min_x_min_u: 0.0
	train_l3_range_x_max_u: 18.3747634888
	train_l3_range_x_mean_u: 4.1795592308
	train_l3_range_x_min_u: 0.0
	train_l3_row_norms_max: 1.79974877834
	train_l3_row_norms_mean: 0.970854818821
	train_l3_row_norms_min: 0.0710906013846
	train_objective: 0.25706794858
	train_y_col_norms_max: 0.226054638624
	train_y_col_norms_mean: 0.225582793355
	train_y_col_norms_min: 0.22511228919
	train_y_max_max_class: 0.999827444553
	train_y_mean_max_class: 0.870033383369
	train_y_min_max_class: 0.509793698788
	train_y_misclass: 0.0511499904096
	train_y_nll: 0.180541098118
	train_y_row_norms_max: 0.0182270538062
	train_y_row_norms_mean: 0.00410407735035
	train_y_row_norms_min: 8.82164094946e-05
	training_seconds_this_epoch: 16.2094936371
	valid_l1_col_norms_max: 1.00000011921
	valid_l1_col_norms_mean: 0.999930679798
	valid_l1_col_norms_min: 0.999852120876
	valid_l1_max_x_max_u: 44.7701148987
	valid_l1_max_x_mean_u: 11.150812149
	valid_l1_max_x_min_u: 0.0
	valid_l1_mean_x_max_u: 5.53166770935
	valid_l1_mean_x_mean_u: 1.11553144455
	valid_l1_mean_x_min_u: 0.0
	valid_l1_min_x_max_u: 0.00193669786677
	valid_l1_min_x_mean_u: 2.60304682342e-06
	valid_l1_min_x_min_u: 0.0
	valid_l1_range_x_max_u: 44.7698059082
	valid_l1_range_x_mean_u: 11.1508102417
	valid_l1_range_x_min_u: 0.0
	valid_l1_row_norms_max: 1.88176071644
	valid_l1_row_norms_mean: 1.07906925678
	valid_l1_row_norms_min: 0.318093955517
	valid_l2_col_norms_max: 1.00000011921
	valid_l2_col_norms_mean: 0.999930739403
	valid_l2_col_norms_min: 0.99985396862
	valid_l2_max_x_max_u: 28.1754112244
	valid_l2_max_x_mean_u: 6.7963552475
	valid_l2_max_x_min_u: 0.0
	valid_l2_mean_x_max_u: 5.11017227173
	valid_l2_mean_x_mean_u: 0.915194809437
	valid_l2_mean_x_min_u: 0.0
	valid_l2_min_x_max_u: 0.208234071732
	valid_l2_min_x_mean_u: 0.000136784103233
	valid_l2_min_x_min_u: 0.0
	valid_l2_range_x_max_u: 28.1744861603
	valid_l2_range_x_mean_u: 6.79621934891
	valid_l2_range_x_min_u: 0.0
	valid_l2_row_norms_max: 1.72999560833
	valid_l2_row_norms_mean: 0.97156983614
	valid_l2_row_norms_min: 0.169249773026
	valid_l3_col_norms_max: 0.999996006489
	valid_l3_col_norms_mean: 0.999930739403
	valid_l3_col_norms_min: 0.999903380871
	valid_l3_max_x_max_u: 18.7555675507
	valid_l3_max_x_mean_u: 4.18773365021
	valid_l3_max_x_min_u: 0.0
	valid_l3_mean_x_max_u: 4.87688875198
	valid_l3_mean_x_mean_u: 0.678628385067
	valid_l3_mean_x_min_u: 0.0
	valid_l3_min_x_max_u: 0.875408828259
	valid_l3_min_x_mean_u: 0.00190749403555
	valid_l3_min_x_min_u: 0.0
	valid_l3_range_x_max_u: 18.7181949615
	valid_l3_range_x_mean_u: 4.18582582474
	valid_l3_range_x_min_u: 0.0
	valid_l3_row_norms_max: 1.79975283146
	valid_l3_row_norms_mean: 0.970852613449
	valid_l3_row_norms_min: 0.0710905939341
	valid_objective: 0.272477805614
	valid_y_col_norms_max: 0.226054146886
	valid_y_col_norms_mean: 0.225583210588
	valid_y_col_norms_min: 0.225112259388
	valid_y_max_max_class: 0.999846220016
	valid_y_mean_max_class: 0.865073382854
	valid_y_min_max_class: 0.509629070759
	valid_y_misclass: 0.058999992907
	valid_y_nll: 0.189870119095
	valid_y_row_norms_max: 0.0182270724326
	valid_y_row_norms_mean: 0.00410407735035
	valid_y_row_norms_min: 8.8216344011e-05
Saving to saved_clf_v3.pkl...
Saving to saved_clf_v3.pkl done. Time elapsed: 28.192684 seconds
Time this epoch: 16.204134 seconds
Monitoring step:
	Epochs seen: 4
	Batches seen: 784
	Examples seen: 100000
	learning_rate: 9.84001599136e-05
	momentum: 0.501205146313
	total_seconds_last_epoch: 54.8284912109
	train_l1_col_norms_max: 0.999998807907
	train_l1_col_norms_mean: 0.999905347824
	train_l1_col_norms_min: 0.999814391136
	train_l1_max_x_max_u: 42.6222686768
	train_l1_max_x_mean_u: 11.1505851746
	train_l1_max_x_min_u: 0.0
	train_l1_mean_x_max_u: 5.61340284348
	train_l1_mean_x_mean_u: 1.11816573143
	train_l1_mean_x_min_u: 0.0
	train_l1_min_x_max_u: 0.000790169346146
	train_l1_min_x_mean_u: 1.62519569358e-07
	train_l1_min_x_min_u: 0.0
	train_l1_range_x_max_u: 42.6222686768
	train_l1_range_x_mean_u: 11.1505851746
	train_l1_range_x_min_u: 0.0
	train_l1_row_norms_max: 1.88171482086
	train_l1_row_norms_mean: 1.07904207706
	train_l1_row_norms_min: 0.318084388971
	train_l2_col_norms_max: 0.999998807907
	train_l2_col_norms_mean: 0.999905645847
	train_l2_col_norms_min: 0.999821424484
	train_l2_max_x_max_u: 27.9444446564
	train_l2_max_x_mean_u: 6.79974031448
	train_l2_max_x_min_u: 0.0
	train_l2_mean_x_max_u: 5.12807130814
	train_l2_mean_x_mean_u: 0.918424963951
	train_l2_mean_x_min_u: 0.0
	train_l2_min_x_max_u: 0.229925751686
	train_l2_min_x_mean_u: 0.000115889008157
	train_l2_min_x_min_u: 0.0
	train_l2_range_x_max_u: 27.9444446564
	train_l2_range_x_mean_u: 6.79962539673
	train_l2_range_x_min_u: 0.0
	train_l2_row_norms_max: 1.72995436192
	train_l2_row_norms_mean: 0.971546471119
	train_l2_row_norms_min: 0.169244810939
	train_l3_col_norms_max: 0.99998152256
	train_l3_col_norms_mean: 0.999905645847
	train_l3_col_norms_min: 0.999877393246
	train_l3_max_x_max_u: 18.4814224243
	train_l3_max_x_mean_u: 4.19234991074
	train_l3_max_x_min_u: 0.0
	train_l3_mean_x_max_u: 4.90569877625
	train_l3_mean_x_mean_u: 0.681956112385
	train_l3_mean_x_min_u: 0.0
	train_l3_min_x_max_u: 0.881761133671
	train_l3_min_x_mean_u: 0.00182722229511
	train_l3_min_x_min_u: 0.0
	train_l3_range_x_max_u: 18.4561672211
	train_l3_range_x_mean_u: 4.19052267075
	train_l3_range_x_min_u: 0.0
	train_l3_row_norms_max: 1.79970753193
	train_l3_row_norms_mean: 0.970829367638
	train_l3_row_norms_min: 0.0710896775126
	train_objective: 0.243062645197
	train_y_col_norms_max: 0.231741040945
	train_y_col_norms_mean: 0.231237500906
	train_y_col_norms_min: 0.230732962489
	train_y_max_max_class: 0.999939143658
	train_y_mean_max_class: 0.883916079998
	train_y_min_max_class: 0.512251675129
	train_y_misclass: 0.0496999956667
	train_y_nll: 0.166305884719
	train_y_row_norms_max: 0.0190164372325
	train_y_row_norms_mean: 0.00418717600405
	train_y_row_norms_min: 0.000110655120807
	training_seconds_this_epoch: 16.2041225433
	valid_l1_col_norms_max: 1.00000011921
	valid_l1_col_norms_mean: 0.999905705452
	valid_l1_col_norms_min: 0.999816656113
	valid_l1_max_x_max_u: 44.7961997986
	valid_l1_max_x_mean_u: 11.1556053162
	valid_l1_max_x_min_u: 0.0
	valid_l1_mean_x_max_u: 5.53240728378
	valid_l1_mean_x_mean_u: 1.11731958389
	valid_l1_mean_x_min_u: 0.0
	valid_l1_min_x_max_u: 0.00201154523529
	valid_l1_min_x_mean_u: 2.67769883067e-06
	valid_l1_min_x_min_u: 0.0
	valid_l1_range_x_max_u: 44.7958450317
	valid_l1_range_x_mean_u: 11.1556034088
	valid_l1_range_x_min_u: 0.0
	valid_l1_row_norms_max: 1.88171386719
	valid_l1_row_norms_mean: 1.0790425539
	valid_l1_row_norms_min: 0.318085074425
	valid_l2_col_norms_max: 1.00000011921
	valid_l2_col_norms_mean: 0.99990695715
	valid_l2_col_norms_min: 0.999821484089
	valid_l2_max_x_max_u: 28.2311134338
	valid_l2_max_x_mean_u: 6.80506801605
	valid_l2_max_x_min_u: 0.0
	valid_l2_mean_x_max_u: 5.11453771591
	valid_l2_mean_x_mean_u: 0.917445898056
	valid_l2_mean_x_min_u: 0.0
	valid_l2_min_x_max_u: 0.209499493241
	valid_l2_min_x_mean_u: 0.000136710295919
	valid_l2_min_x_min_u: 0.0
	valid_l2_range_x_max_u: 28.2305011749
	valid_l2_range_x_mean_u: 6.80493116379
	valid_l2_range_x_min_u: 0.0
	valid_l2_row_norms_max: 1.72995507717
	valid_l2_row_norms_mean: 0.971546471119
	valid_l2_row_norms_min: 0.169245123863
	valid_l3_col_norms_max: 0.999982476234
	valid_l3_col_norms_mean: 0.99990695715
	valid_l3_col_norms_min: 0.999877750874
	valid_l3_max_x_max_u: 18.8667297363
	valid_l3_max_x_mean_u: 4.19889068604
	valid_l3_max_x_min_u: 0.0
	valid_l3_mean_x_max_u: 4.88687372208
	valid_l3_mean_x_mean_u: 0.681163072586
	valid_l3_mean_x_min_u: 0.0
	valid_l3_min_x_max_u: 0.875892281532
	valid_l3_min_x_mean_u: 0.00191287708003
	valid_l3_min_x_min_u: 0.0
	valid_l3_range_x_max_u: 18.8174877167
	valid_l3_range_x_mean_u: 4.19697713852
	valid_l3_range_x_min_u: 0.0
	valid_l3_row_norms_max: 1.79971063137
	valid_l3_row_norms_mean: 0.970829367638
	valid_l3_row_norms_min: 0.0710896328092
	valid_objective: 0.251421004534
	valid_y_col_norms_max: 0.231741145253
	valid_y_col_norms_mean: 0.231237098575
	valid_y_col_norms_min: 0.230733275414
	valid_y_max_max_class: 0.999943554401
	valid_y_mean_max_class: 0.878794968128
	valid_y_min_max_class: 0.51216840744
	valid_y_misclass: 0.0551999919116
	valid_y_nll: 0.176377370954
	valid_y_row_norms_max: 0.0190164204687
	valid_y_row_norms_mean: 0.00418718392029
	valid_y_row_norms_min: 0.000110655368189
Saving to saved_clf_v3.pkl...
Saving to saved_clf_v3.pkl done. Time elapsed: 27.756437 seconds
Time this epoch: 16.196871 seconds

In [ ]:
trn = DenseDesignMatrix(X=X_train, y=y_train)
tst = DenseDesignMatrix(X=X_test, y=y_test)
trainer.monitoring_dataset={'valid': tst,
                            'train': trn}
experiment.main_loop()

Ive saved the output of the experiment as 2 log files so we can plot the results:


In [316]:
with open("logg.txt", "r") as ins:
    score_test = []
    for line in ins:
        if len(line) > 2:
            score_test.append(line.split()[1])
            
with open("logg2.txt", "r") as ins:
    score_train = []
    for line in ins:
        if len(line) > 2:
            score_train.append(line.split()[1])

In [373]:
plt.plot(score_train)
plt.plot(score_test)


Out[373]:
[<matplotlib.lines.Line2D at 0x7f51b4cbb390>]

skipping the first iteration it becomes more clear the net error rate is still decreasing, so increasing the 500 epochs (taking an hour or so) to more should increase performance, at least until it will start overfitting (we would normally use a third dev set, to regulate this)


In [319]:
plt.plot(score_train[2:])
plt.plot(score_test[2:])


Out[319]:
[<matplotlib.lines.Line2D at 0x7f517c694450>]

PREDICTIONS

Ok now we got a working stacked RBM or Deeb Belief Net (DBN) which we trained ourselves on features extracted from a pretrained CNN.

Time to do some predictions on images it hasnt seen yet:


In [51]:
import sys
import os
import numpy as np
import cPickle as pickle

from pylearn2.utils import serial
from theano import tensor as T
from theano import function


Using gpu device 0: GRID K520

In [52]:
print "loading model..."
model = serial.load('saved_clf_v2.pkl')


loading model...

In [53]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# Make sure that caffe is on the python path:
caffe_root = '../'  # this file is expected to be in {caffe_root}/examples
import sys
sys.path.insert(0, caffe_root + 'python')

import caffe


#from decaf.util import transform
#from decaf.scripts import imagenet
import logging
import numpy as np
from glob import glob
import matplotlib.image as mpimg
from random import shuffle
import pickle

# Set the right path to your model definition file, pretrained model weights,
# and the image you would like to classify.
MODEL_FILE = '../models/bvlc_reference_caffenet/deploy.prototxt'
PRETRAINED = '../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'

def getfeat_single_image(image_path):
    logging.getLogger().setLevel(logging.INFO)
    caffe.set_mode_gpu()
    net = caffe.Classifier(MODEL_FILE, PRETRAINED,
                       mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1),
                       channel_swap=(2,1,0),
                       raw_scale=255,
                       image_dims=(256, 256))

      
    feature_info = activate(net, image_path)
    return feature_info

In [54]:
print "setting up symbolic expressions..."

X = model.get_input_space().make_theano_batch()
Y = model.fprop(X)
Y = T.argmax(Y, axis=1)

f = function([X], Y)

print "loading data and predicting..."


setting up symbolic expressions...
loading data and predicting...

In [57]:
feat = getfeat_single_image('images/cat.jpg') #run image through cnn > out: features of layer fc6
x = feat 
y = f([x]) #run feature through DBN > out: prediction
#y #0=cat
if y:
    print "WOOF!"
else:
    print "MEOW!"


MEOW!

In [58]:
feat = getfeat_single_image('images/dog.jpg')  #run image through cnn > out: features of layer fc6
x = feat
y = f([x]) #run feature through DBN > out: prediction
#y #1=dog
if y:
    print "WOOF!"
else:
    print "MEOW!"


WOOF!

In [367]:
#BATCH TEST
x = pickle.load(open('saved_feat_x_test_v2.pkl', 'rb'))
y = pickle.load(open('saved_feat_y_test_v2.pkl', 'rb'))
filenames = pickle.load(open('saved_feat_filenames_test_v2.pkl', 'rb'))

In [368]:
predicted = f(x)

In [369]:
#[0,1] to [1]
#[1,0] to [0]
out = np.zeros(len(y))
for n, i in enumerate(y):
    if i[1]:
        out[n] = 1
y = out

In [370]:
from sklearn.metrics import classification_report, confusion_matrix
target_names = ['cat', 'dog']
print(classification_report(y, predicted, target_names=target_names))


             precision    recall  f1-score   support

        cat       0.96      0.98      0.97      2461
        dog       0.98      0.96      0.97      2539

avg / total       0.97      0.97      0.97      5000

97% accuracy, after but an hour of training, nice!


CAT OR DOG TO THE TEST

I uploaded a picture of myself to imgur, lets try it with another one now to see if they match up:


In [72]:
import urllib

def imgur2catdog(url):
    #print url.split('/')[-1]
    urllib.urlretrieve(url,url.split('/')[-1])
    input_image = caffe.io.load_image(url.split('/')[-1])
    plt.imshow(input_image)
    feat = getfeat_single_image(url.split('/')[-1])  #run image through cnn > out: features of layer fc6
    x = feat
    y = f([x]) #run feature through DBN > out: prediction
    if y:
        print "WOOF I'm a Dog!"
    else:
        print "MEOW I'm a Cat!"

In [73]:
imgur2catdog("http://i.imgur.com/oMJyDO0.jpg") #earlier one while at pycon


WOOF I'm a Dog!

In [74]:
imgur2catdog("http://i.imgur.com/WaKDpDN.jpg") #one now


WOOF I'm a Dog!

Another life's mystery solved. Apparently I look more like a dog, than a cat.

What about you?


In [48]:
Image(url='http://image.slidesharecdn.com/catvsdogdlpycon15se-150512122612-lva1-app6891/95/deep-learning-as-a-catdog-detector-62-638.jpg?cb=1431434162')


Out[48]:

FIN