{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"!unzip ../input/dogs-vs-cats-redux-kernels-edition/train.zip -d train\n!unzip ../input/dogs-vs-cats-redux-kernels-edition/test.zip -d test","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nimport re\nfrom keras.applications import MobileNetV2\nfrom keras.applications.mobilenet_v2 import preprocess_input\nfrom keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array\nfrom keras.optimizers import RMSprop\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Flatten, GlobalAveragePooling2D\nimport pandas as pd\n\nimport os\nprint(os.getcwd())\nfor thisdir, dirnames, filenames in os.walk('.',topdown=True):\n    for dirname in dirnames:\n        print(os.path.join(thisdir, dirname))\n\ntrain_dir = 'train/train/'\ntest_dir = 'test/test/'\nweights_dir = '../input/keras-pretrain-model-weights/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_224_no_top.h5'\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"## Input data ##\ntarget_size = (224,224,3)\nclasses = ['cat','dog']\nbatch_size = 100\n\npdata = pd.Series(os.listdir(train_dir))\npdata = pd.concat([pdata,pdata.map(lambda x: x[:3])],axis=1)\npdata.columns = ['filename','class']\npdata = pdata.sample(frac=1).reset_index(drop=True) # shuffle rows\npdata.to_csv('catdog_trainfiles.csv', index=False)\npdata.head()\n\nval_split = round(0.8*len(pdata))\nprint(val_split)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## Transfer learning ##\ngenerator = ImageDataGenerator(preprocessing_function=preprocess_input, horizontal_flip=True, width_shift_range=5, height_shift_range=5)#, rotation_range=5\ntrain_generator = generator.flow_from_dataframe(pdata, class_mode='categorical', classes=classes, shuffle=False,\n                                                directory=train_dir, batch_size=batch_size, target_size=target_size[:2])\nvalid_generator = generator.flow_from_dataframe(pdata.iloc[val_split:], class_mode='categorical', classes=classes, shuffle=False,\n                                                directory=train_dir, batch_size=batch_size, target_size=target_size[:2])\ntest_generator  = generator.flow_from_directory(test_dir+'../', class_mode=None, batch_size=batch_size,\n                                                shuffle=False, target_size=target_size[:2])\n\nmodel = Sequential()\nmodel.add(MobileNetV2(include_top=False, pooling=\"avg\", input_shape=target_size, weights=weights_dir))\n#model.add(Dense(10, activation=\"softmax\"))\nmodel.add(Dense(2, activation=\"softmax\"))\nmodel.layers[0].trainable = False\n\nmodel.compile('rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])\nmodel.fit_generator(train_generator, steps_per_epoch=200, epochs=1,\n                    validation_data=valid_generator, validation_steps=50)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## Fine tuning ##\nmodel.layers[0].trainable = True\nfinetune_split = int(0.6*len(model.layers[0].layers))\nfor layer in model.layers[0].layers[:finetune_split]:\n    layer.trainable = False\nmodel.compile(RMSprop(learning_rate=0.0005), # default 0.001\n              loss='categorical_crossentropy', metrics=['accuracy'])\nmodel.fit_generator(train_generator, steps_per_epoch=200, epochs=1,\n                    validation_data=valid_generator, validation_steps=50)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## Predicting ##\npredictions = pd.Series()\ntest_generator.reset()\nfor i in range(len(test_generator)):\n    if i%5==4: print('iteration '+str(i+1))\n    batch = test_generator.next()\n    batch_pred = model.predict_on_batch(batch)\n    pred_avg = pd.concat([pd.Series(batch_pred[:,1]),1-pd.Series(batch_pred[:,0])], axis=1).mean(axis=1)\n    predictions = predictions.append(pred_avg, ignore_index=True)\n\n#predictions = predictions.round()\nids = pd.Series(test_generator.filenames).map(lambda x: int(re.search('\\d+',x)[0]))\nout = pd.concat([ids,predictions], axis=1)\n\nout.columns = ['id','label']\nout = out.sort_values(by=['id'])\nout = out.reset_index(drop=True)\nprint(out.head())\nout.to_csv('catdog_predictions.csv', index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}