In [1]:
from __future__ import print_function
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.callbacks import ModelCheckpoint, EarlyStopping, LambdaCallback
from keras.optimizers import Adam

import numpy as np
import matplotlib.pyplot as plt

# reproducibility
np.random.seed(31337)


Using TensorFlow backend.

In [2]:
import h5py
import numpy as np
with h5py.File("ResNet50-300x300-MaxPooling_codes-train.h5.h5") as hf:
    X_train = hf["X_train"][:]
    Y_train = hf["Y_train"][:]
    X_valid = hf["X_valid"][:]
    Y_valid = hf["Y_valid"][:]
    

# with h5py.File("ResNet50-300x300_codes-test.h5") as hf:
#      X_test = hf["X_test"][:]

In [3]:
model = Sequential()
model.add(Dropout(0.5, input_shape=(2048,)))
model.add(Dense(256, activation='relu', input_dim=2048))
model.add(Dropout(0.5))
model.add(Dense(2, activation="softmax"))

# Callbacks
early_stop_cb = EarlyStopping(monitor='val_loss', patience=20, verbose=1)

checkpoit_cb = ModelCheckpoint("ResNet-head-MaxPooling-Droput0.5-Dense256-Dropout.5-Dense2.h5", save_best_only=True)

# Print the batch number at the beginning of every batch.
batch_print_cb = LambdaCallback(on_batch_begin=lambda batch, logs: print(".",end=''), 
                                on_epoch_end=lambda batch, logs: print(batch))

# Plot the loss after every epoch.
plot_loss_cb = LambdaCallback(on_epoch_end=lambda epoch, logs: 
                              print (epoch, logs))
                              #plt.plot(np.arange(epoch), logs['loss']))


model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.0001),
              metrics=['accuracy'],
             )

model.summary()
X_train.shape[1:]


____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
dropout_1 (Dropout)              (None, 2048)          0           dropout_input_1[0][0]            
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 256)           524544      dropout_1[0][0]                  
____________________________________________________________________________________________________
dropout_2 (Dropout)              (None, 256)           0           dense_1[0][0]                    
____________________________________________________________________________________________________
dense_2 (Dense)                  (None, 2)             514         dropout_2[0][0]                  
====================================================================================================
Total params: 525,058
Trainable params: 525,058
Non-trainable params: 0
____________________________________________________________________________________________________
Out[3]:
(2048,)

In [4]:
history = model.fit(
        X_train,
        Y_train,
        nb_epoch=50,
        batch_size=1024,
        validation_data=(X_valid,Y_valid),
        callbacks=[early_stop_cb, checkpoit_cb, batch_print_cb, plot_loss_cb],
        verbose=0
        )


.......................0
0 {'acc': 0.80639679311973567, 'loss': 0.45091770544094306, 'val_acc': 0.97499997806549077, 'val_loss': 0.073657535493373866}
.......................1
1 {'acc': 0.94731796525434664, 'loss': 0.14339577168443113, 'val_acc': 0.98850000476837163, 'val_loss': 0.043820184201002123}
.......................2
2 {'acc': 0.96461719455030825, 'loss': 0.097655106839910202, 'val_acc': 0.98949994897842408, 'val_loss': 0.035181591242551803}
.......................3
3 {'acc': 0.96858250908594179, 'loss': 0.084867911505433713, 'val_acc': 0.99049994897842408, 'val_loss': 0.031391251981258389}
.......................4
4 {'acc': 0.97363719656460268, 'loss': 0.076644140496526, 'val_acc': 0.99049997806549073, 'val_loss': 0.028946294158697129}
.......................5
5 {'acc': 0.97633883862346027, 'loss': 0.064423220648909041, 'val_acc': 0.99049997806549073, 'val_loss': 0.027187058553099632}
.......................6
6 {'acc': 0.97795111002488422, 'loss': 0.063578732928576159, 'val_acc': 0.99099997806549067, 'val_loss': 0.026731805160641671}
.......................7
7 {'acc': 0.97821255903980808, 'loss': 0.058678351615066286, 'val_acc': 0.99049997138977053, 'val_loss': 0.027386727213859558}
.......................8
8 {'acc': 0.98026057913275433, 'loss': 0.056284487428463974, 'val_acc': 0.99099998474121098, 'val_loss': 0.025216111794114114}
.......................9
9 {'acc': 0.98039130406876507, 'loss': 0.053739124655079448, 'val_acc': 0.99149998474121093, 'val_loss': 0.024568733006715776}
.......................10
10 {'acc': 0.98191642470336737, 'loss': 0.053319813972980641, 'val_acc': 0.99050000715255737, 'val_loss': 0.025012878626585008}
.......................11
11 {'acc': 0.98379014483401606, 'loss': 0.047547251797095381, 'val_acc': 0.99050000715255737, 'val_loss': 0.024797564804553987}
.......................12
12 {'acc': 0.98374656885713008, 'loss': 0.047220901235038117, 'val_acc': 0.99099997806549067, 'val_loss': 0.024319105103611946}
.......................13
13 {'acc': 0.98200357484944256, 'loss': 0.049131083982399314, 'val_acc': 0.99049997138977053, 'val_loss': 0.025154305726289749}
.......................14
14 {'acc': 0.9832236710636334, 'loss': 0.044890941009772797, 'val_acc': 0.99149997806549073, 'val_loss': 0.024387926608324052}
.......................15
15 {'acc': 0.98422589366838786, 'loss': 0.045373114055856402, 'val_acc': 0.99149997806549073, 'val_loss': 0.024445223793387413}
.......................16
16 {'acc': 0.9833543957139449, 'loss': 0.046482953707097041, 'val_acc': 0.99099997806549067, 'val_loss': 0.024557276666164397}
.......................17
17 {'acc': 0.98405159413463916, 'loss': 0.044905681991762592, 'val_acc': 0.99099997138977047, 'val_loss': 0.02460703009366989}
.......................18
18 {'acc': 0.9839208690557788, 'loss': 0.043235888752788131, 'val_acc': 0.99149997806549073, 'val_loss': 0.023995228201150895}
.......................19
19 {'acc': 0.98453091770959855, 'loss': 0.041675192349367118, 'val_acc': 0.99099997138977047, 'val_loss': 0.023940287292003631}
.......................20
20 {'acc': 0.98531526589716711, 'loss': 0.040198870953416753, 'val_acc': 0.99099997138977047, 'val_loss': 0.023648005113005639}
.......................21
21 {'acc': 0.98514096636341841, 'loss': 0.039765241327431963, 'val_acc': 0.99149997138977053, 'val_loss': 0.02473266038298607}
.......................22
22 {'acc': 0.98540241566404152, 'loss': 0.038191228455517034, 'val_acc': 0.99099997806549067, 'val_loss': 0.022750230342149735}
.......................23
23 {'acc': 0.98592531355103974, 'loss': 0.037728060214648015, 'val_acc': 0.99149997138977053, 'val_loss': 0.023755105942487718}
.......................24
24 {'acc': 0.98714541071582984, 'loss': 0.036030988707989771, 'val_acc': 0.99149997138977053, 'val_loss': 0.024768452376127244}
.......................25
25 {'acc': 0.98601246265301423, 'loss': 0.037949804229934291, 'val_acc': 0.99099997138977047, 'val_loss': 0.023459761336445808}
.......................26
26 {'acc': 0.98731970929897939, 'loss': 0.034938688643393244, 'val_acc': 0.99099997806549067, 'val_loss': 0.022891785174608232}
.......................27
27 {'acc': 0.98640463688964808, 'loss': 0.03742129741086981, 'val_acc': 0.99150000047683717, 'val_loss': 0.024053938537836075}
.......................28
28 {'acc': 0.98705826094895543, 'loss': 0.033227897149208062, 'val_acc': 0.99149997138977053, 'val_loss': 0.023941186517477037}
.......................29
29 {'acc': 0.9860124630322149, 'loss': 0.037086576674810613, 'val_acc': 0.99149997138977053, 'val_loss': 0.023491719126701355}
.......................30
30 {'acc': 0.98675323690774475, 'loss': 0.035533751670917713, 'val_acc': 0.99149997138977053, 'val_loss': 0.024006312429904936}
.......................31
31 {'acc': 0.98801690852742319, 'loss': 0.035668669015823655, 'val_acc': 0.99199998474121098, 'val_loss': 0.022508122503757475}
.......................32
32 {'acc': 0.98745043518558928, 'loss': 0.034280362545202447, 'val_acc': 0.99149997138977053, 'val_loss': 0.023744353324174881}
.......................33
33 {'acc': 0.98779903368168842, 'loss': 0.033165315082435115, 'val_acc': 0.99099997806549067, 'val_loss': 0.022942488223314284}
.......................34
34 {'acc': 0.98853980727151902, 'loss': 0.031307677809265744, 'val_acc': 0.99149997138977053, 'val_loss': 0.023869678795337676}
.......................35
35 {'acc': 0.98801690838457357, 'loss': 0.032822256963743072, 'val_acc': 0.99149997138977053, 'val_loss': 0.02416867208480835}
.......................36
36 {'acc': 0.98806048326801077, 'loss': 0.032289696605966589, 'val_acc': 0.99099997138977047, 'val_loss': 0.022792108327150343}
.......................37
37 {'acc': 0.98875768073810577, 'loss': 0.030812892592156773, 'val_acc': 0.99149997138977053, 'val_loss': 0.02413123717904091}
.......................38
38 {'acc': 0.98788618359141234, 'loss': 0.032069981700415973, 'val_acc': 0.99099997138977047, 'val_loss': 0.023129903808236121}
.......................39
39 {'acc': 0.98810405786574873, 'loss': 0.031777174466854609, 'val_acc': 0.99149997806549073, 'val_loss': 0.022920195370912552}
.......................40
40 {'acc': 0.98840908247835779, 'loss': 0.030667361674260624, 'val_acc': 0.99150000047683717, 'val_loss': 0.023462078809738159}
.......................41
41 {'acc': 0.98801690767032557, 'loss': 0.031924985060719523, 'val_acc': 0.99099997138977047, 'val_loss': 0.022733698457479478}
.......................42
42 {'acc': 0.98827835811374543, 'loss': 0.030188729389177372, 'val_acc': 0.99099997138977047, 'val_loss': 0.022396552309393882}
.......................43
43 {'acc': 0.98888840524556776, 'loss': 0.029818711073830436, 'val_acc': 0.99149997138977053, 'val_loss': 0.022976946115493776}
.......................44
44 {'acc': 0.98827835811374543, 'loss': 0.031533386694488401, 'val_acc': 0.99049997138977053, 'val_loss': 0.021872592717409135}
.......................45
45 {'acc': 0.98880125700069088, 'loss': 0.030543940336510811, 'val_acc': 0.99099997138977047, 'val_loss': 0.022791428744792938}
.......................46
46 {'acc': 0.98910628061335282, 'loss': 0.029388248303427799, 'val_acc': 0.99049997138977053, 'val_loss': 0.022268221199512481}
.......................47
47 {'acc': 0.98849623238808182, 'loss': 0.029255988125027957, 'val_acc': 0.99099997138977047, 'val_loss': 0.022793246760964395}
.......................48
48 {'acc': 0.98971632898147344, 'loss': 0.028469023585437694, 'val_acc': 0.99099998474121098, 'val_loss': 0.022096894651651381}
.......................49
49 {'acc': 0.98980347874834784, 'loss': 0.027502563564150082, 'val_acc': 0.99149997806549073, 'val_loss': 0.023374635756015779}

In [ ]:


In [5]:
score=model.evaluate(X_valid,Y_valid, verbose=0)
print("OOS %s: %.2f%%" % (model.metrics_names[1], score[1]*100))
print("OOS %s: %.2f" % (model.metrics_names[0], score[0]))

#print("min(val los)",np.min(history.history['val_loss']))


OOS acc: 99.15%
OOS loss: 0.02

In [6]:
# summarize history for accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'val'], loc='lower right')
plt.show()


# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss (log scale)')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'val'], loc='upper right')
plt.yscale('log')
plt.show()



In [10]:
from keras.models import load_model
from sklearn.metrics import log_loss

model = load_model("ResNet-head-MaxPooling-Droput0.5-Dense256-Dropout.5-Dense2.h5")

with h5py.File("ResNet50-300x300_codes-test.h5") as hf:
     X_test = hf["X_test"][:]

In [43]:
Y_train_preds=model.predict(X_train)
print(log_loss(Y_train,Y_train_preds))
Y_valid_preds=model.predict(X_valid)
print(log_loss(Y_valid,Y_valid_preds))


0.0143633059447
0.0233746300862

In [44]:
for i in range(1,10):
    m=i/100.0
    print(m,log_loss(Y_valid,Y_valid_preds.clip(min=m, max=1-m)))
    
for i in range(1,10):
    m=i/100.0
    print(m,log_loss(Y_train,Y_train_preds.clip(min=m, max=1-m)))


0.01 0.032057334451
0.02 0.0414041152112
0.03 0.0510260035256
0.04 0.0608722185642
0.05 0.0707928659115
0.06 0.080850737378
0.07 0.0910736187845
0.08 0.101398083486
0.09 0.11180152848
0.01 0.0229877226971
0.02 0.0323324166134
0.03 0.0419771314386
0.04 0.0518076363958
0.05 0.0618059708603
0.06 0.0719639763921
0.07 0.0822625953877
0.08 0.0927030584339
0.09 0.103277921216

In [35]:
import re
datagen = ImageDataGenerator()
test_batches = datagen.flow_from_directory("test", model.input_shape[1:3], shuffle=False, batch_size=32, class_mode=None)

ids = [re.split('/|\.',x)[1] for x in test_batches.filenames]


Found 12500 images belonging to 1 classes.

In [29]:
Y_test = model.predict(X_test)

In [42]:
Y_test_csv=np.column_stack((ids,Y_test[:,1]))
np.savetxt('Y_test_ResNet-head-Droput0.5-Dense256-Dropout.5-Dense2.csv',Y_test_csv, fmt="%s,%s", header=("id,label"),comments='')

In [45]:
Y_test_csv=np.column_stack((ids,Y_test[:,1].clip(min=0.02, max=0.98)))
np.savetxt('Y_test_ResNet-head-Droput0.5-Dense256-Dropout.5-Dense2-clipped.csv',Y_test_csv, fmt="%s,%s", header=("id,label"),comments='')

In [ ]: