In [1]:
import keras
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
import numpy as np

import os
import wandb
from wandb.keras import WandbCallback
from PIL import Image
from matplotlib import pyplot as plt


Using TensorFlow backend.

In [2]:
run = wandb.init(project="Distillation",tensorboard=True)
config = run.config
config.dropout = 0.25
config.dense_layer_nodes = 100
config.learn_rate = 0.32  #0.01 
config.batch_size = 1024  #32
config.epochs = 50


W&B Run: https://app.wandb.ai/qualcomm/Distillation/runs/lx9bmpjk
Call `%%wandb` in the cell containing your training loop to display live results.

In [3]:
class_names = ['airplane','automobile','bird','cat','deer',
               'dog','frog','horse','ship','truck']
num_classes = len(class_names)

(X_train, y_train_original_label), (X_test, y_test) = cifar10.load_data()

# Convert class vectors to binary class matrices.
y_train_original_label = keras.utils.to_categorical(y_train_original_label, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

# Normalize values into [0 to 1] because all default assume zero to one
# We won't bother to fully sphere the data, removing median and divide by variance
X_train = X_train.astype('float32') / 255.
X_test = X_test.astype('float32') / 255.

In [4]:
y_train_softmax_output = np.load("y_train_softmax_output.npy")

In [5]:
# Define Emulation Model
# Note: We can set some of these at variables to reduce capacity 
model = Sequential() # Sets up model structure to pass data forward 
model.add(Conv2D(32, # Activation layers 
                 (3, 3), # Conv dim
                 padding='same', # Use padding to maintain same dims
                 input_shape=X_train.shape[1:], activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2))) # 16x16 dim per activation
model.add(Dropout(config.dropout)) # Add a dash of regularization (too taste)

# NOTE: Would be fun to try a 16x16xActivation conv to a 1x1x10 tensor
model.add(Flatten()) # Because dense layers like 1D vectors 
model.add(Dense(config.dense_layer_nodes, activation='relu'))
model.add(Dropout(config.dropout)) # A pinch more regularization 
model.add(Dense(num_classes, activation='softmax')) # Plate and serve

# NOTE: Could also try Adam at some point
opt = keras.optimizers.SGD(lr=config.learn_rate) # No momentum 

model.compile(loss='categorical_crossentropy', # Because one hot encoding
              optimizer=opt, # Per previous decision to not use momentum
              metrics=['accuracy']) # Easier to look at than cross entropy

In [6]:
data = X_train[0]
from matplotlib import pyplot as plt
plt.imshow(data, interpolation='nearest')
plt.show()



In [10]:
model2 = keras.models.load_model("lukas.h5")
y_train_softmax_output = model2.predict(X_train)
print(class_names)
y_train_softmax_output[0]


['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
Out[10]:
array([0.04264229, 0.00540979, 0.07433245, 0.20201543, 0.07983524,
       0.23577349, 0.24125147, 0.11060702, 0.00521307, 0.00291974],
      dtype=float32)

In [6]:
# Model 
# For batch size make sure it's big enough to leverage GPU parallelism 
#    As a basic rule you need to reduce learning rate as you reduce batch size
# NOTE: Will be interesting to optimize for training time a bit by tweaking batch size
model.fit(
        X_train, 
        y_train_softmax_output,
        batch_size=config.batch_size,
        # Will use a fixed set of epochs rather than a stopping criteria 
        epochs=config.epochs,
        validation_data=(X_test, y_test),
        # Make sure we can see the pastries while they bake
        callbacks=[WandbCallback(data_type="image", labels=class_names)]
)


wandb: Wandb version 0.7.2 is available!  To upgrade, please run:
wandb:  $ pip install wandb --upgrade
Train on 50000 samples, validate on 10000 samples
Epoch 1/50
50000/50000 [==============================] - 5s 110us/step - loss: 2.2905 - acc: 0.5324 - val_loss: 2.3056 - val_acc: 0.1059
Epoch 2/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2870 - acc: 0.6352 - val_loss: 2.3029 - val_acc: 0.1084
Epoch 3/50
50000/50000 [==============================] - 3s 55us/step - loss: 2.2866 - acc: 0.6830 - val_loss: 2.3013 - val_acc: 0.1092
Epoch 4/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2863 - acc: 0.7110 - val_loss: 2.3005 - val_acc: 0.1097
Epoch 5/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2862 - acc: 0.7287 - val_loss: 2.2999 - val_acc: 0.1094
Epoch 6/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2861 - acc: 0.7406 - val_loss: 2.2992 - val_acc: 0.1090
Epoch 7/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2860 - acc: 0.7520 - val_loss: 2.2989 - val_acc: 0.1088
Epoch 8/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2860 - acc: 0.7593 - val_loss: 2.2986 - val_acc: 0.1095
Epoch 9/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2860 - acc: 0.7659 - val_loss: 2.2985 - val_acc: 0.1093
Epoch 10/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2859 - acc: 0.7703 - val_loss: 2.2983 - val_acc: 0.1091
Epoch 11/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2859 - acc: 0.7766 - val_loss: 2.2979 - val_acc: 0.1090
Epoch 12/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2859 - acc: 0.7800 - val_loss: 2.2978 - val_acc: 0.1090
Epoch 13/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2859 - acc: 0.7828 - val_loss: 2.2975 - val_acc: 0.1086
Epoch 14/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2858 - acc: 0.7853 - val_loss: 2.2975 - val_acc: 0.1093
Epoch 15/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2859 - acc: 0.7903 - val_loss: 2.2971 - val_acc: 0.1093
Epoch 16/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2859 - acc: 0.7911 - val_loss: 2.2972 - val_acc: 0.1101
Epoch 17/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2858 - acc: 0.7955 - val_loss: 2.2969 - val_acc: 0.1101
Epoch 18/50
50000/50000 [==============================] - 3s 60us/step - loss: 2.2859 - acc: 0.7956 - val_loss: 2.2969 - val_acc: 0.1108
Epoch 19/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2858 - acc: 0.7963 - val_loss: 2.2966 - val_acc: 0.1104
Epoch 20/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2858 - acc: 0.7982 - val_loss: 2.2968 - val_acc: 0.1115
Epoch 21/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2858 - acc: 0.7999 - val_loss: 2.2964 - val_acc: 0.1114
Epoch 22/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2858 - acc: 0.8020 - val_loss: 2.2968 - val_acc: 0.1116
Epoch 23/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2858 - acc: 0.8034 - val_loss: 2.2962 - val_acc: 0.1117
Epoch 24/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2858 - acc: 0.8043 - val_loss: 2.2964 - val_acc: 0.1119
Epoch 25/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2857 - acc: 0.8070 - val_loss: 2.2959 - val_acc: 0.1119
Epoch 26/50
50000/50000 [==============================] - 3s 55us/step - loss: 2.2857 - acc: 0.8085 - val_loss: 2.2961 - val_acc: 0.1119
Epoch 27/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2858 - acc: 0.8083 - val_loss: 2.2958 - val_acc: 0.1119
Epoch 28/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2857 - acc: 0.8126 - val_loss: 2.2960 - val_acc: 0.1122
Epoch 29/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2857 - acc: 0.8108 - val_loss: 2.2956 - val_acc: 0.1121
Epoch 30/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2857 - acc: 0.8133 - val_loss: 2.2959 - val_acc: 0.1135
Epoch 31/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2857 - acc: 0.8137 - val_loss: 2.2957 - val_acc: 0.1133
Epoch 32/50
50000/50000 [==============================] - 3s 59us/step - loss: 2.2857 - acc: 0.8174 - val_loss: 2.2953 - val_acc: 0.1131
Epoch 33/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2857 - acc: 0.8155 - val_loss: 2.2959 - val_acc: 0.1138
Epoch 34/50
50000/50000 [==============================] - 3s 57us/step - loss: 2.2856 - acc: 0.8169 - val_loss: 2.2954 - val_acc: 0.1134
Epoch 35/50
50000/50000 [==============================] - 3s 58us/step - loss: 2.2857 - acc: 0.8188 - val_loss: 2.2966 - val_acc: 0.1147
Epoch 36/50
50000/50000 [==============================] - 3s 63us/step - loss: 2.2857 - acc: 0.8187 - val_loss: 2.2949 - val_acc: 0.1137
Epoch 37/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2856 - acc: 0.8192 - val_loss: 2.2952 - val_acc: 0.1141
Epoch 38/50
50000/50000 [==============================] - 3s 55us/step - loss: 2.2856 - acc: 0.8213 - val_loss: 2.2947 - val_acc: 0.1141
Epoch 39/50
50000/50000 [==============================] - 3s 54us/step - loss: 2.2856 - acc: 0.8216 - val_loss: 2.2951 - val_acc: 0.1146
Epoch 40/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2856 - acc: 0.8209 - val_loss: 2.2946 - val_acc: 0.1146
Epoch 41/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2856 - acc: 0.8228 - val_loss: 2.2953 - val_acc: 0.1153
Epoch 42/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2856 - acc: 0.8243 - val_loss: 2.2946 - val_acc: 0.1145
Epoch 43/50
50000/50000 [==============================] - 3s 54us/step - loss: 2.2856 - acc: 0.8233 - val_loss: 2.2955 - val_acc: 0.1155
Epoch 44/50
50000/50000 [==============================] - 3s 55us/step - loss: 2.2856 - acc: 0.8244 - val_loss: 2.2946 - val_acc: 0.1151
Epoch 45/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2856 - acc: 0.8246 - val_loss: 2.2944 - val_acc: 0.1148
Epoch 46/50
50000/50000 [==============================] - 3s 56us/step - loss: 2.2856 - acc: 0.8245 - val_loss: 2.2951 - val_acc: 0.1159
Epoch 47/50
50000/50000 [==============================] - 3s 55us/step - loss: 2.2855 - acc: 0.8262 - val_loss: 2.2946 - val_acc: 0.1155
Epoch 48/50
50000/50000 [==============================] - 3s 55us/step - loss: 2.2856 - acc: 0.8269 - val_loss: 2.2944 - val_acc: 0.1155
Epoch 49/50
50000/50000 [==============================] - 3s 55us/step - loss: 2.2856 - acc: 0.8283 - val_loss: 2.2945 - val_acc: 0.1159
Epoch 50/50
50000/50000 [==============================] - 3s 61us/step - loss: 2.2855 - acc: 0.8292 - val_loss: 2.2942 - val_acc: 0.1153
Out[6]:
<keras.callbacks.History at 0x7f2be50fd4e0>

In [ ]: