{"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":"code","source":"!pip install git+https://github.com/huggingface/transformers -U -q","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-08-08T17:15:49.003980Z","iopub.execute_input":"2022-08-08T17:15:49.004675Z","iopub.status.idle":"2022-08-08T17:16:35.567316Z","shell.execute_reply.started":"2022-08-08T17:15:49.004521Z","shell.execute_reply":"2022-08-08T17:16:35.566067Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! nvidia-smi","metadata":{"execution":{"iopub.status.busy":"2022-08-08T17:16:35.569812Z","iopub.execute_input":"2022-08-08T17:16:35.570227Z","iopub.status.idle":"2022-08-08T17:16:36.658199Z","shell.execute_reply.started":"2022-08-08T17:16:35.570189Z","shell.execute_reply":"2022-08-08T17:16:36.656645Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport os\n\nimport tensorflow as tf\nfrom tensorflow import keras \nimport tensorflow_addons as tfa\n\nimport transformers\nfrom transformers import AutoFeatureExtractor, TFSwinModel, TFConvNextModel\n\ntf.__version__, tfa.__version__, transformers.__version__","metadata":{"execution":{"iopub.status.busy":"2022-08-08T17:16:36.660492Z","iopub.execute_input":"2022-08-08T17:16:36.662069Z","iopub.status.idle":"2022-08-08T17:16:47.510327Z","shell.execute_reply.started":"2022-08-08T17:16:36.662008Z","shell.execute_reply":"2022-08-08T17:16:47.508911Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## TF Hugging Face ","metadata":{}},{"cell_type":"code","source":"model_url = \"microsoft/swin-base-patch4-window7-224-in22k\"\n# model_url = \"microsoft/swin-tiny-patch4-window7-224\"\n# model_url = \"facebook/convnext-large-224-22k-1k\"\nimg_size = 224\nmodel_url, img_size","metadata":{"execution":{"iopub.status.busy":"2022-08-08T17:16:47.513798Z","iopub.execute_input":"2022-08-08T17:16:47.515062Z","iopub.status.idle":"2022-08-08T17:16:47.524980Z","shell.execute_reply.started":"2022-08-08T17:16:47.515002Z","shell.execute_reply":"2022-08-08T17:16:47.523410Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_extractor = AutoFeatureExtractor.from_pretrained(model_url)\nfeature_extractor","metadata":{"execution":{"iopub.status.busy":"2022-08-08T17:16:47.526607Z","iopub.execute_input":"2022-08-08T17:16:47.527279Z","iopub.status.idle":"2022-08-08T17:16:47.805345Z","shell.execute_reply.started":"2022-08-08T17:16:47.527218Z","shell.execute_reply":"2022-08-08T17:16:47.804050Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model","metadata":{}},{"cell_type":"code","source":"if 'swin' in model_url:\n    tf_huggingface_module = TFSwinModel.from_pretrained(model_url)\n    tf_huggingface_module.trainable = False\nelif 'convnext' in model_url:\n    tf_huggingface_module = TFConvNextModel.from_pretrained(model_url)\n    tf_huggingface_module.trainable = False\nelse:\n    pass","metadata":{"execution":{"iopub.status.busy":"2022-08-08T17:16:47.806963Z","iopub.execute_input":"2022-08-08T17:16:47.807346Z","iopub.status.idle":"2022-08-08T17:17:24.968769Z","shell.execute_reply.started":"2022-08-08T17:16:47.807311Z","shell.execute_reply":"2022-08-08T17:17:24.967850Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def init_model(huggingface_feat_ext):\n    inputs = keras.Input(shape=(None, None, 3), dtype='uint8')\n    mode_inputs = tf.cast(inputs, tf.float32)\n    mode_inputs = keras.layers.Resizing(\n        * [huggingface_feat_ext.size] * 2\n    )(mode_inputs)\n    mode_inputs = keras.layers.Rescaling(scale=1.0 / 255)(mode_inputs)\n    mode_inputs = keras.layers.Normalization(\n        mean=huggingface_feat_ext.image_mean,\n        variance=[x ** 2 for x in huggingface_feat_ext.image_std ],\n        axis=3\n    )(mode_inputs)\n    mode_inputs = keras.layers.Permute(dims=(3, 1, 2))(mode_inputs)\n    return inputs, mode_inputs","metadata":{"execution":{"iopub.status.busy":"2022-08-08T17:17:24.970647Z","iopub.execute_input":"2022-08-08T17:17:24.971367Z","iopub.status.idle":"2022-08-08T17:17:24.980637Z","shell.execute_reply.started":"2022-08-08T17:17:24.971320Z","shell.execute_reply":"2022-08-08T17:17:24.979288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inputs, mode_inputs = init_model(\n    feature_extractor\n)\nlogits = tf_huggingface_module(mode_inputs)\nadv_logits = tfa.layers.AdaptiveAveragePooling1D(output_size=64)(logits.pooler_output)\n\noutputs = keras.layers.Lambda(\n    lambda x: tf.math.l2_normalize(x, axis=-1), name='embedding_norm'\n)(adv_logits)\n\ntf_huggingface_classifier = keras.Model(inputs, outputs)\ntf_huggingface_classifier.summary()","metadata":{"execution":{"iopub.status.busy":"2022-08-08T17:17:24.982192Z","iopub.execute_input":"2022-08-08T17:17:24.982657Z","iopub.status.idle":"2022-08-08T17:17:47.521805Z","shell.execute_reply.started":"2022-08-08T17:17:24.982614Z","shell.execute_reply":"2022-08-08T17:17:47.520542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Saving","metadata":{}},{"cell_type":"code","source":"%%time\ntf_huggingface_classifier.save('tf_hf_classifier')","metadata":{"execution":{"iopub.status.busy":"2022-08-08T17:17:47.523379Z","iopub.execute_input":"2022-08-08T17:17:47.524889Z","iopub.status.idle":"2022-08-08T17:24:35.173533Z","shell.execute_reply.started":"2022-08-08T17:17:47.524842Z","shell.execute_reply":"2022-08-08T17:24:35.172345Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Check","metadata":{}},{"cell_type":"code","source":"%%time\n\nimport numpy as np\nfrom PIL import Image\n\n# # Model loading.\nmodel = tf.saved_model.load(\"tf_hf_classifier\")\nembedding_fn = model.signatures[\"serving_default\"]\n\n# The local path to our target image\nimage_path = keras.utils.get_file(\n    \"african_elephant.jpg\", \"https://i.imgur.com/Bvro0YD.png\"\n)\n\n# Load image and extract its embedding.\nimage_tensor = tf.convert_to_tensor(\n        np.array(Image.open(image_path).convert(\"RGB\"))\n    )\nexpanded_tensor = tf.expand_dims(image_tensor, axis=0)\nembedding = embedding_fn(expanded_tensor)\nexpanded_tensor.dtype, embedding.keys()","metadata":{"execution":{"iopub.status.busy":"2022-08-08T17:24:35.194872Z","iopub.execute_input":"2022-08-08T17:24:35.195961Z","iopub.status.idle":"2022-08-08T17:27:48.746627Z","shell.execute_reply.started":"2022-08-08T17:24:35.195900Z","shell.execute_reply":"2022-08-08T17:27:48.745123Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"embedding[\"embedding_norm\"]","metadata":{"execution":{"iopub.status.busy":"2022-08-08T17:27:48.748356Z","iopub.execute_input":"2022-08-08T17:27:48.748699Z","iopub.status.idle":"2022-08-08T17:27:48.756809Z","shell.execute_reply.started":"2022-08-08T17:27:48.748667Z","shell.execute_reply":"2022-08-08T17:27:48.755674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Submission","metadata":{}},{"cell_type":"code","source":"from zipfile import ZipFile\n\nwith ZipFile('submission.zip','w') as zip:           \n    zip.write(\n        'tf_hf_classifier/saved_model.pb', arcname='saved_model.pb'\n    ) \n    zip.write(\n        'tf_hf_classifier/variables/variables.data-00000-of-00001', \n        arcname='variables/variables.data-00000-of-00001'\n    ) \n    zip.write(\n        'tf_hf_classifier/variables/variables.index', \n        arcname='variables/variables.index'\n    ) ","metadata":{"execution":{"iopub.status.busy":"2022-08-08T17:27:48.758410Z","iopub.execute_input":"2022-08-08T17:27:48.759239Z","iopub.status.idle":"2022-08-08T17:27:50.720350Z","shell.execute_reply.started":"2022-08-08T17:27:48.759198Z","shell.execute_reply":"2022-08-08T17:27:50.719226Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}