Created
March 31, 2026 18:08
-
-
Save brusangues/fb7425c3ed3c388643dde470d81e8da9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "id": "42a04b14", | |
| "metadata": {}, | |
| "source": [ | |
| "# 1. Dataset MNIST Dígitos" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "c304ddec", | |
| "metadata": {}, | |
| "source": [ | |
| "## 1.1. Leitura dos dados" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 74, | |
| "id": "25e3e55e", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# import pandas as pd\n", | |
| "# from sklearn.datasets import fetch_openml\n", | |
| "\n", | |
| "# mnist = fetch_openml('mnist_784', version=1)\n", | |
| "# X, y = mnist['data'], mnist['target']\n", | |
| "# X[\"target\"] = y\n", | |
| "# df = pd.DataFrame(X)\n", | |
| "# print(X.shape, df.shape)\n", | |
| "# df" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 75, | |
| "id": "d98f0cae", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# len(df)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 76, | |
| "id": "85dd10a2", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# # Salvando dados\n", | |
| "# step = 5_000\n", | |
| "# len_df = len(df)\n", | |
| "# for i in range(0, len_df, step):\n", | |
| "# print(i, i+step)\n", | |
| "# dfi = df.iloc[i:i+step]\n", | |
| "# dfi.to_csv(f\"mnist/{i}.csv\", index=False)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 77, | |
| "id": "65f3601e", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "0 5000\n", | |
| "5000 10000\n", | |
| "10000 15000\n", | |
| "15000 20000\n", | |
| "20000 25000\n", | |
| "25000 30000\n", | |
| "30000 35000\n", | |
| "35000 40000\n", | |
| "40000 45000\n", | |
| "45000 50000\n", | |
| "50000 55000\n", | |
| "55000 60000\n", | |
| "60000 65000\n", | |
| "65000 70000\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# Lendo dados\n", | |
| "import pandas as pd\n", | |
| "\n", | |
| "dfs = []\n", | |
| "step = 5_000\n", | |
| "len_df = 70000\n", | |
| "for i in range(0, len_df, step):\n", | |
| " print(i, i+step)\n", | |
| " dfi = pd.read_csv(f\"mnist/{i}.csv\")\n", | |
| " dfs.append(dfi)\n", | |
| "df_ = pd.concat(dfs, ignore_index=True)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 78, | |
| "id": "7ac4423a", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "<class 'pandas.core.frame.DataFrame'>\n", | |
| "RangeIndex: 70000 entries, 0 to 69999\n", | |
| "Columns: 785 entries, pixel1 to target\n", | |
| "dtypes: int64(785)\n", | |
| "memory usage: 419.2 MB\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "df_.info()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "c47cd01c", | |
| "metadata": {}, | |
| "source": [ | |
| "## 1.2. Visualização" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 79, | |
| "id": "c7456014", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "X = df_.filter(regex=\"pixel\")\n", | |
| "y = df_[\"target\"]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 80, | |
| "id": "8c8b02ce", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "<class 'pandas.core.frame.DataFrame'>\n", | |
| "RangeIndex: 70000 entries, 0 to 69999\n", | |
| "Columns: 784 entries, pixel1 to pixel784\n", | |
| "dtypes: int16(784)\n", | |
| "memory usage: 104.7 MB\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "X = X.astype(\"int16\")\n", | |
| "X.info()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 81, | |
| "id": "ad1e952b", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "count 70000.000000\n", | |
| "mean 13.230286\n", | |
| "std 50.548067\n", | |
| "min 0.000000\n", | |
| "25% 0.000000\n", | |
| "50% 0.000000\n", | |
| "75% 0.000000\n", | |
| "max 255.000000\n", | |
| "Name: pixel100, dtype: float64" | |
| ] | |
| }, | |
| "execution_count": 81, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "X.pixel100.describe()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 82, | |
| "id": "a0016645", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "count 70000.000000\n", | |
| "mean 13.230286\n", | |
| "std 50.548067\n", | |
| "min 0.000000\n", | |
| "25% 0.000000\n", | |
| "50% 0.000000\n", | |
| "75% 0.000000\n", | |
| "max 255.000000\n", | |
| "Name: pixel100, dtype: float64" | |
| ] | |
| }, | |
| "execution_count": 82, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "X.pixel100.describe()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 83, | |
| "id": "5ea126bc", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "Text(0.5, 1.0, 'Id: 18837, Label: 0')" | |
| ] | |
| }, | |
| "execution_count": 83, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "import matplotlib.pyplot as plt\n", | |
| "\n", | |
| "id = X.sample(1).index[0]\n", | |
| "plt.imshow(X.iloc[id].values.reshape(28, 28), cmap='gray')\n", | |
| "plt.title(f'Id: {id}, Label: {y[id]}')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 84, | |
| "id": "58ba3512", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "y = y.astype(\"int16\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "7d25ace7", | |
| "metadata": {}, | |
| "source": [ | |
| "## 1.3. Train test split" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 85, | |
| "id": "18929619", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "(69000, 784)\n", | |
| "(1000, 784)\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "from sklearn.model_selection import train_test_split\n", | |
| "\n", | |
| "X_train, X_test, y_train, y_test = train_test_split(X.values, y.values, test_size=1000, random_state=42, shuffle=True)\n", | |
| "print(X_train.shape)\n", | |
| "print(X_test.shape)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "180bf32b", | |
| "metadata": {}, | |
| "source": [ | |
| "## 1.4. Scaling" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "af330d6f", | |
| "metadata": {}, | |
| "source": [ | |
| "A escala dos valores de entrada para a rede é bastante importante para que não haja nenhum problema no treinamento. \n", | |
| "Aqui poderíamos aplicar o standard scaler, mas como sabemos o intervalo de valores que os pixels podem assumir, \n", | |
| "vamos fazer um simples min max." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 86, | |
| "id": "040c3575", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import numpy as np" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 87, | |
| "id": "99be654f", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(69000, 784)" | |
| ] | |
| }, | |
| "execution_count": 87, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "X_train.shape" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 88, | |
| "id": "ea8b393d", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(784,)" | |
| ] | |
| }, | |
| "execution_count": 88, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# Standard Scaler\n", | |
| "# Calculando média e desvio padrão no conjunto de treino\n", | |
| "means = X_train.mean(axis=0)\n", | |
| "stds = X_train.std(axis=0)\n", | |
| "stds.shape" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 89, | |
| "id": "7967eb25", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Min max scaler\n", | |
| "subtract = [0.0] * X_train.shape[1]\n", | |
| "divide = [255.0] * X_train.shape[1]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 90, | |
| "id": "e144fa81", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def apply_scaling(X_train, subtract, divide):\n", | |
| " cols_scaled = []\n", | |
| " for i in range(X_train.shape[1]):\n", | |
| " col = X_train[:, i]\n", | |
| " if divide[i] == 0:\n", | |
| " # print(f\"Col {i}: Std == 0\")\n", | |
| " col_scaled = col\n", | |
| " else:\n", | |
| " # print(f\"Col {i}: Std != 0\")\n", | |
| " col_scaled = (col - subtract[i]) / divide[i]\n", | |
| " col_scaled = col_scaled.reshape(-1, 1)\n", | |
| " # print(col_scaled.shape)\n", | |
| " cols_scaled.append(col_scaled)\n", | |
| " X_train_scaled = np.hstack(cols_scaled)\n", | |
| " print(X_train_scaled.shape)\n", | |
| " return X_train_scaled" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 91, | |
| "id": "3e2a5ec1", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "(69000, 784)\n", | |
| "(1000, 784)\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# Min max scaler\n", | |
| "X_train_scaled = apply_scaling(X_train, [0.0] * X_train.shape[1], [255.0] * X_train.shape[1])\n", | |
| "X_test_scaled = apply_scaling(X_test, [0.0] * X_test.shape[1], [255.0] * X_test.shape[1])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 92, | |
| "id": "2077e5e7", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>0</th>\n", | |
| " <th>1</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>count</th>\n", | |
| " <td>69000.0000</td>\n", | |
| " <td>69000.0000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>mean</th>\n", | |
| " <td>12.9836</td>\n", | |
| " <td>11.5725</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>std</th>\n", | |
| " <td>49.7809</td>\n", | |
| " <td>47.1865</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>min</th>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>25%</th>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>50%</th>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>75%</th>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>max</th>\n", | |
| " <td>255.0000</td>\n", | |
| " <td>255.0000</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " 0 1\n", | |
| "count 69000.0000 69000.0000\n", | |
| "mean 12.9836 11.5725\n", | |
| "std 49.7809 47.1865\n", | |
| "min 0.0000 0.0000\n", | |
| "25% 0.0000 0.0000\n", | |
| "50% 0.0000 0.0000\n", | |
| "75% 0.0000 0.0000\n", | |
| "max 255.0000 255.0000" | |
| ] | |
| }, | |
| "execution_count": 92, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "pd.DataFrame(X_train[:, 100:102]).describe().round(4)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 93, | |
| "id": "9823c865", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>0</th>\n", | |
| " <th>1</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>count</th>\n", | |
| " <td>69000.0000</td>\n", | |
| " <td>69000.0000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>mean</th>\n", | |
| " <td>0.0509</td>\n", | |
| " <td>0.0454</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>std</th>\n", | |
| " <td>0.1952</td>\n", | |
| " <td>0.1850</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>min</th>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>25%</th>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>50%</th>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>75%</th>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>max</th>\n", | |
| " <td>1.0000</td>\n", | |
| " <td>1.0000</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " 0 1\n", | |
| "count 69000.0000 69000.0000\n", | |
| "mean 0.0509 0.0454\n", | |
| "std 0.1952 0.1850\n", | |
| "min 0.0000 0.0000\n", | |
| "25% 0.0000 0.0000\n", | |
| "50% 0.0000 0.0000\n", | |
| "75% 0.0000 0.0000\n", | |
| "max 1.0000 1.0000" | |
| ] | |
| }, | |
| "execution_count": 93, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "pd.DataFrame(X_train_scaled[:, 100:102]).describe().round(4)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "8e4d8bce", | |
| "metadata": {}, | |
| "source": [ | |
| "# 2. PyTorch" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "8e029ad3", | |
| "metadata": {}, | |
| "source": [ | |
| "Refazendo a rede usando a api de alto nível do pytorch" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "48d6dacd", | |
| "metadata": {}, | |
| "source": [ | |
| "## 2.1. Dados e Wrappers" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 171, | |
| "id": "ebe1b118", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Device: cpu\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "import torch\n", | |
| "\n", | |
| "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", | |
| "print('Device:', device)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 172, | |
| "id": "c1544ef3", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "(69000, 784)\n", | |
| "(1000, 784)\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print(X_train_scaled.shape)\n", | |
| "print(X_test_scaled.shape)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 173, | |
| "id": "6e9b8897", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "from torch.utils.data import TensorDataset, DataLoader\n", | |
| "\n", | |
| "# Conversão para tensores\n", | |
| "X_train_t = torch.tensor(X_train_scaled, dtype=torch.float32, device=device)\n", | |
| "X_test_t = torch.tensor(X_test_scaled, dtype=torch.float32, device=device)\n", | |
| "y_train_t = torch.tensor(y_train, dtype=torch.long, device=device)\n", | |
| "y_test_t = torch.tensor(y_test, dtype=torch.long, device=device)\n", | |
| "\n", | |
| "# Criando dataset wrappers\n", | |
| "train_dataset = TensorDataset(X_train_t, y_train_t)\n", | |
| "test_dataset = TensorDataset(X_test_t, y_test_t)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "f3ef4761", | |
| "metadata": {}, | |
| "source": [ | |
| "* Algoritmos de descida de gradiente por número de amostras antes da atualização dos parâmetros treináveis\n", | |
| " * Gradient Descent (GD): dataset inteiro N\n", | |
| " * Mini Batch GD ou Batch GD: tamanho de amostra entre 1 e N, como 10, 256, 512, etc\n", | |
| " * Stochastic GD ou SGD: uma única amostra n=1" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 174, | |
| "id": "31c87dd4", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "train_loader batches: 1 test_loader batches: 1\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# GD sem mini batch -> batch size = número total de amostras\n", | |
| "batch_size = X_train_t.shape[0]\n", | |
| "\n", | |
| "# Dataloader wrappers\n", | |
| "train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n", | |
| "test_loader = DataLoader(test_dataset, batch_size=len(test_dataset), shuffle=False)\n", | |
| "\n", | |
| "print('train_loader batches:', len(train_loader), 'test_loader batches:', len(test_loader))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "a09782ba", | |
| "metadata": {}, | |
| "source": [ | |
| "## 2.2. Modelo Simples" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 175, | |
| "id": "43dc510f", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "SimpleNN(\n", | |
| " (fc1): Linear(in_features=784, out_features=12, bias=True)\n", | |
| " (fc2): Linear(in_features=12, out_features=10, bias=True)\n", | |
| ")\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "import torch.nn as nn\n", | |
| "import torch.nn.functional as F\n", | |
| "import torch.optim as optim\n", | |
| "\n", | |
| "class SimpleNN(nn.Module):\n", | |
| " def __init__(self, input_dim=784, hidden_dim=12, output_dim=10):\n", | |
| " super(SimpleNN, self).__init__()\n", | |
| " self.fc1 = nn.Linear(input_dim, hidden_dim)\n", | |
| " self.fc2 = nn.Linear(hidden_dim, output_dim)\n", | |
| "\n", | |
| " def forward(self, x):\n", | |
| " x = self.fc1(x)\n", | |
| " x = F.relu(x)\n", | |
| " x = self.fc2(x)\n", | |
| " return x\n", | |
| "\n", | |
| "model = SimpleNN(input_dim=784, hidden_dim=12, output_dim=10).to(device)\n", | |
| "print(model)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 176, | |
| "id": "07ffa410", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Linear(in_features=784, out_features=12, bias=True)\n", | |
| "torch.Size([12, 784])\n", | |
| "Parameter containing:\n", | |
| "tensor([[ 0.0218, 0.0055, 0.0046, ..., -0.0024, -0.0062, 0.0098],\n", | |
| " [ 0.0177, 0.0004, 0.0042, ..., -0.0292, -0.0033, 0.0347],\n", | |
| " [-0.0109, 0.0324, -0.0113, ..., 0.0204, -0.0178, 0.0137],\n", | |
| " ...,\n", | |
| " [-0.0049, -0.0059, 0.0151, ..., -0.0153, 0.0188, 0.0138],\n", | |
| " [ 0.0315, -0.0183, 0.0269, ..., 0.0301, 0.0191, -0.0029],\n", | |
| " [ 0.0237, 0.0179, -0.0280, ..., 0.0192, -0.0192, -0.0244]],\n", | |
| " requires_grad=True)\n", | |
| "Parameter containing:\n", | |
| "tensor([ 0.0089, -0.0052, -0.0091, 0.0320, -0.0022, 0.0246, -0.0320, 0.0167,\n", | |
| " -0.0320, 0.0131, 0.0164, -0.0187], requires_grad=True)\n", | |
| "model.fc1.weight.mean().item()=3.234109499317128e-06\n", | |
| "model.fc1.weight.std().item()=0.02066139131784439\n", | |
| "model.fc1.bias.mean().item()=0.0010457849130034447\n", | |
| "model.fc1.bias.std().item()=0.021178442984819412\n", | |
| "model.fc2.weight.mean().item()=-0.014864904806017876\n", | |
| "model.fc2.weight.std().item()=0.17274221777915955\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print(model.fc1)\n", | |
| "print(model.fc1.weight.shape)\n", | |
| "print(model.fc1.weight)\n", | |
| "print(model.fc1.bias)\n", | |
| "print(f\"{model.fc1.weight.mean().item()=}\")\n", | |
| "print(f\"{model.fc1.weight.std().item()=}\")\n", | |
| "print(f\"{model.fc1.bias.mean().item()=}\")\n", | |
| "print(f\"{model.fc1.bias.std().item()=}\")\n", | |
| "print(f\"{model.fc2.weight.mean().item()=}\")\n", | |
| "print(f\"{model.fc2.weight.std().item()=}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 177, | |
| "id": "d299e53f", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "model.fc1.weight.grad=None\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print(f\"{model.fc1.weight.grad=}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 178, | |
| "id": "4f256471", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Definindo tensor de pesos...\n", | |
| "w=tensor([2., 3.], requires_grad=True) w.grad=None\n", | |
| "Calculando loss...\n", | |
| "loss=tensor(13., grad_fn=<SumBackward0>)\n", | |
| "w=tensor([2., 3.], requires_grad=True) w.grad=None\n", | |
| "Backward...\n", | |
| "w=tensor([2., 3.], requires_grad=True) w.grad=tensor([4., 6.])\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "True" | |
| ] | |
| }, | |
| "execution_count": 178, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# Onde ficam guardados os gradientes dos pesos?\n", | |
| "print(\"Definindo tensor de pesos...\")\n", | |
| "w = torch.tensor([2.0, 3.0], requires_grad=True)\n", | |
| "print(f\"{w=} {w.grad=}\")\n", | |
| "print(\"Calculando loss...\")\n", | |
| "loss = (w**2).sum()\n", | |
| "print(f\"{loss=}\")\n", | |
| "print(f\"{w=} {w.grad=}\")\n", | |
| "print(\"Backward...\")\n", | |
| "loss.backward()\n", | |
| "print(f\"{w=} {w.grad=}\")\n", | |
| "\n", | |
| "# De fato,\n", | |
| "w.grad.equal((2 * (w ** (2-1))))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 179, | |
| "id": "f1e98dbc", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Antes:\n", | |
| "w=tensor([2., 3.], requires_grad=True) w.grad=tensor([4., 6.])\n", | |
| "Atualizando pesos...\n", | |
| "Depois:\n", | |
| "w=tensor([1.6000, 2.4000], requires_grad=True) w.grad=tensor([4., 6.])\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# Atualização dos pesos\n", | |
| "optimizer = optim.SGD([w], lr=0.1)\n", | |
| "print(\"Antes:\")\n", | |
| "print(f\"{w=} {w.grad=}\")\n", | |
| "print(\"Atualizando pesos...\")\n", | |
| "optimizer.step()\n", | |
| "print(\"Depois:\")\n", | |
| "print(f\"{w=} {w.grad=}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 180, | |
| "id": "9241a003", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "[tensor([1.6000, 2.4000], requires_grad=True)]" | |
| ] | |
| }, | |
| "execution_count": 180, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "optimizer.param_groups[0][\"params\"]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 181, | |
| "id": "8a15c4a4", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Inicialização customizada - exemplos\n", | |
| "def init_weights_normal(m, std=0.5, mean=0):\n", | |
| " if isinstance(m, nn.Linear):\n", | |
| " nn.init.normal_(m.weight, mean=mean, std=std)\n", | |
| " nn.init.normal_(m.bias, mean=mean, std=std)\n", | |
| "\n", | |
| "def init_weights_xavier(m):\n", | |
| " if isinstance(m, nn.Linear):\n", | |
| " nn.init.xavier_normal_(m.weight)\n", | |
| " nn.init.normal_(m.bias)\n", | |
| "\n", | |
| "# model.apply(init_weights_xavier)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "d4228612", | |
| "metadata": {}, | |
| "source": [ | |
| "## 2.3. Loop de treinamento" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 182, | |
| "id": "160f8890", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Training loop\n", | |
| "\n", | |
| "def torch_training_loop(model, optimizer, train_loader, test_loader=test_loader, n_epochs=100, verbose=10):\n", | |
| " criterion = nn.CrossEntropyLoss()\n", | |
| "\n", | |
| " for epoch in range(n_epochs):\n", | |
| " model.train()\n", | |
| " running_loss = 0.0\n", | |
| " running_corrects = 0\n", | |
| " total = 0\n", | |
| "\n", | |
| " for X_batch, y_batch in train_loader:\n", | |
| " optimizer.zero_grad() # Zera os gradientes de cada tensor do modelo\n", | |
| " outputs = model(X_batch) # Forward pass\n", | |
| " loss = criterion(outputs, y_batch) # Cálculo da loss\n", | |
| " loss.backward() # Cálculo das derivadas - backward pass\n", | |
| " optimizer.step() # Atualização dos pesos do modelo: w = w - lr * d_w\n", | |
| "\n", | |
| " running_loss += loss.item() * X_batch.size(0)\n", | |
| " _, preds = torch.max(outputs, 1)\n", | |
| " running_corrects += torch.sum(preds == y_batch).item()\n", | |
| " total += X_batch.size(0)\n", | |
| "\n", | |
| " epoch_loss = running_loss / total\n", | |
| " epoch_acc = running_corrects / total\n", | |
| "\n", | |
| " model.eval()\n", | |
| " test_loss = 0.0\n", | |
| " test_corrects = 0\n", | |
| " test_total = 0\n", | |
| " with torch.no_grad(): # Deixa de calcular os gradientes\n", | |
| " for X_batch, y_batch in test_loader:\n", | |
| " outputs = model(X_batch)\n", | |
| " loss = criterion(outputs, y_batch)\n", | |
| " test_loss += loss.item() * X_batch.size(0)\n", | |
| " _, preds = torch.max(outputs, 1)\n", | |
| " test_corrects += torch.sum(preds == y_batch).item()\n", | |
| " test_total += X_batch.size(0)\n", | |
| "\n", | |
| " test_loss = test_loss / test_total\n", | |
| " test_acc = test_corrects / test_total\n", | |
| "\n", | |
| " if epoch % verbose == 0 or epoch == n_epochs-1:\n", | |
| " print(f'Epoch {epoch:>2}/{n_epochs} - train_loss: {epoch_loss:.4f} train_acc: {epoch_acc:.4f} - test_loss: {test_loss:.4f} test_acc: {test_acc:.4f}')\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 183, | |
| "id": "a0365693", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Epoch 0/2 - train_loss: 2.3125 train_acc: 0.1045 - test_loss: 2.3082 test_acc: 0.1090\n", | |
| "Epoch 1/2 - train_loss: 2.2984 train_acc: 0.1188 - test_loss: 2.2950 test_acc: 0.1230\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "optimizer = optim.SGD(model.parameters(), lr=0.1)\n", | |
| "torch_training_loop(model, optimizer, train_loader=train_loader, n_epochs=2, verbose=10)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 184, | |
| "id": "5ddc5552", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Training loop\n", | |
| "\n", | |
| "def torch_training_loop(model, optimizer, train_loader, test_loader=test_loader, n_epochs=100, verbose=10, show_tensors=False):\n", | |
| " criterion = nn.CrossEntropyLoss()\n", | |
| "\n", | |
| " weights_stats = []\n", | |
| " for epoch in range(n_epochs):\n", | |
| " model.train()\n", | |
| " running_loss = 0.0\n", | |
| " running_corrects = 0\n", | |
| " total = 0\n", | |
| "\n", | |
| " for X_batch, y_batch in train_loader:\n", | |
| " optimizer.zero_grad() # Zera os gradientes de cada tensor do modelo\n", | |
| " outputs = model(X_batch) # Forward pass\n", | |
| " loss = criterion(outputs, y_batch) # Cálculo da loss\n", | |
| " loss.backward() # Cálculo das derivadas - backward pass\n", | |
| " optimizer.step() # Atualização dos pesos do modelo: w = w - lr * d_w\n", | |
| "\n", | |
| " running_loss += loss.item() * X_batch.size(0)\n", | |
| " _, preds = torch.max(outputs, 1)\n", | |
| " running_corrects += torch.sum(preds == y_batch).item()\n", | |
| " total += X_batch.size(0)\n", | |
| "\n", | |
| " model.eval()\n", | |
| " # Cálculo de estatísticas sobre os pesos\n", | |
| " stats = {}\n", | |
| " for n, p in model.named_parameters():\n", | |
| " stats[f\"{n}.avg\"] = p.mean().item()\n", | |
| " stats[f\"{n}.std\"] = p.std().item()\n", | |
| " stats[f\"{n}.grad.avg\"] = p.grad.mean().item()\n", | |
| " stats[f\"{n}.grad.std\"] = p.grad.std().item()\n", | |
| " with torch.no_grad():\n", | |
| " fc1_outputs = model.fc1(X_batch)\n", | |
| " stats[f\"fc1_outputs.avg\"] = fc1_outputs.mean().item()\n", | |
| " stats[f\"fc1_outputs.std\"] = fc1_outputs.std().item()\n", | |
| " stats[f\"fc2_outputs.avg\"] = outputs.mean().item()\n", | |
| " stats[f\"fc2_outputs.std\"] = outputs.std().item()\n", | |
| " if any([\"bn1\" in k for k in stats]):\n", | |
| " bn1_outputs = model.bn1(fc1_outputs)\n", | |
| " stats[f\"bn1_outputs.avg\"] = bn1_outputs.mean().item()\n", | |
| " stats[f\"bn1_outputs.std\"] = bn1_outputs.std().item()\n", | |
| " stats[f\"bn1_running_mean.avg\"] = model.bn1.running_mean.mean().item()\n", | |
| " stats[f\"bn1_running_var.avg\"] = model.bn1.running_var.mean().item()\n", | |
| " stats[f\"bn1_running_mean\"] = model.bn1.running_mean.numpy()\n", | |
| " stats[f\"bn1_running_var\"] = model.bn1.running_var.numpy()\n", | |
| " weights_stats.append(stats)\n", | |
| "\n", | |
| " # Prints maneiros\n", | |
| " if show_tensors and (epoch % verbose == 0 or epoch == n_epochs-1):\n", | |
| " print(\"Visualizando tensores:\")\n", | |
| " print(f\"{model.fc1.weight=}\")\n", | |
| " print(f\"{model.fc1.weight.mean()=}\")\n", | |
| " print(f\"{model.fc1.weight.grad=}\")\n", | |
| " print(f\"{model.fc1.weight.grad.mean()=}\")\n", | |
| " print(f\"{model.fc2.weight=}\")\n", | |
| " print(f\"{model.fc2.weight.mean()=}\")\n", | |
| " print(f\"{model.fc2.weight.grad=}\")\n", | |
| " print(f\"{model.fc2.weight.grad.mean()=}\")\n", | |
| " print(f\"{X_batch.shape=}\")\n", | |
| " print(f\"{outputs.shape=} {outputs=}\")\n", | |
| " print(f\"{loss=}\")\n", | |
| " print(f\"{preds.shape=} {preds=}\")\n", | |
| "\n", | |
| " epoch_loss = running_loss / total\n", | |
| " epoch_acc = running_corrects / total\n", | |
| "\n", | |
| " model.eval()\n", | |
| " test_loss = 0.0\n", | |
| " test_corrects = 0\n", | |
| " test_total = 0\n", | |
| " with torch.no_grad(): # Deixa de calcular os gradientes\n", | |
| " for X_batch, y_batch in test_loader:\n", | |
| " outputs = model(X_batch)\n", | |
| " loss = criterion(outputs, y_batch)\n", | |
| " test_loss += loss.item() * X_batch.size(0)\n", | |
| " _, preds = torch.max(outputs, 1)\n", | |
| " test_corrects += torch.sum(preds == y_batch).item()\n", | |
| " test_total += X_batch.size(0)\n", | |
| "\n", | |
| " test_loss = test_loss / test_total\n", | |
| " test_acc = test_corrects / test_total\n", | |
| "\n", | |
| " if epoch % verbose == 0 or epoch == n_epochs-1:\n", | |
| " print(f'Epoch {epoch:>2}/{n_epochs} - train_loss: {epoch_loss:.4f} train_acc: {epoch_acc:.4f} - test_loss: {test_loss:.4f} test_acc: {test_acc:.4f}')\n", | |
| " return weights_stats" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 185, | |
| "id": "a179fe70", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Visualizando tensores:\n", | |
| "model.fc1.weight=Parameter containing:\n", | |
| "tensor([[ 0.0218, 0.0055, 0.0046, ..., -0.0024, -0.0062, 0.0098],\n", | |
| " [ 0.0177, 0.0004, 0.0042, ..., -0.0292, -0.0033, 0.0347],\n", | |
| " [-0.0109, 0.0324, -0.0113, ..., 0.0204, -0.0178, 0.0137],\n", | |
| " ...,\n", | |
| " [-0.0049, -0.0059, 0.0151, ..., -0.0153, 0.0188, 0.0138],\n", | |
| " [ 0.0315, -0.0183, 0.0269, ..., 0.0301, 0.0191, -0.0029],\n", | |
| " [ 0.0237, 0.0179, -0.0280, ..., 0.0192, -0.0192, -0.0244]],\n", | |
| " requires_grad=True)\n", | |
| "model.fc1.weight.mean()=tensor(5.7077e-05, grad_fn=<MeanBackward0>)\n", | |
| "model.fc1.weight.grad=tensor([[0., 0., 0., ..., 0., 0., 0.],\n", | |
| " [0., 0., 0., ..., 0., 0., 0.],\n", | |
| " [0., 0., 0., ..., 0., 0., 0.],\n", | |
| " ...,\n", | |
| " [0., 0., 0., ..., 0., 0., 0.],\n", | |
| " [0., 0., 0., ..., 0., 0., 0.],\n", | |
| " [0., 0., 0., ..., 0., 0., 0.]])\n", | |
| "model.fc1.weight.grad.mean()=tensor(-0.0005)\n", | |
| "model.fc2.weight=Parameter containing:\n", | |
| "tensor([[-0.1177, -0.2244, 0.2051, 0.0045, -0.0976, 0.0181, -0.1808, -0.1764,\n", | |
| " 0.1509, -0.0141, 0.0619, -0.1922],\n", | |
| " [-0.2573, -0.0597, -0.1699, -0.0267, 0.2200, 0.2828, 0.0615, 0.0298,\n", | |
| " -0.2243, -0.1041, 0.1928, -0.1064],\n", | |
| " [-0.2564, 0.0535, -0.2320, -0.0920, 0.0337, 0.1651, -0.0291, 0.0820,\n", | |
| " -0.0093, -0.1208, 0.1126, 0.0433],\n", | |
| " [-0.0829, 0.2763, -0.2831, 0.1987, -0.0898, 0.0610, 0.0984, -0.2759,\n", | |
| " -0.1954, -0.0276, 0.0391, 0.1913],\n", | |
| " [-0.0562, 0.1154, -0.0826, 0.1137, -0.0138, -0.0975, 0.1569, 0.0555,\n", | |
| " 0.2800, 0.0305, -0.2100, 0.2654],\n", | |
| " [-0.1136, -0.1091, -0.2371, 0.2773, 0.0576, 0.2743, 0.0205, -0.2016,\n", | |
| " 0.2860, -0.1641, -0.0080, 0.0828],\n", | |
| " [ 0.1328, 0.1561, 0.2861, 0.0952, -0.2480, -0.2054, -0.2045, -0.2675,\n", | |
| " -0.0847, -0.1224, 0.1117, 0.1465],\n", | |
| " [ 0.0072, -0.0420, -0.1841, 0.2329, -0.2145, -0.2879, -0.2874, -0.2825,\n", | |
| " -0.2099, 0.1631, -0.0655, 0.1483],\n", | |
| " [ 0.2701, 0.0866, -0.0478, 0.1661, -0.1463, -0.1074, 0.1160, 0.2098,\n", | |
| " 0.2792, 0.1551, -0.0138, 0.2766],\n", | |
| " [-0.2819, 0.1351, -0.2857, -0.2798, 0.0427, 0.0518, -0.2498, -0.2252,\n", | |
| " 0.1684, -0.1937, -0.1788, -0.1631]], requires_grad=True)\n", | |
| "model.fc2.weight.mean()=tensor(-0.0149, grad_fn=<MeanBackward0>)\n", | |
| "model.fc2.weight.grad=tensor([[ 4.9673e-04, -1.8180e-03, 3.6991e-04, -1.5800e-03, 1.7811e-03,\n", | |
| " -4.9585e-03, 3.1083e-04, 1.2047e-03, -1.2745e-02, -2.2495e-04,\n", | |
| " -1.0676e-02, 1.2698e-03],\n", | |
| " [ 8.5994e-03, -1.4780e-03, -1.4939e-03, 1.6744e-04, -1.1387e-02,\n", | |
| " 2.1379e-03, 1.8675e-03, -5.7702e-03, 5.2781e-03, 7.2278e-04,\n", | |
| " -4.1111e-03, 4.2963e-03],\n", | |
| " [ 8.1063e-03, 1.3226e-03, 1.7047e-05, -1.3422e-03, 9.3801e-04,\n", | |
| " -6.5178e-03, -4.2531e-03, -4.1815e-03, 2.6257e-04, -8.8101e-05,\n", | |
| " -6.2163e-03, -2.3026e-03],\n", | |
| " [ 4.3851e-03, -1.3693e-03, 3.0464e-04, 1.8954e-03, 1.8692e-04,\n", | |
| " -1.1667e-02, 1.0840e-03, 4.6629e-03, 3.8933e-03, -1.7013e-03,\n", | |
| " -7.2514e-03, -5.3867e-04],\n", | |
| " [-7.9242e-03, 5.4516e-03, -4.0253e-05, 3.2025e-03, 2.6299e-03,\n", | |
| " 8.3343e-03, 5.6008e-04, 3.6287e-03, 4.5839e-04, 8.8532e-04,\n", | |
| " 1.5316e-02, 4.2488e-03],\n", | |
| " [ 2.9545e-03, 1.8750e-03, 2.0888e-04, -2.0244e-03, 1.4317e-03,\n", | |
| " 2.5062e-03, 1.3898e-03, 6.8133e-03, -5.6424e-04, -3.2918e-04,\n", | |
| " 3.1958e-03, 2.3358e-03],\n", | |
| " [-6.2942e-03, -7.2521e-03, 3.4986e-04, -1.3437e-05, 1.4289e-03,\n", | |
| " 6.5359e-03, -1.9557e-03, -2.6301e-04, -3.6691e-03, -6.3767e-04,\n", | |
| " -1.4748e-02, -1.6549e-02],\n", | |
| " [ 1.5749e-03, 6.8418e-04, -1.2844e-04, 3.5398e-03, 1.9559e-03,\n", | |
| " 1.9940e-03, 2.5486e-03, -4.5848e-03, 1.9319e-03, 3.5359e-04,\n", | |
| " 1.8275e-02, 1.9634e-03],\n", | |
| " [-1.8273e-03, 4.9149e-03, 2.3843e-04, -4.7105e-03, -4.0731e-04,\n", | |
| " 1.6937e-03, -1.9183e-03, 4.2465e-03, 4.3198e-03, 8.2570e-04,\n", | |
| " 9.0721e-04, 2.0526e-03],\n", | |
| " [-1.0071e-02, -2.3309e-03, 1.7384e-04, 8.6545e-04, 1.4421e-03,\n", | |
| " -5.8892e-05, 3.6613e-04, -5.7567e-03, 8.3431e-04, 1.9382e-04,\n", | |
| " 5.3091e-03, 3.2234e-03]])\n", | |
| "model.fc2.weight.grad.mean()=tensor(1.3970e-10)\n", | |
| "X_batch.shape=torch.Size([69000, 784])\n", | |
| "outputs.shape=torch.Size([69000, 10]) outputs=tensor([[-0.1499, -0.1819, 0.0369, ..., 0.0536, 0.0393, -0.3632],\n", | |
| " [-0.2251, -0.1369, 0.0914, ..., -0.0521, 0.0485, -0.3474],\n", | |
| " [-0.2452, -0.1388, 0.1076, ..., 0.1096, 0.0340, -0.3241],\n", | |
| " ...,\n", | |
| " [-0.2029, 0.0099, 0.1887, ..., -0.1145, -0.0334, -0.3400],\n", | |
| " [-0.2125, -0.2541, 0.0108, ..., 0.0125, 0.1419, -0.3981],\n", | |
| " [-0.2005, -0.1711, 0.0403, ..., 0.0684, 0.0135, -0.3556]],\n", | |
| " grad_fn=<AddmmBackward0>)\n", | |
| "loss=tensor(2.2851, grad_fn=<NllLossBackward0>)\n", | |
| "preds.shape=torch.Size([69000]) preds=tensor([4, 4, 4, ..., 2, 4, 4])\n", | |
| "Epoch 0/10 - train_loss: 2.2851 train_acc: 0.1335 - test_loss: 2.2809 test_acc: 0.1340\n", | |
| "Visualizando tensores:\n", | |
| "model.fc1.weight=Parameter containing:\n", | |
| "tensor([[ 0.0218, 0.0055, 0.0046, ..., -0.0024, -0.0062, 0.0098],\n", | |
| " [ 0.0177, 0.0004, 0.0042, ..., -0.0292, -0.0033, 0.0347],\n", | |
| " [-0.0109, 0.0324, -0.0113, ..., 0.0204, -0.0178, 0.0137],\n", | |
| " ...,\n", | |
| " [-0.0049, -0.0059, 0.0151, ..., -0.0153, 0.0188, 0.0138],\n", | |
| " [ 0.0315, -0.0183, 0.0269, ..., 0.0301, 0.0191, -0.0029],\n", | |
| " [ 0.0237, 0.0179, -0.0280, ..., 0.0192, -0.0192, -0.0244]],\n", | |
| " requires_grad=True)\n", | |
| "model.fc1.weight.mean()=tensor(0.0006, grad_fn=<MeanBackward0>)\n", | |
| "model.fc1.weight.grad=tensor([[0., 0., 0., ..., 0., 0., 0.],\n", | |
| " [0., 0., 0., ..., 0., 0., 0.],\n", | |
| " [0., 0., 0., ..., 0., 0., 0.],\n", | |
| " ...,\n", | |
| " [0., 0., 0., ..., 0., 0., 0.],\n", | |
| " [0., 0., 0., ..., 0., 0., 0.],\n", | |
| " [0., 0., 0., ..., 0., 0., 0.]])\n", | |
| "model.fc1.weight.grad.mean()=tensor(-0.0005)\n", | |
| "model.fc2.weight=Parameter containing:\n", | |
| "tensor([[-0.1151, -0.2275, 0.2049, 0.0058, -0.1035, 0.0267, -0.1833, -0.1831,\n", | |
| " 0.1798, -0.0140, 0.0820, -0.1974],\n", | |
| " [-0.2707, -0.0607, -0.1693, -0.0270, 0.2472, 0.2935, 0.0605, 0.0466,\n", | |
| " -0.2442, -0.1044, 0.2052, -0.1140],\n", | |
| " [-0.2674, 0.0519, -0.2320, -0.0925, 0.0310, 0.1732, -0.0243, 0.0920,\n", | |
| " -0.0170, -0.1208, 0.1244, 0.0453],\n", | |
| " [-0.0858, 0.2833, -0.2833, 0.1977, -0.0887, 0.0851, 0.0990, -0.2797,\n", | |
| " -0.2022, -0.0267, 0.0544, 0.1952],\n", | |
| " [-0.0530, 0.1068, -0.0826, 0.1112, -0.0216, -0.1201, 0.1556, 0.0483,\n", | |
| " 0.2816, 0.0300, -0.2428, 0.2619],\n", | |
| " [-0.1158, -0.1139, -0.2372, 0.2798, 0.0524, 0.2721, 0.0187, -0.2109,\n", | |
| " 0.2896, -0.1639, -0.0152, 0.0783],\n", | |
| " [ 0.1452, 0.1689, 0.2860, 0.0946, -0.2514, -0.2148, -0.2050, -0.2685,\n", | |
| " -0.0805, -0.1223, 0.1328, 0.1662],\n", | |
| " [ 0.0054, -0.0439, -0.1840, 0.2314, -0.2179, -0.2997, -0.2907, -0.2844,\n", | |
| " -0.2165, 0.1633, -0.0891, 0.1459],\n", | |
| " [ 0.2734, 0.0797, -0.0480, 0.1697, -0.1429, -0.1062, 0.1214, 0.2115,\n", | |
| " 0.2732, 0.1546, -0.0167, 0.2761],\n", | |
| " [-0.2723, 0.1431, -0.2858, -0.2808, 0.0393, 0.0452, -0.2500, -0.2239,\n", | |
| " 0.1771, -0.1937, -0.1934, -0.1650]], requires_grad=True)\n", | |
| "model.fc2.weight.mean()=tensor(-0.0149, grad_fn=<MeanBackward0>)\n", | |
| "model.fc2.weight.grad=tensor([[-5.2655e-03, 9.0768e-03, 1.0550e-04, -1.6734e-03, 9.7278e-03,\n", | |
| " -1.3519e-02, 5.0277e-03, 1.1732e-02, -4.5484e-02, -9.4241e-05,\n", | |
| " -3.3570e-02, 9.3060e-03],\n", | |
| " [ 1.8769e-02, 4.5739e-03, -4.0258e-04, 8.9902e-04, -4.2354e-02,\n", | |
| " -2.0920e-02, 3.4901e-04, -2.6675e-02, 3.3224e-02, 3.7284e-04,\n", | |
| " -1.8259e-02, 1.1725e-02],\n", | |
| " [ 1.5232e-02, 2.7434e-03, 2.7571e-05, 1.7368e-03, 5.0264e-03,\n", | |
| " -8.2460e-03, -5.9189e-03, -1.5195e-02, 1.5748e-02, 5.1407e-05,\n", | |
| " -1.6937e-02, -1.2324e-03],\n", | |
| " [ 3.2460e-03, -1.4954e-02, 9.8682e-05, 1.0233e-03, -1.5840e-03,\n", | |
| " -3.7169e-02, -3.5964e-03, 4.5744e-03, 1.0751e-02, -6.9742e-04,\n", | |
| " -2.3679e-02, -7.5770e-03],\n", | |
| " [-1.1832e-03, 1.2566e-02, -7.1721e-05, 3.1607e-03, 1.2012e-02,\n", | |
| " 3.6455e-02, 2.9790e-03, 1.1388e-02, -3.8903e-03, 4.1802e-04,\n", | |
| " 5.1818e-02, 2.8027e-03],\n", | |
| " [ 1.7896e-03, 8.8645e-03, 4.8098e-05, -3.5978e-03, 8.8871e-03,\n", | |
| " 2.0455e-03, 2.5904e-03, 1.3860e-02, -5.8695e-03, -4.2863e-05,\n", | |
| " 1.1901e-02, 6.4256e-03],\n", | |
| " [-1.9098e-02, -1.8911e-02, 9.6191e-05, 9.3873e-04, 5.1333e-03,\n", | |
| " 1.3705e-02, 2.9214e-03, 2.4034e-03, -5.0452e-03, 3.2260e-05,\n", | |
| " -3.0977e-02, -2.4072e-02],\n", | |
| " [ 1.3211e-03, 2.2611e-03, -6.8122e-05, 6.4617e-04, 3.5046e-03,\n", | |
| " 1.8065e-02, 5.1625e-03, 4.2992e-03, 9.9646e-03, -6.0454e-04,\n", | |
| " 3.0100e-02, 2.3745e-03],\n", | |
| " [-4.1489e-03, 9.8104e-03, 1.1283e-04, -4.1282e-03, -4.9422e-03,\n", | |
| " -2.4977e-03, -9.8589e-03, -7.0456e-03, 8.2684e-03, 5.1598e-04,\n", | |
| " 6.3359e-03, -1.6382e-04],\n", | |
| " [-1.0662e-02, -1.6030e-02, 5.3548e-05, 9.9474e-04, 4.5891e-03,\n", | |
| " 1.2082e-02, 3.4418e-04, 6.5761e-04, -1.7667e-02, 4.8556e-05,\n", | |
| " 2.3267e-02, 4.1122e-04]])\n", | |
| "model.fc2.weight.grad.mean()=tensor(7.7610e-11)\n", | |
| "X_batch.shape=torch.Size([69000, 784])\n", | |
| "outputs.shape=torch.Size([69000, 10]) outputs=tensor([[-0.3177, 0.0501, 0.2413, ..., -0.0895, 0.0665, -0.3961],\n", | |
| " [-0.4029, 0.2739, 0.3711, ..., -0.4092, 0.0153, -0.3815],\n", | |
| " [-0.3167, 0.4704, 0.3783, ..., -0.5436, -0.1445, -0.4391],\n", | |
| " ...,\n", | |
| " [-0.2794, -0.1867, 0.1182, ..., -0.0140, 0.1039, -0.2204],\n", | |
| " [-0.4765, -0.3866, 0.0819, ..., -0.0519, 0.5168, -0.4301],\n", | |
| " [ 0.1206, -0.0436, 0.2394, ..., -0.4398, 0.1689, -0.1987]],\n", | |
| " grad_fn=<AddmmBackward0>)\n", | |
| "loss=tensor(2.1485, grad_fn=<NllLossBackward0>)\n", | |
| "preds.shape=torch.Size([69000]) preds=tensor([2, 2, 1, ..., 4, 8, 5])\n", | |
| "Epoch 9/10 - train_loss: 2.1485 train_acc: 0.2615 - test_loss: 2.1443 test_acc: 0.2560\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "optimizer = optim.SGD(model.parameters(), lr=0.1)\n", | |
| "weights_stats = torch_training_loop(model, optimizer, train_loader=train_loader, n_epochs=10, verbose=10, show_tensors=True)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 186, | |
| "id": "eff9ddb9", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>fc1.weight.avg</th>\n", | |
| " <th>fc1.weight.std</th>\n", | |
| " <th>fc1.weight.grad.avg</th>\n", | |
| " <th>fc1.weight.grad.std</th>\n", | |
| " <th>fc1.bias.avg</th>\n", | |
| " <th>fc1.bias.std</th>\n", | |
| " <th>fc1.bias.grad.avg</th>\n", | |
| " <th>fc1.bias.grad.std</th>\n", | |
| " <th>fc2.weight.avg</th>\n", | |
| " <th>fc2.weight.std</th>\n", | |
| " <th>fc2.weight.grad.avg</th>\n", | |
| " <th>fc2.weight.grad.std</th>\n", | |
| " <th>fc2.bias.avg</th>\n", | |
| " <th>fc2.bias.std</th>\n", | |
| " <th>fc2.bias.grad.avg</th>\n", | |
| " <th>fc2.bias.grad.std</th>\n", | |
| " <th>fc1_outputs.avg</th>\n", | |
| " <th>fc1_outputs.std</th>\n", | |
| " <th>fc2_outputs.avg</th>\n", | |
| " <th>fc2_outputs.std</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>epochs</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>0.000057</td>\n", | |
| " <td>0.020687</td>\n", | |
| " <td>-0.000515</td>\n", | |
| " <td>0.003734</td>\n", | |
| " <td>0.001477</td>\n", | |
| " <td>0.021065</td>\n", | |
| " <td>-0.004218</td>\n", | |
| " <td>0.007939</td>\n", | |
| " <td>-0.014865</td>\n", | |
| " <td>0.172887</td>\n", | |
| " <td>1.396984e-10</td>\n", | |
| " <td>0.004961</td>\n", | |
| " <td>-0.073255</td>\n", | |
| " <td>0.140303</td>\n", | |
| " <td>3.725290e-10</td>\n", | |
| " <td>0.016538</td>\n", | |
| " <td>0.015567</td>\n", | |
| " <td>0.221910</td>\n", | |
| " <td>-0.083202</td>\n", | |
| " <td>0.157321</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>0.000124</td>\n", | |
| " <td>0.020709</td>\n", | |
| " <td>-0.000670</td>\n", | |
| " <td>0.003841</td>\n", | |
| " <td>0.002039</td>\n", | |
| " <td>0.021082</td>\n", | |
| " <td>-0.005624</td>\n", | |
| " <td>0.008169</td>\n", | |
| " <td>-0.014865</td>\n", | |
| " <td>0.173064</td>\n", | |
| " <td>1.086543e-10</td>\n", | |
| " <td>0.005874</td>\n", | |
| " <td>-0.073255</td>\n", | |
| " <td>0.138974</td>\n", | |
| " <td>5.122274e-10</td>\n", | |
| " <td>0.016617</td>\n", | |
| " <td>0.035390</td>\n", | |
| " <td>0.236664</td>\n", | |
| " <td>-0.082533</td>\n", | |
| " <td>0.159184</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>0.000194</td>\n", | |
| " <td>0.020737</td>\n", | |
| " <td>-0.000700</td>\n", | |
| " <td>0.003851</td>\n", | |
| " <td>0.002629</td>\n", | |
| " <td>0.021205</td>\n", | |
| " <td>-0.005902</td>\n", | |
| " <td>0.007755</td>\n", | |
| " <td>-0.014865</td>\n", | |
| " <td>0.173305</td>\n", | |
| " <td>-3.104409e-11</td>\n", | |
| " <td>0.006955</td>\n", | |
| " <td>-0.073255</td>\n", | |
| " <td>0.137702</td>\n", | |
| " <td>-2.095476e-10</td>\n", | |
| " <td>0.017041</td>\n", | |
| " <td>0.056138</td>\n", | |
| " <td>0.252885</td>\n", | |
| " <td>-0.081137</td>\n", | |
| " <td>0.164697</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>0.000262</td>\n", | |
| " <td>0.020772</td>\n", | |
| " <td>-0.000684</td>\n", | |
| " <td>0.003830</td>\n", | |
| " <td>0.003206</td>\n", | |
| " <td>0.021399</td>\n", | |
| " <td>-0.005766</td>\n", | |
| " <td>0.007413</td>\n", | |
| " <td>-0.014865</td>\n", | |
| " <td>0.173611</td>\n", | |
| " <td>-9.313226e-11</td>\n", | |
| " <td>0.008074</td>\n", | |
| " <td>-0.073255</td>\n", | |
| " <td>0.136484</td>\n", | |
| " <td>4.190951e-10</td>\n", | |
| " <td>0.017622</td>\n", | |
| " <td>0.076431</td>\n", | |
| " <td>0.269632</td>\n", | |
| " <td>-0.079876</td>\n", | |
| " <td>0.172953</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>0.000328</td>\n", | |
| " <td>0.020813</td>\n", | |
| " <td>-0.000653</td>\n", | |
| " <td>0.003801</td>\n", | |
| " <td>0.003763</td>\n", | |
| " <td>0.021631</td>\n", | |
| " <td>-0.005569</td>\n", | |
| " <td>0.007202</td>\n", | |
| " <td>-0.014865</td>\n", | |
| " <td>0.173978</td>\n", | |
| " <td>-1.396984e-10</td>\n", | |
| " <td>0.009166</td>\n", | |
| " <td>-0.073255</td>\n", | |
| " <td>0.135319</td>\n", | |
| " <td>-1.396984e-10</td>\n", | |
| " <td>0.018235</td>\n", | |
| " <td>0.095880</td>\n", | |
| " <td>0.286682</td>\n", | |
| " <td>-0.078713</td>\n", | |
| " <td>0.182642</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>0.000389</td>\n", | |
| " <td>0.020860</td>\n", | |
| " <td>-0.000615</td>\n", | |
| " <td>0.003762</td>\n", | |
| " <td>0.004295</td>\n", | |
| " <td>0.021895</td>\n", | |
| " <td>-0.005322</td>\n", | |
| " <td>0.007018</td>\n", | |
| " <td>-0.014865</td>\n", | |
| " <td>0.174406</td>\n", | |
| " <td>1.241763e-10</td>\n", | |
| " <td>0.010211</td>\n", | |
| " <td>-0.073255</td>\n", | |
| " <td>0.134213</td>\n", | |
| " <td>-2.793968e-10</td>\n", | |
| " <td>0.018833</td>\n", | |
| " <td>0.114252</td>\n", | |
| " <td>0.304078</td>\n", | |
| " <td>-0.077279</td>\n", | |
| " <td>0.192996</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>0.000448</td>\n", | |
| " <td>0.020912</td>\n", | |
| " <td>-0.000583</td>\n", | |
| " <td>0.003720</td>\n", | |
| " <td>0.004808</td>\n", | |
| " <td>0.022184</td>\n", | |
| " <td>-0.005134</td>\n", | |
| " <td>0.006869</td>\n", | |
| " <td>-0.014865</td>\n", | |
| " <td>0.174892</td>\n", | |
| " <td>-2.173086e-10</td>\n", | |
| " <td>0.011207</td>\n", | |
| " <td>-0.073255</td>\n", | |
| " <td>0.133172</td>\n", | |
| " <td>-9.313226e-11</td>\n", | |
| " <td>0.019394</td>\n", | |
| " <td>0.131672</td>\n", | |
| " <td>0.321694</td>\n", | |
| " <td>-0.075557</td>\n", | |
| " <td>0.203608</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>0.000504</td>\n", | |
| " <td>0.020971</td>\n", | |
| " <td>-0.000562</td>\n", | |
| " <td>0.003682</td>\n", | |
| " <td>0.005310</td>\n", | |
| " <td>0.022496</td>\n", | |
| " <td>-0.005014</td>\n", | |
| " <td>0.006726</td>\n", | |
| " <td>-0.014865</td>\n", | |
| " <td>0.175436</td>\n", | |
| " <td>-1.552204e-10</td>\n", | |
| " <td>0.012154</td>\n", | |
| " <td>-0.073255</td>\n", | |
| " <td>0.132204</td>\n", | |
| " <td>9.313226e-11</td>\n", | |
| " <td>0.019921</td>\n", | |
| " <td>0.148416</td>\n", | |
| " <td>0.339382</td>\n", | |
| " <td>-0.073914</td>\n", | |
| " <td>0.214436</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>0.000558</td>\n", | |
| " <td>0.021035</td>\n", | |
| " <td>-0.000538</td>\n", | |
| " <td>0.003647</td>\n", | |
| " <td>0.005798</td>\n", | |
| " <td>0.022822</td>\n", | |
| " <td>-0.004876</td>\n", | |
| " <td>0.006588</td>\n", | |
| " <td>-0.014865</td>\n", | |
| " <td>0.176035</td>\n", | |
| " <td>6.208817e-11</td>\n", | |
| " <td>0.013059</td>\n", | |
| " <td>-0.073255</td>\n", | |
| " <td>0.131316</td>\n", | |
| " <td>-3.725290e-10</td>\n", | |
| " <td>0.020421</td>\n", | |
| " <td>0.164403</td>\n", | |
| " <td>0.357093</td>\n", | |
| " <td>-0.072356</td>\n", | |
| " <td>0.225576</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>9</th>\n", | |
| " <td>0.000611</td>\n", | |
| " <td>0.021105</td>\n", | |
| " <td>-0.000531</td>\n", | |
| " <td>0.003620</td>\n", | |
| " <td>0.006283</td>\n", | |
| " <td>0.023153</td>\n", | |
| " <td>-0.004859</td>\n", | |
| " <td>0.006433</td>\n", | |
| " <td>-0.014865</td>\n", | |
| " <td>0.176688</td>\n", | |
| " <td>7.761022e-11</td>\n", | |
| " <td>0.013922</td>\n", | |
| " <td>-0.073255</td>\n", | |
| " <td>0.130513</td>\n", | |
| " <td>3.725290e-10</td>\n", | |
| " <td>0.020886</td>\n", | |
| " <td>0.180107</td>\n", | |
| " <td>0.374835</td>\n", | |
| " <td>-0.070822</td>\n", | |
| " <td>0.236886</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " fc1.weight.avg fc1.weight.std fc1.weight.grad.avg \\\n", | |
| "epochs \n", | |
| "0 0.000057 0.020687 -0.000515 \n", | |
| "1 0.000124 0.020709 -0.000670 \n", | |
| "2 0.000194 0.020737 -0.000700 \n", | |
| "3 0.000262 0.020772 -0.000684 \n", | |
| "4 0.000328 0.020813 -0.000653 \n", | |
| "5 0.000389 0.020860 -0.000615 \n", | |
| "6 0.000448 0.020912 -0.000583 \n", | |
| "7 0.000504 0.020971 -0.000562 \n", | |
| "8 0.000558 0.021035 -0.000538 \n", | |
| "9 0.000611 0.021105 -0.000531 \n", | |
| "\n", | |
| " fc1.weight.grad.std fc1.bias.avg fc1.bias.std fc1.bias.grad.avg \\\n", | |
| "epochs \n", | |
| "0 0.003734 0.001477 0.021065 -0.004218 \n", | |
| "1 0.003841 0.002039 0.021082 -0.005624 \n", | |
| "2 0.003851 0.002629 0.021205 -0.005902 \n", | |
| "3 0.003830 0.003206 0.021399 -0.005766 \n", | |
| "4 0.003801 0.003763 0.021631 -0.005569 \n", | |
| "5 0.003762 0.004295 0.021895 -0.005322 \n", | |
| "6 0.003720 0.004808 0.022184 -0.005134 \n", | |
| "7 0.003682 0.005310 0.022496 -0.005014 \n", | |
| "8 0.003647 0.005798 0.022822 -0.004876 \n", | |
| "9 0.003620 0.006283 0.023153 -0.004859 \n", | |
| "\n", | |
| " fc1.bias.grad.std fc2.weight.avg fc2.weight.std \\\n", | |
| "epochs \n", | |
| "0 0.007939 -0.014865 0.172887 \n", | |
| "1 0.008169 -0.014865 0.173064 \n", | |
| "2 0.007755 -0.014865 0.173305 \n", | |
| "3 0.007413 -0.014865 0.173611 \n", | |
| "4 0.007202 -0.014865 0.173978 \n", | |
| "5 0.007018 -0.014865 0.174406 \n", | |
| "6 0.006869 -0.014865 0.174892 \n", | |
| "7 0.006726 -0.014865 0.175436 \n", | |
| "8 0.006588 -0.014865 0.176035 \n", | |
| "9 0.006433 -0.014865 0.176688 \n", | |
| "\n", | |
| " fc2.weight.grad.avg fc2.weight.grad.std fc2.bias.avg fc2.bias.std \\\n", | |
| "epochs \n", | |
| "0 1.396984e-10 0.004961 -0.073255 0.140303 \n", | |
| "1 1.086543e-10 0.005874 -0.073255 0.138974 \n", | |
| "2 -3.104409e-11 0.006955 -0.073255 0.137702 \n", | |
| "3 -9.313226e-11 0.008074 -0.073255 0.136484 \n", | |
| "4 -1.396984e-10 0.009166 -0.073255 0.135319 \n", | |
| "5 1.241763e-10 0.010211 -0.073255 0.134213 \n", | |
| "6 -2.173086e-10 0.011207 -0.073255 0.133172 \n", | |
| "7 -1.552204e-10 0.012154 -0.073255 0.132204 \n", | |
| "8 6.208817e-11 0.013059 -0.073255 0.131316 \n", | |
| "9 7.761022e-11 0.013922 -0.073255 0.130513 \n", | |
| "\n", | |
| " fc2.bias.grad.avg fc2.bias.grad.std fc1_outputs.avg \\\n", | |
| "epochs \n", | |
| "0 3.725290e-10 0.016538 0.015567 \n", | |
| "1 5.122274e-10 0.016617 0.035390 \n", | |
| "2 -2.095476e-10 0.017041 0.056138 \n", | |
| "3 4.190951e-10 0.017622 0.076431 \n", | |
| "4 -1.396984e-10 0.018235 0.095880 \n", | |
| "5 -2.793968e-10 0.018833 0.114252 \n", | |
| "6 -9.313226e-11 0.019394 0.131672 \n", | |
| "7 9.313226e-11 0.019921 0.148416 \n", | |
| "8 -3.725290e-10 0.020421 0.164403 \n", | |
| "9 3.725290e-10 0.020886 0.180107 \n", | |
| "\n", | |
| " fc1_outputs.std fc2_outputs.avg fc2_outputs.std \n", | |
| "epochs \n", | |
| "0 0.221910 -0.083202 0.157321 \n", | |
| "1 0.236664 -0.082533 0.159184 \n", | |
| "2 0.252885 -0.081137 0.164697 \n", | |
| "3 0.269632 -0.079876 0.172953 \n", | |
| "4 0.286682 -0.078713 0.182642 \n", | |
| "5 0.304078 -0.077279 0.192996 \n", | |
| "6 0.321694 -0.075557 0.203608 \n", | |
| "7 0.339382 -0.073914 0.214436 \n", | |
| "8 0.357093 -0.072356 0.225576 \n", | |
| "9 0.374835 -0.070822 0.236886 " | |
| ] | |
| }, | |
| "execution_count": 186, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "import pandas as pd\n", | |
| "\n", | |
| "df_stats = pd.DataFrame(weights_stats)\n", | |
| "df_stats.index.name = \"epochs\"\n", | |
| "df_stats" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 187, | |
| "id": "da1b318c", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<Axes: xlabel='epochs'>" | |
| ] | |
| }, | |
| "execution_count": 187, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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r6qqSt0eNWqUw9fgfuvnA1o76no+ERER+Ra3dxuhS2fq1KkybNgwGTFihMydO1eKi4vV7CO4/vrrpWPHjmrsCtx1110ybtw4efHFF+X888+XhQsXyoYNG+Sdd95x964SERGRAbg9vEyZMkWysrLkkUceUYNuBw0aJIsWLbIMyj148KCagaQbPXq0fPzxx/LQQw/Jgw8+KN27d1czjfr16+fuXSUiIiID8MiA3enTp6uLI8uXL6913xVXXKEuRERERPa4thEREREZCsMLERERGQrDCxERERkKwwsREREZCsMLERERGQrDCxERERkKwwsREREZCsMLERERGQrDCxERERkKwwsREREZCsMLERERGQrDCxERERkKwwsREREZCsMLERERGQrDCxERERkKwwsREREZCsMLERERGQrDCxERERkKwwsREREZCsMLERERGQrDCxERERkKwwsREREZCsMLERERGQrDCxERERkKwwsREREZCsMLERERGQrDCxERERkKwwsREREZCsMLERERGQrDCxERERkKwwsREREZCsMLERERGQrDCxERERkKwwsREREZCsMLERERGQrDCxERERkKwwsREREZCsMLERERGQrDCxERERkKwwsREREZSmBL7wAREREZg6nKJJsyN0lWSZbEh8XLkIQhEuAf4PH9YHghIiLywEl/w4kNsrV8qyScSJARHUa0yEm/OZZmLJVnfn1GTpScsNyXGJYos0bMkgmpE8STGF6IiMhrecsnfVee9P9v2f+12Em/OT/DjOUzRBPN5v7Mkkx1/0tnvuTRn4XhhYiolWkNn/K97ZN+aznpN0TTNDFpJqmoqlCXyqpKKa0slafWPVXrZ1DPF038xE+e/fVZOSv5LI/9njG8EBG1Iq3hU74RT/p1hUgci7pO+vDk2iclISzBHBhM5rCgBwc9PKivTXa3q9z3uKP9rQ+ef7zkuGohG540XDyB4YWIqJV0UbSGE74zJ3180sfjOD5VUlXnidmV99e6T79fq7S8zvLa6vvLKsvU/tXnZOlJufb7a8Wb+fv5S5VW/88B+HfjKQwvRC3I6CfL1tRNYfQuCmdO+PU17aO7wNGJuNxUXuvkjovN/XaP2Xxdfbu8qrzOx+y/LigvsDkOjn4ePD7us3HSGrQLaSeRwZES5B8kQQFB6jrQP9B829/utoPHAxt6DPf7mR93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42NeevfuraY8T5s2Td566y11wKZPny5XXXWVZabRkSNHZPz48bJgwQIZMWKEug/jYXDZu3evuv37779LRESEpKSkqPEyzigsLFTXGPdCRERExoLzeFRUVMusbfTRRx+pwIKAgllGl112mbz66quWxxFodu/ebTO6GEHHeubQGWecoa7ff//9BrurdAhHhw4dUqEHhe5cSR8MjO27ejAw8XgYHf99eBceD+/DY1I/tLgguNRVTsWan+ZM+wxZfvGQBvPz8xlevACPh3fh8fAuPB7eh8fEdbi2ERERERkKwwsREREZCsNLI6CezOzZsx3WlSHP4/HwLjwe3oXHw/vwmLgOx7wQERGRobDlhYiIiAyF4YWIiIgMheGFiIiIDIXhhYiIiAyF4cVJr7/+unTu3FlCQ0PV+ky//vqre48M1WnOnDkyfPhwVUU5ISFBLr74YlWtmbzDM888o6pb33333S29Kz4Ly69cd911EhsbK23atJH+/fvLhg0bWnq3fJLJZJKHH35Y0tLS1LHo2rWrPPHEE06t30N1Y3hxwqeffiozZsxQ06Q3bdokAwcOlMmTJ9daOZs84+eff5Y77rhD1q5dK0uWLFFLTUyaNEmKi4t5CFrY+vXr5e2335YBAwa09K74rNzcXBkzZoxaPPZ///uf7NixQ1588UWJjo5u6V3zSc8++6y8+eab8tprr8nOnTvV7eeee07mzZvX0rtmaJwq7QS0tOCTPn75AKtjY42jO++8U2bNmuXuY0QNyMrKUi0wCDX6eljkeUVFRTJkyBB544035Mknn5RBgwbJ3LlzeSg8DH+TVq9eLStXruR77wUuuOACSUxMlHfffddyH9b6QyvMhx9+2KL7ZmRseWlAeXm5bNy4USZMmFDzpvn7q9tr1qxx9/EhJ2CtKXB25XFyD7SGnX/++Tb/Vsjzvv76axk2bJhcccUVKtQPHjxY5s+fz0PRQkaPHi3Lli2TP/74Q93eunWrrFq1Ss4991wek2Zw26rSrUV2drbqs0Rytobbu3btarH9IrG0gmFsBZrJ+/Xrx7elhSxcuFB1qaLbiFrW/v37VTcFuroffPBBdUz+9re/SXBwsEydOpWHpwVawrAgY69evSQgIECdT5566im59tpreSyageGFDP9pf9u2beqTDLWMQ4cOyV133aXGH2FAO7V8oEfLy9NPP61uo+UF/0beeusthpcW8Nlnn8lHH30kH3/8sfTt21e2bNmiPnB16NCBx6MZGF4aEBcXp9LyiRMnbO7H7aSkpOa899RM06dPl2+//VZWrFghnTp14vvZQtCtisHrGO+iw6dLHBeMEysrK1P/hsgz2rdvL3369LG5r3fv3vLFF1/wELSA++67T7W+XHXVVeo2Zn5lZGSoWZNsCWs6jnlpAJpahw4dqvosrT/Z4PaoUaOa8dZTU2GKIYLLl19+KT/++KOagkgtZ/z48fL777+rT5T6BZ/80SyOrxlcPAtdqPalAzDeIjU11cN7QlBSUqLGSVrDvwmcR6jp2PLiBPQdIyHjD/KIESPUDApMy73hhhua8dZTc7qK0AT73//+V9V6OX78uLo/KipKjeAnz8IxsB9vFB4ermqMcByS591zzz1qkCi6ja688kpVk+qdd95RF/K8Cy+8UI1xSUlJUd1GmzdvlpdeekluvPFGHo7m0Mgp8+bN01JSUrTg4GBtxIgR2tq1a/nOtRD82jq6vP/++zwmXmLcuHHaXXfd1dK74bO++eYbrV+/flpISIjWq1cv7Z133mnpXfJZBQUF6t8Czh+hoaFaly5dtH/84x9aWVlZS++aobHOCxERERkKx7wQERGRoTC8EBERkaEwvBAREZGhMLwQERGRoTC8EBERkaEwvBAREZGhMLwQERGRoTC8EBERkaEwvBBRq7N8+XLx8/OTvLy8lt4VInIDhhciIiIyFIYXIiIiMhSGFyJyuaqqKpkzZ46kpaWplb4HDhwon3/+uU2XznfffScDBgyQ0NBQOe2002Tbtm022/jiiy/UKrwhISHSuXNnefHFF20eLysrk5kzZ0pycrJ6Trdu3eTdd9+1ec7GjRvVavBhYWFqpeXdu3dbHtu6daucddZZalXsyMhIGTp0qGzYsIG/DUQGwPBCRC6H4LJgwQJ56623ZPv27XLPPffIddddJz///LPlOffdd58KJOvXr5f4+Hi58MILpaKiwhI6rrzySrnqqqvk999/l0cffVQefvhh+eCDDyyvv/766+WTTz6RV199VXbu3Clvv/22tG3b1mY//vGPf6jvgVASGBgoN954o+Wxa6+9Vjp16qS+P77frFmzJCgoiL8NREbQ0staE1HrUlpaqoWFhWm//PKLzf033XSTdvXVV2s//fSThj89CxcutDx28uRJrU2bNtqnn36qbl9zzTXaxIkTbV5/3333aX369FFf7969W21jyZIlDvdB/x5Lly613Pfdd9+p+06dOqVuR0REaB988IELf3Ii8hS2vBCRS+3du1dKSkpk4sSJqiVEv6AlZt++fZbnjRo1yvJ1TEyM9OzZU7WgAK7HjBljs13c3rNnj5hMJtmyZYsEBATIuHHj6t0XdEvp2rdvr64zMzPV9YwZM+Tmm2+WCRMmyDPPPGOzb0Tk3RheiMilioqK1DXGtCBk6JcdO3ZYxr00F8bROMO6GwjjbPTxOICuKHRpnX/++fLjjz9Knz595Msvv3TJ/hGRezG8EJFLIQRgAO3BgwfVIFrrCwbX6tauXWv5Ojc3V/744w/p3bu3uo3r1atX22wXt3v06KFaXPr3769CiPUYmqbA9jAeZ/HixXLppZfK+++/36ztEZFnBHro+xCRj8Dsnb///e8qFCBgjB07VvLz81X4wKye1NRU9bzHH39cYmNjJTExUQ2sjYuLk4svvlg9du+998rw4cPliSeekClTpsiaNWvktddekzfeeEM9jtlHU6dOVQNwMWAXs5kyMjJUlxAG+jbk1KlTasDw5ZdfrmZEHT58WA3cveyyy9z87hCRS3hsdA0R+Yyqqipt7ty5Ws+ePbWgoCAtPj5emzx5svbzzz9bBtN+8803Wt++fbXg4GBtxIgR2tatW2228fnnn6sBunh9SkqK9vzzz9s8joG399xzj9a+fXu1jW7dumnvvfeeekz/Hrm5uZbnb968Wd2Xnp6ulZWVaVdddZWWnJysXtuhQwdt+vTplsG8ROTd/PA/18QgIqKGoc4L6qugq6hdu3Z8y4io0TjmhYiIiAyF4YWIiIgMhd1GREREZChseSEiIiJDYXghIiIiQ2F4ISIiIkNheCEiIiJDYXghIiIiQ2F4ISIiIkNheCEiIiJDYXghIiIiMZL/B5im11KqxnMfAAAAAElFTkSuQmCC", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "df_stats.filter(regex=\"outputs\").plot(marker=\"o\", grid=True)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 188, | |
| "id": "37ff7c2a", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Test accuracy: 0.256\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAGbCAYAAAAr/4yjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAESZJREFUeJzt3XmsHXMbwPHfrWopXqTVUqT2XalaQsVStUsk9jX2qFpLUBq7WGqpNfhDrEVaYkktoUmtCWoJVSR2moYiRSqaWubNb5L76MqZ03tPT4/PJ7m5S89zztzxZr4zc+bO21YURZEAIKXUxVoAoJ0oABBEAYAgCgAEUQAgiAIAQRQACKIAQBAFAIIosMjWWmutdOyxx8b3L774Ymprays/N+syAgsmCku4e++9t9wAt38ss8wyaYMNNkinnXZa+u6779KS5JlnnkmXXnppanZjxowp1/Xyyy9f1/wuu+wy13+zhX0sCevi999/T5tsskm5vNdff/3iXhw6QNeOeBIWv8svvzytvfbaadasWenVV19Nd9xxR7mR/eCDD1KPHj0auiw77bRT+u2331K3bt0qzeXlvf3225t6Yzhz5sx03nnnpeWWW67u5xg5cmQ68cQT4/tJkyalW265JV144YVp4403jp/3798/Nbtbb701ff3114t7MehAotAi9t5777T11luXX+cNTs+ePdONN96YnnzyyXT44YcvcObXX39dpI3bwnTp0qU8YmlFV155ZVphhRXSrrvump544om6nmP33Xef6/u8rnIU8s/zUcTCdNZ/r3pNnz693Bk5//zz08UXX7y4F4cO4vRRixo8eHD5+Ysvvig/5/Pp+XTHZ599lvbZZ59yw3bkkUeW//bXX3+lm266KW266ablBqpPnz7p5JNPTjNmzJjrOfMNdfNGcY011iiPPvKGccqUKfO99sLeU3jjjTfK11555ZXLjVveE7755ptj+fJRQjbnKZR2Hb2MWV4X+aNWn3zySRo9enQZ265dO3d/Kh8t5d//ww8/TEcccUS5znbcccfy33I4FhSPvA7zeydzqnW9/fzzz+njjz8uP9dqxIgRacMNN0xHHXVU3b8nzceRQotq39jlI4Z2f/zxR9pzzz3LjUs+/9t+WilvJPJ7E8cdd1w644wzypDcdttt6d13302vvfZaWnrppcvH5b3BvMHNG/b88c4776Q99tgjzZ49+1+X54UXXkj77bdfWm211dKZZ56ZVl111fTRRx+l8ePHl9/nZZg2bVr5uAceeGC++c5Yxt122638/OWXX9a0Ts8666wyMvl5x44dmxrh4IMPTuuvv3666qqryuBVVet6e/zxx8vH3HPPPTW9If/mm2+m++67rzxVOWe8aQH5/0+BJdc999yTtxTFhAkTiu+//7745ptvikceeaTo2bNnseyyyxZTp04tH3fMMceUjxsxYsRc86+88kr58zFjxsz18+eee26un0+fPr3o1q1bse+++xZ//fVXPO7CCy8sH5efv93EiRPLn+XP2R9//FGsvfbaRb9+/YoZM2bM9TpzPtepp55azs2rM5Yxy8uTP2oxfvz4omvXrsWUKVPK7/NzLbfcckVHGDdu3FzrK7vkkkvKnx1++OHzPX7nnXcuP+aVl2nO36fW9Tbn/47y53+T1+22224by/bFF1+Us9ddd12F35pm5fRRixgyZEhaZZVV0pprrpkOO+yw8lRR3vtbffXV53rcKaecMtf348aNSyuuuGJ5PvuHH36Ij4EDB5bPMXHixPJxEyZMKPe2Tz/99Ln2DPPe87/Je6V5DzU/dqWVVprr32rZy+ysZcxHCLUcJeTnHD58eBo6dGh5pU0j5desV63rLctHB/lIpJajhHzkMXny5HTttdfWvWw0L6ePWkQ+H58vRc3nuvN543yuN7/hO6f8b/lc+7znyfN55N69ey/0zcTsq6++Kj/nUxlzyiHK57trOZW12Wab1fGbNWYZ/0l+HyFvTC+77LLUaPmKsnrVut6q+OWXX9IFF1yQzj333HIHhNYjCi1i2223jauPFqZ79+7zhSK/EZk3Gvna+wXJG9TFbXEuY96o5vcohg0bVm4Q80f7pal5zzofaeT3Zha24V1Uyy677Hw/y0dBC3p/4c8//+z09Zbfi8pHToceemgcZU2dOrX8nN+8zj/r27dv5cuRaR6i8B+37rrrlqddBg0atMANULt+/frF3uc666wTP//+++/nu5JlQa+R5b+ZyKe5FmZhp5IasYwLk+dyAEaNGlV+LGhPfv/996/78tR65KOezz//fL6ftx8pVV1vVeS/ScjrJF/NNK/8Znj+yKcLt9xyyw55PRrPewr/cYcccki5h3nFFVfM92/5aqWffvqp/DpvzPOVKvmPlebcS82XO/6b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", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# Avaliação final e predição randômica\n", | |
| "model.eval()\n", | |
| "with torch.no_grad():\n", | |
| " outputs = model(X_test_t)\n", | |
| " _, preds = torch.max(outputs, 1)\n", | |
| " test_acc = torch.sum(preds == y_test_t).item() / y_test_t.size(0)\n", | |
| " print('Test accuracy:', test_acc)\n", | |
| "\n", | |
| "# Mostrar imagem e predição para um sample\n", | |
| "idx = torch.randint(0, X_test_t.size(0), (1,)).item()\n", | |
| "img = X_test_t[idx].cpu().numpy().reshape(28, 28)\n", | |
| "pred_class = preds[idx].item()\n", | |
| "true_class = y_test_t[idx].item()\n", | |
| "\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "plt.imshow(img, cmap='gray')\n", | |
| "plt.title(f'Predicted: {pred_class}, True: {true_class}')\n", | |
| "plt.axis('off')\n", | |
| "plt.show()\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "e09f7dbe", | |
| "metadata": {}, | |
| "source": [ | |
| "## 2.4. Variações no Tamanho do Batch" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 189, | |
| "id": "b3469b17", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Epoch 0/10 - train_loss: 2.3225 train_acc: 0.0833 - test_loss: 2.3094 test_acc: 0.0800\n", | |
| "Epoch 5/10 - train_loss: 2.2618 train_acc: 0.1502 - test_loss: 2.2370 test_acc: 0.1950\n", | |
| "Epoch 9/10 - train_loss: 2.1884 train_acc: 0.2657 - test_loss: 2.1624 test_acc: 0.2840\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "model = SimpleNN()\n", | |
| "optimizer = optim.SGD(model.parameters(), lr=0.1)\n", | |
| "weights_stats = torch_training_loop(model, optimizer, train_loader=train_loader, n_epochs=10, verbose=5, show_tensors=False)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 190, | |
| "id": "ee7940e8", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<Axes: xlabel='epochs'>" | |
| ] | |
| }, | |
| "execution_count": 190, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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3Kj+4IqPj+f70QIML42IjIxUaTk7O9vserkcGxvbkteeWmjatGn47rvv8Ouvv6JTp058PVuJTKtK8brUuxjIX5fyvkidWFlZmfo3RM4RFxeHvn37ml3Xp08ffPHFF3wLWsG9996rRl+mTJmiLsvKr4yMDLVqkiNhzceal0bIUOuQIUPUnKXpXzZyOS0trQUvPTWXLDGU4PLVV1/h559/VksQqfWMHj0amzdvVn9RGk7yl78Mi8vXDC7OJVOolq0DpN4iOTnZyc+ERHFxsaqTNCX/JuRzhJqPIy82kLljScjyH+TU1FS1gkKW5V533XUteOmpJVNFMgT7zTffqF4vWVlZ6vqwsDBVwU/OJe+BZb1RUFCQ6jHCOiTnmz59uioSlWmjyy67TPWkevfdd9WJnG/SpEmqxiUpKUlNG/3555946aWXcP311/PtaAmNbPLaa69pSUlJmq+vr5aamqqtWrWKr1wrkV9ba6c5c+bwPXERo0aN0u64447Wfhrt1sKFC7X+/ftrfn5+Wu/evbV33323tZ9Su1VQUKD+Lcjnh7+/v9a1a1ft4Ycf1srKylr7qbk19nkhIiIit8KaFyIiInIrDC9ERETkVhheiIiIyK0wvBAREZFbYXghIiIit8LwQkRERG6F4YWIiIjcCsMLERERuRWGFyJqc5YvXw4PDw+cOHGitZ8KETkAwwsRERG5FYYXIiIicisML0Rkd9XV1XjmmWfQpUsXtdN3SkoKPv/8c7Mpne+//x4DBw6Ev78/Tj31VGzZssXsGF988YXahdfPzw+dO3fGiy++aHZ7WVkZ7r//fiQmJqr7dO/eHe+//77ZfdavX692gw8MDFQ7Le/cudN426ZNm3DWWWepXbFDQ0MxZMgQrFu3jr8NRG6A4YWI7E6Cy9y5c/H2229j69atmD59Oq666iqsWLHCeJ97771XBZK1a9ciKioKkyZNQkVFhTF0XHbZZZgyZQo2b96MRx99FI888gg+/PBD4+OvueYa/O9//8Orr76K7du345133kFwcLDZ83j44YfV95BQ4u3tjeuvv95425VXXolOnTqp7y/f74EHHoCPjw9/G4jcQWtva01EbUtpaakWGBio/fHHH2bX33DDDdrll1+u/fLLL5r8p2fBggXG244dO6YFBARon3zyibp8xRVXaGPHjjV7/L333qv17dtXfb1z5051jCVLllh9DobvsXTpUuN133//vbqupKREXQ4JCdE+/PBDO/7kROQsHHkhIrvavXs3iouLMXbsWDUSYjjJSMyePXuM90tLSzN+HR4ejl69eqkRFCHnI0eONDuuXN61axeqqqqwceNGeHl5YdSoUQ0+F5mWMoiLi1PnOTk56vyuu+7CjTfeiDFjxmDWrFlmz42IXBvDCxHZ1cmTJ9W51LRIyDCctm3bZqx7aSmpo7GF6TSQ1NkY6nGETEXJlNbEiRPx888/o2/fvvjqq6/s8vyIyLEYXojIriQESAHtgQMHVBGt6UmKaw1WrVpl/Pr48eP4+++/0adPH3VZzn///Xez48rlnj17qhGXAQMGqBBiWkPTHHI8qcdZvHgxLrroIsyZM6dFxyMi5/B20vchonZCVu/cc889KhRIwDjttNOQn5+vwoes6klOTlb3e/zxxxEREYGYmBhVWBsZGYkLLrhA3Xb33Xdj2LBheOKJJzB58mSkp6fj9ddfx5tvvqlul9VHU6dOVQW4UrArq5kyMjLUlJAU+jampKREFQxfcsklakXUoUOHVOHuxRdf7OBXh4jswmnVNUTUblRXV2uzZ8/WevXqpfn4+GhRUVHa+PHjtRUrVhiLaRcuXKj169dP8/X11VJTU7VNmzaZHePzzz9XBbry+KSkJO355583u10Kb6dPn67FxcWpY3Tv3l374IMP1G2G73H8+HHj/f/880913b59+7SysjJtypQpWmJionpsfHy8Nm3aNGMxLxG5Ng/5P/vEICKixkmfF+mvIlNFHTp04EtGRE3GmhciIiJyKwwvRERE5FY4bURERERuhSMvRERE5FYYXoiIiMitMLwQERGRW2F4ISIiIrfC8EJERERuheGFiIiI3ArDCxEREbkVhhciIiKCO/l//g2mBJgVBl0AAAAASUVORK5CYII=", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "df_stats = pd.DataFrame(weights_stats)\n", | |
| "df_stats.index.name = \"epochs\"\n", | |
| "df_stats.filter(regex=\"outputs\").plot(marker=\"o\", grid=True)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 191, | |
| "id": "b8bf7703", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "len(train_loader_mini_batch)=69 len(test_loader)=1\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# Mini batch GD\n", | |
| "batch_size = 1000\n", | |
| "train_loader_mini_batch = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n", | |
| "test_loader = DataLoader(test_dataset, batch_size=len(test_dataset), shuffle=False)\n", | |
| "print(f\"{len(train_loader_mini_batch)=} {len(test_loader)=}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 192, | |
| "id": "e2342923", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Epoch 0/10 - train_loss: 1.4732 train_acc: 0.5962 - test_loss: 0.8254 test_acc: 0.8040\n", | |
| "Epoch 5/10 - train_loss: 0.3580 train_acc: 0.8996 - test_loss: 0.3420 test_acc: 0.9000\n", | |
| "Epoch 9/10 - train_loss: 0.3131 train_acc: 0.9115 - test_loss: 0.3046 test_acc: 0.9110\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "model = SimpleNN()\n", | |
| "optimizer = optim.SGD(model.parameters(), lr=0.1)\n", | |
| "weights_stats = torch_training_loop(model, optimizer, train_loader=train_loader_mini_batch, n_epochs=10, verbose=5, show_tensors=False)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 193, | |
| "id": "151185f5", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<Axes: xlabel='epochs'>" | |
| ] | |
| }, | |
| "execution_count": 193, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "df_stats = pd.DataFrame(weights_stats)\n", | |
| "df_stats.index.name = \"epochs\"\n", | |
| "df_stats.filter(regex=\"outputs\").plot(marker=\"o\", grid=True)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "00b1c343", | |
| "metadata": {}, | |
| "source": [ | |
| "## 2.5. Batch Normalization (2015)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "3d09dd81", | |
| "metadata": {}, | |
| "source": [ | |
| "https://arxiv.org/abs/1502.03167" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 194, | |
| "id": "ef263a03", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Modelo com Batch Normalization:\n", | |
| "SimpleNN_BatchNorm(\n", | |
| " (fc1): Linear(in_features=784, out_features=12, bias=True)\n", | |
| " (bn1): BatchNorm1d(12, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", | |
| " (fc2): Linear(in_features=12, out_features=10, bias=True)\n", | |
| ")\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "class SimpleNN_BatchNorm(nn.Module):\n", | |
| " def __init__(self, input_dim=784, hidden_dim=12, output_dim=10):\n", | |
| " super(SimpleNN_BatchNorm, self).__init__()\n", | |
| " self.fc1 = nn.Linear(input_dim, hidden_dim)\n", | |
| " self.bn1 = nn.BatchNorm1d(hidden_dim)\n", | |
| " self.fc2 = nn.Linear(hidden_dim, output_dim)\n", | |
| "\n", | |
| " def forward(self, x):\n", | |
| " x = self.fc1(x)\n", | |
| " x = self.bn1(x) # BatchNorm após a primeira camada linear\n", | |
| " x = F.relu(x)\n", | |
| " x = self.fc2(x)\n", | |
| " return x\n", | |
| "\n", | |
| "model_bn = SimpleNN_BatchNorm(input_dim=784, hidden_dim=12, output_dim=10).to(device)\n", | |
| "print(\"Modelo com Batch Normalization:\")\n", | |
| "print(model_bn)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 195, | |
| "id": "e2bd4f65", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Epoch 0/10 - train_loss: 1.1942 train_acc: 0.7499 - test_loss: 0.6919 test_acc: 0.8700\n", | |
| "Epoch 9/10 - train_loss: 0.2461 train_acc: 0.9307 - test_loss: 0.2478 test_acc: 0.9320\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "model_bn = SimpleNN_BatchNorm(input_dim=784, hidden_dim=12, output_dim=10)\n", | |
| "optimizer = optim.SGD(model_bn.parameters(), lr=0.1)\n", | |
| "weights_stats = torch_training_loop(model_bn, optimizer, train_loader=train_loader_mini_batch, n_epochs=10)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 196, | |
| "id": "e823f65f", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "running_mean tensor([-0.0135, 0.0179, -0.1967, -0.2354, -0.0224, 0.4319, -0.0216, -0.0095,\n", | |
| " 0.0346, -0.2299, -0.0258, -0.2881])\n", | |
| "running_var tensor([0.1109, 0.1587, 0.2010, 0.1127, 0.1071, 0.1742, 0.2510, 0.2178, 0.1750,\n", | |
| " 0.2343, 0.2064, 0.1024])\n", | |
| "num_batches_tracked tensor(690)\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "for n, b in model_bn.bn1.named_buffers():\n", | |
| " print(n, b)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 197, | |
| "id": "58fb2d92", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "weight Parameter containing:\n", | |
| "tensor([1.6296, 1.6928, 2.0651, 1.7580, 1.5861, 1.7017, 2.1572, 2.1434, 1.9448,\n", | |
| " 2.1528, 1.9318, 1.7726], requires_grad=True)\n", | |
| "bias Parameter containing:\n", | |
| "tensor([0.4089, 0.2975, 0.6146, 0.1982, 0.4586, 0.7011, 0.8583, 0.5699, 0.3732,\n", | |
| " 0.5065, 0.3705, 0.2596], requires_grad=True)\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "for n, b in model_bn.bn1.named_parameters():\n", | |
| " print(n, b)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 198, | |
| "id": "c3c7cee9", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "Index(['fc1.weight.avg', 'fc1.weight.std', 'fc1.weight.grad.avg',\n", | |
| " 'fc1.weight.grad.std', 'fc1.bias.avg', 'fc1.bias.std',\n", | |
| " 'fc1.bias.grad.avg', 'fc1.bias.grad.std', 'bn1.weight.avg',\n", | |
| " 'bn1.weight.std', 'bn1.weight.grad.avg', 'bn1.weight.grad.std',\n", | |
| " 'bn1.bias.avg', 'bn1.bias.std', 'bn1.bias.grad.avg',\n", | |
| " 'bn1.bias.grad.std', 'fc2.weight.avg', 'fc2.weight.std',\n", | |
| " 'fc2.weight.grad.avg', 'fc2.weight.grad.std', 'fc2.bias.avg',\n", | |
| " 'fc2.bias.std', 'fc2.bias.grad.avg', 'fc2.bias.grad.std',\n", | |
| " 'fc1_outputs.avg', 'fc1_outputs.std', 'fc2_outputs.avg',\n", | |
| " 'fc2_outputs.std', 'bn1_outputs.avg', 'bn1_outputs.std',\n", | |
| " 'bn1_running_mean.avg', 'bn1_running_var.avg', 'bn1_running_mean',\n", | |
| " 'bn1_running_var'],\n", | |
| " dtype='object')" | |
| ] | |
| }, | |
| "execution_count": 198, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "df_stats = pd.DataFrame(weights_stats)\n", | |
| "df_stats.index.name = \"epochs\"\n", | |
| "df_stats.columns" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 199, | |
| "id": "df0b707d", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<Axes: xlabel='epochs'>" | |
| ] | |
| }, | |
| "execution_count": 199, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "df_stats.filter(regex=\"bn1\").plot(marker=\"o\", grid=True)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 200, | |
| "id": "aea204d3", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "fc1_outputs.avg 1.208624\n", | |
| "fc1_outputs.std 1.556348\n", | |
| "bn1_outputs.avg 1.537014\n", | |
| "bn1_outputs.std 2.545684\n", | |
| "dtype: float64" | |
| ] | |
| }, | |
| "execution_count": 200, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "df_stats.filter(regex=\"fc1_outputs|bn1_outputs\").describe().mean()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 201, | |
| "id": "f36caefc", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "=== Parâmetros do modelo com BatchNorm ===\n", | |
| "\n", | |
| "fc1.weight: torch.Size([12, 784])\n", | |
| "fc1.bias: torch.Size([12])\n", | |
| "bn1.weight: torch.Size([12])\n", | |
| " Valores: tensor([1.6296, 1.6928, 2.0651, 1.7580, 1.5861])...\n", | |
| "bn1.bias: torch.Size([12])\n", | |
| " Valores: tensor([0.4089, 0.2975, 0.6146, 0.1982, 0.4586])...\n", | |
| "fc2.weight: torch.Size([10, 12])\n", | |
| "fc2.bias: torch.Size([10])\n", | |
| "\n", | |
| "=== Estatísticas acumuladas (running stats) do BatchNorm ===\n", | |
| "\n", | |
| "bn1.running_mean shape: torch.Size([12])\n", | |
| "bn1.running_mean: tensor([-0.0135, 0.0179, -0.1967, -0.2354, -0.0224, 0.4319, -0.0216, -0.0095,\n", | |
| " 0.0346, -0.2299])\n", | |
| "\n", | |
| "bn1.running_var shape: torch.Size([12])\n", | |
| "bn1.running_var: tensor([0.1109, 0.1587, 0.2010, 0.1127, 0.1071, 0.1742, 0.2510, 0.2178, 0.1750,\n", | |
| " 0.2343])\n", | |
| "\n", | |
| "=== Comparação de tamanhos de modelos ===\n", | |
| "Modelo original (sem BatchNorm): 9550 parâmetros\n", | |
| "Modelo com BatchNorm: 9574 parâmetros\n", | |
| "Diferença: 24 parâmetros (BatchNorm adiciona weight e bias)\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# Inspecionar os parâmetros do BatchNorm\n", | |
| "print(\"=== Parâmetros do modelo com BatchNorm ===\\n\")\n", | |
| "\n", | |
| "for name, param in model_bn.named_parameters():\n", | |
| " print(f\"{name}: {param.shape}\")\n", | |
| " if 'bn1' in name:\n", | |
| " print(f\" Valores: {param.data[:5]}...\") # Mostrar primeiros 5 valores\n", | |
| " \n", | |
| "print(\"\\n=== Estatísticas acumuladas (running stats) do BatchNorm ===\\n\")\n", | |
| "\n", | |
| "print(f\"bn1.running_mean shape: {model_bn.bn1.running_mean.shape}\")\n", | |
| "print(f\"bn1.running_mean: {model_bn.bn1.running_mean[:10]}\")\n", | |
| "print(f\"\\nbn1.running_var shape: {model_bn.bn1.running_var.shape}\")\n", | |
| "print(f\"bn1.running_var: {model_bn.bn1.running_var[:10]}\")\n", | |
| "\n", | |
| "print(f\"\\n=== Comparação de tamanhos de modelos ===\")\n", | |
| "params_original = sum(p.numel() for p in model.parameters())\n", | |
| "params_bn = sum(p.numel() for p in model_bn.parameters())\n", | |
| "\n", | |
| "print(f\"Modelo original (sem BatchNorm): {params_original} parâmetros\")\n", | |
| "print(f\"Modelo com BatchNorm: {params_bn} parâmetros\")\n", | |
| "print(f\"Diferença: {params_bn - params_original} parâmetros (BatchNorm adiciona weight e bias)\")\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "c7f41704", | |
| "metadata": {}, | |
| "source": [ | |
| "## 2.6. Layer Normalization (2016)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "c03d66d4", | |
| "metadata": {}, | |
| "source": [ | |
| "https://arxiv.org/abs/1607.06450" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 202, | |
| "id": "eac4a088", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# WIP" | |
| ] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "cat", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.11.14" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 5 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment