{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":65471,"databundleVersionId":7211464,"sourceType":"competition"}],"dockerImageVersionId":30627,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport torch\nimport torch.nn.functional as F\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import transforms\nfrom torchvision.models import resnet50\nfrom torch.utils.data import Dataset, DataLoader, random_split\nfrom PIL import Image\nimport csv\nimport matplotlib.pyplot as plt","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-12-23T20:07:55.098843Z","iopub.execute_input":"2023-12-23T20:07:55.099217Z","iopub.status.idle":"2023-12-23T20:07:59.691554Z","shell.execute_reply.started":"2023-12-23T20:07:55.099186Z","shell.execute_reply":"2023-12-23T20:07:59.690478Z"},"trusted":true},"execution_count":1,"outputs":[]},{"cell_type":"code","source":"def name_to_label(name):\n    return \"_\".join(name.replace('.', '_').split('_')[1:3])\n\ndef imshow(image, ax=None, title=None, normalize=True):\n    if ax is None:\n        fig, ax = plt.subplots()\n    image = image.numpy().transpose((1, 2, 0))\n\n    if normalize:\n        mean = np.array([0.485, 0.456, 0.406])\n        std = np.array([0.229, 0.224, 0.225])\n        image = std * image + mean\n        image = np.clip(image, 0, 1)\n    ax.imshow(image)\n    ax.spines['top'].set_visible(False)\n    ax.spines['right'].set_visible(False)\n    ax.spines['left'].set_visible(False)\n    ax.spines['bottom'].set_visible(False)\n    ax.set_title(title)\n    ax.tick_params(axis='both', length=0)\n    ax.set_xticklabels('')\n    ax.set_yticklabels('')\n\n    return ax\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:07:59.693938Z","iopub.execute_input":"2023-12-23T20:07:59.69505Z","iopub.status.idle":"2023-12-23T20:07:59.707212Z","shell.execute_reply.started":"2023-12-23T20:07:59.695009Z","shell.execute_reply":"2023-12-23T20:07:59.706113Z"},"trusted":true},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"base_folder = \"/kaggle/input/arabic-letters-classification/Final_Arabic_Alpha_dataset/Final_Arabic_Alpha_dataset/train/\"\ncategory_labels_dict = {}\nfor category_folder in sorted(os.listdir(base_folder), key=lambda x: int(x)):\n    category_path = os.path.join(base_folder, category_folder)\n    for picture_name in os.listdir(category_path):\n        label = name_to_label(picture_name)\n        category_labels_dict[category_folder] = label\n        break\nprint(category_labels_dict)\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:08:13.256607Z","iopub.execute_input":"2023-12-23T20:08:13.256955Z","iopub.status.idle":"2023-12-23T20:08:19.919113Z","shell.execute_reply.started":"2023-12-23T20:08:13.256927Z","shell.execute_reply":"2023-12-23T20:08:19.918105Z"},"trusted":true},"execution_count":3,"outputs":[{"name":"stdout","text":"{'0': 'heh_middle', '1': 'noon_end', '2': 'ain_begin', '3': 'ain_end', '4': 'ain_middle', '5': 'ain_regular', '6': 'alif_end', '7': 'alif_hamza', '8': 'alif_regular', '9': 'beh_begin', '10': 'beh_end', '11': 'beh_middle', '12': 'beh_regular', '13': 'dal_end', '14': 'dal_regular', '15': 'feh_begin', '16': 'feh_end', '17': 'feh_middle', '18': 'feh_regular', '19': 'heh_begin', '20': 'heh_end', '21': 'heh_regular', '22': 'jeem_begin', '23': 'jeem_end', '24': 'jeem_middle', '25': 'jeem_regular', '26': 'kaf_begin', '27': 'kaf_end', '28': 'kaf_middle', '29': 'kaf_regular', '30': 'lam_alif', '31': 'lam_begin', '32': 'lam_end', '33': 'lam_middle', '34': 'lam_regular', '35': 'meem_begin', '36': 'meem_end', '37': 'meem_middle', '38': 'meem_regular', '39': 'noon_begin', '40': 'noon_middle', '41': 'noon_regular', '42': 'qaf_begin', '43': 'qaf_end', '44': 'qaf_middle', '45': 'qaf_regular', '46': 'raa_end', '47': 'raa_regular', '48': 'sad_begin', '49': 'sad_end', '50': 'sad_middle', '51': 'sad_regular', '52': 'seen_begin', '53': 'seen_end', '54': 'seen_middle', '55': 'seen_regular', '56': 'tah_end', '57': 'tah_middle', '58': 'tah_regular', '59': 'waw_end', '60': 'waw_regular', '61': 'yaa_begin', '62': 'yaa_end', '63': 'yaa_middle', '64': 'yaa_regular'}\n","output_type":"stream"}]},{"cell_type":"code","source":"class CustomDataset(Dataset):\n    def __init__(self, root_folder, transform=None):\n      \n        self.root_folder = root_folder\n        self.transform = transform\n        self.classes = sorted(os.listdir(root_folder), key=lambda x: int(x))\n        self.class_to_idx = {class_folder: idx for idx, class_folder in enumerate(self.classes)}\n        self.images = self.make_dataset()\n\n    def make_dataset(self):\n       \n        images = []\n        for class_folder in self.classes:\n            class_folder_path = os.path.join(self.root_folder, class_folder)\n            for image_name in os.listdir(class_folder_path):\n                image_path = os.path.join(class_folder_path, image_name)\n                item = (image_path, self.class_to_idx[class_folder])\n                images.append(item)\n        return images\n\n    def __len__(self):\n       \n        return len(self.images)\n\n    def __getitem__(self, index):\n        \n        image_path, label = self.images[index]\n        image = Image.open(image_path).convert(\"RGB\")\n        if self.transform:\n            image = self.transform(image)\n\n        return image, label\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:08:53.222048Z","iopub.execute_input":"2023-12-23T20:08:53.222418Z","iopub.status.idle":"2023-12-23T20:08:53.232272Z","shell.execute_reply.started":"2023-12-23T20:08:53.222385Z","shell.execute_reply":"2023-12-23T20:08:53.231324Z"},"trusted":true},"execution_count":5,"outputs":[]},{"cell_type":"code","source":"import torch.nn.functional as F\n\nclass Threshold(object):\n    def __init__(self, threshold):\n      \n        self.threshold = threshold\n\n    def __call__(self, img):\n      \n        return (img > self.threshold).float()\n\nclass Dilate(object):\n    def __init__(self, radius=3):\n      \n        self.radius = radius\n\n    def __call__(self, img):\n      \n        kernel = torch.ones(1, 1, self.radius * 2 + 1, self.radius * 2 + 1).to(img.device)\n        return F.conv2d(img.unsqueeze(0), kernel, padding=self.radius).squeeze(0)\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:09:12.264622Z","iopub.execute_input":"2023-12-23T20:09:12.264999Z","iopub.status.idle":"2023-12-23T20:09:12.272488Z","shell.execute_reply.started":"2023-12-23T20:09:12.264967Z","shell.execute_reply":"2023-12-23T20:09:12.271572Z"},"trusted":true},"execution_count":7,"outputs":[]},{"cell_type":"code","source":"image_transform = transforms.Compose([\n    transforms.Resize((100, 100)),\n    transforms.Grayscale(num_output_channels=1),\n    transforms.ToTensor(),\n    Threshold(threshold=0.9),\n    Dilate(radius=1),\n])\ncustom_dataset = CustomDataset(root_folder=base_folder, transform=image_transform)\ntrain_size = int(0.8 * len(custom_dataset))\nval_size = int(0.1 * len(custom_dataset))\ntest_size = len(custom_dataset) - train_size - val_size\n\ntrain_dataset, val_dataset, test_dataset = random_split(custom_dataset, [train_size, val_size, test_size])\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:09:30.925142Z","iopub.execute_input":"2023-12-23T20:09:30.926053Z","iopub.status.idle":"2023-12-23T20:09:31.107802Z","shell.execute_reply.started":"2023-12-23T20:09:30.926017Z","shell.execute_reply":"2023-12-23T20:09:31.106775Z"},"trusted":true},"execution_count":8,"outputs":[]},{"cell_type":"code","source":"batch_size = 512\ntrain_dataloader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)\nval_dataloader = DataLoader(dataset=val_dataset, batch_size=batch_size, shuffle=False)\ntest_dataloader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:09:49.810081Z","iopub.execute_input":"2023-12-23T20:09:49.810749Z","iopub.status.idle":"2023-12-23T20:09:49.816541Z","shell.execute_reply.started":"2023-12-23T20:09:49.810719Z","shell.execute_reply":"2023-12-23T20:09:49.815586Z"},"trusted":true},"execution_count":9,"outputs":[]},{"cell_type":"code","source":"labels_dict = {\"0\": \"ClassA\", \"1\": \"ClassB\", \"2\": \"ClassC\", }\nfor batch_idx, (batch_images, batch_labels) in enumerate(train_dataloader):\n    if batch_idx == 0:\n        for i in range(min(2, batch_size)):\n            imshow(batch_images[i], title=category_labels_dict[str(batch_labels[i].item())], normalize=False)\n            print(f\"Label: {batch_labels[i]}\")\n            print(batch_images[i].shape)\n        break\n\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:10:06.41099Z","iopub.execute_input":"2023-12-23T20:10:06.41168Z","iopub.status.idle":"2023-12-23T20:10:09.033601Z","shell.execute_reply.started":"2023-12-23T20:10:06.411647Z","shell.execute_reply":"2023-12-23T20:10:09.032642Z"},"trusted":true},"execution_count":10,"outputs":[{"name":"stdout","text":"Label: 41\ntorch.Size([1, 100, 100])\nLabel: 9\ntorch.Size([1, 100, 100])\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAYUAAAGbCAYAAAAr/4yjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8WgzjOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAV8UlEQVR4nO3df6yWdd0H8M+BOAQ0OIAIAsERGPgjl81gMnJgI6HCHi1jttUgkwzNRdov2x6BucFs08fKtB8WqMt/pEyb7bix0hZg4HxSN0vlIXA7GRh2YAGCwP380eOH67oOz805eDicA6/X5ry/93Xd932dM+XN9/v53p+roVar1QIAIqLPyb4AAHoOoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAPUxDQ0MsW7bsZF8GpymhAEASCgAkoQD/p1arxb59+072ZXSpPXv2nOxLoJcRChyXZcuWRUNDQ2zevDkWLlwYTU1NMWTIkPj85z8fe/fuzfMOHjwYt912W0ycODH69+8fzc3N8e1vfzv279/f7j3vueeeOP/886N///4xevTouOGGG6Ktra10zqxZs+J973tfvPjii3HppZfGwIEDY8yYMfGd73yn0z9Dc3NzzJs3L5544on44Ac/GAMGDIgf/ehHERHR1tYWS5Ysife+973Rv3//mDRpUtx+++1x+PDh0nvs3LkzPve5z8XgwYOjqakpFixYEM8991w0NDTE6tWrS9c9a9asdtewcOHCaG5urnud27Zti+uvvz6mTJkSAwYMiOHDh8enP/3p2Lp1a+m81atXR0NDQzz11FNx/fXXx5lnnhljx47t9O+F09u7TvYF0LvNnz8/zj777Fi5cmU8++yzcd9998WZZ54Zt99+e0REXHvttXH//ffHVVddFTfffHP88Y9/jJUrV8af//zneOSRR/J9li1bFsuXL4/Zs2fH4sWL46WXXop77703Nm3aFOvWrYt+/frluf/85z9j7ty58clPfjLmz58fa9asiW9+85txwQUXxEc/+tFOXf9LL70Un/nMZ+K6666LRYsWxZQpU2Lv3r0xc+bMaG1tjeuuuy7GjRsX69evj1tuuSVee+21uOuuuyIi4vDhw3H55ZfHxo0bY/HixXHOOefEo48+GgsWLHjnv9iCTZs2xfr16+Pqq6+OsWPHxtatW+Pee++NWbNmxYsvvhgDBw4snX/99dfHiBEj4tZbbzVToPNqcByWLl1ai4jaNddcU3r+yiuvrA0fPrxWq9Vqf/rTn2oRUbv22mtL53zta1+rRUTtt7/9ba1Wq9V27NhRa2xsrF122WW1Q4cO5Xl33313LSJqP/vZz/K5mTNn1iKi9sADD+Rz+/fvr40aNar2qU99qlM/w/jx42sRUWtpaSk9f9ttt9UGDRpUe/nll0vPf+tb36r17du39uqrr9ZqtVrtF7/4RS0ianfddVeec+jQodqHP/zhWkTUVq1aVbrumTNntruGBQsW1MaPH196LiJqS5cuzfHevXvbvW7Dhg3tfg+rVq2qRUTtQx/6UO3gwYPH+vHhqCwf8Y586UtfKo0vueSS2LlzZ+zevTt+85vfRETETTfdVDrn5ptvjoiIxx9/PCIi1q5dGwcOHIglS5ZEnz5H/pNctGhRDB48OM9723ve85747Gc/m+PGxsaYNm1abNmypdPXf/bZZ8ecOXNKzz388MNxySWXxNChQ+Mf//hH/jN79uw4dOhQ/P73v4+IiJaWlujXr18sWrQoX9unT5+44YYbOn0d9QwYMCAfv/XWW7Fz586YNGlSNDU1xbPPPtvu/EWLFkXfvn279Bo4fVg+4h0ZN25caTx06NCI+PcSz7Zt26JPnz4xadKk0jmjRo2Kpqam2LZtW0RE/nvKlCml8xobG2PChAl5/G1jx46NhoaGdp/7/PPPd/r6zz777HbPvfLKK/H888/HiBEjjvqaHTt25HWfddZZ7ZZvqj/vO7Vv375YuXJlrFq1KlpbW6NWuFnirl272p1/tJ8JOkoo8I78f38jLf7BVf0DvDs+s6OKfwt/2+HDh+MjH/lIfOMb3zjqayZPntzpz2loaDjq9R06dOiYr73xxhtj1apVsWTJkpg+fXoMGTIkGhoa4uqrr25X+I44+s8EHSUUOGHGjx8fhw8fjldeeSXOPffcfH779u3R1tYW48ePz/Mi/l30nTBhQp534MCB+Otf/xqzZ8/u1uueOHFi/Otf/zrm544fPz5+97vfxd69e0uzhc2bN7c7d+jQoUdd3qrOgo5mzZo1sWDBgrjjjjvyuTfffLPdzizoCmoKnDAf+9jHIiJyt87b7rzzzoiI+PjHPx4REbNnz47Gxsb43ve+V/rb9E9/+tPYtWtXntdd5s+fHxs2bIgnnnii3bG2trY4ePBgRETMmTMn3nrrrfjJT36Sxw8fPhw/+MEP2r1u4sSJ8Ze//CVef/31fO65556LdevWHfN6+vbt226W8f3vf79DswzoLDMFTpj3v//9sWDBgvjxj38cbW1tMXPmzNi4cWPcf//9ccUVV8Sll14aEREjRoyIW265JZYvXx5z586NT3ziE/HSSy/FPffcE1OnTi0VlbvD17/+9Xjsscdi3rx5sXDhwrjoootiz5498cILL8SaNWti69atccYZZ8QVV1wR06ZNi5tvvjk2b94c55xzTjz22GPxxhtvRER52eyaa66JO++8M+bMmRNf+MIXYseOHfHDH/4wzj///Ni9e3fd65k3b148+OCDMWTIkDjvvPNiw4YNsXbt2hg+fPgJ/T1wehIKnFD33XdfTJgwIVavXh2PPPJIjBo1Km655ZZYunRp6bxly5bFiBEj4u67746vfvWrMWzYsPjiF78YK1asKH1HoTsMHDgwnnrqqVixYkU8/PDD8cADD8TgwYNj8uTJsXz58hgyZEhE/Ptv8I8//nh85Stfifvvvz/69OkTV155ZSxdujRmzJgR7373u/M9zz333HjggQfi1ltvjZtuuinOO++8ePDBB+Ohhx6KJ598su71fPe7342+ffvGz3/+83jzzTdjxowZsXbt2na7pqArNNSOpzoH/L9+9atfxZVXXhl/+MMfYsaMGSf7cqBThAK8A/v27Svt9jl06FBcdtll8cwzz8Tf//53O4HodSwfccp5/fXX6xZhGxsbY9iwYV3yWTfeeGPs27cvpk+fHvv3749f/vKXsX79+lixYoVAoFcyU+CU09zcXHer58yZM4+5jt9RDz30UNxxxx2xefPmePPNN2PSpEmxePHi+PKXv9wl7w/dTShwylm3bl3dFthDhw6Niy66qBuvCHoPoQBA8uU1AFKHC82Tb/uv0rhp6o4uvxgAuk7bpjNL45f/86vHfI2ZAgBJKACQhAIAqcM1hWoN4ekL13T5xQDQdS6Oqzr9GjMFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQDSu072BcCppmVv//J41wWl8dPbm0vji0duzcdzh7xQOjZ34P4uvTY4FjMFAJJQACAJBQCSmgJ0sWoN4dH/vrA0Hrax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"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"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"},"metadata":{}}]},{"cell_type":"code","source":"for batch_idx, (images, labels) in enumerate(test_dataloader):\n    if batch_idx == 0:\n        for i in range(min(2, batch_size)):\n            label_value = labels[i].item()\n            label_key = str(label_value)\n            if label_key in category_labels_dict:\n                title = category_labels_dict[label_key]\n                imshow(images[i], title=title, normalize=False)\n            else:\n                print(f\"Label {label_value} not found in category_labels_dict.\")\n            print(f\"Label: {label_value}\")\n            print(f\"Dictionary Key: {label_key}\")\n            print(images[i].shape)\n        break\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:10:28.574751Z","iopub.execute_input":"2023-12-23T20:10:28.575725Z","iopub.status.idle":"2023-12-23T20:10:31.228623Z","shell.execute_reply.started":"2023-12-23T20:10:28.575686Z","shell.execute_reply":"2023-12-23T20:10:31.227652Z"},"trusted":true},"execution_count":11,"outputs":[{"name":"stdout","text":"Label: 30\nDictionary Key: 30\ntorch.Size([1, 100, 100])\nLabel: 15\nDictionary Key: 15\ntorch.Size([1, 100, 100])\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAYUAAAGbCAYAAAAr/4yjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8WgzjOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAVxElEQVR4nO3dX4xdVdkH4Hco7XTaptTyZ5yO4tiSogkmNIS2kNASEpOJiKDBpDcE7ox3ft7IBZ9tqjFKiNgbMF9iSkLEmKihEZMhGqnxggYIEo1JQ+LQ1Iw4VKEtabGFcr4L4zt77Tp7eqZnZs6Z8zxXe519ZmZDJ/11rXeddw20Wq1WAEBEXLHUDwBA9xAKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCnSVp556KgYGBuLYsWNL/SjzNjY2Fg899FCODx8+HAMDA3H48OHifU8//XR86lOfipUrV8aGDRsW9RlhNlcu9QNAPzp69Gg89NBDMT4+Hg8//HCsWbNmqR8JIkIowILbtWtXvPfee7Fq1ap87fDhw/Hhhx/GgQMH4oYbbljCp4OSUIAFdsUVV8Tq1auL1956662ICMtGdB01BbraoUOH4u67745NmzbF4OBgbNmyJb71rW/FhQsXivfdeeedcdNNN8Uf//jH2L17d6xZsyZuuOGG+NnPfhYREb/73e9ix44dMTQ0FDfeeGP85je/aftZHnvssbj99tvj6quvjqGhobjlllvy+zep1xTGxsZi7969ERFx7bXXxsDAQOzbt6/t54GFIBToak899VSsW7cuvv71r8eBAwfilltuiW9+85vx8MMPX/Ted955Jz7/+c/Hjh074tFHH43BwcHYs2dP/PSnP409e/bE5z73ufjud78bZ86cifvvvz/efffdtp7lwIEDsW3btti/f3985zvfiSuvvDK+/OUvx69+9au2vs8PfvCD+OIXvxgREU8++WQ8/fTT8aUvfamt7wELpgVd5ODBg62IaL3xxhutVqvVOnv27EXv+cpXvtJas2ZN61//+le+tnv37lZEtJ555pl87ejRo62IaF1xxRWtI0eO5OvPP/98KyJaBw8ebOvZ6s9y/vz51k033dS66667itc/8YlPtB588MEcv/DCC62IaL3wwgv52t69e1sR0Tpx4kRbzwALzUyBrjY0NJTX7777bvzjH/+IO+64I86ePRtHjx4t3rtu3brYs2dPjm+88cbYsGFDfPrTn44dO3bk6/+5npycnPezvPPOO3Hq1Km444474tVXX23r+0A3U2imq/35z3+ORx55JH7729/G6dOni3unTp0qxh/72MdiYGCgeO2qq66Kj3/84xe9FvHvv9jb8dxzz8W3v/3teO211+LcuXP5ev1nQi8TCnStkydPxu7du2P9+vWxf//+2LJlS6xevTpeffXV+MY3vhEffvhh8f4VK1b81+8z2+utNk6i/f3vfx9f+MIXYteuXfHEE0/EyMhIrFy5Mg4ePBjPPPPMpf9HQZcTCnStw4cPxz//+c/4xS9+Ebt27crX33jjjUV/lp///OexevXqeP7552NwcDBfP3jw4KI/CywkNQW61n/+hV/9F/358+fjiSeeWJJnGRgYKLbCHjt2LJ599tlFfxZYSEKBrnX77bfHRz7ykXjwwQfj+9//fjz++OOxc+fOtpZ9OuXuu++Os2fPxvj4ePzwhz+M/fv3x44dO3wamWVHKNC1rr766njuuediZGQkHnnkkXjsscfis5/9bDz66KOL/ix33XVX/OhHP4q///3v8bWvfS1+8pOfxPe+9738vAEsFwOtpfhnFwBdyUwBgGT3EX3twoULceLEicb3rFu3LtatW7dITwRLSyjQ1/7617/GJz/5ycb37N27V8M6+oZQoK999KMfjV//+teN79m8efMiPQ0sPYVmAJJCMwDpkpePtn7r8WK84da3Ov4wAHTOyZevK8av/+//zPk1ZgoAJKEAQBIKAKRLrinUawhHbp77wHIAls7OuL/trzFTACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgXbnUDwCdNHF2sByf+sys7x2/6k/leM25BXkm6CVmCgAkoQBAEgoAJDUFelq9hrDv9XuK8cmXr5v1a4/cOla+sPWXxVCNgX5kpgBAEgoAJMtH9LT6ltP6ctHmH0/P+rWTMVx+r+Hye42veeUynw56j5kCAEkoAJCEAgBJTYGedmR6rBivnWoV4wuv/2XWr107VdYf6t8rRtQU6D9mCgAkoQBAEgoAJDUF+tb64x8U42N/21CMJ7bOtNDQ8oJ+YaYAQBIKACShAEASCgAkoQBAEgoAJFtS6Ssr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"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAYUAAAGbCAYAAAAr/4yjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8WgzjOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAASSUlEQVR4nO3dXYxVZ7kH8Gc6wzdaOnMGtFg6BSHRBAtpaXqaIqiNjCYiNmViNKm9sPgF1RouUNMWPDYaLTapIY0S04m2F8YTe2gT7Y22iRc0glpCjKZQmNZOm6EDIlYLBWadCw8Pey2YzQyzZ4bp+f2u1rvXx343F/PnfZ+13tVUFEURABARl413BwC4dAgFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBcbUrl274qabbooZM2ZEU1NTPPfcc0M6r7u7O5qammL37t0j7sPmzZujqakp+vv7R3yt4erp6Ymmpqbo7u4e8++GoWgZ7w7w/8fJkydj7dq1MXXq1HjwwQdj+vTpcfXVV493t4AaQoEx88ILL8SLL74Y27dvj89+9rPj3Z1xcfXVV8cbb7wRkyZNGu+uwHkJBcbMoUOHIiJi1qxZ49uRcdTU1BRTp04d727AoNQUGBN33HFHrFixIiIi1q5dG01NTbFy5cqIiPjLX/4St912W7S2tsbUqVPj+uuvjyeeeOK81zlx4kR89atfjfb29pgxY0Z84hOfiNdee+2i+tTf3x9dXV3x9re/Pdra2uLLX/5yHD9+/JzjHn300bjuuuti2rRp0draGp/85Cfjr3/96znHbdu2LebPnx/Tpk2LG264IX7729/GypUr83dGnL+mcMcdd8TMmTOjt7c31qxZEzNnzoz29vbYuHFjnD59+qJ+G1wsocCY+NznPhdf//rXIyLirrvuip/+9KfxjW98I/70pz/FjTfeGH/+859j06ZNsXXr1pgxY0asWbMmHn/88XOus2HDhtizZ0/cd9998YUvfCGefPLJWL9+/UX1qaurK44fPx7f/va346Mf/Wg89NBDsW7dutIx999/f9x+++2xcOHC+P73vx9f+cpX4te//nW8//3vj6NHj+ZxDz/8cKxfvz7e9a53xXe/+91Yvnx5rFmzJl5++eUh9eX06dOxatWqaGtriwceeCBWrFgRW7dujR/96EcX9dvgohUwRp5++ukiIoqf//zn+dmHPvShYvHixcXx48fzs4GBgeKmm24qFi5cmJ898sgjRUQUt9xySzEwMJCf33333UVzc3Nx9OjRIffjvvvuKyKiWL16denzL37xi0VEFHv27CmKoih6enqK5ubm4v777y8dt3fv3qKlpSU/P3HiRNHW1lYsW7asOHnyZB7X3d1dRESxYsWK/OzgwYNFRBSPPPJIfvaZz3ymiIjim9/8Zul7li5dWlx33XVD/l3QCEYKjJsjR47Eb37zm+jq6op//OMf0d/fH/39/XH48OFYtWpV7Nu3L3p7e0vnrFu3LpqamrK9fPnyOH36dLz44ovD/v4vfelLpfaGDRsiIuKXv/xlRET84he/iIGBgejq6sq+9ff3xzve8Y5YuHBhPP300xERsXv37jh8+HDceeed0dJytkz36U9/Oq644ooh9+fzn/98qb18+fI4cODAsH8XjIRCM+Nm//79URRF3HPPPXHPPfec95hDhw7F3Llzsz1v3rzS/jN/dP/2t78N+/sXLlxYai9YsCAuu+yy6OnpiYiIffv2RVEU5xx3xpk7iM4E0rvf/e7S/paWlujo6BhSX6ZOnRrt7e2lz6644oqL+l0wEkKBcTMwMBARERs3boxVq1ad95jqH9rm5ubzHlc04K2ytSOQM/1ramqKX/3qV+f93pkzZ474O88Y7HfBWBMKjJv58+dHxL//x33LLbeM+ffv27cvrrnmmmzv378/BgYG8n/3CxYsiKIo4pprrolFixYNep0zD+Dt378/PvCBD+Tnp06dip6ennjf+943Oj8ARoGaAuNm9uzZsXLlyvjhD38Yr7766jn7L/ZW06Hatm1bqf2DH/wgIiI+8pGPRETErbfeGs3NzbFly5ZzRiJFUcThw4cjIuL666+Ptra22L59e5w6dSqPeeyxx0z/MOEYKTCutm3bFjfffHMsXrw47rzzzpg/f3709fXFzp074+WXX449e/aM2ncfPHgwVq9eHZ2dnbFz58549NFH41Of+lRce+21EfHvkcK3vvWt+NrXvhY9PT2xZs2aeNvb3hYHDx6Mxx9/PNatWxcbN26MyZMnx+bNm2PDhg3xwQ9+MLq6uqKnpye6u7tjwYIF50xLwaVMKDCu3vve98bu3btjy5Yt0d3dHYcPH47Zs2fH0qVL49577x3V7/7Zz34W9957b2zatClaWlpi/fr18b3vfa90zKZNm2LRokXx4IMPxpYtWyIi4qqrrooPf/jDsXr16jxu/fr1URRFbN26NTZu3BjXXnttPPHEE3HXXXd5gpkJpaloRIUOOMfAwEC0t7fHrbfeGtu3bx/v7sCQqClAAxw/fvycusNPfvKTOHLkSGmZC7jUGSnwlvH666/H66+/XveY9vb2Ubn985lnnom777471q5dG21tbfGHP/whfvzjH8d73vOe+P3vfx+TJ09u+HfCaFBT4C3jgQceyHn/wRw8eHDID5QNR0dHR1x11VXx0EMPxZEjR6K1tTVuv/32+M53viMQmFCMFHjLOHDgwAWXhbj55psVfqEOoQBAUmgGIA25prDovx4stWctO9TwzgDQOEd3zS61n7/n7gueY6QAQBIKACShAEAack2hWkN4dsl/N7wzADTOjXHbsM8xUgAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAN+c1rAJeqp/41pdz+++JBj+28fG+5Pf3EqPRpojJSACAJBQCSUAAgqSkAE161hrDjj0sGP3hpudk5fXfjOzSBGSkAkIQCAEkoAJDUFIAJ79m+jlK79XeTBj/2yvKx8U41hVpGCgAkoQBAMn0ETDjVZS36XplVane8dCq3j83zZ244jBQASEIBgCQUAEgm24AJp7qsxZTeyaX2tAN9uX1s3uwx6dNbhZECAEkoAJCEAgBJKACQhAIASSgAkNySCkw4nZfvLbV3zF1SavetPHsb6j/nNpXPndMzWt16SzBSACAJBQCSUAAgqSkAE07n9BOl9seXPldq175dbVb13Eo9gjIjBQCSUAAgCQUAkpoCMOFV6wT16gbVegRlRgoAJKEAQDJ9BEx4poQax0gBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBQASEIBgCQUAEhCAYDUMt4dAGBwT/1rSrn998V1j++8fO+Ivs9IAYAkFABIQgGApKYAcImprSNsfv5jpX1Hd82ue+6zyzpyu++VWcP+biMFAJJQACAJBQCSmgLAOKs+i1BbRzj5P+2lffOf6at7rQMxJ7en1DluMEYKACShAEAyfQQwxupNF0WUp4zmPHOotO/08y/UvfaM3vq3rF6IkQIASSgAkIQCAElNAWCMVZe/ri5dUe+20+ZFC0alT2cYKQCQhAIASSgAkNQUAMZA7bMJO/64pLSvY+fJUrv2WYQ3O5eNar+qjBQASEIBgCQUAEhqCgBjoPbZhCm9k0v7ph2oPJdQ8yzCq/85qe51Z/QWI+9cDSMFAJJQACCZPgIYA8/2deT2haZ8+laeXfZi1rLy0tl9r8wqtWf01p9eGi4jBQCSUAAgCQUAkpoCwCiovnKzthbQ8dKp0r435reW2kduOLvsxcOLnizt2xyVV3dGezSSkQIASSgAkIQCAElNAWAUVF+5Wbu0RXVZi9rnEiIi5lz5Wm53Tj9R2re5Qf0bjJECAEkoAJBMHwGMgtplLSLKS1vUvlktIiIq00fjyUgBgCQUAEhCAYCkpgDQAPWWtYgoL23RXPNmtYiIf85tKrU75/Q0tG/DYaQAQBIKACShAEBSUwBogHrLWkSUl7aoLpV9Yu6bpXbn5Xsb3LuhM1IAIAkFAJLpI4AGqLesRUR5aYtjdVZFjSivjDqcW10jIo7NG9mfdSMFAJJQACAJBQCSmgLAGKhd2mI4y1oM51bXf2uNkTBSACAJBQCSUAAgqSkAjIHapS2Gs6zFcJ5/iIiYdpH9O8NIAYAkFABIQgGApKYAMMaqzxpsfv5j5XbN9tFd5XWS3vnSybrXrtYYhstIAYAkFABIpo8AxsC0A0dy+52VpSiO9bYPel51uqj2OhERpxvQt1pGCgAkoQBAEgoAJDUFgDFQe6vo5Mpto/9R57zaJbeHst8tqQA0jFAAIAkFAJKaAkAD3Fh5peZTc8vLU8ypmfsfzrx/7ZLbQ1GtVwyXkQIASSgAkEwfATRA9e1pO+YuKbVrp4Gqb0erThEdm3f2T/ORG8rLXFRXWK2+ia3e7a1DYaQAQBIKACShAEBSUwBogM7pJ0rtjy99rtTeEUtye0rvnNK+E3PfLLXnXPna2etUbnWtvU5ExIzeScPr6AUYKQCQhAIASSgAkNQUAEZB9bmFWDrI9nmOrdYnaj3b11Fqn4zBX+V5MYwUAEhCAYBk+ghgFFSngDqn7x6nngyPkQIASSgAkIQCAEkoAJCEAgBJKACQhAIASSgAkIQCAEkoAJCEAgBJKACQhAIASSgAkIQCAEkoAJCEAgBJKACQhAIASSgAkIQCAEkoAJBaxrsDADRO86IFIzrfSAGAJBQASKaPAN5C3pjfOqLzjRQASEIBgCQUAEhqCgCXsKf+NaXU7ntlVqnd8dKpUvvYvJH9WTdSACAJBQCSUAAgqSkAjLNq3eCpvy/O7R1/XFLa1/q7SaX2tAOHSu1j82aPqC9GCgAkoQBAMn0E0AD1poAiIp7t6xj03OptplN6J+d2x86TpX3V6aLTz79QvthK00cANIhQACAJBQCSmgLA/xmtukBExIzeYtBzq0tVTDvQl9vVmsHpyrnVN639c27ToN8zFEYKACShAEASCgAkNQVg1Fxojr5W5+V761+r5tx6c/sjMVp1gYjzPE9QR7VuUKtaQ+irPJcwa9nZ5xiqv2cojBQASEIBgCQUAEhqCkDDVGsIm5//WKl9dNfg6/LsmLuk7rVr5/frze2PxFjVBYbjQjWESWteK7U3L3ry7HaU//2HwkgBgCQUAEimj4CGqd5yWp0umv9YeTqm1hvzW+teu97SD6OlUVNAw1U7ZTSc6aKIiM7pJ87uu4jvNlIAIAkFAJJQACCpKQANU11+onrraL1awOQL1AnGa37/YlVvJa2tmRybV/9Pb+3y17XLVkTUryE0gpECAEkoAJCEAgBJTQEYkdqlLapLNVeXjZjohlMnqL4W88TcN3N7zpXlZw2qOuf0nN2uLCne6BpClZECAEkoAJBMHwEjUru0RfVNZeesMjomPSqrN+UTceHbQ2sNZ0qodgooojwNNNpTQCNhpABAEgoAJKEAQFJTAC4JjZz7r1WvDhBx4dtDa03UOsFwGCkAkIQCAEkoAJDUFIARqZ1X3zF3SWlf9VWSb7/IZSEihjf3X+pfnTpAxFunFtAoRgoAJKEAQDJ9BIxI7fTLx5c+V9r37JUdpXZPzSqqw1kWovo9jB4jBQCSUAAgCQUAkpoC0DDn1AEq7VhUs0+N4JJkpABAEgoAJKEAQFJTABpGnWDiM1IAIAkFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUAklAAILUM9cCju2aX2jfGbQ3vDACNU/27HZ0XPsdIAYAkFABIQgGA1FQURTHenQDg0mCkAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBA+l91do1vDu2WKQAAAABJRU5ErkJggg=="},"metadata":{}}]},{"cell_type":"code","source":"for batch_idx, (images, labels) in enumerate(val_dataloader):\n    if batch_idx == 0:\n        for i in range(min(2, batch_size)):\n            label_value = labels[i].item()\n            label_key = str(label_value)\n            if label_key in category_labels_dict:\n                title = category_labels_dict[label_key]\n                imshow(images[i], title=title, normalize=False)\n            else:\n                print(f\"Label {label_value} not found in category_labels_dict.\")\n            print(f\"Label: {label_value}\")\n            print(f\"Dictionary Key: {label_key}\")\n            print(images[i].shape)\n        break\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:10:47.854298Z","iopub.execute_input":"2023-12-23T20:10:47.854677Z","iopub.status.idle":"2023-12-23T20:10:50.246805Z","shell.execute_reply.started":"2023-12-23T20:10:47.854647Z","shell.execute_reply":"2023-12-23T20:10:50.245821Z"},"trusted":true},"execution_count":12,"outputs":[{"name":"stdout","text":"Label: 42\nDictionary Key: 42\ntorch.Size([1, 100, 100])\nLabel: 11\nDictionary Key: 11\ntorch.Size([1, 100, 100])\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAYUAAAGbCAYAAAAr/4yjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8WgzjOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAUZklEQVR4nO3dbYxVV9k/4HuYYXhVCikMLxVHUKpiG0j/RbAqrSgzatoSbfqJJ1S/kGJrn8f4EqtPGWoTI0atkaTWakBNY0z7QSS2Q4NCYpsS2qStTTCCHSkJRaC2TGNB2mHO/4OP95y9Bw4zw2Fg6HUlTfY6e+9z1kwKP9a691mroVKpVAIAImLU+e4AABcOoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKHAiPfd73435syZE42NjbFgwYIB3XPLLbfExIkTz23HTmPHjh3R0NAQO3bsOC+fD7U0ne8OwNl47LHH4qtf/WqsXLkyOjo64tJLLz3fXYIRTSgwov3hD3+IUaNGxc9+9rNobm4+390ZkI9+9KNx/PjxEdNf3lqEAiPa4cOHY9y4cSPqL9hRo0bF2LFjz3c34JTUFBh2jz/+eFx99dUxduzYmDt3btx///3R0dERDQ0Nec3GjRvjYx/7WEybNi3GjBkT73//++O+++4rvE9DQ0Ns3LgxXn/99WhoaIiGhobYtGnToPrS1dUVbW1tMWHChJg5c2bcfffdUV44uLe3N+69996YP39+jB07NlpaWmL16tXx6quv9ruuo6MjZs6cGePHj4/rrrsudu/eHa2trXHLLbfkdaeqKVx77bXxgQ98IHbv3h3XXXddjB8/PmbNmhXr168f1M8DZ8tIgWH1/PPPx/Lly2Pq1KnR0dERPT09sXbt2mhpaSlcd99998X8+fPjhhtuiKamptiyZUusWbMment74wtf+EJERPzyl7+Mn/zkJ7Fr16746U9/GhERH/rQhwbcl5MnT0Z7e3ssXrw41q9fH52dnbF27dro6emJu+++O69bvXp1bNq0KT73uc/FF7/4xfjb3/4WGzZsiGeeeSaeeOKJGD16dEREfP3rX4/169fH9ddfH21tbfHcc89FW1tb/Otf/xpQf1599dVob2+Pz3zmM3HzzTfHww8/HF/72tfiiiuuiE9+8pMD/rngrFRgGK1YsaIyduzYyosvvpiv7d69u9LY2Fip/t/x2LFj/e5ta2urzJkzp/DaqlWrKhMmTBh0P1atWlWJiMrtt9+er/X29lY+/elPV5qbmytHjhypVCqVyh//+MdKRFQefPDBwv2dnZ2F1//+979XmpqaKitWrChc19HRUYmIyqpVq/K17du3VyKisn379nxt6dKllYio/OIXv8jXTpw4UZk+fXrls5/97KB/Phgq00cMm5MnT8bWrVtjxYoVMXv27Hz9fe97X7S1tRWuHTduXB53d3fHyy+/HEuXLo2urq7o7u6uW59uu+22PG5oaIjbbrst3njjjdi2bVtERDz00EMxadKk+MQnPhEvv/xy/nfVVVfFxIkTY/v27RER8fvf/z56enpizZo1hfe//fbbB9yXiRMnxsqVK7Pd3NwcixYtiq6urrP5EWFQTB8xbI4cORLHjx+P97znPf3OXX755fHII49k+4knnoi1a9fGk08+GceOHStc293dHZMmTTrr/owaNSrmzJlTeG3evHkREbFv376IiNi7d290d3fHtGnTTvkehw8fjoiIF198MSIi3v3udxfOT5kyJSZPnjyg/lx22WWFukpExOTJk+NPf/rTgO6HehAKXHBeeOGFWLZsWbz3ve+N73//+/GOd7wjmpub45FHHokf/OAH0dvbO2x96e3tjWnTpsWDDz54yvNTp06t22c1Njae8vWKHXMZRkKBYTN16tQYN25c7N27t9+5v/zlL3m8ZcuWOHHiRPz2t78tTDP9Z6qmXnp7e6OrqytHBxERe/bsiYiI1tbWiIiYO3dubNu2La655prClFbZO9/5zoiI+Otf/xrvete78vV//OMf/Z5SgguZmgLDprGxMdra2uI3v/lN7N+/P1//85//HFu3bi1cF1H8F3J3d3ds3Lix7n3asGFDHlcqldiwYUOMHj06li1bFhERN998c5w8eTK+9a1v9bu3p6cnjh49GhERy5Yti6ampn6PzVa/P4wERgoMq3Xr1kVnZ2d85CMfiTVr1kRPT0/86Ec/ivnz5+fc+fLly6O5uTmuv/76WL16dfzzn/+MBx54IKZNmxYHDx6sW1/Gjh0bnZ2dsWrVqvjgBz8Yjz76aPzud7+LO++8M6eFli5dGqtXr45vf/vb8eyzz8by5ctj9OjRsXfv3njooYfihz/8Ydx0003R0tISd9xxR3zve9+LG264Idrb2+O5556LRx99NC699NJ+tQK4UAkFhtWVV14ZW7dujS996Utx1113xWWXXRbr1q2LgwcPZihcfvnl8fDDD8c3v/nN+PKXvxzTp0+PW2+9NaZOnRqf//zn69aXxsbG6OzsjFtvvTW+8pWvxNve9rZYu3Zt3HXXXYXrfvzjH8dVV10V999/f9x5553R1NQUra2tsXLlyrjmmmvyuu985zsxfvz4eOCBB2Lbtm2xZMmSeOyxx+LDH/6wbzAzYjRUVLG4AHR0dMS6desuuqLq0aNHY/LkyXHPPffEN77xjfPdHTgjNQWok+PHj/d77d57742Ify9jASOB6SMuKt3d3af8y7na9OnTz8ln//rXv45NmzbFpz71qZg4cWI8/vjj8atf/SqWL19emGaCC5lQ4KJyxx13xM9//vOa15yrKaorr7wympqaYv369fHaa69l8fmee+45J58H54KaAheV3bt3x0svvVTzmo9//OPD1BsYeYQCAEmhGYA04JrCvG/9oNC+5OrDde8MvBUceumSQnvMgb5d4yYcqD1wf31W35fgTsx6o3CuZebRs+4bF5ejTxUXctzzv/9zxnuMFABIQgGAJBQASAOuKZRrCDsXPFz3zsDFoPPYmGK7+4pCe/NLC+ryOeUaQse8LYV2+/gTdfkcRq7FcdOg7zFSACAJBQCSZS5gCGpNEW1+ZkHhXPUjpxERrU++WWiP6zqUxyf3vFDzc1vmzc3jrmgp9qGlOE3VPv7pmu8Fp2KkAEASCgAkoQBAUlOA06iuG/R7rLRG3aBWzSCif93g5CD6VH3vhAPFJQx2HmotXjxDTYHBM1IAIAkFAJJQACCpKfCWdcblKKrqBmfzXYNyzaCx6rsGERHH50zJ49dmF/9Ivn1/T/+O/5/qZbQjItpb9p32WhgoIwUAklAAIJk+4qJWr+UoBvNYaa3poYiIg0tGF9rVO6i1zDxSOLevtEtbtZaZxZWL2yc9f9prYaCMFABIQgGAJBQASGoKjGiDeaw0YujLUQzmsdJaNYOIiBsX7iq0q2sB5d3SOucVf75a7LRGPRgpAJCEAgBJKACQ1BQY0c5UQ2h9uLgUxFCXoxjMdw1q1QwiBjf3r07AcDNSACAJBQCSUAAgqSkwopW3oJyyqzjX39z5ZPGGqjrBG+1XF06Vl62uXpr6bL5rACOJkQIASSgAkEwfMaItLu02tnnRJaUrlhRataaEystWV+9kdjaPlcJIYqQAQBIKACShAEBSU2BE67cF5cJic+fM1uL16gRQk5ECAEkoAJCEAgBJTYERrVwHaB//dPGCGaU2UJORAgBJKACQhAIASSgAkIQCAEkoAJCEAgBJKACQhAIASSgAkIQCAEkoAJCEAgBJKACQhAIASSgAkIQCAEkoAJCEAgBJKACQhAIASSgAkIQCAEkoAJCEAgCp6Xx3ADi9zmNjiu3uK/J456HWwrnFLfsK7fZJz/cdjz9R975xcTJSACAJBQCS6SO4gJSnizr2XF9oH31qWh5POFApnNu86JLimy3sO2wf/3Rd+sfFz0gBgCQUAEhCAYCkpgAXkOpHTiOKNYSIiDkPHsrjk3teKN29pNDaObO1rzFDTYGBMVIAIAkFAJJQACCpKcB5Vv3dhM3PLCica33yzUK7fx0B6stIAYAkFABIpo9gmNVaymLKrtGFc+O6DhfaJ89dtyAijBQAqCIUAEhCAYCkpgDDrNZSFnN2HCqcG8wjqG/f31No73vpkr7PnFesY9iJjdMxUgAgCQUAklAAIKkpwDDbeai10K7eVrNcQ2icN3fA7zuu65VCe8yBljwu1zFsz8npGCkAkIQCAMn0EZxj5WUtDlU9KhoR0Vr1KGl5uujQtcWd16qVH0Ft7nyq0J5woO/e8pSVndg4HSMFAJJQACAJBQCSmgLUWa2lsSP6L48d0VcbKNcQRq84UmgX6xHF97l0UL2EUzNSACAJBQCSUAAgqSlAHVTXEco1hDd/M7XQbtlR3GLz+JwpefzKojcL5+6bt6XQ7oi+934ziu8L9WCkAEASCgAkoQBAUlOAOqhemrp6e82I/ltslh1c0vd9gxsX7iqcK2+b2THE/sFAGSkAkIQCAMn0EdRB9dLU1TupRfTfTe2N9qsL7ROz3sjj9knP179zMAhGCgAkoQBAEgoAJDUFGIJaW2y2lrbJLHttdvGPXcvMvuWxy4+gno3q7ToPlh6T/e+W/1dol2sZ9ewHI4uRAgBJKACQhAIASU0BhqB6WYuIiDEHmvN4XFdpWYt5cwvN12c1FNrtLfvq2re+frySxzNiSuHc5lkLihcvLDbbxz99TvrEhc9IAYAkFABIpo9gCKqXtYgoLm0xmGUtIs7d0hbV/Wgu9WnK7CWF9s6ZrcWbZ5g+eqsyUgAgCQUAklAAIKkpwDCrfnw1IqJjz/V9x2e4t3pXtxn73xzwZzaep8diGXmMFABIQgGAJBQASGoKMASLS3PwnbP65vpbSvP31ctNRPRfcuK1A1MH/LnVdYTy+54sXVtdRzh0bXHp7EuuPlxo2waU/zBSACAJBQCS6SMYgvJ0S/Wqo8fnFKeHmjufKrZLS05cOsQ+lKeLyqr78cqi4uOr983bUmjbaY3/MFIAIAkFAJJQACCpKcAQlOfgb1z4bB53HlhUODenq/iIanlp7Wrl5SjK9Ylq/R5JrfG+MFBGCgAkoQBAEgoAJDUFqIPq7y3svLq1cK4rWgrtCQeKS05UKy9pXd66s9qUXcX3aSmdr645jDlQPNvZfUWh3T7e9pv8m5ECAEkoAJCEAgBJTQHqoPC9hdK6Qp0txfn7nYdaT/8+pSW5ay1pfWv8V6H99v2nX3OpXMfo14cZagr8m5ECAEkoAJBMH0GdlZfA6Pe4Z52malpmHi20X5td3MFtqEty89ZmpABAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACTLXFA3ncfGDPja8lIQwIXBSAGAJBQASEIBgKSmQN10dg98h7Hy7mRqDKdWrtNU/46PPlXcTW3G/jeHpU9c3IwUAEhCAYAkFABIagoMWXm+e/MzCwrtKbtG5/HrsxqK97YU6w/9tqx8C6n+PZbrMuXf6ZgDzXk848liDWFc1yuF9sk69Y+3FiMFAJJQACCZPmLIylMd1VMbEREtOw7l8aFri49P9ntcdcbInj6qNQVU89HciDj00iV5XP4dtvabIur7nZ7c80LhnOki6sFIAYAkFABIQgGApKbAkJXnyiccqJz22vIjqe0t+85Bjwan1hISEWeuBVSrVReo9XuJiGjd35PH1TWDiMHVDRrnzS20j8+ZksevLCrWJm68AH7/XJiMFABIQgGAJBQASGoKXBBqPedf1j7p+dO/zyDqAtV1gIjB1wKqDaYuUMuZvmtQXTeorhlERBxcMrrQPjHrjTy+ceGzhXO1foe8tRkpAJCEAgBJKACQ1BQYFuX5+fKS0Jujr12e2y/bPGvBac8Npi5QXQeIOLtaQOG+QV5fq07w2uziH9Hq73tU1wwiIm5cuKvQrq4b2O6UgTJSACAJBQCS6SOGbHFpqYTOWdNOfWFEtOw4XGi/ff+U01zZfxqnrDzFUuveej4OWstgpoDKak0Jtcw8UmhXLw9SfqzUFBH1YKQAQBIKACShAEBSU2DIynPa5UdFq+fWmzufKpxrrjHXf6a5/bO5t1qtpaYjzlwLqDaYukCZOgEXEiMFAJJQACAJBQCSmgJDVp7vLi/PXL10xZTZS4ahR4NT3iJ0sLWAauoCXCyMFABIQgGAZPqIuum3m9fCvsOdM1uHtS8D0V5apsO0DxgpAFBFKACQhAIASU2BuinPwbePf7qvMePpAC58RgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoApKaBXnj0qWmF9uK4qe6dAaB+yn9vR/uZ7zFSACAJBQCSUAAgNVQqlcr57gQAFwYjBQCSUAAgCQUAklAAIAkFAJJQACAJBQCSUAAgCQUA0v8Hr5RvxcPPGfIAAAAASUVORK5CYII="},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAYUAAAGbCAYAAAAr/4yjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8WgzjOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAATFklEQVR4nO3da4ycZdkH8Gu7PW0LhVaWpSzQhdrFU6WkFEGDRYJl0bY2ajba8CImhuStp0I8lMSXdoOIh6ikRBO++IG0HwyEg0bYfiCgMbYBE5AmGOmBbbWSlmqLkUN92533wxuuzvNsO7vTnT3R3y8hmXvmmZl7d9L9c1/XM/fTVKlUKgEAETFprCcAwPghFABIQgGAJBQASEIBgCQUAEhCAYAkFABIQgGAJBRoqA0bNkRTU1McPHiwIa937bXXxgc+8IGGvNZwvf2zDUVTU1Ns2LDhlF6zo6MjbrnlllOYIQyfUAAgCQUYou985zvx5ptvjvU0YERNHusJwEQxefLkmDzZPxne2awUGBEHDx6M7u7umDVrVrzrXe+Kr3/96/HWW28Vjtm0aVMsXrw4WlpaYs6cOfG5z30u/vrXv57w9V588cX42Mc+FjNmzIj29vb44Q9/WPecOjo6Yvny5fH000/HFVdcES0tLbFw4cJ4+umnIyLi4YcfjoULF8b06dNj8eLF8dxzzxWef6L6/5EjR+K2226L1tbWOPPMM2PlypXxt7/97YTv//vf/z6WLFkS06dPj/nz58f9998/5LkfPnw41q5dGxdeeGFMmzYt3v3ud8cPfvCD6O/vr++XAIMQCoyI7u7ueOutt+Kee+6JT3ziE7Fx48a49dZb8/G77747br755liwYEH85Cc/ibVr18aTTz4ZH/3oR+Pw4cOF1zp06FB0dXXFZZddFj/+8Y/jPe95T3z729+OJ554ou557dy5M1avXh0rVqyIe+65Jw4dOhQrVqyIzZs3x2233RY33XRT9PT0xK5du6K7u3vQP7pf+tKX4t57741ly5bF97///ZgyZUp88pOfHHDc9u3bY9myZXHgwIHYsGFDfPGLX4z169fHI488Muic33jjjVi6dGls2rQpbr755ti4cWN85CMfiTvuuCNuv/32un8HUFMFGmj9+vWViKisXLmycP+aNWsqEVH505/+VOnr66s0NzdX7r777sIx27dvr0yePLlw/9KlSysRUXnggQfyviNHjlTOO++8ymc+85m65jZv3rxKRFT+8Ic/5H1btmypRESlpaWlsmfPnrz//vvvr0RE5amnnhrws73t+eefr0REZc2aNYX3Wb16dSUiKuvXr8/7Vq1aVZk+fXrhPV588cVKc3NzpfzPcN68eZUvfOELOb7rrrsqM2fOrLz00kuF49atW1dpbm6u7N27t67fA9RipcCI+PKXv1wYf/WrX42IiMcffzwefvjh6O/vj+7u7jh48GD+d95558WCBQviqaeeKjz3jDPOiJtuuinHU6dOjSuvvDJ2795d97ze9773xdVXX53jD33oQxERcd1118VFF1004P5a7/H4449HRMTXvva1wv1r164tjI8dOxZbtmyJVatWFd7jve99b9xwww2DzvnBBx+Ma665JmbPnl34fV1//fVx7Nix+N3vfjfoa8BQ6ZoxIhYsWFAYz58/PyZNmhR9fX0xadKkqFQqA45525QpUwrjCy64YEAtf/bs2fHCCy/UPa/qP8oREWeddVZERFx44YUnvP/QoUMnfa09e/bEpEmTYv78+YX7L7300sL41VdfjTfffPOEP++ll16a4XIyO3bsiBdeeCFaW1tP+PiBAwdqPh/qIRQYFdV/1Pv7+6OpqSmeeOKJaG5uHnDsGWecURif6JiIiMopXEn2ZK/VyPdotP7+/vj4xz8e3/rWt074eGdn5yjPiHcyocCI2LFjR1x88cU53rlzZ/T390dHR0c0NzdHpVKJiy++eEL/QZs3b1709/fHrl27CquDv/zlL4XjWltbo6WlJXbs2DHgNcrHnsj8+fPj3//+d1x//fXDnzQMQk+BEfGzn/2sML7vvvsiIuLGG2+MT3/609Hc3Bw9PT0D/k+8UqnEP/7xj1Gb53DceOONERGxcePGwv333ntvYdzc3Bw33HBDPProo7F37968/89//nNs2bJl0Pfp7u6OrVu3nvDYw4cPx9GjR09h9nBiVgqMiJdffjlWrlwZXV1dsXXr1ti0aVOsXr06LrvssoiI+O53vxt33HFH9PX1xapVq+LMM8+Ml19+OR555JG49dZb4xvf+MYY/wSDW7RoUXz+85+Pn//85/Haa6/Fhz/84XjyySdj586dA47t6emJ3t7euOaaa2LNmjVx9OjRuO++++L973//oL2Rb37zm/GrX/0qli9fHrfcckss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CgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQJo81AMPP3tuYXxVfLbhkwGgccp/t6Nr8OdYKQCQhAIASSgAkJoqlUplrCcBwPhgpQBAEgoAJKEAQBIKACShAEASCgAkoQBAEgoAJKEAQPo/TXU1UCxME2sAAAAASUVORK5CYII="},"metadata":{}}]},{"cell_type":"code","source":"import torchvision.models as models\nmodel = models.resnet18(pretrained=True)\nnum_classes = len(custom_dataset .classes)\nmodel.fc = nn.Linear(model.fc.in_features, num_classes)\nmodel.conv1 = nn.Conv2d(1, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\nif torch.cuda.is_available():\n    model = model.cuda()\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.001)\nnum_epochs = 50\nprint_interval = 10\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:11:09.466168Z","iopub.execute_input":"2023-12-23T20:11:09.46655Z","iopub.status.idle":"2023-12-23T20:11:13.568308Z","shell.execute_reply.started":"2023-12-23T20:11:09.466521Z","shell.execute_reply":"2023-12-23T20:11:13.567208Z"},"trusted":true},"execution_count":13,"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/torchvision/models/_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n  warnings.warn(\n/opt/conda/lib/python3.10/site-packages/torchvision/models/_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=ResNet18_Weights.IMAGENET1K_V1`. You can also use `weights=ResNet18_Weights.DEFAULT` to get the most up-to-date weights.\n  warnings.warn(msg)\nDownloading: \"https://download.pytorch.org/models/resnet18-f37072fd.pth\" to /root/.cache/torch/hub/checkpoints/resnet18-f37072fd.pth\n100%|██████████| 44.7M/44.7M [00:00<00:00, 175MB/s] \n","output_type":"stream"}]},{"cell_type":"code","source":"!pip install torch torchvision torchaudio -f https://download.pytorch.org/whl/cuXXX/torch_stable.html\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:11:37.775941Z","iopub.execute_input":"2023-12-23T20:11:37.776789Z","iopub.status.idle":"2023-12-23T20:11:52.097212Z","shell.execute_reply.started":"2023-12-23T20:11:37.776753Z","shell.execute_reply":"2023-12-23T20:11:52.09595Z"},"trusted":true},"execution_count":14,"outputs":[{"name":"stdout","text":"Looking in links: https://download.pytorch.org/whl/cuXXX/torch_stable.html\nRequirement already satisfied: torch in /opt/conda/lib/python3.10/site-packages (2.0.0)\nRequirement already satisfied: torchvision in /opt/conda/lib/python3.10/site-packages (0.15.1)\nRequirement already satisfied: torchaudio in /opt/conda/lib/python3.10/site-packages (2.0.1)\nRequirement already satisfied: filelock in /opt/conda/lib/python3.10/site-packages (from torch) (3.12.2)\nRequirement already satisfied: typing-extensions in /opt/conda/lib/python3.10/site-packages (from torch) (4.5.0)\nRequirement already satisfied: sympy in /opt/conda/lib/python3.10/site-packages (from torch) (1.12)\nRequirement already satisfied: networkx in /opt/conda/lib/python3.10/site-packages (from torch) (3.1)\nRequirement already satisfied: jinja2 in /opt/conda/lib/python3.10/site-packages (from torch) (3.1.2)\nRequirement already satisfied: numpy in /opt/conda/lib/python3.10/site-packages (from torchvision) (1.24.3)\nRequirement already satisfied: requests in /opt/conda/lib/python3.10/site-packages (from torchvision) (2.31.0)\nRequirement already satisfied: pillow!=8.3.*,>=5.3.0 in /opt/conda/lib/python3.10/site-packages (from torchvision) (10.1.0)\nRequirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.10/site-packages (from jinja2->torch) (2.1.3)\nRequirement already satisfied: charset-normalizer<4,>=2 in /opt/conda/lib/python3.10/site-packages (from requests->torchvision) (3.2.0)\nRequirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.10/site-packages (from requests->torchvision) (3.4)\nRequirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/lib/python3.10/site-packages (from requests->torchvision) (1.26.15)\nRequirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.10/site-packages (from requests->torchvision) (2023.11.17)\nRequirement already satisfied: mpmath>=0.19 in /opt/conda/lib/python3.10/site-packages (from sympy->torch) (1.3.0)\n","output_type":"stream"}]},{"cell_type":"code","source":"import torch\nprint(torch.cuda.is_available())\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:11:54.622768Z","iopub.execute_input":"2023-12-23T20:11:54.623199Z","iopub.status.idle":"2023-12-23T20:11:54.628712Z","shell.execute_reply.started":"2023-12-23T20:11:54.623162Z","shell.execute_reply":"2023-12-23T20:11:54.627762Z"},"trusted":true},"execution_count":15,"outputs":[{"name":"stdout","text":"True\n","output_type":"stream"}]},{"cell_type":"code","source":"for epoch in range(num_epochs):\n    # Training phase\n    model.train()\n    running_loss = 0.0\n    total_correct_train = 0\n    total_train = 0\n    total_batches_train = len(train_dataloader)\n\n    for batch_idx, (inputs, labels) in enumerate(train_dataloader):\n        inputs, labels = inputs.cuda(), labels.cuda() if torch.cuda.is_available() else (inputs, labels)\n\n        optimizer.zero_grad()\n        outputs = model(inputs)\n        loss = criterion(outputs, labels)\n        \n        print(\"Before backward\")\n        loss.backward()\n        print(\"After backward\")\n        \n        optimizer.step()\n        torch.cuda.empty_cache()\n        running_loss += loss.item()\n\n        _, predicted_train = torch.max(outputs.data, 1)\n        total_correct_train += (predicted_train == labels).sum().item()\n        total_train += labels.size(0)\n\n        if (batch_idx + 1) % print_interval == 0 or (batch_idx + 1) == total_batches_train:\n            print(f\"Epoch {epoch + 1}/{num_epochs}, Batch {batch_idx + 1}/{total_batches_train}, Training Loss: {loss.item()}\")\n\n    train_accuracy = total_correct_train / total_train\n\n    # Validation phase\n    model.eval()\n    val_loss = 0.0\n    correct = 0\n    total = 0\n    total_batches_val = len(val_dataloader)\n\n    with torch.no_grad():\n        for batch_idx, (val_inputs, val_labels) in enumerate(val_dataloader):\n            val_inputs, val_labels = val_inputs.cuda(), val_labels.cuda() if torch.cuda.is_available() else (val_inputs, val_labels)\n\n            val_outputs = model(val_inputs)\n            val_loss += criterion(val_outputs, val_labels).item()\n\n            _, predicted = torch.max(val_outputs.data, 1)\n            total += val_labels.size(0)\n            correct += (predicted == val_labels).sum().item()\n            torch.cuda.empty_cache()\n\n            if (batch_idx + 1) % print_interval == 0 or (batch_idx + 1) == total_batches_val:\n                avg_val_loss = val_loss / (batch_idx + 1)\n                val_accuracy = correct / total\n                print(f\"Epoch {epoch + 1}/{num_epochs}, Validation Batch {batch_idx + 1}/{total_batches_val}, Validation Loss: {avg_val_loss}, Validation Accuracy: {val_accuracy}\")\n\n    avg_train_loss = running_loss / total_batches_train\n    avg_val_loss = val_loss / total_batches_val\n    val_accuracy = correct / total\n\n    print(f\"Epoch {epoch + 1}/{num_epochs}, Average Training Loss: {avg_train_loss}, Average Validation Loss: {avg_val_loss}, Training Accuracy: {train_accuracy}, Validation Accuracy: {val_accuracy}\")\n","metadata":{"execution":{"iopub.status.busy":"2023-12-23T20:12:15.870249Z","iopub.execute_input":"2023-12-23T20:12:15.870727Z"},"trusted":true},"execution_count":null,"outputs":[{"name":"stdout","text":"Before backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 1/50, Batch 10/67, Training Loss: 1.4148896932601929\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 1/50, Batch 20/67, Training Loss: 0.639610767364502\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 1/50, Batch 30/67, Training Loss: 0.5835862159729004\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 1/50, Batch 40/67, Training Loss: 0.41631612181663513\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 1/50, Batch 50/67, Training Loss: 0.43974703550338745\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 1/50, Batch 60/67, Training Loss: 0.3403419852256775\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 1/50, Batch 67/67, Training Loss: 0.3861953318119049\nEpoch 1/50, Validation Batch 9/9, Validation Loss: 0.42371267080307007, Validation Accuracy: 0.8679200940070505\nEpoch 1/50, Average Training Loss: 0.8751174838685277, Average Validation Loss: 0.42371267080307007, Training Accuracy: 0.7628865979381443, Validation Accuracy: 0.8679200940070505\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 2/50, Batch 10/67, Training Loss: 0.21046432852745056\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 2/50, Batch 20/67, Training Loss: 0.2233130782842636\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 2/50, Batch 30/67, Training Loss: 0.30429717898368835\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 2/50, Batch 40/67, Training Loss: 0.25564512610435486\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 2/50, Batch 50/67, Training Loss: 0.2550203502178192\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 2/50, Batch 60/67, Training Loss: 0.29164227843284607\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 2/50, Batch 67/67, Training Loss: 0.22371768951416016\nEpoch 2/50, Validation Batch 9/9, Validation Loss: 0.5963151289357079, Validation Accuracy: 0.8131609870740305\nEpoch 2/50, Average Training Loss: 0.2503230558402503, Average Validation Loss: 0.5963151289357079, Training Accuracy: 0.920257291391312, Validation Accuracy: 0.8131609870740305\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 3/50, Batch 10/67, Training Loss: 0.19556228816509247\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 3/50, Batch 20/67, Training Loss: 0.18216575682163239\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 3/50, Batch 30/67, Training Loss: 0.1949157863855362\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 3/50, Batch 40/67, Training Loss: 0.16194087266921997\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 3/50, Batch 50/67, Training Loss: 0.13600695133209229\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 3/50, Batch 60/67, Training Loss: 0.13973821699619293\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 3/50, Batch 67/67, Training Loss: 0.19856710731983185\nEpoch 3/50, Validation Batch 9/9, Validation Loss: 0.30111774305502575, Validation Accuracy: 0.899882491186839\nEpoch 3/50, Average Training Loss: 0.17230146967653018, Average Validation Loss: 0.30111774305502575, Training Accuracy: 0.9435486239609951, Validation Accuracy: 0.899882491186839\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 4/50, Batch 10/67, Training Loss: 0.12458217889070511\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 4/50, Batch 20/67, Training Loss: 0.13447417318820953\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 4/50, Batch 30/67, Training Loss: 0.1095338761806488\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 4/50, Batch 40/67, Training Loss: 0.1626339703798294\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 4/50, Batch 50/67, Training Loss: 0.12818345427513123\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 4/50, Batch 60/67, Training Loss: 0.09449854493141174\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 4/50, Batch 67/67, Training Loss: 0.17902140319347382\nEpoch 4/50, Validation Batch 9/9, Validation Loss: 0.3055239071448644, Validation Accuracy: 0.9031727379553467\nEpoch 4/50, Average Training Loss: 0.12309108641165406, Average Validation Loss: 0.3055239071448644, Training Accuracy: 0.9579111228595765, Validation Accuracy: 0.9031727379553467\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 5/50, Batch 10/67, Training Loss: 0.09584710747003555\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 5/50, Batch 20/67, Training Loss: 0.08819509297609329\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 5/50, Batch 30/67, Training Loss: 0.09389746189117432\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 5/50, Batch 40/67, Training Loss: 0.08885640650987625\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 5/50, Batch 50/67, Training Loss: 0.09926215559244156\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 5/50, Batch 60/67, Training Loss: 0.09672866016626358\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 5/50, Batch 67/67, Training Loss: 0.14634858071804047\nEpoch 5/50, Validation Batch 9/9, Validation Loss: 0.4114338755607605, Validation Accuracy: 0.8841363102232668\nEpoch 5/50, Average Training Loss: 0.10532142966985703, Average Validation Loss: 0.4114338755607605, Training Accuracy: 0.964167180662026, Validation Accuracy: 0.8841363102232668\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 6/50, Batch 10/67, Training Loss: 0.09720856696367264\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 6/50, Batch 20/67, Training Loss: 0.09616828709840775\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 6/50, Batch 30/67, Training Loss: 0.07692732661962509\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 6/50, Batch 40/67, Training Loss: 0.07147388905286789\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 6/50, Batch 50/67, Training Loss: 0.08054375648498535\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 6/50, Batch 60/67, Training Loss: 0.12113247066736221\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 6/50, Batch 67/67, Training Loss: 0.10155313462018967\nEpoch 6/50, Validation Batch 9/9, Validation Loss: 0.33285213510195416, Validation Accuracy: 0.8977673325499412\nEpoch 6/50, Average Training Loss: 0.08743862251737225, Average Validation Loss: 0.33285213510195416, Training Accuracy: 0.96983581519664, Validation Accuracy: 0.8977673325499412\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 7/50, Batch 10/67, Training Loss: 0.05700143799185753\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 7/50, Batch 20/67, Training Loss: 0.07535370439291\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 7/50, Batch 30/67, Training Loss: 0.057094134390354156\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 7/50, Batch 40/67, Training Loss: 0.09346508234739304\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 7/50, Batch 50/67, Training Loss: 0.062420617789030075\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 7/50, Batch 60/67, Training Loss: 0.09582635760307312\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 7/50, Batch 67/67, Training Loss: 0.07451002299785614\nEpoch 7/50, Validation Batch 9/9, Validation Loss: 0.434859037399292, Validation Accuracy: 0.8782608695652174\nEpoch 7/50, Average Training Loss: 0.08054613922514132, Average Validation Loss: 0.434859037399292, Training Accuracy: 0.9719505389608483, Validation Accuracy: 0.8782608695652174\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 8/50, Batch 10/67, Training Loss: 0.059236589819192886\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 8/50, Batch 20/67, Training Loss: 0.04755512624979019\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 8/50, Batch 30/67, Training Loss: 0.042976055294275284\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 8/50, Batch 40/67, Training Loss: 0.0755043551325798\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 8/50, Batch 50/67, Training Loss: 0.05930979922413826\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 8/50, Batch 60/67, Training Loss: 0.03141476586461067\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 8/50, Batch 67/67, Training Loss: 0.06947959959506989\nEpoch 8/50, Validation Batch 9/9, Validation Loss: 0.46685933073361713, Validation Accuracy: 0.8686251468860164\nEpoch 8/50, Average Training Loss: 0.06259977661851626, Average Validation Loss: 0.46685933073361713, Training Accuracy: 0.9786765353775663, Validation Accuracy: 0.8686251468860164\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 9/50, Batch 10/67, Training Loss: 0.06011652201414108\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 9/50, Batch 20/67, Training Loss: 0.048786334693431854\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 9/50, Batch 30/67, Training Loss: 0.0627460852265358\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 9/50, Batch 40/67, Training Loss: 0.04790050536394119\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 9/50, Batch 50/67, Training Loss: 0.044255975633859634\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 9/50, Batch 60/67, Training Loss: 0.05104003846645355\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 9/50, Batch 67/67, Training Loss: 0.09198295325040817\nEpoch 9/50, Validation Batch 9/9, Validation Loss: 0.3608652419514126, Validation Accuracy: 0.9078730904817861\nEpoch 9/50, Average Training Loss: 0.055501668199674406, Average Validation Loss: 0.3608652419514126, Training Accuracy: 0.9804094340176814, Validation Accuracy: 0.9078730904817861\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 10/50, Batch 10/67, Training Loss: 0.07671929150819778\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 10/50, Batch 20/67, Training Loss: 0.04322468489408493\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 10/50, Batch 30/67, Training Loss: 0.03392984718084335\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 10/50, Batch 40/67, Training Loss: 0.06263698637485504\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 10/50, Batch 50/67, Training Loss: 0.037043675780296326\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 10/50, Batch 60/67, Training Loss: 0.033723730593919754\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 10/50, Batch 67/67, Training Loss: 0.0378350093960762\nEpoch 10/50, Validation Batch 9/9, Validation Loss: 0.3262542916668786, Validation Accuracy: 0.9151586368977673\nEpoch 10/50, Average Training Loss: 0.04562461784860091, Average Validation Loss: 0.3262542916668786, Training Accuracy: 0.9841983140952213, Validation Accuracy: 0.9151586368977673\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 11/50, Batch 10/67, Training Loss: 0.045912932604551315\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 11/50, Batch 20/67, Training Loss: 0.05202975124120712\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 11/50, Batch 30/67, Training Loss: 0.05167120695114136\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 11/50, Batch 40/67, Training Loss: 0.028675999492406845\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 11/50, Batch 50/67, Training Loss: 0.06120513007044792\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 11/50, Batch 60/67, Training Loss: 0.023014280945062637\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 11/50, Batch 67/67, Training Loss: 0.06278057396411896\nEpoch 11/50, Validation Batch 9/9, Validation Loss: 0.366685195101632, Validation Accuracy: 0.9036427732079906\nEpoch 11/50, Average Training Loss: 0.04204053837639182, Average Validation Loss: 0.366685195101632, Training Accuracy: 0.985314418304109, Validation Accuracy: 0.9036427732079906\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 12/50, Batch 10/67, Training Loss: 0.018605666235089302\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 12/50, Batch 20/67, Training Loss: 0.03712661191821098\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 12/50, Batch 30/67, Training Loss: 0.028102489188313484\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 12/50, Batch 40/67, Training Loss: 0.02569718286395073\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 12/50, Batch 50/67, Training Loss: 0.06598925590515137\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 12/50, Batch 60/67, Training Loss: 0.04273856803774834\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 12/50, Batch 67/67, Training Loss: 0.062281008809804916\nEpoch 12/50, Validation Batch 9/9, Validation Loss: 0.35235429803530377, Validation Accuracy: 0.9139835487661575\nEpoch 12/50, Average Training Loss: 0.03870277255495538, Average Validation Loss: 0.35235429803530377, Training Accuracy: 0.9870473169442242, Validation Accuracy: 0.9139835487661575\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 13/50, Batch 10/67, Training Loss: 0.03777291625738144\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 13/50, Batch 20/67, Training Loss: 0.04407430440187454\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 13/50, Batch 30/67, Training Loss: 0.02821228839457035\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 13/50, Batch 40/67, Training Loss: 0.021583478897809982\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 13/50, Batch 50/67, Training Loss: 0.05023480951786041\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 13/50, Batch 60/67, Training Loss: 0.03799959272146225\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 13/50, Batch 67/67, Training Loss: 0.02717026136815548\nEpoch 13/50, Validation Batch 9/9, Validation Loss: 0.38765763574176365, Validation Accuracy: 0.899412455934195\nEpoch 13/50, Average Training Loss: 0.0382184507464295, Average Validation Loss: 0.38765763574176365, Training Accuracy: 0.986929832290657, Validation Accuracy: 0.899412455934195\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 14/50, Batch 10/67, Training Loss: 0.052244797348976135\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 14/50, Batch 20/67, Training Loss: 0.058504071086645126\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 14/50, Batch 30/67, Training Loss: 0.03636400029063225\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 14/50, Batch 40/67, Training Loss: 0.03637217357754707\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 14/50, Batch 50/67, Training Loss: 0.07256056368350983\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 14/50, Batch 60/67, Training Loss: 0.02053302712738514\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 14/50, Batch 67/67, Training Loss: 0.03959188982844353\nEpoch 14/50, Validation Batch 9/9, Validation Loss: 0.4200570219092899, Validation Accuracy: 0.9008225616921269\nEpoch 14/50, Average Training Loss: 0.03986640332906104, Average Validation Loss: 0.4200570219092899, Training Accuracy: 0.9873116574147502, Validation Accuracy: 0.9008225616921269\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 15/50, Batch 10/67, Training Loss: 0.041648536920547485\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 15/50, Batch 20/67, Training Loss: 0.038005802780389786\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 15/50, Batch 30/67, Training Loss: 0.027708876878023148\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 15/50, Batch 40/67, Training Loss: 0.021735817193984985\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 15/50, Batch 50/67, Training Loss: 0.04126737266778946\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 15/50, Batch 60/67, Training Loss: 0.06149834394454956\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 15/50, Batch 67/67, Training Loss: 0.04563459753990173\nEpoch 15/50, Validation Batch 9/9, Validation Loss: 0.37741682926813763, Validation Accuracy: 0.9135135135135135\nEpoch 15/50, Average Training Loss: 0.03860733562163008, Average Validation Loss: 0.37741682926813763, Training Accuracy: 0.9872235439245749, Validation Accuracy: 0.9135135135135135\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 16/50, Batch 10/67, Training Loss: 0.02316875383257866\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 16/50, Batch 20/67, Training Loss: 0.025912916287779808\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 16/50, Batch 30/67, Training Loss: 0.05042882263660431\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 16/50, Batch 40/67, Training Loss: 0.038501814007759094\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 16/50, Batch 50/67, Training Loss: 0.03624233976006508\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 16/50, Batch 60/67, Training Loss: 0.033502452075481415\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 16/50, Batch 67/67, Training Loss: 0.025263255462050438\nEpoch 16/50, Validation Batch 9/9, Validation Loss: 0.37469252778424156, Validation Accuracy: 0.9132784958871916\nEpoch 16/50, Average Training Loss: 0.030871382205566362, Average Validation Loss: 0.37469252778424156, Training Accuracy: 0.9897788351396599, Validation Accuracy: 0.9132784958871916\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 17/50, Batch 10/67, Training Loss: 0.029191697016358376\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 17/50, Batch 20/67, Training Loss: 0.027197400107979774\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 17/50, Batch 30/67, Training Loss: 0.02885279431939125\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 17/50, Batch 40/67, Training Loss: 0.012601683847606182\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 17/50, Batch 50/67, Training Loss: 0.045641012489795685\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 17/50, Batch 60/67, Training Loss: 0.011994716711342335\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 17/50, Batch 67/67, Training Loss: 0.020228583365678787\nEpoch 17/50, Validation Batch 9/9, Validation Loss: 0.3781619568665822, Validation Accuracy: 0.9132784958871916\nEpoch 17/50, Average Training Loss: 0.024892416136311508, Average Validation Loss: 0.3781619568665822, Training Accuracy: 0.9917467030869093, Validation Accuracy: 0.9132784958871916\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 18/50, Batch 10/67, Training Loss: 0.010969228111207485\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 18/50, Batch 20/67, Training Loss: 0.009033688344061375\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 18/50, Batch 30/67, Training Loss: 0.009925839491188526\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 18/50, Batch 40/67, Training Loss: 0.010105738416314125\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 18/50, Batch 50/67, Training Loss: 0.03330308571457863\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 18/50, Batch 60/67, Training Loss: 0.012092476710677147\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 18/50, Batch 67/67, Training Loss: 0.01738976500928402\nEpoch 18/50, Validation Batch 9/9, Validation Loss: 0.383478045463562, Validation Accuracy: 0.9132784958871916\nEpoch 18/50, Average Training Loss: 0.012745876240530122, Average Validation Loss: 0.383478045463562, Training Accuracy: 0.9961523775956765, Validation Accuracy: 0.9132784958871916\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 19/50, Batch 10/67, Training Loss: 0.0376015231013298\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 19/50, Batch 20/67, Training Loss: 0.014595670625567436\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 19/50, Batch 30/67, Training Loss: 0.012025275267660618\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 19/50, Batch 40/67, Training Loss: 0.006712791509926319\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 19/50, Batch 50/67, Training Loss: 0.0192545335739851\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 19/50, Batch 60/67, Training Loss: 0.006532822269946337\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 19/50, Batch 67/67, Training Loss: 0.00891359057277441\nEpoch 19/50, Validation Batch 9/9, Validation Loss: 0.35865145921707153, Validation Accuracy: 0.9233842538190364\nEpoch 19/50, Average Training Loss: 0.01178135321503366, Average Validation Loss: 0.35865145921707153, Training Accuracy: 0.9964754603929862, Validation Accuracy: 0.9233842538190364\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 20/50, Batch 10/67, Training Loss: 0.010425891727209091\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 20/50, Batch 20/67, Training Loss: 0.014745788648724556\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 20/50, Batch 30/67, Training Loss: 0.015581678599119186\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 20/50, Batch 40/67, Training Loss: 0.013221392408013344\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 20/50, Batch 50/67, Training Loss: 0.006386000197380781\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 20/50, Batch 60/67, Training Loss: 0.017060231417417526\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 20/50, Batch 67/67, Training Loss: 0.009477208368480206\nEpoch 20/50, Validation Batch 9/9, Validation Loss: 0.38168568743599784, Validation Accuracy: 0.9203290246768507\nEpoch 20/50, Average Training Loss: 0.014280286483786334, Average Validation Loss: 0.38168568743599784, Training Accuracy: 0.9957118101447998, Validation Accuracy: 0.9203290246768507\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 21/50, Batch 10/67, Training Loss: 0.013034365139901638\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 21/50, Batch 20/67, Training Loss: 0.02156779170036316\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 21/50, Batch 30/67, Training Loss: 0.015389082953333855\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 21/50, Batch 40/67, Training Loss: 0.019653422757983208\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 21/50, Batch 50/67, Training Loss: 0.02976362034678459\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 21/50, Batch 60/67, Training Loss: 0.0149235175922513\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 21/50, Batch 67/67, Training Loss: 0.002950412919744849\nEpoch 21/50, Validation Batch 9/9, Validation Loss: 0.3758423129717509, Validation Accuracy: 0.9146886016451233\nEpoch 21/50, Average Training Loss: 0.019672039816322835, Average Validation Loss: 0.3758423129717509, Training Accuracy: 0.9931565189297148, Validation Accuracy: 0.9146886016451233\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 22/50, Batch 10/67, Training Loss: 0.004742036573588848\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 22/50, Batch 20/67, Training Loss: 0.009019726887345314\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 22/50, Batch 30/67, Training Loss: 0.04240177571773529\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 22/50, Batch 40/67, Training Loss: 0.015059972181916237\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 22/50, Batch 50/67, Training Loss: 0.056029368191957474\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 22/50, Batch 60/67, Training Loss: 0.045159466564655304\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 22/50, Batch 67/67, Training Loss: 0.02203105390071869\nEpoch 22/50, Validation Batch 9/9, Validation Loss: 0.440394573741489, Validation Accuracy: 0.909753231492362\nEpoch 22/50, Average Training Loss: 0.023214483028972773, Average Validation Loss: 0.440394573741489, Training Accuracy: 0.9923634975181367, Validation Accuracy: 0.909753231492362\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 23/50, Batch 10/67, Training Loss: 0.015021655708551407\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 23/50, Batch 20/67, Training Loss: 0.039584796875715256\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 23/50, Batch 30/67, Training Loss: 0.025222351774573326\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 23/50, Batch 40/67, Training Loss: 0.012664823792874813\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 23/50, Batch 50/67, Training Loss: 0.041044946759939194\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 23/50, Batch 60/67, Training Loss: 0.047164853662252426\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 23/50, Batch 67/67, Training Loss: 0.006069014314562082\nEpoch 23/50, Validation Batch 9/9, Validation Loss: 0.5148999161190457, Validation Accuracy: 0.8984723854289072\nEpoch 23/50, Average Training Loss: 0.026295756455510855, Average Validation Loss: 0.5148999161190457, Training Accuracy: 0.9913355067994243, Validation Accuracy: 0.8984723854289072\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 24/50, Batch 10/67, Training Loss: 0.030952278524637222\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 24/50, Batch 20/67, Training Loss: 0.02680893801152706\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 24/50, Batch 30/67, Training Loss: 0.02765708602964878\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 24/50, Batch 40/67, Training Loss: 0.03126727044582367\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 24/50, Batch 50/67, Training Loss: 0.0167042538523674\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 24/50, Batch 60/67, Training Loss: 0.021597884595394135\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 24/50, Batch 67/67, Training Loss: 0.022423608228564262\nEpoch 24/50, Validation Batch 9/9, Validation Loss: 0.36784592601988053, Validation Accuracy: 0.9193889541715629\nEpoch 24/50, Average Training Loss: 0.02675674900190154, Average Validation Loss: 0.36784592601988053, Training Accuracy: 0.9914823626163832, Validation Accuracy: 0.9193889541715629\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 25/50, Batch 10/67, Training Loss: 0.019563067704439163\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 25/50, Batch 20/67, Training Loss: 0.011188147589564323\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 25/50, Batch 30/67, Training Loss: 0.009116951376199722\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 25/50, Batch 40/67, Training Loss: 0.013365897350013256\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 25/50, Batch 50/67, Training Loss: 0.03244279697537422\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 25/50, Batch 60/67, Training Loss: 0.011040650308132172\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 25/50, Batch 67/67, Training Loss: 0.01301773451268673\nEpoch 25/50, Validation Batch 9/9, Validation Loss: 0.3918573790126377, Validation Accuracy: 0.9130434782608695\nEpoch 25/50, Average Training Loss: 0.01698173411232211, Average Validation Loss: 0.3918573790126377, Training Accuracy: 0.9945075924457367, Validation Accuracy: 0.9130434782608695\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 26/50, Batch 10/67, Training Loss: 0.0312313474714756\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 26/50, Batch 20/67, Training Loss: 0.024136904627084732\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 26/50, Batch 30/67, Training Loss: 0.019359489902853966\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 26/50, Batch 40/67, Training Loss: 0.019828464835882187\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 26/50, Batch 50/67, Training Loss: 0.00925899762660265\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 26/50, Batch 60/67, Training Loss: 0.012497072108089924\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 26/50, Batch 67/67, Training Loss: 0.010548199526965618\nEpoch 26/50, Validation Batch 9/9, Validation Loss: 0.3914335568745931, Validation Accuracy: 0.9146886016451233\nEpoch 26/50, Average Training Loss: 0.021422721841720057, Average Validation Loss: 0.3914335568745931, Training Accuracy: 0.9933033747466737, Validation Accuracy: 0.9146886016451233\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 27/50, Batch 10/67, Training Loss: 0.010608688928186893\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 27/50, Batch 20/67, Training Loss: 0.008359042927622795\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 27/50, Batch 30/67, Training Loss: 0.016906583681702614\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 27/50, Batch 40/67, Training Loss: 0.004988174419850111\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 27/50, Batch 50/67, Training Loss: 0.016202164813876152\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 27/50, Batch 60/67, Training Loss: 0.005895263981074095\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 27/50, Batch 67/67, Training Loss: 0.039082713425159454\nEpoch 27/50, Validation Batch 9/9, Validation Loss: 0.38221773008505505, Validation Accuracy: 0.9165687426556992\nEpoch 27/50, Average Training Loss: 0.015094871684881066, Average Validation Loss: 0.38221773008505505, Training Accuracy: 0.9955943254912327, Validation Accuracy: 0.9165687426556992\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 28/50, Batch 10/67, Training Loss: 0.01927824318408966\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 28/50, Batch 20/67, Training Loss: 0.015453916043043137\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 28/50, Batch 30/67, Training Loss: 0.009636091999709606\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 28/50, Batch 40/67, Training Loss: 0.00794427003711462\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 28/50, Batch 50/67, Training Loss: 0.016220584511756897\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 28/50, Batch 60/67, Training Loss: 0.008378250524401665\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 28/50, Batch 67/67, Training Loss: 0.009798514656722546\nEpoch 28/50, Validation Batch 9/9, Validation Loss: 0.3742136326101091, Validation Accuracy: 0.9215041128084607\nEpoch 28/50, Average Training Loss: 0.016851349149955744, Average Validation Loss: 0.3742136326101091, Training Accuracy: 0.9949187887332217, Validation Accuracy: 0.9215041128084607\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 29/50, Batch 10/67, Training Loss: 0.012734253890812397\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 29/50, Batch 20/67, Training Loss: 0.006619780790060759\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 29/50, Batch 30/67, Training Loss: 0.014674902893602848\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 29/50, Batch 40/67, Training Loss: 0.005058566108345985\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 29/50, Batch 50/67, Training Loss: 0.010486002080142498\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 29/50, Batch 60/67, Training Loss: 0.005211985670030117\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 29/50, Batch 67/67, Training Loss: 0.0025332493241876364\nEpoch 29/50, Validation Batch 9/9, Validation Loss: 0.38477827111879986, Validation Accuracy: 0.9205640423031728\nEpoch 29/50, Average Training Loss: 0.009587117856535227, Average Validation Loss: 0.38477827111879986, Training Accuracy: 0.9969747701706465, Validation Accuracy: 0.9205640423031728\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 30/50, Batch 10/67, Training Loss: 0.010724025778472424\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 30/50, Batch 20/67, Training Loss: 0.02060270495712757\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 30/50, Batch 30/67, Training Loss: 0.01786673255264759\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 30/50, Batch 40/67, Training Loss: 0.003689622273668647\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 30/50, Batch 50/67, Training Loss: 0.0016423948109149933\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 30/50, Batch 60/67, Training Loss: 0.010087731294333935\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 30/50, Batch 67/67, Training Loss: 0.006101788487285376\nEpoch 30/50, Validation Batch 9/9, Validation Loss: 0.441187408235338, Validation Accuracy: 0.9156286721504113\nEpoch 30/50, Average Training Loss: 0.010105945043085115, Average Validation Loss: 0.441187408235338, Training Accuracy: 0.9967104297001205, Validation Accuracy: 0.9156286721504113\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 31/50, Batch 10/67, Training Loss: 0.01614372432231903\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 31/50, Batch 20/67, Training Loss: 0.008509626612067223\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 31/50, Batch 30/67, Training Loss: 0.01775387115776539\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 31/50, Batch 40/67, Training Loss: 0.016835881397128105\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 31/50, Batch 50/67, Training Loss: 0.019565265625715256\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 31/50, Batch 60/67, Training Loss: 0.01221768744289875\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 31/50, Batch 67/67, Training Loss: 0.01905045472085476\nEpoch 31/50, Validation Batch 9/9, Validation Loss: 0.3870150115754869, Validation Accuracy: 0.9229142185663924\nEpoch 31/50, Average Training Loss: 0.014236148728280147, Average Validation Loss: 0.3870150115754869, Training Accuracy: 0.995564954327841, Validation Accuracy: 0.9229142185663924\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 32/50, Batch 10/67, Training Loss: 0.01141130831092596\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 32/50, Batch 20/67, Training Loss: 0.016903113573789597\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 32/50, Batch 30/67, Training Loss: 0.02909974195063114\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 32/50, Batch 40/67, Training Loss: 0.03888591751456261\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 32/50, Batch 50/67, Training Loss: 0.018994221463799477\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 32/50, Batch 60/67, Training Loss: 0.004805379547178745\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 32/50, Batch 67/67, Training Loss: 0.0066063618287444115\nEpoch 32/50, Validation Batch 9/9, Validation Loss: 0.4010353849993812, Validation Accuracy: 0.9168037602820212\nEpoch 32/50, Average Training Loss: 0.018826211708834143, Average Validation Loss: 0.4010353849993812, Training Accuracy: 0.9937145710341586, Validation Accuracy: 0.9168037602820212\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 33/50, Batch 10/67, Training Loss: 0.023487139493227005\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 33/50, Batch 20/67, Training Loss: 0.01798248291015625\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 33/50, Batch 30/67, Training Loss: 0.004703795071691275\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 33/50, Batch 40/67, Training Loss: 0.01144204568117857\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 33/50, Batch 50/67, Training Loss: 0.03054339438676834\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 33/50, Batch 60/67, Training Loss: 0.012025519274175167\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 33/50, Batch 67/67, Training Loss: 0.014016168192029\nEpoch 33/50, Validation Batch 9/9, Validation Loss: 0.4052227238814036, Validation Accuracy: 0.9215041128084607\nEpoch 33/50, Average Training Loss: 0.0168079393707327, Average Validation Loss: 0.4052227238814036, Training Accuracy: 0.9945663347725203, Validation Accuracy: 0.9215041128084607\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 34/50, Batch 10/67, Training Loss: 0.028444664552807808\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 34/50, Batch 20/67, Training Loss: 0.013826830312609673\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 34/50, Batch 30/67, Training Loss: 0.017482297495007515\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 34/50, Batch 40/67, Training Loss: 0.01032821275293827\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 34/50, Batch 50/67, Training Loss: 0.01254948042333126\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 34/50, Batch 60/67, Training Loss: 0.025294935330748558\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 34/50, Batch 67/67, Training Loss: 0.020989952608942986\nEpoch 34/50, Validation Batch 9/9, Validation Loss: 0.4247422152095371, Validation Accuracy: 0.918448883666275\nEpoch 34/50, Average Training Loss: 0.016671773789923138, Average Validation Loss: 0.4247422152095371, Training Accuracy: 0.9952125003671396, Validation Accuracy: 0.918448883666275\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 35/50, Batch 10/67, Training Loss: 0.008906615898013115\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 35/50, Batch 20/67, Training Loss: 0.011755982413887978\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 35/50, Batch 30/67, Training Loss: 0.011454136110842228\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 35/50, Batch 40/67, Training Loss: 0.021605301648378372\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 35/50, Batch 50/67, Training Loss: 0.01768486760556698\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 35/50, Batch 60/67, Training Loss: 0.024776838719844818\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 35/50, Batch 67/67, Training Loss: 0.016244646161794662\nEpoch 35/50, Validation Batch 9/9, Validation Loss: 0.3949238889747196, Validation Accuracy: 0.9210340775558167\nEpoch 35/50, Average Training Loss: 0.01626437548339478, Average Validation Loss: 0.3949238889747196, Training Accuracy: 0.9948013040796546, Validation Accuracy: 0.9210340775558167\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 36/50, Batch 10/67, Training Loss: 0.041571490466594696\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 36/50, Batch 20/67, Training Loss: 0.022080637514591217\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 36/50, Batch 30/67, Training Loss: 0.012078945524990559\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 36/50, Batch 40/67, Training Loss: 0.005614163354039192\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 36/50, Batch 50/67, Training Loss: 0.02980796992778778\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 36/50, Batch 60/67, Training Loss: 0.008581152185797691\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 36/50, Batch 67/67, Training Loss: 0.012229031883180141\nEpoch 36/50, Validation Batch 9/9, Validation Loss: 0.47571797172228497, Validation Accuracy: 0.9102232667450059\nEpoch 36/50, Average Training Loss: 0.0207734432509308, Average Validation Loss: 0.47571797172228497, Training Accuracy: 0.9930390342761477, Validation Accuracy: 0.9102232667450059\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 37/50, Batch 10/67, Training Loss: 0.03465939685702324\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 37/50, Batch 20/67, Training Loss: 0.012751015834510326\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 37/50, Batch 30/67, Training Loss: 0.018697774037718773\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 37/50, Batch 40/67, Training Loss: 0.02310054376721382\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 37/50, Batch 50/67, Training Loss: 0.019902946427464485\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 37/50, Batch 60/67, Training Loss: 0.012093971483409405\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 37/50, Batch 67/67, Training Loss: 0.03897170349955559\nEpoch 37/50, Validation Batch 9/9, Validation Loss: 0.46663174364301896, Validation Accuracy: 0.9057579318448884\nEpoch 37/50, Average Training Loss: 0.022833500717724883, Average Validation Loss: 0.46663174364301896, Training Accuracy: 0.9926278379886627, Validation Accuracy: 0.9057579318448884\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 38/50, Batch 10/67, Training Loss: 0.014668671414256096\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 38/50, Batch 20/67, Training Loss: 0.030850205570459366\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 38/50, Batch 30/67, Training Loss: 0.015769515186548233\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nBefore backward\nAfter backward\nEpoch 38/50, Batch 40/67, Training Loss: 0.022097714245319366\n","output_type":"stream"}]},{"cell_type":"code","source":"# Initialize counters\ncorrect = 0\ntotal = 0\n\n# Set the model to evaluation mode\nmodel.eval()\n\n# Deactivate gradient computation\nwith torch.no_grad():\n    # Iterate over the validation dataloader\n    for val_inputs, val_labels in val_dataloader:\n        # Move data to GPU if available\n        if torch.cuda.is_available():\n            val_inputs, val_labels = val_inputs.cuda(), val_labels.cuda()\n\n        # Forward pass\n        val_outputs = model(val_inputs)\n\n        # Get predicted labels\n        _, predicted = torch.max(val_outputs.data, 1)\n\n        # Update counters\n        total += val_labels.size(0)\n        correct += (predicted == val_labels).sum().item()\n\n# Calculate accuracy\nval_accuracy = correct / total\nprint(f\"Validation Accuracy: {val_accuracy}\")\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import csv\nimport os\n\n# Initialize counters\ncorrect = 0\ntotal = 0\npredictions = []\n\n# Set the model to evaluation mode\nmodel.eval()\n\n# Deactivate gradient computation\nwith torch.no_grad():\n    # Iterate over the test dataloader\n    for test_inputs, test_labels in test_dataloader:  # Use test_dataloader instead of val_dataloader\n        # Move data to GPU if available\n        if torch.cuda.is_available():\n            test_inputs, test_labels = test_inputs.cuda(), test_labels.cuda()\n\n        # Forward pass\n        test_outputs = model(test_inputs)\n\n        # Get predicted labels\n        _, predicted = torch.max(test_outputs.data, 1)\n\n        # Update counters\n        total += test_labels.size(0)\n        correct += (predicted == test_labels).sum().item()\n\n        # Append predictions to the list\n        predictions.extend(predicted.cpu().numpy())\n\n# Calculate accuracy\ntest_accuracy = correct / total\nprint(f\"Testing Accuracy: {test_accuracy}\")\n\n# Save predictions to CSV file in /kaggle/working/ directory\ncsv_file_path = \"/kaggle/working/test_predictions.csv\"\n\n# Ensure the directory exists before writing the file\nos.makedirs(os.path.dirname(csv_file_path), exist_ok=True)\n\nwith open(csv_file_path, 'w', newline='') as csvfile:\n    fieldnames = ['Image', 'Predicted_Label']\n    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)\n\n    writer.writeheader()\n    for i, prediction in enumerate(predictions):\n        writer.writerow({'Image': f'{i}.png', 'Predicted_Label': prediction})\n\nprint(f\"Testing predictions saved to: {csv_file_path}\")\nimport csv\nimport os\n\n# Initialize counters\ncorrect = 0\ntotal = 0\npredictions = []\n\n# Set the model to evaluation mode\nmodel.eval()\n\n# Deactivate gradient computation\nwith torch.no_grad():\n    # Iterate over the test dataloader\n    for test_inputs, test_labels in test_dataloader:  # Use test_dataloader instead of val_dataloader\n        # Move data to GPU if available\n        if torch.cuda.is_available():\n            test_inputs, test_labels = test_inputs.cuda(), test_labels.cuda()\n\n        # Forward pass\n        test_outputs = model(test_inputs)\n\n        # Get predicted labels\n        _, predicted = torch.max(test_outputs.data, 1)\n\n        # Update counters\n        total += test_labels.size(0)\n        correct += (predicted == test_labels).sum().item()\n\n        # Append predictions to the list\n        predictions.extend(predicted.cpu().numpy())\n\n# Calculate accuracy\ntest_accuracy = correct / total\nprint(f\"Testing Accuracy: {test_accuracy}\")\n\n# Save predictions to CSV file in /kaggle/working/ directory\ncsv_file_path = \"/kaggle/working/test_predictions.csv\"\n\n# Ensure the directory exists before writing the file\nos.makedirs(os.path.dirname(csv_file_path), exist_ok=True)\n\nwith open(csv_file_path, 'w', newline='') as csvfile:\n    fieldnames = ['Image', 'Predicted_Label']\n    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)\n\n    writer.writeheader()\n    for i, prediction in enumerate(predictions):\n        writer.writerow({'Image': f'{i}.png', 'Predicted_Label': prediction})\n\nprint(f\"Testing predictions saved to: {csv_file_path}\")\n","metadata":{},"execution_count":null,"outputs":[]}]}