{"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"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":87397,"databundleVersionId":9945924,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport tensorflow as tf\nfrom datetime import datetime\nfrom keras.preprocessing import image\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.layers import Dense, Flatten, Conv2D, UpSampling2D, Dropout,BatchNormalization,GlobalAveragePooling2D\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.utils import to_categorical\nimport pickle\nfrom torch.utils.data import Dataset, DataLoader\n\nimport sys\n\nclass CIFAR100Dataset(Dataset):\n    def __init__(self, file_path):\n        with open(file_path, 'rb') as f:\n            self.data = pickle.load(f)\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        image, label = self.data[idx]\n        return image, label\n\ndef dataset_to_numpy(dataset):\n    images = []\n    labels = []\n    \n    for img, label in DataLoader(dataset, batch_size=1, shuffle=False):\n        images.append(img.squeeze(0).numpy())  \n        labels.append(label.item())            \n    X = np.array(np.transpose(np.array(images), (0, 2, 3, 1)) * 255, dtype=int)\n    Y = np.array(labels)\n    \n    return X, Y\n\ndef timer(start_time=None):\n  #function to track time \n  if not start_time:\n      print(datetime.now())\n      start_time = datetime.now()\n      return start_time\n  elif start_time:\n      thour, temp_sec = divmod((datetime.now() - start_time).total_seconds(), 3600)\n      tmin, tsec = divmod(temp_sec, 60)\n      print('Time taken: %i hours %i minutes and %s seconds.' % (thour, tmin, round(tsec, 2)))\n\ndef plot_acc_loss(result):\n  # function to plot the accuracy and loss graphs\n  acc = result.history['accuracy']\n  val_acc = result.history['val_accuracy']\n  loss = result.history['loss']\n  val_loss = result.history['val_loss']\n\n  plt.figure(figsize=(20, 10))\n  plt.subplot(1, 2, 1)\n  plt.title(\"Training and Validation Accuracy\")\n  plt.plot(acc,color = 'green',label = 'Training Acuracy')\n  plt.plot(val_acc,color = 'red',label = 'Validation Accuracy')\n  plt.legend(loc='lower right')\n  plt.ylabel('accuracy')\n  plt.xlabel('epoch')\n  plt.subplot(1, 2, 2)\n  plt.title('Training and Validation Loss')\n  plt.plot(loss,color = 'blue',label = 'Training Loss')\n  plt.plot(val_loss,color = 'purple',label = 'Validation Loss')\n  plt.ylabel('loss')\n  plt.xlabel('epoch')\n  plt.legend(loc='upper right')\n  plt.show()\n\nif __name__=='__main__':\n    train_file='/kaggle/input/col-774-a-3-new/train.pkl'\n    # alpha=float(sys.argv[2])\n    # gamma=float(sys.argv[3])\n    train_dataset = CIFAR100Dataset(train_file)\n    X_train, Y_train = dataset_to_numpy(train_dataset)\n    x_train,x_val,y_train,y_val = train_test_split(X_train, Y_train, test_size = 0.1)\n    y_train = to_categorical(y_train, num_classes = 100)\n    y_val = to_categorical(y_val, num_classes = 100)\n    x_train = x_train * 1.0/255\n    x_val = x_val * 1.0/255\n\n\n    train_datagen = ImageDataGenerator( \n            rotation_range = 10,  \n            zoom_range = 0.1, \n            width_shift_range = 0.1,  \n            height_shift_range = 0.1,\n            shear_range = 0.1,\n            horizontal_flip = True,  \n            vertical_flip = False\n            )\n    train_datagen.fit(x_train)\n\n\n    from keras.callbacks import ReduceLROnPlateau\n    learning_rate_reduction = ReduceLROnPlateau(\n        monitor='val_accuracy', \n        patience=3, \n        verbose=1, \n        factor=0.6, \n        min_lr=1e-6)\n\n    from tensorflow.keras.applications.resnet50 import ResNet50\n    resnet_model = ResNet50(\n        include_top = False,\n        weights = 'imagenet',\n        input_shape = (224,224,3)\n    )\n\n    for layer in resnet_model.layers:\n        if isinstance(layer, BatchNormalization):\n            layer.trainable = True\n        else:\n            layer.trainable = False\n\n\n    model=tf.keras.models.Sequential()\n    model.add(UpSampling2D(size=(7, 7),interpolation='bilinear'))\n    model.add(resnet_model)\n    model.add(GlobalAveragePooling2D())\n    model.add(Dropout(.25))\n    model.add(Dense(256, activation='relu'))\n    model.add(BatchNormalization())\n    model.add(Dense(100, activation='softmax'))\n\n    optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3, momentum=0.9)\n    model.compile(\n        optimizer = optimizer,\n        loss='categorical_crossentropy',\n        metrics=['accuracy']\n    )\n\n    start_time=timer(None)\n    result=model.fit(\n        train_datagen.flow(x_train, y_train, batch_size = 128),\n        validation_data = (x_val, y_val),\n        epochs = 160,\n        verbose = 1,\n        callbacks = [learning_rate_reduction]\n    )\n    timer(start_time)\n\n    model.save('model.keras')\n    # plot_acc_loss(result)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null}]}