In [1]:
import numpy as np
import os
from IPython.display import display
from matplotlib import pyplot as plt
from sklearn.svm import LinearSVC
%matplotlib inline
In [2]:
from importlib import reload
import naive_keras
reload(naive_keras)
from naive_keras import Sequential, Conv2D, MaxPooling2D, ZeroPadding2D, Dense
In [3]:
model = Sequential(Conv2D(5, input_shape=(None, 20, 20, 3)),
MaxPooling2D(),
ZeroPadding2D(),
Conv2D(5))
In [4]:
x = np.random.randn(10,20,20,3)
y = model.predict(x)
In [5]:
model.layers[0].save_memory = True
model.layers[-1].save_memory = True
y2 = model.predict(x)
In [6]:
np.allclose(y, y2)
Out[6]:
In [2]:
from importlib import reload
import naive_keras
reload(naive_keras)
from naive_keras import Sequential, Conv2D, MaxPooling2D, ZeroPadding2D
model = Sequential(ZeroPadding2D(input_shape=(None, 56, 56, 3)),
Conv2D(20),
ZeroPadding2D(),
Conv2D(20),
ZeroPadding2D(),
Conv2D(20),
ZeroPadding2D(),
Conv2D(20),
ZeroPadding2D(),
Conv2D(20),
ZeroPadding2D(),
Conv2D(20))
model.folder = '/home/spi/nbs/input/train/'
In [3]:
model.summary()
In [4]:
svms = model.initialize_by_SVM('/home/spi/nbs/input/train/', batch_size=20)
In [ ]:
np.expand_dims()
In [227]:
pics,labels = model.load_random_input(10, model.layers[0].input_shape[1:])
In [239]:
x = model.predict(pics, up_to_layer=model.layers[1])
In [228]:
y = model.predict(pics)
In [229]:
(y.reshape(-1,y.shape[-1])==0).mean(axis=0)
Out[229]:
In [241]:
j = 3
plt.imshow(((pics[j]+2)*64).astype(np.uint8))
Out[241]:
In [245]:
n = int(np.ceil(model.layers[1].output_shape[-1] / 5))
f, axes = plt.subplots(n,5,figsize=(15,3*n+2))
for i in range(model.layers[1].output_shape[-1]):
axes[i//5,i%5].imshow(x[j,:,:,i])
In [248]:
plt.hist(np.log10(x.flatten()+1e-5))
Out[248]:
In [237]:
n = int(np.ceil(model.layers[-1].output_shape[-1] / 5))
f, axes = plt.subplots(n,5,figsize=(15,3*n+2))
for i in range(model.layers[-1].output_shape[-1]):
if n > 1:
axes[i//5,i%5].imshow(y[j,:,:,i])
else:
axes[i].imshow(y[j,:,:,i])
In [249]:
plt.hist(np.log10(y.flatten()+1e-5))
Out[249]:
Now should implement a fully connected layer on top with usual softmax and backpropagation to check if it really learns anything. As it's just one FC layer it's a quadratic problem, SGD will work fine.
Probably can simply use sklearn.linear_model.SGDClassifier with partial_fit...
In [9]:
reload(naive_keras)
from naive_keras import Dense, Sequential
linear = Sequential(Dense(2, activation='softmax', input_shape=(None, 56, 56, 3)))
In [10]:
linear.summary()
In [11]:
svms = linear.initialize_by_SVM(train_folder = '/home/spi/nbs/input/train/',
valid_folder='/home/spi/nbs/input/valid/',
recompute=False, final_epochs=5)
In [3]:
reload(naive_keras)
from naive_keras import Sequential, Dense
two_layers = Sequential(Dense(10, input_shape=(None, 56, 56, 3)),
Dense(2, activation='softmax'))
In [4]:
two_layers.summary()
In [5]:
svms = two_layers.initialize_by_SVM(train_folder = '/home/spi/nbs/input/train/',
valid_folder='/home/spi/nbs/input/valid/')
In [26]:
two_layers.layers[1].input_shape
Out[26]:
In [7]:
from importlib import reload
import naive_keras
reload(naive_keras)
from naive_keras import Sequential, Conv2D, MaxPooling2D, ZeroPadding2D, Dense
model = Sequential(ZeroPadding2D(input_shape=(None, 56, 56, 3)),
Conv2D(40),
ZeroPadding2D(),
Conv2D(40),
MaxPooling2D(),
ZeroPadding2D(),
Conv2D(60),
ZeroPadding2D(),
Conv2D(60),
MaxPooling2D(),
ZeroPadding2D(),
Conv2D(80),
ZeroPadding2D(),
Conv2D(80),
MaxPooling2D(),
Dense(2, activation='softmax')
)
model.folder = '/home/spi/nbs/input/train/'
In [8]:
model.summary()
In [9]:
svms = model.initialize_by_SVM(train_folder = '/home/spi/nbs/input/train/',
valid_folder='/home/spi/nbs/input/valid/',
final_epochs=5)
In [12]:
from naive_keras import save_array
In [50]:
reload(naive_keras)
from naive_keras import save_weights, fit_only_last, Sequential, Dense, Conv2D, ZeroPadding2D, MaxPooling2D
In [51]:
model2 = Sequential(ZeroPadding2D(input_shape=(None, 56, 56, 3)),
Conv2D(40),
ZeroPadding2D(),
Conv2D(40),
MaxPooling2D(),
ZeroPadding2D(),
Conv2D(60),
ZeroPadding2D(),
Conv2D(60),
MaxPooling2D(),
ZeroPadding2D(),
Conv2D(80),
ZeroPadding2D(),
Conv2D(80),
MaxPooling2D(),
Dense(2, activation='softmax')
)
In [52]:
model2.load_weights('/home/spi/nbs/model_weights/first_cnn_with_svm')
In [53]:
model2.fit_only_last(train_folder = '/home/spi/nbs/input/train/',
valid_folder='/home/spi/nbs/input/valid/', epochs=50, recompute=False)
Out[53]:
In [25]:
m = model
for l in m.layers:
if isinstance(l, Dense) and [l1 for l1 in m.layers if isinstance(l1, Dense)][::-1].index(l) == 0:
print(l)
In [54]:
model2.save_weights('/home/spi/nbs/model_weights/second_cnn_with_svm')
In [16]:
space = 0
for l in model.layers:
try:
l.weights
except:
pass
else:
space += l.weights[0].size + l.weights[1].size
In [18]:
space * 8 /1e6
Out[18]: