{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Import libraries\n\nThis is intended as a simple, short introduction to the operations competitors will need to perform with TPUs.","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nfrom kaggle_datasets import KaggleDatasets\nfrom tensorflow.keras.layers import Flatten, Dropout, Dense, Conv2D, MaxPooling2D, GlobalAveragePooling2D\nfrom tensorflow.keras.optimizers import Adam, RMSprop, SGD\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nprint(\"Tensorflow version \" + tf.__version__)","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.status.busy":"2021-10-14T08:54:15.748404Z","iopub.execute_input":"2021-10-14T08:54:15.749586Z","iopub.status.idle":"2021-10-14T08:54:15.756645Z","shell.execute_reply.started":"2021-10-14T08:54:15.749541Z","shell.execute_reply":"2021-10-14T08:54:15.755936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Detect my accelerator","metadata":{}},{"cell_type":"code","source":"# Detect hardware, return appropriate distribution strategy\ntry:\n    tpu = tf.distribute.cluster_resolver.TPUClusterResolver()  # TPU detection. No parameters necessary if TPU_NAME environment variable is set. On Kaggle this is always the case.\n    print('Running on TPU ', tpu.master())\nexcept ValueError:\n    tpu = None\n\nif tpu:\n    tf.config.experimental_connect_to_cluster(tpu)\n    tf.tpu.experimental.initialize_tpu_system(tpu)\n    strategy = tf.distribute.experimental.TPUStrategy(tpu)\nelse:\n    strategy = tf.distribute.get_strategy() # default distribution strategy in Tensorflow. Works on CPU and single GPU.\n\nprint(\"REPLICAS: \", strategy.num_replicas_in_sync)","metadata":{"execution":{"iopub.status.busy":"2021-10-14T08:54:15.758495Z","iopub.execute_input":"2021-10-14T08:54:15.759176Z","iopub.status.idle":"2021-10-14T08:54:21.237958Z","shell.execute_reply.started":"2021-10-14T08:54:15.759127Z","shell.execute_reply":"2021-10-14T08:54:21.237125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Get my data path","metadata":{}},{"cell_type":"code","source":"GCS_DS_PATH = KaggleDatasets().get_gcs_path('tpu-getting-started') # you can list the bucket with \"!gsutil ls $GCS_DS_PATH\"","metadata":{"execution":{"iopub.status.busy":"2021-10-14T08:54:21.239165Z","iopub.execute_input":"2021-10-14T08:54:21.239504Z","iopub.status.idle":"2021-10-14T08:54:21.665504Z","shell.execute_reply.started":"2021-10-14T08:54:21.239470Z","shell.execute_reply":"2021-10-14T08:54:21.664663Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#  Set some parameters","metadata":{}},{"cell_type":"code","source":"IMAGE_SIZE = [512, 512] # at this size, a GPU will run out of memory. Use the TPU\nEPOCHS_STEP1 = 50\nEPOCHS_STEP2 = 40\nAUTOTUNE = tf.data.experimental.AUTOTUNE\nBATCH_SIZE = 16 * strategy.num_replicas_in_sync\nprint(\"Batch size = \", BATCH_SIZE)\n\nNUM_TRAINING_IMAGES = 12753\nNUM_TEST_IMAGES = 7382\nSTEPS_PER_EPOCH = NUM_TRAINING_IMAGES // BATCH_SIZE\nprint(\"Steps per epoch = \", STEPS_PER_EPOCH)","metadata":{"execution":{"iopub.status.busy":"2021-10-14T08:54:21.666918Z","iopub.execute_input":"2021-10-14T08:54:21.667454Z","iopub.status.idle":"2021-10-14T08:54:21.676215Z","shell.execute_reply.started":"2021-10-14T08:54:21.667409Z","shell.execute_reply":"2021-10-14T08:54:21.675010Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load my data\n\nThis data is loaded from Kaggle and automatically sharded to maximize parallelization.","metadata":{}},{"cell_type":"code","source":"def decode_image(image_data):\n    image = tf.image.decode_jpeg(image_data, channels=3)\n    image = tf.cast(image, tf.float32) / 255.0  # convert image to floats in [0, 1] range\n    image = tf.reshape(image, [*IMAGE_SIZE, 3]) # explicit size needed for TPU \n    return image\n\ndef read_labeled_tfrecord(example):\n    LABELED_TFREC_FORMAT = {\n        \"image\": tf.io.FixedLenFeature([], tf.string), # tf.string means bytestring\n        \"class\": tf.io.FixedLenFeature([], tf.int64),  # shape [] means single element\n    }\n    example = tf.io.parse_single_example(example, LABELED_TFREC_FORMAT)\n    image = decode_image(example['image'])\n    label = tf.cast(example['class'], tf.int32)\n    return image, label # returns a dataset of (image, label) pairs\n\ndef read_unlabeled_tfrecord(example):\n    UNLABELED_TFREC_FORMAT = {\n        \"image\": tf.io.FixedLenFeature([], tf.string), # tf.string means bytestring\n        \"id\": tf.io.FixedLenFeature([], tf.string),  # shape [] means single element\n        # class is missing, this competitions's challenge is to predict flower classes for the test dataset\n    }\n    example = tf.io.parse_single_example(example, UNLABELED_TFREC_FORMAT)\n    image = decode_image(example['image'])\n    idnum = example['id']\n    return image, idnum # returns a dataset of image(s)\n\ndef load_dataset(filenames, labeled=True, ordered=False):\n    # Read from TFRecords. For optimal performance, reading from multiple files at once and\n    # disregarding data order. Order does not matter since we will be shuffling the data anyway.\n    ignore_order = tf.data.Options()\n    if not ordered:\n        ignore_order.experimental_deterministic = False # disable order, increase speed\n\n    dataset = tf.data.TFRecordDataset(filenames) # automatically interleaves reads from multiple files\n    dataset = dataset.with_options(ignore_order) # uses data as soon as it streams in, rather than in its original order\n    dataset = dataset.map(read_labeled_tfrecord if labeled else read_unlabeled_tfrecord)\n    # returns a dataset of (image, label) pairs if labeled=True or (image, id) pairs if labeled=False\n    return dataset\n\ndef data_augmention(image, label):\n    images = tf.image.random_flip_left_right(image)\n    return images, label\n\ndef get_training_dataset():\n    dataset = load_dataset(tf.io.gfile.glob(GCS_DS_PATH + '/tfrecords-jpeg-512x512/train/*.tfrec'), labeled=True)\n    dataset = dataset.map(data_augmention, num_parallel_calls = AUTOTUNE)\n    dataset = dataset.repeat() # the training dataset must repeat for several epochs\n    dataset = dataset.shuffle(2048)\n    dataset = dataset.batch(BATCH_SIZE)\n    dataset = dataset.prefetch(AUTOTUNE)\n    return dataset\n\ndef get_validation_dataset():\n    dataset = load_dataset(tf.io.gfile.glob(GCS_DS_PATH + '/tfrecords-jpeg-512x512/val/*.tfrec'), labeled=True, ordered=False)\n    dataset = dataset.batch(BATCH_SIZE)\n    dataset = dataset.cache()\n    dataset = dataset.prefetch(AUTOTUNE)\n    return dataset\n\ndef get_test_dataset(ordered=False):\n    dataset = load_dataset(tf.io.gfile.glob(GCS_DS_PATH + '/tfrecords-jpeg-512x512/test/*.tfrec'), labeled=False, ordered=ordered)\n    dataset = dataset.batch(BATCH_SIZE)\n    dataset = dataset.prefetch(AUTOTUNE)\n    return dataset\n\ntraining_dataset = get_training_dataset()\nvalidation_dataset = get_validation_dataset()","metadata":{"execution":{"iopub.status.busy":"2021-10-14T08:54:21.679121Z","iopub.execute_input":"2021-10-14T08:54:21.679449Z","iopub.status.idle":"2021-10-14T08:54:21.958493Z","shell.execute_reply.started":"2021-10-14T08:54:21.679409Z","shell.execute_reply":"2021-10-14T08:54:21.957854Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Optimizer learning rate tuning","metadata":{}},{"cell_type":"markdown","source":"lr_schedule = tf.keras.callbacks.LearningRateScheduler(\n    lambda epoch: 1e-5 * 10**(epoch / 10))\n\nwith strategy.scope():        \n\n    local_weights_file = '../input/inception-v3-weights/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5'\n    pretrained_model = tf.keras.applications.InceptionV3(input_shape = [*IMAGE_SIZE, 3], \n                                include_top = False, \n                                weights = None)\n\n    pretrained_model.load_weights(local_weights_file)\n\n    for layer in pretrained_model.layers:\n        layer.trainable = False\n    \n    last_layer = pretrained_model.get_layer('mixed7')\n    print('last layer output shape: ', last_layer.output_shape)\n    last_output = last_layer.output\n\n    x = GlobalAveragePooling2D()(last_output)\n    x = Flatten()(x)\n    x = Dropout(0.2)(x)\n    x = Dense(1024, activation='relu')(x)\n    x = Dropout(0.2)(x)\n    x = Dense(2048, activation='relu')(x)\n    x = Dropout(0.2)(x)\n    x = Dense  (104, activation='softmax')(x)           \n    \n    model = tf.keras.Model( pretrained_model.input, x)\n\nmodel.compile(\n    optimizer = RMSprop(learning_rate=1e-5),\n    loss = 'sparse_categorical_crossentropy',\n    metrics=['sparse_categorical_accuracy']\n)\n\nhistorical = model.fit(training_dataset, \n          steps_per_epoch=STEPS_PER_EPOCH, \n          epochs=EPOCHS, \n          validation_data=validation_dataset,\n            callbacks=[lr_schedule])\n\nplt.semilogx(historical.history[\"lr\"], historical.history[\"loss\"])\nplt.axis([1e-5, 1e-2, 0, 5])","metadata":{"execution":{"iopub.status.busy":"2021-10-10T10:39:26.418053Z","iopub.execute_input":"2021-10-10T10:39:26.418319Z","iopub.status.idle":"2021-10-10T10:39:26.423412Z","shell.execute_reply.started":"2021-10-10T10:39:26.418293Z","shell.execute_reply":"2021-10-10T10:39:26.42255Z"}}},{"cell_type":"markdown","source":"![image.png](attachment:6c459b51-2a09-4b5c-9b77-c32f1b8cdb80.png)","metadata":{},"attachments":{"6c459b51-2a09-4b5c-9b77-c32f1b8cdb80.png":{"image/png":"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QOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCABCZRAQOFRQi2YBwlIQAISkIAEJCABCVROQOFReQVbPAlIQAISkIAEJCAB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"}}},{"cell_type":"markdown","source":"# Build, Compile and fit the model","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n    \n    pretrained_model = tf.keras.applications.InceptionV3(input_shape = [*IMAGE_SIZE, 3], include_top = False,\n                                                     weights='../input/inception-v3-weights/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5')\n\n    pretrained_model.trainable = False\n\n#     last_layer = pretrained_model.get_layer('mixed7')\n#     last_output = last_layer.output\n\n#     x = data_augmentation()(last_output)\n    x = GlobalAveragePooling2D()(pretrained_model.get_layer('mixed7').output)\n    x = Flatten()(x)\n    x = Dropout(0.2)(x)\n    x = Dense(1024, activation='relu')(x)\n    x = Dropout(0.2)(x)\n    x = Dense(2048, activation='relu')(x)\n    x = Dropout(0.2)(x)\n    x = Dense  (104, activation='softmax')(x)           \n\n    model = tf.keras.Model( pretrained_model.input, x)\n\nmodel.compile(\n    optimizer = RMSprop(learning_rate=1e-3),\n    loss = 'sparse_categorical_crossentropy',\n    metrics=['sparse_categorical_accuracy']\n)\n\n# early_stop = tf.keras.callbacks.EarlyStopping(verbose=1, patience=5, monitor=\"val_loss\", restore_best_weights=True)\n\nhistorical = model.fit(training_dataset, \n          steps_per_epoch=STEPS_PER_EPOCH, \n          epochs=EPOCHS_STEP1,\n          validation_data=validation_dataset)","metadata":{"execution":{"iopub.status.busy":"2021-10-14T08:54:21.959893Z","iopub.execute_input":"2021-10-14T08:54:21.960381Z","iopub.status.idle":"2021-10-14T09:37:48.165072Z","shell.execute_reply.started":"2021-10-14T08:54:21.960334Z","shell.execute_reply":"2021-10-14T09:37:48.164138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plot helper function\ndef plot_graph(history, string):\n    plt.figure(figsize=(10, 6))\n    plt.plot(history.history[string])\n    plt.plot(history.history['val_' + string])\n    plt.xlabel(\"Epochs\")\n    plt.ylabel(string)\n    plt.legend([string, 'val_' + string])\n    \nplot_graph(historical, \"sparse_categorical_accuracy\")\nplot_graph(historical, \"loss\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-14T09:37:48.166578Z","iopub.execute_input":"2021-10-14T09:37:48.166912Z","iopub.status.idle":"2021-10-14T09:37:48.588904Z","shell.execute_reply.started":"2021-10-14T09:37:48.166870Z","shell.execute_reply":"2021-10-14T09:37:48.588307Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pretrained_model.trainable = True\n\nmodel.compile(\n    optimizer = RMSprop(learning_rate=1e-5),\n    loss = 'sparse_categorical_crossentropy',\n    metrics=['sparse_categorical_accuracy']\n)\n\nhistorical = model.fit(training_dataset, \n          steps_per_epoch=STEPS_PER_EPOCH, \n          epochs=EPOCHS_STEP2, \n          validation_data=validation_dataset)","metadata":{"execution":{"iopub.status.busy":"2021-10-14T09:37:48.589933Z","iopub.execute_input":"2021-10-14T09:37:48.590246Z","iopub.status.idle":"2021-10-14T10:12:54.534804Z","shell.execute_reply.started":"2021-10-14T09:37:48.590220Z","shell.execute_reply":"2021-10-14T10:12:54.533840Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_graph(historical, \"sparse_categorical_accuracy\")\nplot_graph(historical, \"loss\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-14T10:12:54.536057Z","iopub.execute_input":"2021-10-14T10:12:54.536358Z","iopub.status.idle":"2021-10-14T10:12:55.048207Z","shell.execute_reply.started":"2021-10-14T10:12:54.536324Z","shell.execute_reply":"2021-10-14T10:12:55.047590Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Compute your predictions on the test set!\n\nThis will create a file that can be submitted to the competition.","metadata":{}},{"cell_type":"code","source":"test_ds = get_test_dataset(ordered=True) # since we are splitting the dataset and iterating separately on images and ids, order matters.\n\nprint('Computing predictions...')\ntest_images_ds = test_ds.map(lambda image, idnum: image)\nprobabilities = model.predict(test_images_ds)\npredictions = np.argmax(probabilities, axis=-1)\nprint(predictions)\n\nprint('Generating submission.csv file...')\ntest_ids_ds = test_ds.map(lambda image, idnum: idnum).unbatch()\ntest_ids = next(iter(test_ids_ds.batch(NUM_TEST_IMAGES))).numpy().astype('U') # all in one batch\nnp.savetxt('submission.csv', np.rec.fromarrays([test_ids, predictions]), fmt=['%s', '%d'], delimiter=',', header='id,label', comments='')","metadata":{"execution":{"iopub.status.busy":"2021-10-14T10:12:55.049582Z","iopub.execute_input":"2021-10-14T10:12:55.049811Z","iopub.status.idle":"2021-10-14T10:14:36.536397Z","shell.execute_reply.started":"2021-10-14T10:12:55.049785Z","shell.execute_reply":"2021-10-14T10:14:36.535314Z"},"trusted":true},"execution_count":null,"outputs":[]}]}