{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np \nimport pandas as pd \n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras import layers\nfrom keras import models\nfrom keras.utils import to_categorical\nfrom keras.applications import VGG16\nfrom keras.datasets import cifar10\nfrom keras.preprocessing import image\nimport matplotlib.pyplot as plt\nimport cv2","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def graph(history):\n    epoklar = range(1,len(history[\"loss\"])+1)\n    \n    plt.plot(epoklar,history[\"loss\"],label=\"Training Loss\")\n    plt.plot(epoklar,history[\"val_loss\"],label=\"Validation Loss\")\n    plt.title(\"Loss\")\n    plt.legend()\n    plt.show()\n    \n    plt.plot(epoklar,history[\"acc\"],label=\"Training Accuracy\")\n    plt.plot(epoklar,history[\"val_acc\"],label=\"Validation Accuracy\")\n    plt.title(\"Accuracy\")\n    plt.legend()\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"(train_images,train_labels),(test_images,test_labels) = cifar10.load_data()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def resize(images):\n    yeni = np.zeros((images.shape[0],96,96,3),dtype=np.float32)\n    for i in range(len(images)):\n        yeni[i] = cv2.resize(images[i,:,:,:],(96,96))\n    return yeni","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_images = resize(train_images)\ntest_images = resize(test_images)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_images.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_labels.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"numberOfClass = len(np.unique(train_labels))\nnumberOfClass","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(test_images[20].astype(np.uint8))\nplt.axis(\"off\")\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#one-hot encoding\ntrain_labels = to_categorical(train_labels)\ntest_labels = to_categorical(test_labels)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_train = train_images[:35000]\ny_train = train_labels[:35000]\n\nx_valid = train_images[35000:]\ny_valid = train_labels[35000:]\n\nx_test = test_images\ny_test = test_labels","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#data augmentation and normalize images with using ImageDataGenerator\ntrain_datagen = image.ImageDataGenerator(\n      rescale=1./255,\n      rotation_range=30,\n      width_shift_range=0.15,\n      height_shift_range=0.15,\n      shear_range=0.15,\n      zoom_range=0.1,\n      horizontal_flip=True,\n      fill_mode='nearest')\n\nvalid_datagen = image.ImageDataGenerator(rescale=1./255)\ntest_datagen = image.ImageDataGenerator(rescale=1./255)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_size = 256\nepoch = 30\nsize = x_train.shape[1:]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_generator = train_datagen.flow(x_train,y_train,batch_size=batch_size)\nvalid_generator = valid_datagen.flow(x_valid,y_valid,batch_size=batch_size)\ntest_generator = test_datagen.flow(x_test,y_test,batch_size=batch_size)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Feature Extraction\n\nStep 1 - Load pre-trained model and freeze\n\nStep 2 - Create new model and add the frozen pretrained model in this model\n\nStep 3 - Add dense layers\n\nStep 4 - Train Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"vgg16 = VGG16(weights=\"imagenet\",include_top=False,input_shape=size)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"vgg16.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Load Pre-trained Model**\n\n* We are select include_top = False. Because we are don't want dense layers.\n\n* This Model coming with trained weights on imagenet"},{"metadata":{"trusted":true},"cell_type":"code","source":"#create new model and add pretrained model in this model\nmodel = models.Sequential()\nfor i in range(len(vgg16.layers)):\n    model.add(vgg16.layers[i])\n\nfor i in range(len(model.layers)): #freeze pretrained model\n    model.layers[i].trainable = False\n\n#add new layers your model\nmodel.add(layers.Flatten())\nmodel.add(layers.Dropout(0.40))\nmodel.add(layers.Dense(256,activation=\"relu\"))\nmodel.add(layers.Dense(numberOfClass,activation=\"softmax\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(optimizer=\"rmsprop\",loss=\"categorical_crossentropy\",\n              metrics=[\"acc\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"(4608*256 + 256) + (256*10 + 10)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Now we have 1,182,474 trainable params."},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit_generator(generator=train_generator,\n                steps_per_epoch=len(train_generator),epochs=epoch,\n                validation_data=valid_generator,\n                validation_steps=len(valid_generator))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"graph(history.history)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"loss,acc = model.evaluate_generator(test_generator,\n                        steps=len(test_generator))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Test Accuracy =\",acc)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Fine Tunning\n\nStep 1 - Take the Feature Extraction(We are did this step)\n\nStep 2 - Select layers to Fine Tunning\n\nStep 3 - Train Model\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#select after blocks block5_conv1 to fine tunnig\ntrnable = False\nfor i in model.layers:\n    if i.name == \"block5_conv1\":\n        trnable = True\n    i.trainable = trnable","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras import optimizers","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#compile model with very low learning rate\nmodel.compile(optimizer=optimizers.RMSprop(lr=1e-5),\n        loss=\"categorical_crossentropy\",metrics=[\"acc\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Now we have 8,261,898 trainable params"},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_size = 256\nepoch = 50","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit_generator(generator=train_generator,\n                steps_per_epoch=len(train_generator),epochs=epoch,\n                validation_data=valid_generator,\n                validation_steps=len(valid_generator))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"graph(history.history)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"loss,acc = model.evaluate_generator(test_generator,\n                            steps=len(test_generator))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Test Accuracy =\",acc)","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}