In [1]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from keras.utils import np_utils
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D, AveragePooling2D
from keras.optimizers import Adam
import glob
from PIL import Image
import keras
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
from keras.utils import np_utils
from keras.layers.core import Flatten, Dense, Dropout, Lambda
In [2]:
from keras.preprocessing import image
BATCH_SIZE = 64
PATH="data/"
def get_fit_sample():
gen = image.ImageDataGenerator()
sample_batches = gen.flow_from_directory(PATH+'valid', target_size=(224,224),
class_mode='categorical', shuffle=False, batch_size=1000)
imgs, labels = next(sample_batches)
return imgs
gen = image.ImageDataGenerator(featurewise_std_normalization=True)
gen.fit(get_fit_sample())
val_batches = gen.flow_from_directory(PATH+'valid', target_size=(224,224),
class_mode='categorical', shuffle=True, batch_size=BATCH_SIZE)
gen = image.ImageDataGenerator(featurewise_std_normalization=True, horizontal_flip=True, channel_shift_range=100, zoom_range=0.5)
gen.fit(get_fit_sample())
batches = gen.flow_from_directory(PATH+'train', target_size=(224,224),
class_mode='categorical', shuffle=True, batch_size=BATCH_SIZE)
# from utils import plots
#imgs,labels = next(batches)
#plots(imgs[:2])
In [ ]:
In [3]:
CLASSES = 2
INPUT_SHAPE = (224,224,3)
model = Sequential()
# Block 1
model.add(Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1', input_shape=INPUT_SHAPE))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2'))
model.add(MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool'))
# Block 2
model.add(Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1'))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2'))
model.add(MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool'))
# Block 3
model.add(Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1'))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2'))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3'))
model.add(MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool'))
# Block 4
model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1'))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2'))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3'))
model.add(MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool'))
# Block 5
model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1'))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2'))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3'))
model.add(MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool'))
# Classification block
model.add(Flatten(name='flatten'))
model.add(Dense(4096, activation='relu', name='fc1'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu', name='fc2'))
model.add(Dropout(0.5))
model.add(Dense(CLASSES, activation='softmax', name='predictions'))
from keras.optimizers import SGD
sgd = SGD(lr=0.01, decay=0.0005, momentum=0.9, nesterov=False)
model.compile(optimizer=sgd, loss='mean_squared_error', metrics=['accuracy'])
In [4]:
%%time
hist = model.fit_generator(batches, steps_per_epoch=1000, epochs=10, validation_data=val_batches, validation_steps=1000)
model.save('ConvNet-D-vgg16-large-dataset.h5')
# http://qiita.com/TypeNULL/items/4e4d7de11ab4361d6085
loss = hist.history['loss']
val_loss = hist.history['val_loss']
nb_epoch = len(loss)
plt.plot(range(nb_epoch), loss, marker='.', label='loss')
plt.plot(range(nb_epoch), val_loss, marker='.', label='val_loss')
plt.legend(loc='best', fontsize=10)
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
10 Epochまで行って、ConvNet-D-vgg16-large-dataset ほど性能が出ていない。 25 Epochまで、実行してみる
In [14]:
%%time
from keras.models import load_model
#model = load_model('ConvNet-D-vgg16-large-dataset.h5')
hist2 = model.fit_generator(batches, steps_per_epoch=1000, epochs=15, validation_data=val_batches, validation_steps=1000)
model.save('ConvNet-D-vgg16-large-dataset_2.h5')
import utils
utils.plot_hist(hist2)
In [22]:
import bcolz
#https://github.com/fastai/courses/blob/master/deeplearning1/nbs/utils.py#L175
def save_array(fname, arr):
c=bcolz.carray(arr, rootdir=fname, mode='w')
c.flush()
save_array("hist.dat", hist.history)
save_array("hist2.dat", hist2.history)
In [26]:
# http://qiita.com/TypeNULL/items/4e4d7de11ab4361d6085
loss = hist.history['loss'] + hist2.history['loss']
val_loss = hist.history['val_loss'] + hist2.history['val_loss']
nb_epoch = len(loss)
plt.plot(range(nb_epoch), loss, marker='.', label='loss')
plt.plot(range(nb_epoch), val_loss, marker='.', label='val_loss')
plt.legend(loc='best', fontsize=10)
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
In [27]:
%%time
# Prediction
gen = image.ImageDataGenerator(featurewise_std_normalization=True)
gen.fit(get_fit_sample())
test_batches = gen.flow_from_directory(PATH+'test', target_size=(224,224),
class_mode=None, shuffle=False, batch_size=BATCH_SIZE)
print(test_batches.samples)
preds = model.predict_generator(test_batches, test_batches.samples / BATCH_SIZE, verbose=1)
In [28]:
filenames = test_batches.filenames
isdog = preds[:,1]
isdog_clipped = isdog.clip(min=0.05, max=0.95)
ids = np.array([int(f[8:f.find('.')]) for f in filenames])
subm = np.stack([ids,isdog_clipped], axis=1)
subm[:5]
from IPython.display import FileLink
np.savetxt(PATH + "results/submission3_aug.csv", subm, fmt='%d,%.5f', header='id,label', comments='')
FileLink(PATH + "results/submission3_aug.csv")
Out[28]:
In [ ]: