In [2]:
import dogs_vs_cats as dvc
all_files = dvc.image_files()
In [3]:
# load model without top layer
n_images_train=500
n_images_test=500
input_image_shape = (3,224,224)
train_features, train_labels,train_files, \
test_features, test_labels, test_files = dvc.training_test_datasets(all_files,
n_images_train,n_images_test,
input_image_shape)
In [4]:
from keras.applications.imagenet_utils import preprocess_input
# load_img from keras.preprocessing loads the images in [0,255] scale
train_features*=255
test_features*=255
train_features = preprocess_input(train_features)
test_features = preprocess_input(test_features)
In [5]:
from keras.applications.vgg16 import VGG16
from keras.models import Model
base_model = VGG16(weights='imagenet')
model_conv_vgg = Model(input=base_model.input, output=base_model.get_layer('flatten').output)
train_features_convs = model_conv_vgg.predict(train_features,verbose=1)
In [6]:
test_features_convs = model_conv_vgg.predict(test_features,verbose=1)
In [7]:
model_conv_vgg.output_shape
Out[7]:
In [8]:
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping
from keras.layers import Dense
model_fc_vgg = Sequential([
Dense(4096, activation='relu', name='fc1',input_dim=train_features_convs.shape[1]),
Dense(4096, activation='relu', name='fc2'),
Dense(1, activation='sigmoid', name='predictions_new')
])
# Copy to weights to have them as an initialization
model_fc_vgg.get_layer('fc1').set_weights([w for w in base_model.get_layer("fc1").get_weights()])
model_fc_vgg.get_layer('fc2').set_weights([w for w in base_model.get_layer("fc2").get_weights()])
model_fc_vgg.get_layer('fc1').trainable = False
model_fc_vgg.get_layer('fc2').trainable = True
In [9]:
model_fc_vgg.summary()
In [10]:
model_fc_vgg.compile(optimizer="adam",
loss='binary_crossentropy',metrics=['accuracy'])
nb_epoch=80
print("Model compiled, start training")
early_stopping_callback = EarlyStopping(monitor='val_loss', min_delta=0, patience=5,
verbose=0, mode='auto')
history = model_fc_vgg.fit(train_features_convs,
train_labels,validation_split=.1,
batch_size=32, nb_epoch=nb_epoch,verbose=2,callbacks=[early_stopping_callback])
In [13]:
results = model_fc_vgg.evaluate(test_features_convs,test_labels)
print(" ".join(["%s: %.4f"%(metric_name,valor) for metric_name,valor in zip(model_fc_vgg.metrics_names,results)]))
In [15]:
preds = model_fc_vgg.predict(test_features_convs,verbose=1)
%matplotlib inline
dvc.plotROC(test_labels,preds)