{"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":"class CFG:\n    data_path = \"../input/asl-signs/\"\n    num_classes = 250\n    rows_per_frame = 543 ","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:47:32.301144Z","iopub.execute_input":"2023-02-28T20:47:32.302294Z","iopub.status.idle":"2023-02-28T20:47:32.310202Z","shell.execute_reply.started":"2023-02-28T20:47:32.302230Z","shell.execute_reply":"2023-02-28T20:47:32.308487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Forked from lonnie.**","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom tqdm import tqdm\nimport json\nimport os\nfrom sklearn.model_selection import train_test_split","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:47:34.016008Z","iopub.execute_input":"2023-02-28T20:47:34.016496Z","iopub.status.idle":"2023-02-28T20:47:34.022750Z","shell.execute_reply.started":"2023-02-28T20:47:34.016441Z","shell.execute_reply":"2023-02-28T20:47:34.021764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_relevant_data_subset_with_imputation(pq_path):\n    data_columns = ['x', 'y', 'z']\n    data = pd.read_parquet(pq_path, columns=data_columns)\n    data.replace(np.nan, 0, inplace=True)\n    n_frames = int(len(data) / CFG.rows_per_frame)\n    data = data.values.reshape(n_frames, CFG.rows_per_frame, len(data_columns))\n    return data.astype(np.float32)\n\ndef load_relevant_data_subset(pq_path):\n    data_columns = ['x', 'y', 'z']\n    data = pd.read_parquet(pq_path, columns=data_columns)\n    n_frames = int(len(data) / CFG.rows_per_frame)\n    data = data.values.reshape(n_frames, CFG.rows_per_frame, len(data_columns))\n    return data.astype(np.float32)\n\ndef read_dict(file_path):\n    path = os.path.expanduser(file_path)\n    with open(path, \"r\") as f:\n        dic = json.load(f)\n    return dic","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:47:36.184848Z","iopub.execute_input":"2023-02-28T20:47:36.185348Z","iopub.status.idle":"2023-02-28T20:47:36.197125Z","shell.execute_reply.started":"2023-02-28T20:47:36.185310Z","shell.execute_reply":"2023-02-28T20:47:36.195588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(f\"{CFG.data_path}train.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:47:39.010440Z","iopub.execute_input":"2023-02-28T20:47:39.011716Z","iopub.status.idle":"2023-02-28T20:47:39.154326Z","shell.execute_reply.started":"2023-02-28T20:47:39.011626Z","shell.execute_reply":"2023-02-28T20:47:39.153060Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_index = read_dict(f\"{CFG.data_path}sign_to_prediction_index_map.json\")\nindex_label = dict([(label_index[key], key) for key in label_index])\ntrain[\"label\"] = train[\"sign\"].map(lambda sign: label_index[sign])","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:47:41.452709Z","iopub.execute_input":"2023-02-28T20:47:41.453171Z","iopub.status.idle":"2023-02-28T20:47:41.505175Z","shell.execute_reply.started":"2023-02-28T20:47:41.453132Z","shell.execute_reply":"2023-02-28T20:47:41.503490Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xs = []\nys = []\n\nfor i in tqdm(range(len(train))):\n\n    path = f\"{CFG.data_path}{train.iloc[i].path}\"\n    data = load_relevant_data_subset_with_imputation(path)\n\n    xs.append(np.mean(data, axis=0))\n    ys.append(train.iloc[i].label)\n    \n#     if i == 100:\n#         break\n    \n## Save number of frames of each training sample for data analysis\n\nX = np.array(xs)\ny = np.array(ys)\nprint(X.shape, y.shape)","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:47:44.937293Z","iopub.execute_input":"2023-02-28T20:47:44.938531Z","iopub.status.idle":"2023-02-28T21:18:12.298053Z","shell.execute_reply.started":"2023-02-28T20:47:44.938475Z","shell.execute_reply":"2023-02-28T21:18:12.294318Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model():\n    inputs = tf.keras.Input(shape=(543, 3), dtype=tf.float64)\n\n    vector = tf.keras.layers.Dense(1024, activation=\"relu\")(inputs)\n    vector = tf.keras.layers.BatchNormalization()(vector)\n\n    vector = tf.keras.layers.Dense(512, activation=\"relu\")(vector)\n    vector = tf.keras.layers.Dropout(0.2)(vector)\n\n    vector = tf.keras.layers.Dense(256, activation=\"relu\")(vector)\n    vector = tf.keras.layers.BatchNormalization()(vector)\n\n    vector = tf.keras.layers.Dense(256, activation=\"relu\")(vector)\n    vector = tf.keras.layers.Dropout(0.2)(vector)\n\n    vector = tf.keras.layers.Dense(128, activation=\"relu\")(vector)\n    vector = tf.keras.layers.BatchNormalization()(vector)\n\n    vector = tf.keras.layers.Dense(64, activation=\"relu\")(vector)\n    vector = tf.keras.layers.Dropout(0.2)(vector)\n\n    vector = tf.keras.layers.Dense(32, activation=\"relu\")(vector)\n    vector = tf.keras.layers.BatchNormalization()(vector)\n\n    vector = tf.keras.layers.Dense(32, activation=\"relu\")(vector)\n\n    vector = tf.keras.layers.Flatten()(vector)\n    \n    outputs = tf.keras.layers.Dense(250, activation=\"softmax\")(vector)\n\n    model = tf.keras.Model(inputs=inputs, outputs=outputs)\n\n    optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)\n\n    model.compile(\n        loss=tf.keras.losses.SparseCategoricalCrossentropy(), \n        optimizer=optimizer,\n        metrics=[\n            \"accuracy\", \n            tf.keras.metrics.SparseTopKCategoricalAccuracy(k=5, name=\"top-5-accuracy\"),\n            tf.keras.metrics.SparseTopKCategoricalAccuracy(k=10, name=\"top-10-accuracy\")\n        ]\n    )\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:34:17.608945Z","iopub.execute_input":"2023-02-28T20:34:17.610128Z","iopub.status.idle":"2023-02-28T20:34:17.626453Z","shell.execute_reply.started":"2023-02-28T20:34:17.610073Z","shell.execute_reply":"2023-02-28T20:34:17.625281Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.1, random_state=42)\nprint(X_train.shape, y_train.shape, X_val.shape, y_val.shape)","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:34:43.834729Z","iopub.execute_input":"2023-02-28T20:34:43.836854Z","iopub.status.idle":"2023-02-28T20:34:43.846943Z","shell.execute_reply.started":"2023-02-28T20:34:43.836793Z","shell.execute_reply":"2023-02-28T20:34:43.845541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = get_model()\ncallbacks = [tf.keras.callbacks.ModelCheckpoint(\"model.h5\", save_best_only=True, load_best_weights=True, monitor=\"val_accuracy\", mode=\"max\")]\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:34:57.680398Z","iopub.execute_input":"2023-02-28T20:34:57.680872Z","iopub.status.idle":"2023-02-28T20:34:58.287263Z","shell.execute_reply.started":"2023-02-28T20:34:57.680833Z","shell.execute_reply":"2023-02-28T20:34:58.286162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(X_train, y_train, epochs=50, validation_data=(X_val, y_val), batch_size=128, callbacks=callbacks)","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:39:57.250155Z","iopub.execute_input":"2023-02-28T20:39:57.250626Z","iopub.status.idle":"2023-02-28T20:41:56.838212Z","shell.execute_reply.started":"2023-02-28T20:39:57.250579Z","shell.execute_reply":"2023-02-28T20:41:56.836869Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_inference_model(model):\n    inputs = tf.keras.Input((543, 3), dtype=tf.float32, name=\"inputs\")\n    x = tf.where(tf.math.is_nan(inputs), tf.zeros_like(inputs), inputs)\n    x = tf.reduce_mean(x, axis=0, keepdims=True)\n    for i in range(1, len(model.layers)):\n        x = model.layers[i](x)\n    output = tf.keras.layers.Activation(activation=\"linear\", name=\"outputs\")(x)\n    inference_model = tf.keras.Model(inputs=inputs, outputs=output) \n    inference_model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[\"accuracy\"])\n    return inference_model","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:42:04.439591Z","iopub.execute_input":"2023-02-28T20:42:04.440068Z","iopub.status.idle":"2023-02-28T20:42:04.451071Z","shell.execute_reply.started":"2023-02-28T20:42:04.440028Z","shell.execute_reply":"2023-02-28T20:42:04.449602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inference_model = get_inference_model(model)\ninference_model.summary()","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:42:07.858184Z","iopub.execute_input":"2023-02-28T20:42:07.858660Z","iopub.status.idle":"2023-02-28T20:42:08.121998Z","shell.execute_reply.started":"2023-02-28T20:42:07.858619Z","shell.execute_reply":"2023-02-28T20:42:08.120098Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#CREATE SUBMISSION FILE\nconverter = tf.lite.TFLiteConverter.from_keras_model(inference_model)\ntflite_model = converter.convert()\nmodel_path = \"model.tflite\"\n# Save the model.\nwith open(model_path, 'wb') as f:\n    f.write(tflite_model)","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:42:14.064977Z","iopub.execute_input":"2023-02-28T20:42:14.065447Z","iopub.status.idle":"2023-02-28T20:42:19.536209Z","shell.execute_reply.started":"2023-02-28T20:42:14.065407Z","shell.execute_reply":"2023-02-28T20:42:19.534724Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!zip submission.zip $model_path","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:42:24.955162Z","iopub.execute_input":"2023-02-28T20:42:24.956267Z","iopub.status.idle":"2023-02-28T20:42:26.895546Z","shell.execute_reply.started":"2023-02-28T20:42:24.956217Z","shell.execute_reply":"2023-02-28T20:42:26.893510Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install tflite-runtime","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:42:30.022747Z","iopub.execute_input":"2023-02-28T20:42:30.024051Z","iopub.status.idle":"2023-02-28T20:42:44.840797Z","shell.execute_reply.started":"2023-02-28T20:42:30.023989Z","shell.execute_reply":"2023-02-28T20:42:44.839219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tflite_runtime.interpreter as tflite\ninterpreter = tflite.Interpreter(model_path)\nfound_signatures = list(interpreter.get_signature_list().keys())\nprediction_fn = interpreter.get_signature_runner(\"serving_default\")\nfor i in range(100):\n    frames = load_relevant_data_subset(f'/kaggle/input/asl-signs/{train.iloc[i].path}')\n    output = prediction_fn(inputs=frames)\n    sign = np.argmax(output[\"outputs\"])\n    print(f\"Predicted label: {index_label[sign]}, Actual Label: {train.iloc[i].sign}\")","metadata":{"execution":{"iopub.status.busy":"2023-02-28T20:42:44.843761Z","iopub.execute_input":"2023-02-28T20:42:44.844332Z","iopub.status.idle":"2023-02-28T20:42:50.239557Z","shell.execute_reply.started":"2023-02-28T20:42:44.844271Z","shell.execute_reply":"2023-02-28T20:42:50.238250Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}