{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Import Libraries","metadata":{}},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nfrom tqdm.notebook import tqdm\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data import Dataset, DataLoader\nimport math\nimport os\nimport json\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score","metadata":{"execution":{"iopub.status.busy":"2023-04-27T16:10:18.472306Z","iopub.execute_input":"2023-04-27T16:10:18.472611Z","iopub.status.idle":"2023-04-27T16:10:22.336259Z","shell.execute_reply.started":"2023-04-27T16:10:18.472582Z","shell.execute_reply":"2023-04-27T16:10:22.335004Z"},"trusted":true},"execution_count":1,"outputs":[]},{"cell_type":"code","source":"LANDMARK_FILES_DIR = \"/kaggle/input/asl-signs/train_landmark_files\"\nTRAIN_FILE = \"/kaggle/input/asl-signs/train.csv\"\nlabel_map = json.load(open(\"/kaggle/input/asl-signs/sign_to_prediction_index_map.json\", \"r\"))","metadata":{"execution":{"iopub.status.busy":"2023-04-27T16:10:26.9782Z","iopub.execute_input":"2023-04-27T16:10:26.978809Z","iopub.status.idle":"2023-04-27T16:10:26.988028Z","shell.execute_reply.started":"2023-04-27T16:10:26.978773Z","shell.execute_reply":"2023-04-27T16:10:26.987012Z"},"trusted":true},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"SEED = 7122000\nUSE_WHOLE_DATASET = False\n\n\nTOTAL_FRAMES = 50\n\n# A single skeleton (for a single frame) will be of size: \n# total_dim = 3 * (left_hand + right_hand + face + pose), \n# where 3 comes from the fact that each coord is (x,y,z)\nSKELETON_SIZE = {\n    \"left_hand\": 21,\n    \"right_hand\": 21,\n    \"face\": 468,\n    \"pose\": 33,\n}\n\nROWS_PER_FRAME = 543  # number of landmarks per frame\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) / ROWS_PER_FRAME)\n    data = data.values.reshape(n_frames, ROWS_PER_FRAME, len(data_columns))\n    return data.astype(np.float32)\n\nclass ASLData(Dataset):\n    def __init__(self, datax, datay):\n        self.datax = datax\n        self.datay = datay\n        \n    def __getitem__(self, index):\n        return self.datax[index,:], self.datay[index]\n        \n    def __len__(self):\n        return len(self.datay)\n    \nmax_length = 96  #reduce this if gets out of memory error\n\n# Converts (n_frames, 543, 3) to (n_frames, 256) feature vector\nclass FeatureGen(nn.Module):\n    def __init__(self, ):\n        super().__init__()\n        self.max_length = max_length \n  \n    def forward(self, xyz):\n        xyz = xyz - xyz[~torch.isnan(xyz)].mean(0,keepdim=True) #noramlisation to common maen\n        xyz = xyz / xyz[~torch.isnan(xyz)].std(0, keepdim=True)\n\n        LIP = [\n            61, 185, 40, 39, 37, 0, 267, 269, 270, 409,\n            291, 146, 91, 181, 84, 17, 314, 405, 321, 375,\n            78, 191, 80, 81, 82, 13, 312, 311, 310, 415,\n            95, 88, 178, 87, 14, 317, 402, 318, 324, 308,\n        ]\n        #LHAND = np.arange(468, 489).tolist()\n        #RHAND = np.arange(522, 543).tolist()\n\n        lip = xyz[:, LIP]\n        lhand = xyz[:, 468:489]\n        rhand = xyz[:, 522:543]\n        xyz = torch.cat([  # (none, 82, 3)\n            lip,\n            lhand,\n            rhand,\n        ], 1)\n        xyz[torch.isnan(xyz)] = 0\n        x = xyz[:self.max_length].flatten(1)\n        return x\n\nfeature_converter = FeatureGen()","metadata":{"execution":{"iopub.status.busy":"2023-04-27T16:10:28.391204Z","iopub.execute_input":"2023-04-27T16:10:28.391686Z","iopub.status.idle":"2023-04-27T16:10:28.407502Z","shell.execute_reply.started":"2023-04-27T16:10:28.39165Z","shell.execute_reply":"2023-04-27T16:10:28.406399Z"},"trusted":true},"execution_count":3,"outputs":[]},{"cell_type":"code","source":"max_length = 80\nnum_class  = 250\n\ndef positional_encoding(length, embed_dim):\n    dim = embed_dim//2\n    position = np.arange(length)[:, np.newaxis]     # (seq, 1)\n    dim = np.arange(dim)[np.newaxis, :]/dim   # (1, dim)\n    angle = 1 / (10000**dim)         # (1, dim)\n    angle = position * angle    # (pos, dim)\n    pos_embed = np.concatenate(\n        [np.sin(angle), np.cos(angle)],\n        axis=-1\n    )\n    pos_embed = torch.from_numpy(pos_embed).float()\n    return pos_embed\n","metadata":{"execution":{"iopub.status.busy":"2023-04-27T16:10:30.909021Z","iopub.execute_input":"2023-04-27T16:10:30.909553Z","iopub.status.idle":"2023-04-27T16:10:30.921711Z","shell.execute_reply.started":"2023-04-27T16:10:30.909502Z","shell.execute_reply":"2023-04-27T16:10:30.920614Z"},"trusted":true},"execution_count":4,"outputs":[]},{"cell_type":"code","source":"import multiprocessing as mp\n\ndef convert_row(row):\n    x = load_relevant_data_subset(os.path.join(\"/kaggle/input/asl-signs\", row[1].path))\n    x = feature_converter(torch.tensor(x)).cpu().numpy()\n    return x, row[1].label\n\ndef convert_and_save_data():\n    df = pd.read_csv(TRAIN_FILE)\n    df['label'] = df['sign'].map(label_map)\n    npdata = np.zeros(df.shape[0],dtype=object)\n    nplabels = np.zeros(df.shape[0])\n    with mp.Pool() as pool:\n        results = pool.imap(convert_row, df.iterrows(), chunksize=250)\n        for i, (x,y) in tqdm(enumerate(results), total=df.shape[0]):\n            npdata[i] = x\n            nplabels[i] = y\n    \n    np.save(\"feature_data.npy\", npdata)\n    np.save(\"feature_labels.npy\", nplabels)\n        \nconvert_and_save_data()\n\n","metadata":{"execution":{"iopub.status.busy":"2023-04-27T16:11:12.593131Z","iopub.execute_input":"2023-04-27T16:11:12.594059Z","iopub.status.idle":"2023-04-27T16:28:35.643708Z","shell.execute_reply.started":"2023-04-27T16:11:12.594018Z","shell.execute_reply":"2023-04-27T16:28:35.638975Z"},"trusted":true},"execution_count":7,"outputs":[{"output_type":"display_data","data":{"text/plain":"  0%|          | 0/94477 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"61069bc4da3446598950ae3feb63656b"}},"metadata":{}}]},{"cell_type":"code","source":"from collections import defaultdict\n## presence of thing per video\ncats = [\"face\", \"right_hand\", \"left_hand\", \"pose\"]\n# face = []\n# rh = []\n# lh = []\n# p = []\nlr = []\nsigns = defaultdict(int)\nfor idx, file_path in enumerate(tqdm(train['path'])):\n    sign = train[train[\"path\"] == file_path][\"sign\"].values[0]\n    parquet = pd.read_parquet(\"/kaggle/input/asl-signs/\" + file_path)\n    parquet = parquet.groupby([\"frame\", \"type\"]).count().reset_index().values\n    temp_counts = {\"face\": [], \"right_hand\": [], \"left_hand\": [], \"pose\": []}\n    lr_count = []\n    cur_f = 0\n    found_cur_f = False\n    for row in parquet:\n        if row[0] != cur_f:\n            cur_f = row[0]\n            found_cur_f = False\n#         temp_counts[row[1]].append(1 if row[4] else 0)\n        if (row[1] == \"left_hand\" or row[1] == \"right_hand\") and not found_cur_f:\n            lr_count.append(1 if row[4] else 0)\n            found_cur_f = True\n#     face.append(sum(temp_counts[\"face\"])/len(temp_counts[\"face\"]))\n#     r = sum(temp_counts[\"right_hand\"])/len(temp_counts[\"right_hand\"])\n#     l = sum(temp_counts[\"left_hand\"])/len(temp_counts[\"left_hand\"])\n#     rh.append(l)\n#     lh.append(r)\n#     p.append(sum(temp_counts[\"pose\"])/len(temp_counts[\"pose\"]))\n    lr.append(sum(lr_count)/len(lr_count))\n    signs[sign] += 1 if sum(lr_count) > 1 else 0\n\n# lr.sort()\n# lr.reverse()\n# # plt.bar([x for x in range(len(lr))], lr)\n# # plt.show()\n\n\n# plt.bar([x for x in range(len(lr))], lr)\n# plt.show()\n\nsigns_2 = [k for k, v in sorted(signs.items(), key=lambda x: x[1])]\nvals = [v for k, v in sorted(signs.items(), key=lambda x: x[1])]\n\nplt.bar(signs_2, vals)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-27T16:10:33.219404Z","iopub.execute_input":"2023-04-27T16:10:33.21989Z","iopub.status.idle":"2023-04-27T16:10:33.427718Z","shell.execute_reply.started":"2023-04-27T16:10:33.219849Z","shell.execute_reply":"2023-04-27T16:10:33.425044Z"},"trusted":true},"execution_count":5,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)","\u001b[0;32m/tmp/ipykernel_23/1323997157.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      8\u001b[0m \u001b[0mlr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      9\u001b[0m \u001b[0msigns\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdefaultdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfile_path\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtqdm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'path'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     11\u001b[0m     \u001b[0msign\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrain\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"path\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mfile_path\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"sign\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     12\u001b[0m     \u001b[0mparquet\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_parquet\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"/kaggle/input/asl-signs/\"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mfile_path\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mNameError\u001b[0m: name 'train' is not defined"],"ename":"NameError","evalue":"name 'train' is not defined","output_type":"error"}]},{"cell_type":"code","source":"# count presence of thing\n\ncats = [\"face\", \"right_hand\", \"left_hand\", \"pose\"]\ncounts = {}\nfor x in range(1, 11):\n    counts[x] = {\"face\": [], \"right_hand\": [], \"left_hand\": [], \"pose\": []}\n\nfor idx, file_path in enumerate(tqdm(train['path'].sample(50, random_state=0))):\n    parquet = pd.read_parquet(\"/kaggle/input/asl-signs/\" + file_path)\n    parquet = parquet.groupby([\"frame\", \"type\"]).count().reset_index().values\n    temp_counts = {\"face\": [], \"right_hand\": [], \"left_hand\": [], \"pose\": []}\n    max_frame_no = parquet.max(axis=0)[0]\n    min_frame_no = parquet.min(axis=0)[0]\n    diffs = (max_frame_no - min_frame_no) / 10\n    group = 1\n    for row in parquet:\n        if row[0] > min_frame_no + diffs * group:\n            for cat in cats:\n                group_avg = sum(temp_counts[cat])/len(temp_counts[cat])\n                counts[group][cat].append(group_avg)\n            group += 1\n        temp_counts[row[1]].append(1 if row[4] else 0)\n    \n    for cat in cats:\n        group_avg = sum(temp_counts[cat])/len(temp_counts[cat])\n        counts[group][cat].append(group_avg)\n\n    \navgs = []\ntemp_avgs = []\nfor group in counts.keys():\n    for cat in cats:\n        c = counts[group][cat]\n        temp_avgs.append(sum(c)/len(c))\n    avgs.append(tuple(temp_avgs))\n    temp_avgs = []\n    \navgs = list(map(list, zip(*avgs)))\nlabels = [f\"{x*10}%\" for x in range(1, 11)]\n\nX = np.arange(len(avgs[0]))\nfig = plt.figure()\nax = fig.add_axes([0,0,1,1])\nax.bar(X - 0.4,  avgs[3], color = 'b', width = 0.2)\nax.bar(X - 0.2, avgs[0], color = 'g', width = 0.2)\nax.bar(X + 0, avgs[1], color = 'r', width = 0.2)\nax.bar(X + 0.2, avgs[2], color = 'y', width = 0.2)\n\nax.set_xticks(X, labels)\nax.legend(labels=[\"pose\", \"face\", \"left_hand\", \"right_hand\"])\n","metadata":{"execution":{"iopub.status.busy":"2023-04-26T14:31:10.53367Z","iopub.execute_input":"2023-04-26T14:31:10.535024Z","iopub.status.idle":"2023-04-26T14:33:41.356756Z","shell.execute_reply.started":"2023-04-26T14:31:10.534973Z","shell.execute_reply":"2023-04-26T14:33:41.355284Z"},"trusted":true},"execution_count":61,"outputs":[{"output_type":"display_data","data":{"text/plain":"  0%|          | 0/5000 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"c12d6c77f3a447e1a6fa8ebefbbf1fe7"}},"metadata":{}},{"execution_count":61,"output_type":"execute_result","data":{"text/plain":"<matplotlib.legend.Legend at 0x7f8e6b686f50>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"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p1ElsDILAABQSh06dNCQIUOUmpqqevXq6dZbb5XD4dC8efOcfTZtWqV7771a118foMTEWC1dOk9t2zq0fftGl7EyMzOUmBirGy6/QX3/1Fff7fpOkvTJnE/0+qTXtXPbTrVt0FZtG7TVJ3M+uaj5HT58WH/+859VvXp1NWvWTPPnz3eeKygoUL9+/RQVFaVq1aqpRYsWeumll1yu79Onj+6880698MILCgsLU3BwsAYPHqwzZ844++Tk5Khbt26qVq2aoqKiNGvWLPd+E0uIMAsAAFAG3nrrLfn4+GjlypV69dVXXc6dPHlSDz/cTU2bXqV//nO9Bg36m1555fFix5k6daQeemii3l74tnx8fPS3h/8mSbr1T7fqvkH3qUmLJlq4YaEWblioW/9060XNbcyYMerevbs2b96sLl266L777tPRo0clSYWFhWrYsKHef/99bdu2TaNGjdKTTz6p999/32WML7/8Urt379aXX36pt956SzNnztTMmTOd5/v06aPvvvtOX3zxhT788ENNmTJFOTk5F/vbV2JsMwAAACgDTZs21fPPP1/subOrlA6NHPm6/P0D1KTJFfrPfw7o2WcHFOn74IPPKiamvRS+Tr0H91ZKYopyf8lVQLUAVa9RXd7e3qpXv55bc+vTp4969uwpSRo3bpxeeeUVffPNN7rtttvk6+urMWPGOPtGRUVp1apVev/999W9e3dne926dTV58mR5e3urZcuW6tq1qz7//HMNGDBAO3bs0MKFC/X111/ruuuukyS9+eabatWqlVvzLAlWZgEAAMpAbGzsBc9t375dzZq1lr9/gLPtyiuvLbZvs2atnb+uF3I2tP545MdSza116/+NWaNGDdWqVctl1XTatGmKjY3VZZddppo1a+r1119XVlaWyxhXXnmlvL29na/DwsKcY2RmZsrHx8fl96Bly5aqU6dOqeZ9MQizAAAAZaBGjRoXPGeMkeQopq0oHx/fIm2FhYWlmpuvr+uYDofDOeb777+v4cOHq2/fvlqyZIk2btyoBx54QHl5eRc9xrlaHA7XGisCYRYAAKCctWzZUrt2bVZeXq6zLTNzndvj+Pr6ljrYnm/58uWKj49XcnKyrrnmGjVt2lS7d+92a4xWrVopPz9f69b9r6bt27fr2LFjZTrX4hBmAQAAytm9994rYwo1btxA7d2bqdWrF+ud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AGAtwiwAAACsRZgFAACAtQizAAAAsBZhFgAAANYizAIAAMBahFkAAABYizALAAAAaxFmAQAAYC3CLAAAAKxFmAUAAIC1CLMAAACwFmEWAAAA1iLMAgAAwFqEWQAAAFiLMAsAAABrEWYBAABgLcIsAAAArEWYBQAAgLUIswAAALAWYRYAAADWIswCAADAWoRZAAAAWIswCwAAAGsRZgEAAGAtwiwAAACsRZgFAACAtQizAAAAsBZhFgAAANYizAIAAMBahFkAAABYq0RhdsqUKYqKilJAQIBiYmK0fPny3+z/1VdfKSYmRgEBAWrSpImmTZtWoskCAAAAv+Z2mJ0zZ45SUlI0cuRIbdiwQe3atVPnzp2VlZVVbP+9e/eqS5cuateunTZs2KAnn3xSw4YN00cffVTqyQMAAKBqczvMTpo0Sf369VP//v3VqlUrpaWlKSIiQlOnTi22/7Rp09SoUSOlpaWpVatW6t+/v/r27asXXnih1JMHAABA1ebjTue8vDxlZGToiSeecGlPSEjQqlWrir1m9erVSkhIcGnr1KmT3nzzTZ05c0a+vr5FrsnNzVVubq7z9fHjxyVJJ06ccGe6Fe8X97q7W81PP7kxdnn/XlWiWqXKVW9VqlWyvN6qVKtUrvVWpVqlSlZvVapVqlT1VqVapYrPYefuZ4z57Y7GDQcOHDCSzMqVK13an332WdO8efNir2nWrJl59tlnXdpWrlxpJJmDBw8We83o0aONJA4ODg4ODg4Ojip+7Nu37zfzqVsrs+c4HA6X18aYIm2/17+49nNGjBih1NRU5+vCwkIdPXpUwcHBv3kfT3DixAlFRERo3759ql279qWeTrmiVs9VleqlVs9VleqtSrVKVatem2s1xujkyZMKDw//zX5uhdl69erJ29tbhw4dcmnPyclRSEhIsdeEhoYW29/Hx0fBwcHFXuPv7y9/f3+Xtjp16rgzVevVrl3buj90JUWtnqsq1Uutnqsq1VuVapWqVr221hoYGPi7fdz6AJifn59iYmKUnp7u0p6enq74+Phir4mLiyvSf8mSJYqNjS12vywAAABwsdx+mkFqaqreeOMNTZ8+XZmZmRo+fLiysrKUlJQk6ewWgcTERGf/pKQkff/990pNTVVmZqamT5+uN998U4888kjZVQEAAIAqye09sz169NCRI0c0duxYZWdnKzo6WgsWLFBkZKQkKTs72+WZs1FRUVqwYIGGDx+uf/zjHwoPD9fLL7+su+++u+yq8CD+/v4aPXp0kW0WnohaPVdVqpdaPVdVqrcq1SpVrXqrQq0OY37veQcAAABA5VSir7MFAAAAKgPCLAAAAKxFmAUAAIC1CLMAAACwFmEWAAAA1iLMlqNly5apW7duCg8Pl8Ph0Lx581zOG2P09NNPKzw8XNWqVVOHDh307bffuvRJTU1VUFCQGjVqpPfee8/l3Pvvv69u3bqVdxkXZfz48Wrbtq1q1aql+vXr684779T27dtd+nhKvVOnTlXr1q2d36YSFxenhQsXOs97Sp3FGT9+vBwOh1JSUpxtnlTv008/LYfD4XKEhoY6z3tSrZJ04MAB3X///QoODlb16tV19dVXKyMjw3nek+pt3LhxkffW4XBo8ODBkjyr1vz8fP31r39VVFSUqlWrpiZNmmjs2LEqLCx09vGkek+ePKmUlBRFRkaqWrVqio+P19q1a53nba61LHJEbm6uhg4dqnr16qlGjRr605/+pP3797uc79Wrl2rXrq0WLVroiy++cLn++eef19ChQ8utxjJhUG4WLFhgRo4caT766CMjyXz88ccu55977jlTq1Yt89FHH5ktW7aYHj16mLCwMHPixAljjDHz5883ISEhZu3atebdd981AQEB5vDhw8YYY3788UfTtGlT8/3331d0WcXq1KmTmTFjhtm6davZuHGj6dq1q2nUqJE5deqUs4+n1Dt//nzz2Wefme3bt5vt27ebJ5980vj6+pqtW7caYzynzvN98803pnHjxqZ169bmoYcecrZ7Ur2jR482V155pcnOznYeOTk5zvOeVOvRo0dNZGSk6dOnj1mzZo3Zu3ev+fe//2127drl7ONJ9ebk5Li8r+np6UaS+fLLL40xnlXrM888Y4KDg82nn35q9u7daz744ANTs2ZNk5aW5uzjSfV2797dXHHFFearr74yO3fuNKNHjza1a9c2+/fvN8bYXWtpc4QxxiQlJZkGDRqY9PR0s379enPTTTeZNm3amPz8fGOMMS+//LJp1aqV2bp1q/n73/9u6tevbwoLC40xxuzZs8c0a9bMHD9+vMJqLgnCbAU5/w9hYWGhCQ0NNc8995yz7ZdffjGBgYFm2rRpxhhjJkyYYHr06OE8X79+ffPNN98YY4wZMGCAmTRpUsVMvgRycnKMJPPVV18ZYzy/3rp165o33njDY+s8efKkadasmUlPTzft27d3hllPq3f06NGmTZs2xZ7ztFoff/xxc8MNN1zwvKfVe76HHnrIXH755aawsNDjau3atavp27evS9tdd91l7r//fmOMZ723p0+fNt7e3ubTTz91aW/Tpo0ZOXKkR9Vakhxx7Ngx4+vra9577z1nnwMHDhgvLy+zaNEiY4wxDz74oHn88ceNMWd/PyU5/xHfqVMnM3fu3PIurdTYZnCJ7N27V4cOHVJCQoKzzd/fX+3bt9eqVaskSW3atNG6dev0448/KiMjQz///LOaNm2qFStWaP369Ro2bNilmv7vOn78uCQpKChIkufWW1BQoPfee08//fST4uLiPLbOwYMHq2vXrurYsaNLuyfWu3PnToWHhysqKkp/+ctftGfPHkmeV+v8+fMVGxure+65R/Xr19c111yj119/3Xne0+r9tby8PL3zzjvq27evHA6Hx9V6ww036PPPP9eOHTskSZs2bdKKFSvUpUsXSZ713ubn56ugoEABAQEu7dWqVdOKFSs8qtbzXUxtGRkZOnPmjEuf8PBwRUdHu9S/YsUK/fzzz1q8eLHCwsJUr149vfPOOwoICNCf//znii2sJC51mq4qdN6/qFauXGkkmQMHDrj0GzBggElISHC+Hj16tLn88stNdHS0mTt3rsnNzTXR0dFm3bp15pVXXjHNmzc38fHxzh9xVwaFhYWmW7duLqs+nlbv5s2bTY0aNYy3t7cJDAw0n332mTHG8+o0xpjZs2eb6Oho8/PPPxtjjMvKrKfVu2DBAvPhhx+azZs3O1ehQ0JCzOHDhz2uVn9/f+Pv729GjBhh1q9fb6ZNm2YCAgLMW2+9ZYzxvPf21+bMmWO8vb2dtXlarYWFheaJJ54wDofD+Pj4GIfDYcaNG+c872n1xsXFmfbt25sDBw6Y/Px8889//tM4HA7TvHlzj6q1JDli1qxZxs/Pr8hYt956qxk4cKAxxpi8vDyTnJxsGjdubGJjY83y5cvNkSNHTJMmTcz3339vRo4caS6//HKTkJDg3LpR2RBmK8iF/hAePHjQpV///v1Np06dLjjO6NGjTUpKitm0aZMJCQkxOTk5Zvr06eYPf/hDeU3dbcnJySYyMtLs27fP2eZp9ebm5pqdO3eatWvXmieeeMLUq1fPfPvttx5XZ1ZWlqlfv77ZuHGjs624MOsp9Z7v1KlTJiQkxEycONHjavX19TVxcXEubUOHDjV//OMfjTGe/d4mJCSY22+/3fna02qdPXu2adiwoZk9e7bZvHmzefvtt01QUJCZOXOmMcbz6t21a5e58cYbjSTj7e1t2rZta+677z7TqlUrj6q1JDniQmG2Y8eOZtCgQRe8V+/evU1aWpr517/+Za688kpz6tQpM2rUKHPXXXeVTTFljDBbQc7/Q7h7924jyaxfv96l35/+9CeTmJhY7BiZmZmmadOm5uTJk+all14y99xzjzHm7F+4kirFBu0hQ4aYhg0bmj179ri0e2q959xyyy1m4MCBHlfnxx9/7PwL4twhyTgcDuPt7W127drlUfUWp2PHjiYpKcnj3ttGjRqZfv36ubRNmTLFhIeHG2M89//Z7777znh5eZl58+Y52zyt1oYNG5rJkye7tP3tb38zLVq0MMZ4Xr3nnDp1yhnsunfvbrp06eJRtZYkR3z++edGkjl69KhLn9atW5tRo0YVe5/PP//ctG3b1uTn55vhw4ebRx991BhjzNatW01QUFAZVlR22DN7iURFRSk0NFTp6enOtry8PH311VeKj48v0t8Yo4EDB2rixImqWbOmCgoKdObMGUly/vfXj12paMYYDRkyRHPnztUXX3yhqKgol/OeVu/5jDHKzc31uDpvueUWbdmyRRs3bnQesbGxuu+++7Rx40Y1adLEo+o9X25urjIzMxUWFuZx7+31119f5PF5O3bsUGRkpCTP/X92xowZql+/vrp27eps87RaT58+LS8v17/evb29nXPytHrPqVGjhsLCwvTjjz9q8eLFuuOOOzy2Vuni3seYmBj5+vq69MnOztbWrVuLrf+XX37R4MGD9eqrr8rb27tI/QUFBeVcVQldohBdJZw8edJs2LDBbNiwwUgykyZNMhs2bHA+4uO5554zgYGBZu7cuWbLli2mZ8+eRR6pcc6rr75q7r77bufrNWvWmNq1a5vVq1ebUaNGmSuuuKLC6irOgw8+aAIDA83SpUtdHn9z+vRpZx9PqXfEiBFm2bJlZu/evWbz5s3mySefNF5eXmbJkiXGGM+p80J+vc3AGM+q9+GHHzZLly41e/bsMV9//bW5/fbbTa1atcx3331njPGsWr/55hvj4+Njnn32WbNz504za9YsU716dfPOO+84+3hSvcYYU1BQYBo1auT85PaveVKtvXv3Ng0aNHA+mmvu3LmmXr165rHHHnP28aR6Fy1aZBYuXGj27NljlixZYtq0aWOuvfZak5eXZ4yxu9ayyBFJSUmmYcOG5t///rdZv369ufnmm10ezfVrI0aMMA8//LDz9Zw5c0yjRo3Mpk2bTL9+/UyXLl3Kv+gSIMyWoy+//NJIKnL07t3bGHN2k/7o0aNNaGio8ff3NzfeeKPZsmVLkXEOHTpkIiMji2zyHjNmjAkKCjItW7Y0a9asqYiSLqi4OiWZGTNmOPt4Sr19+/Y1kZGRxs/Pz1x22WXmlltucQZZYzynzgs5P8x6Ur3nntHo6+trwsPDzV133WW+/fZb53lPqtUYYz755BMTHR1t/P39TcuWLc1rr73mct7T6l28eLGRZLZv317knCfVeuLECfPQQw+ZRo0amYCAANOkSRMzcuRIk5ub6+zjSfXOmTPHNGnSxPj5+ZnQ0FAzePBgc+zYMed5m2stixzx888/myFDhpigoCBTrVo1c/vtt5usrKwi99qyZYtp2rSpy/PhCwoKzIMPPmhq165t2rZta3bu3Fmu9ZaUwxhjKngxGAAAACgT7JkFAACAtQizAAAAsBZhFgAAANYizAIAAMBahFkAAABYizALAAAAaxFmAQAAYC3CLAAAAKxFmAUAAIC1CLMAAACwFmEWAAAA1vr/1qqcTUt7C6wAAAAASUVORK5CYII=\n"},"metadata":{}}]},{"cell_type":"code","source":"# count frequency of (not) NaNs for each type (invert the percentages at the end for % of nan)\n\ncounts = {\"face\": 0, \"right_hand\": 0, \"left_hand\": 0, \"pose\": 0}\nnot_nan_counts = {\"face\": 0, \"right_hand\": 0, \"left_hand\": 0, \"pose\": 0}\nfor idx, file_path in enumerate(tqdm(train['path'].sample(2000, random_state=0))):\n    parquet = pd.read_parquet(\"/kaggle/input/asl-signs/\" + file_path)\n    total_counts = parquet.groupby([\"type\"]).count()\n    for key in counts.keys():\n        counts[key] += total_counts.loc[key][\"frame\"]\n        not_nan_counts[key] += total_counts.loc[key][\"x\"]\n\n\nfinal_counts = {}\nfor key in counts.keys():\n    final_counts[key] = (not_nan_counts[key] / counts[key]) * 100\n    \nprint(counts)\nfinal_counts","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def display_sign_histogram(dataset):\n    value_counts = dict(train[\"sign\"].value_counts())\n    print(value_counts)\n    signs = list(value_counts.keys())\n    values = list(value_counts.values())\n    plt.bar(signs, values)\n    plt.show()\n    \ndisplay_sign_histogram(train)","metadata":{"execution":{"iopub.status.busy":"2023-04-19T20:12:42.112613Z","iopub.execute_input":"2023-04-19T20:12:42.11394Z","iopub.status.idle":"2023-04-19T20:12:45.025171Z","shell.execute_reply.started":"2023-04-19T20:12:42.113853Z","shell.execute_reply":"2023-04-19T20:12:45.023782Z"},"trusted":true},"execution_count":75,"outputs":[{"name":"stdout","text":"{'taste': 32, 'closet': 30, 'outside': 30, 'ear': 30, 'touch': 29, 'cow': 29, 'bath': 29, 'think': 29, 'rain': 29, 'snack': 29, 'shhh': 28, 'gum': 28, 'like': 28, 'icecream': 28, 'pool': 28, 'elephant': 28, 'clown': 27, 'face': 27, 'stuck': 27, 'home': 27, 'helicopter': 26, 'grandpa': 26, 'penny': 26, 'TV': 26, 'green': 26, 'gift': 26, 'yellow': 26, 'hello': 25, 'first': 25, 'sick': 25, 'owl': 25, 'weus': 25, 'donkey': 25, 'pencil': 25, 'noisy': 25, 'bad': 25, 'alligator': 25, 'finger': 24, 'food': 24, 'napkin': 24, 'sleepy': 24, 'go': 24, 'thankyou': 24, 'drink': 24, 'find': 24, 'story': 24, 'for': 24, 'boat': 23, 'hungry': 23, 'fine': 23, 'child': 23, 'garbage': 23, 'can': 23, 'cute': 23, 'milk': 23, 'lips': 23, 'flag': 23, 'tomorrow': 23, 'farm': 22, 'feet': 22, 'yucky': 22, 'yourself': 22, 'ride': 22, 'open': 22, 'cereal': 22, 'dry': 22, 'snow': 22, 'water': 22, 'uncle': 22, 'tongue': 22, 'fall': 22, 'red': 22, 'kitty': 22, 'jump': 22, 'minemy': 22, 'sleep': 22, 'stairs': 22, 'pen': 22, 'now': 22, 'cry': 22, 'pizza': 22, 'drop': 22, 'that': 21, 'flower': 21, 'cat': 21, 'tree': 21, 'lamp': 21, 'goose': 21, 'person': 21, 'blue': 21, 'mitten': 21, 'brown': 21, 'tooth': 21, 'finish': 21, 'hear': 21, 'lion': 21, 'fireman': 21, 'chair': 21, 'bye': 21, 'hesheit': 21, 'will': 21, 'close': 20, 'car': 20, 'head': 20, 'loud': 20, 'callonphone': 20, 'beside': 20, 'pretend': 20, 'nose': 20, 'night': 20, 'grandma': 20, 'carrot': 20, 'quiet': 20, 'old': 20, 'aunt': 20, 'where': 20, 'pretty': 20, 'no': 20, 'apple': 20, 'listen': 20, 'fish': 20, 'sticky': 20, 'horse': 20, 'man': 20, 'up': 20, 'happy': 20, 'bee': 20, 'cowboy': 20, 'doll': 20, 'wet': 20, 'dryer': 20, 'talk': 19, 'better': 19, 'empty': 19, 'glasswindow': 19, 'please': 19, 'duck': 19, 'wake': 19, 'look': 19, 'mouse': 19, 'girl': 19, 'pig': 19, 'dad': 19, 'sad': 19, 'same': 19, 'bedroom': 19, 'hen': 19, 'hot': 19, 'potty': 19, 'morning': 19, 'many': 19, 'hide': 19, 'if': 19, 'orange': 19, 'every': 19, 'shirt': 19, 'another': 19, 'see': 19, 'radio': 19, 'on': 18, 'wait': 18, 'boy': 18, 'black': 18, 'puzzle': 18, 'give': 18, 'store': 18, 'bird': 18, 'toothbrush': 18, 'mom': 18, 'chocolate': 18, 'mad': 18, 'jeans': 18, 'wolf': 18, 'jacket': 18, 'chin': 18, 'kiss': 18, 'have': 18, 'toy': 18, 'say': 18, 'shower': 18, 'puppy': 18, 'awake': 18, 'not': 18, 'backyard': 18, 'before': 18, 'who': 17, 'moon': 17, 'because': 17, 'arm': 17, 'room': 17, 'police': 17, 'nap': 17, 'white': 17, 'tiger': 17, 'cloud': 17, 'frog': 17, 'nuts': 17, 'scissors': 17, 'owie': 17, 'time': 17, 'hair': 17, 'clean': 17, 'fast': 17, 'high': 17, 'frenchfries': 16, 'pajamas': 16, 'balloon': 16, 'there': 16, 'brother': 16, 'book': 16, 'all': 16, 'dance': 16, 'later': 16, 'bug': 16, 'make': 16, 'hate': 16, 'dog': 16, 'zebra': 15, 'table': 15, 'sun': 15, 'yesterday': 15, 'read': 15, 'underwear': 15, 'into': 15, 'down': 15, 'drawer': 15, 'bed': 15, 'grass': 15, 'zipper': 15, 'giraffe': 15, 'cut': 15, 'smile': 14, 'shoe': 14, 'mouth': 14, 'blow': 14, 'eye': 14, 'hat': 14, 'animal': 14, 'stay': 13, 'yes': 13, 'vacuum': 13, 'refrigerator': 13, 'airplane': 13, 'haveto': 12, 'after': 11, 'cheek': 11, 'dirty': 10, 'any': 10, 'why': 10, 'thirsty': 8}\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"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47tjAACAFYQQAABgBSEEAABYQQgBAABWEEIAAIAVhBAAAGAFIQQAAFhBCAEAAFYQQgAAgBWEEAAAYAUhBAAAWEEIAQAAVhBCAACAFYQQAABgBSEEAABYQQgBAOAM0feRFer7yArbzXARQgAAgBWEEAAAYAUhBAAAWEEIAQAAVhBCAACAFYQQAABgBSEEAABYQQgBAABWEEIAAIAVhBAAAGAFIQQAAFhBCAEAAFYQQgAAgBWEEAAAYAUhBAAAWEEIAQAAVhBCAACAFYQQAABgBSEEAABYQQgBAABWEEIAAIAVhBAAAGAFIQQAAFhBCAEAAFYQQgAAgBWEEAAAYAUhBAAAWEEIAQAAVrR7CCkoKJDjOCElKSmpvRcDAAC6OF9HzPT888/X6tWr3cder7cjFgMAALqwDgkhPp+P3g8AANCiDrknZPv27UpJSVG/fv1022236euvv262bnV1tSorK0MKAADo/to9hGRlZenFF1/Ue++9p+eee05lZWUaNmyY9u3b12T9wsJCxcXFuSUtLa29mwQAADqhdg8h+fn5uummm3TBBRdo1KhRWrFihSRp6dKlTdafPn26Kioq3FJSUtLeTQIAAJ1Qh9wTUl9UVJQuuOACbd++vcnn/X6//H5/RzcDAAB0Mh0+Tkh1dbW2bdum5OTkjl4UAADoQto9hDz88MNau3atiouL9cknn+gnP/mJKisrNW7cuPZeFAAA6MLa/d8xu3fv1k9/+lN999136tWrl4YOHar169crPT29vRcFAAC6sHYPIa+88kp7zxIAAHRDfHcMAACwghACAACsIIQAAAArCCEAAMAKQggAALCCEAIAAKwghAAAACsIIQAAwApCCAAAsIIQAgAArCCEAAAAKwghAADACkIIAACwghACAACsIIQAAAArCCEAAMAKQggAALCCEAIAAKwghAAAACsIIQAAwApCCAAAsIIQAgAArCCEAAAAKwghAADACkIIAACwghACAACsIIQAAAArCCEAAMAKQggAALCCEAIAAKwghAAAACsIIQAAwApCCAAAsIIQAgAArCCEAAAAKwghAADACkIIAACwghACAACsIIQAAAArCCEAAMAKQggAALCCEAIAAKwghAAAACsIIQAAwIoOCyELFy5Uv379FBERoUsvvVR/+ctfOmpRAACgC+qQELJ8+XJNmTJFM2bM0ObNm3Xl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VFSkzz77TFFRUXr33Xe1dOlSLVy48KTt+P777/Uf//EfCgQCqqmpaXStXbhwocrLy/XBBx9ozJgxIcdre3nxxRfVv39/9enTR88884yeffZZZWdn684779T7778vSUpNTdXcuXO1cOHCVg+n3xrV1dX6/PPP3eH6k5OTNWnSJJWUlOj8889XaWlpi+tb/xpd/6sLWqOqqkpFRUV65JFHdOzYMQ0ZMkQPPPCA3njjjWbbWlJSoscee0y33HJLk19x0WanHWO6kU8//dRccsklJioqyvTs2dP88Ic/NJGRkSYsLMz07NnTjBo1ymzZssWt31JPyKeffur+2ygQCDR6bXPLHDVqlBkyZIiZPHlym3pCJJmEhATzhz/8wRhjTFVVlfnRj35kevbsaSIjI80PfvAD9y+ZgoIC4ziO29XmOI7x+XymZ8+eJjk52fh8PnPLLbeY48ePm3Hjxpnw8HBzyy23mOzs7EbrGvwL7sILLzTHjx830onPn9fv9vN6vWbKlCluO1vqCdH//8u7Z8+ebts8Ho/p37+/mT17tjl27Jhbd/PmzSYQCJhrrrnGfP/99+70q666yu0+nD17thk4cKDx+/2mT58+Jiws7KR/LeTk5JiYmBgTFRVl+vTpY6KiokxERISJjo5292F6errxeDxm5MiR5uDBg03Ow3Eck52d3eKygnUb9oQ0PC4kmR49erj7t63q94RcccUVJj093fj9ftO3b18zZcoUc/jwYWNM6PEYFxdnJJn/+q//ana+bekJkeSOetzUMTB58mT3mElNTW3yfMnJyTEej8dcfPHFIe31eDzG7/ebUaNGuefC4MGDQ47XmTNnGp/PZ0aOHGl+//vfhxwX48aNM999993JN2S9djQ37+DxENxnPXv2dM+1iIgI87Of/cy8/vrrxufzuevbq1cv89lnnzU5n5Mtu62CPSHJycnG6/Wa4cOHu9NSU1PN6tWr3f1af1pD9ds6fPhwk5GRYXr16mUiIiLMeeedZxYtWuTWbaknZMyYMSYpKcn07ds35DoY3P/B7ef1ehsdr+3lN7/5jXtOJCQkhOyb4PWx/jq1Z09I8NzweDzm17/+tft7WFiYiYuLMwkJCS2ub/1r9PHjx9uy2mbmzJnuNbpv374mEAi41+rm2urxeMwll1xidu/e3aZlNafTjxMCAAC6pzP3s18AAMAqQggAALCCEAIAAKwghAAAACsIIQAAwApCCAAAsIIQAgAArCCEAAAAKwghAADAiv8HeYVNGmXUmnsAAAAASUVORK5CYII=\n"},"metadata":{}}]},{"cell_type":"code","source":"datax = np.load(\"/kaggle/working/feature_data.npy\",allow_pickle=True)\ndatay = np.load(\"/kaggle/working/feature_labels.npy\")","metadata":{"execution":{"iopub.status.busy":"2023-04-27T16:30:54.984843Z","iopub.execute_input":"2023-04-27T16:30:54.985696Z","iopub.status.idle":"2023-04-27T16:31:10.589718Z","shell.execute_reply.started":"2023-04-27T16:30:54.985655Z","shell.execute_reply":"2023-04-27T16:31:10.588676Z"},"trusted":true},"execution_count":8,"outputs":[]},{"cell_type":"code","source":"EPOCHS = 40\nBATCH_SIZE = 64\n\ntrainx, testx, trainy, testy = train_test_split(datax, datay, test_size=0.15, random_state=42)\n\ntrain_data = ASLData(trainx, trainy)\nvalid_data = ASLData(testx, testy)\n\ntrain_loader = DataLoader(train_data, batch_size=BATCH_SIZE, num_workers=2, shuffle=True)\nval_loader = DataLoader(valid_data, batch_size=BATCH_SIZE, num_workers=2, shuffle=False)\n\nitr = iter(train_loader)\nim, _ = next(itr)\nprint(im.size())","metadata":{"execution":{"iopub.status.busy":"2023-04-27T16:36:08.485927Z","iopub.execute_input":"2023-04-27T16:36:08.486546Z","iopub.status.idle":"2023-04-27T16:36:08.807131Z","shell.execute_reply.started":"2023-04-27T16:36:08.486494Z","shell.execute_reply":"2023-04-27T16:36:08.805475Z"},"trusted":true},"execution_count":18,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mIndexError\u001b[0m                                Traceback (most recent call last)","\u001b[0;32m/tmp/ipykernel_23/2372080260.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     12\u001b[0m \u001b[0mitr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0miter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain_loader\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mim\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     14\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mim\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    626\u001b[0m                 \u001b[0;31m# TODO(https://github.com/pytorch/pytorch/issues/76750)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    627\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m  \u001b[0;31m# type: ignore[call-arg]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 628\u001b[0;31m             \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_next_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    629\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_num_yielded\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    630\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dataset_kind\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0m_DatasetKind\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mIterable\u001b[0m \u001b[0;32mand\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_next_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   1331\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1332\u001b[0m                 \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_task_info\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1333\u001b[0;31m                 \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1334\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1335\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_try_put_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_process_data\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m   1357\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_try_put_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1358\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mExceptionWrapper\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1359\u001b[0;31m             \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreraise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1360\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1361\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.7/site-packages/torch/_utils.py\u001b[0m in \u001b[0;36mreraise\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    541\u001b[0m             \u001b[0;31m# instantiate since we don't know how to\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    542\u001b[0m             \u001b[0;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 543\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    544\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    545\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mIndexError\u001b[0m: Caught IndexError in DataLoader worker process 0.\nOriginal Traceback (most recent call last):\n  File \"/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/worker.py\", line 302, in _worker_loop\n    data = fetcher.fetch(index)\n  File \"/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 58, in fetch\n    data = [self.dataset[idx] for idx in possibly_batched_index]\n  File \"/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 58, in <listcomp>\n    data = [self.dataset[idx] for idx in possibly_batched_index]\n  File \"/tmp/ipykernel_23/2566360283.py\", line 32, in __getitem__\n    return self.datax[index,:], self.datay[index]\nIndexError: too many indices for array: array is 1-dimensional, but 2 were indexed\n"],"ename":"IndexError","evalue":"Caught IndexError in DataLoader worker process 0.\nOriginal Traceback (most recent call last):\n  File \"/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/worker.py\", line 302, in _worker_loop\n    data = fetcher.fetch(index)\n  File \"/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 58, in fetch\n    data = [self.dataset[idx] for idx in possibly_batched_index]\n  File \"/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 58, in <listcomp>\n    data = [self.dataset[idx] for idx in possibly_batched_index]\n  File \"/tmp/ipykernel_23/2566360283.py\", line 32, in __getitem__\n    return self.datax[index,:], self.datay[index]\nIndexError: too many indices for array: array is 1-dimensional, but 2 were indexed\n","output_type":"error"}]},{"cell_type":"code","source":"import torch.nn as nn\n\nclass Net1(nn.Module):\n    def __init__(self,in_features,out_features):\n        super().__init__()\n        # Hidden layer size choice\n        hidden_size1 = 5000\n        hidden_size2 = 1000\n        self.layer1 = nn.Linear(in_features,hidden_size1)\n        self.layer2 = nn.Linear(hidden_size1,hidden_size2)\n        self.layer3 = nn.Linear(hidden_size2,out_features)\n\n    def forward(self,x):\n        x = x.flatten(start_dim=1)\n        x = self.layer1(x)\n        x = self.layer2(x)\n        x = self.layer3(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2023-04-27T16:32:31.835392Z","iopub.execute_input":"2023-04-27T16:32:31.835953Z","iopub.status.idle":"2023-04-27T16:32:31.844756Z","shell.execute_reply.started":"2023-04-27T16:32:31.83591Z","shell.execute_reply":"2023-04-27T16:32:31.843312Z"},"trusted":true},"execution_count":13,"outputs":[]},{"cell_type":"code","source":"input_size = 10000\nmodel = Net1(input_size, 250).cuda()\n\nopt = torch.optim.Adam(model.parameters(), lr=0.005)\ncriterion = nn.CrossEntropyLoss()\nsched = torch.optim.lr_scheduler.StepLR(opt, step_size=300, gamma=0.95)\n\n\n\nfor i in range(EPOCHS):\n    model.train()\n    \n    train_loss_sum = 0.\n    train_correct = 0\n    train_total = 0\n    train_bar = train_loader\n    for x, y in train_bar:\n        x = torch.Tensor(x).float().cuda()\n        y = torch.Tensor(y).long().cuda()  \n        y_pred = model(x)\n        \n        loss = criterion(y_pred, y)\n        loss.backward()\n        opt.step()\n        opt.zero_grad()\n        \n        train_loss_sum += loss.item()\n        train_correct += np.sum((np.argmax(y_pred.detach().cpu().numpy(), axis=1) == y.cpu().numpy()))\n        train_total += 1\n        sched.step()\n        \n    val_loss_sum = 0.\n    val_correct = 0\n    val_total = 0\n    model.eval()\n    for x,y in val_loader:\n        x = torch.Tensor(x).float().cuda()\n        y = torch.Tensor(y).long().cuda()\n        \n        with torch.no_grad():\n            y_pred = model(x)\n            loss = criterion(y_pred, y)\n            val_loss_sum += loss.item()\n            val_correct += np.sum((np.argmax(y_pred.cpu().numpy(), axis=1) == y.cpu().numpy()))\n            val_total += 1\n                              \n    print(f\"Epoch:{i} > Train Loss: {(train_loss_sum/train_total):.04f}, Train Acc: {train_correct/len(train_data):0.04f}\")\n    print(f\"Epoch:{i} > Val Loss: {(val_loss_sum/val_total):.04f}, Val Acc: {val_correct/len(valid_data):0.04f}\")\n    print(\"=\"*50)","metadata":{"execution":{"iopub.status.busy":"2023-04-27T16:35:17.366301Z","iopub.execute_input":"2023-04-27T16:35:17.367013Z","iopub.status.idle":"2023-04-27T16:35:18.264247Z","shell.execute_reply.started":"2023-04-27T16:35:17.366968Z","shell.execute_reply":"2023-04-27T16:35:18.262464Z"},"trusted":true},"execution_count":17,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mIndexError\u001b[0m                                Traceback (most recent call last)","\u001b[0;32m/tmp/ipykernel_23/1630825448.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     15\u001b[0m     \u001b[0mtrain_total\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     16\u001b[0m     \u001b[0mtrain_bar\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrain_loader\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 17\u001b[0;31m     \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtrain_bar\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     18\u001b[0m         \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     19\u001b[0m         \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTensor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcuda\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    626\u001b[0m                 \u001b[0;31m# TODO(https://github.com/pytorch/pytorch/issues/76750)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    627\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m  \u001b[0;31m# type: ignore[call-arg]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 628\u001b[0;31m             \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_next_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    629\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_num_yielded\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    630\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dataset_kind\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0m_DatasetKind\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mIterable\u001b[0m \u001b[0;32mand\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_next_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   1331\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1332\u001b[0m                 \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_task_info\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1333\u001b[0;31m                 \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1334\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1335\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_try_put_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_process_data\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m   1357\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_try_put_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1358\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mExceptionWrapper\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1359\u001b[0;31m             \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreraise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1360\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1361\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/opt/conda/lib/python3.7/site-packages/torch/_utils.py\u001b[0m in \u001b[0;36mreraise\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    541\u001b[0m             \u001b[0;31m# instantiate since we don't know how to\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    542\u001b[0m             \u001b[0;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 543\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    544\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    545\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mIndexError\u001b[0m: Caught IndexError in DataLoader worker process 0.\nOriginal Traceback (most recent call last):\n  File \"/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/worker.py\", line 302, in _worker_loop\n    data = fetcher.fetch(index)\n  File \"/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 58, in fetch\n    data = [self.dataset[idx] for idx in possibly_batched_index]\n  File \"/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 58, in <listcomp>\n    data = [self.dataset[idx] for idx in possibly_batched_index]\n  File \"/tmp/ipykernel_23/2566360283.py\", line 32, in __getitem__\n    return self.datax[index,:], self.datay[index]\nIndexError: too many indices for array: array is 1-dimensional, but 2 were indexed\n"],"ename":"IndexError","evalue":"Caught IndexError in DataLoader worker process 0.\nOriginal Traceback (most recent call last):\n  File \"/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/worker.py\", line 302, in _worker_loop\n    data = fetcher.fetch(index)\n  File \"/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 58, in fetch\n    data = [self.dataset[idx] for idx in possibly_batched_index]\n  File \"/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py\", line 58, in <listcomp>\n    data = [self.dataset[idx] for idx in possibly_batched_index]\n  File \"/tmp/ipykernel_23/2566360283.py\", line 32, in __getitem__\n    return self.datax[index,:], self.datay[index]\nIndexError: too many indices for array: array is 1-dimensional, but 2 were indexed\n","output_type":"error"}]}]}