{"cells":[{"metadata":{"_uuid":"e252cece4ef64c606cd06c398159fa34295231c3","_cell_guid":"fd10b600-5f8d-4f87-9893-7a8c92763a04"},"cell_type":"markdown","source":"# Intro\nThe notebook uses pretrained models of InceptionV3 and others (possibly) to try and predict the manufacturer of each camera, not sure why this is a good idea, but it's worth an experiment"},{"metadata":{"_uuid":"26754ef81cca855665b7a8295ad3ce12207a0fbb","_cell_guid":"f497e185-3e4f-4e40-8fac-35e88b53e2f7"},"cell_type":"markdown","source":"Copy weights into directories keras links"},{"metadata":{"_uuid":"b2432c6a53e22f33875d9e513ab30655404117a9","_cell_guid":"6760396c-1a3b-457d-bce5-0d9cc0a24afb","trusted":true},"cell_type":"code","source":"!mkdir ~/.keras\n!mkdir ~/.keras/models\n# not enough space for both\n#!cp ../input/keras-pretrained-models/* ~/.keras/models/ \n#!cp ../input/vgg19/* ~/.keras/models\n!cp ../input/keras-pretrained-models/*notop* ~/.keras/models/\n!cp ../input/keras-pretrained-models/imagenet_class_index.json ~/.keras/models/\n!cp ../input/keras-pretrained-models/resnet50* ~/.keras/models/","execution_count":2,"outputs":[{"output_type":"stream","text":"mkdir: cannot create directory ‘/tmp/.keras’: File exists\r\n","name":"stdout"}]},{"metadata":{"_uuid":"0574ae9cf202788587b74329b02e051ab88f005b","_cell_guid":"6fd008ce-cdea-4908-945b-74676088fd3c","collapsed":true,"trusted":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nfrom PIL import Image\nfrom skimage.transform import resize\nfrom random import shuffle","execution_count":3,"outputs":[]},{"metadata":{"_uuid":"f9044c11e2b52edecd1a86574309e885094d3a20","_cell_guid":"f59874a4-e8b4-47e1-b488-34bf0f2b42fb","collapsed":true,"trusted":true},"cell_type":"code","source":"list_paths = []\nfor subdir, dirs, files in os.walk(\"../input/sp-society-camera-model-identification/\"):\n    for file in files:\n        #print os.path.join(subdir, file)\n        filepath = subdir + os.sep + file\n        list_paths.append(filepath)","execution_count":4,"outputs":[]},{"metadata":{"_uuid":"982cf9b8f6b9b68b2a476a57d4846db22c76809f","_cell_guid":"f4ceca4d-77df-4987-a20b-dbaae3ba89e0","collapsed":true,"trusted":true},"cell_type":"code","source":"list_train = [filepath for filepath in list_paths if \"train/\" in filepath]\nshuffle(list_train)\nlist_test = [filepath for filepath in list_paths if \"test/\" in filepath]\n\nlist_train = list_train\nlist_test = list_test\nindex = [os.path.basename(filepath) for filepath in list_test]","execution_count":5,"outputs":[]},{"metadata":{"_uuid":"fcf5feb59fe568fd999ad95091e067b85e4cf1d2","_cell_guid":"c6062575-203b-4062-ae57-7ffbc872f177","collapsed":true,"trusted":true},"cell_type":"code","source":"list_classes = list(set([os.path.dirname(filepath).split(os.sep)[-1] for filepath in list_paths if \"train\" in filepath]))","execution_count":6,"outputs":[]},{"metadata":{"_uuid":"db99a95c9fd22162ccadc67835dc240a8874f838","_cell_guid":"1737834f-8eea-4061-9210-53709a91d623","collapsed":true,"trusted":true},"cell_type":"code","source":"list_classes = ['Sony-NEX-7',\n 'Motorola-X',\n 'HTC-1-M7',\n 'Samsung-Galaxy-Note3',\n 'Motorola-Droid-Maxx',\n 'iPhone-4s',\n 'iPhone-6',\n 'LG-Nexus-5x',\n 'Samsung-Galaxy-S4',\n 'Motorola-Nexus-6']","execution_count":7,"outputs":[]},{"metadata":{"_uuid":"5b73c7558e78d92669ae494d0dea924d1e3b55b3","_cell_guid":"7817b75e-cca5-4dd0-b248-ff2c263f8726","trusted":true},"cell_type":"code","source":"ROWS=139\nCOLS=139\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.applications.inception_v3 import preprocess_input\ntrain_idg = ImageDataGenerator(vertical_flip=True,\n                               horizontal_flip=True,\n                               height_shift_range=0.1,\n                               width_shift_range=0.1,\n                               preprocessing_function=preprocess_input)\ntrain_gen = train_idg.flow_from_directory(\n    '../input/sp-society-camera-model-identification/train/',\n    target_size=(ROWS, COLS),\n    batch_size = 16\n)","execution_count":8,"outputs":[{"output_type":"stream","text":"Found 2750 images belonging to 10 classes.\n","name":"stdout"}]},{"metadata":{"_uuid":"ab7de25beab727c6ca14ca24a9302538b70e8238","_cell_guid":"9fe6b2ae-d956-49c6-9658-6f02bfab42b6","trusted":true},"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.models import Model\nfrom keras.callbacks import ModelCheckpoint, LearningRateScheduler, EarlyStopping, ReduceLROnPlateau, TensorBoard\nfrom keras import optimizers, losses, activations, models\nfrom keras.layers import Convolution2D, Dense, Input, Flatten, Dropout, MaxPooling2D, BatchNormalization, GlobalAveragePooling2D, Concatenate\nfrom keras import applications\ninput_shape = (ROWS, COLS, 3)\nnclass = len(train_gen.class_indices)\n\nbase_model = applications.InceptionV3(weights='imagenet', \n                                include_top=False, \n                                input_shape=(ROWS, COLS,3))\nbase_model.trainable = False\n\nadd_model = Sequential()\nadd_model.add(base_model)\nadd_model.add(GlobalAveragePooling2D())\nadd_model.add(Dropout(0.5))\nadd_model.add(Dense(nclass, \n                    activation='softmax'))\n\nmodel = add_model\nmodel.compile(loss='categorical_crossentropy', \n              optimizer=optimizers.SGD(lr=1e-4, \n                                       momentum=0.9),\n              metrics=['accuracy'])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"086bdeb47ed7022e95b46e3c6c3c2ee0eda147d3","_cell_guid":"d111f13d-c7e8-4b5a-a20e-34a1e67260c9","trusted":true},"cell_type":"code","source":"file_path=\"weights.best.hdf5\"\n\ncheckpoint = ModelCheckpoint(file_path, monitor='acc', verbose=1, save_best_only=True, mode='max')\n\nearly = EarlyStopping(monitor=\"acc\", mode=\"max\", patience=15)\n\ncallbacks_list = [checkpoint, early] #early\n\nhistory = model.fit_generator(train_gen, \n                              epochs=2, \n                              shuffle=True, \n                              verbose=True,\n                              callbacks=callbacks_list)","execution_count":10,"outputs":[{"output_type":"stream","text":"Epoch 1/2\n160/172 [==========================>...] - ETA: 56s - loss: 3.2540 - acc: 0.0954 ","name":"stdout"},{"output_type":"error","ename":"KeyboardInterrupt","evalue":"","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)","\u001b[0;32m<ipython-input-10-5b4db6b42ac0>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m     11\u001b[0m                               \u001b[0mshuffle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     12\u001b[0m                               \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m                               callbacks=callbacks_list)\n\u001b[0m","\u001b[0;32m/opt/conda/lib/python3.6/site-packages/Keras-2.1.3-py3.6.egg/keras/legacy/interfaces.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     89\u001b[0m                 warnings.warn('Update your `' + object_name +\n\u001b[1;32m     90\u001b[0m                               '` call to the Keras 2 API: ' + signature, stacklevel=2)\n\u001b[0;32m---> 91\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     92\u001b[0m         \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     93\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.6/site-packages/Keras-2.1.3-py3.6.egg/keras/models.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m   1255\u001b[0m                                         \u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1256\u001b[0m                                         \u001b[0mshuffle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1257\u001b[0;31m                                         initial_epoch=initial_epoch)\n\u001b[0m\u001b[1;32m   1258\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1259\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0minterfaces\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlegacy_generator_methods_support\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.6/site-packages/Keras-2.1.3-py3.6.egg/keras/legacy/interfaces.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     89\u001b[0m                 warnings.warn('Update your `' + object_name +\n\u001b[1;32m     90\u001b[0m                               '` call to the Keras 2 API: ' + signature, stacklevel=2)\n\u001b[0;32m---> 91\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     92\u001b[0m         \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     93\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.6/site-packages/Keras-2.1.3-py3.6.egg/keras/engine/training.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m   2167\u001b[0m                 \u001b[0mbatch_index\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2168\u001b[0m                 \u001b[0;32mwhile\u001b[0m \u001b[0msteps_done\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2169\u001b[0;31m                     \u001b[0mgenerator_output\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutput_generator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2170\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2171\u001b[0m                     \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgenerator_output\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'__len__'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.6/site-packages/Keras-2.1.3-py3.6.egg/keras/utils/data_utils.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    563\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    564\u001b[0m             \u001b[0;32mwhile\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_running\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 565\u001b[0;31m                 \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mblock\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    566\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtask_done\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    567\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    636\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    637\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 638\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    639\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mready\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    640\u001b[0m             \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    633\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    634\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 635\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_event\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    636\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    637\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.6/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    549\u001b[0m             \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_flag\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    550\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 551\u001b[0;31m                 \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cond\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    552\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    553\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.6/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    293\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m    \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    294\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 295\u001b[0;31m                 \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    296\u001b[0m                 \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    297\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mKeyboardInterrupt\u001b[0m: "]}]},{"metadata":{"_uuid":"641d27a2a045c06889dbcdf48ce835be40d5758c","_cell_guid":"1bbc75a8-6711-4b37-af02-b1069eb69fbe","collapsed":true,"trusted":true},"cell_type":"code","source":"model.load_weights(file_path)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5bc3e61c261c62093317efd784619c7c988b5b63","_cell_guid":"00b74906-9351-44ba-98a4-03439eabaa23","trusted":true},"cell_type":"code","source":"test_idg = ImageDataGenerator(preprocessing_function=preprocess_input)\ntest_gen = test_idg.flow_from_directory(\n    '../input/sp-society-camera-model-identification/',\n    target_size=(ROWS, COLS),\n    batch_size = 16,\n    shuffle = False,\n    class_mode='binary',\n    classes = ['test']\n)\nlen(test_gen.filenames)","execution_count":11,"outputs":[{"output_type":"stream","text":"Found 2640 images belonging to 1 classes.\n","name":"stdout"},{"output_type":"execute_result","execution_count":11,"data":{"text/plain":"2640"},"metadata":{}}]},{"metadata":{"_uuid":"a98a23f680ca5c16ca2c0dec5a50a78a4d0d52e7","_cell_guid":"badeefc1-f3d4-4310-a1d8-785eff174b02","trusted":true},"cell_type":"code","source":"predicts = model.predict_generator(test_gen, verbose = True, workers = 2)","execution_count":15,"outputs":[{"output_type":"stream","text":"165/165 [==============================] - 178s 1s/step\n","name":"stdout"}]},{"metadata":{"_uuid":"bb64c96160b482fed2ff66df81899a7196d7b099","_cell_guid":"6733c810-a45e-4206-8db3-3cf099386855","collapsed":true,"trusted":true},"cell_type":"code","source":"predicts = np.argmax(predicts, \n                     axis=1)\nlabel_index = {v: k for k,v in train_gen.class_indices.items()}\npredicts = [label_index[p] for p in predicts]\n\ndf = pd.DataFrame(columns=['fname', 'camera'])\ndf['fname'] = [os.path.basename(x) for x in test_gen.filenames]\ndf['camera'] = predicts\ndf.to_csv(\"sub1.csv\", index=False)","execution_count":16,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"300d1cc9123c50f1bb27a04755f6ca0d76b8a033"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"}},"nbformat":4,"nbformat_minor":1}