Created
August 3, 2018 18:35
-
-
Save demacdolincoln/56a00fd2d9111b433e6c2b791290cfc1 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", | |
"metadata": {}, | |
"source": [ | |
"## Simples exemplo de uso do pytorch para classificar números manuscritos\n", | |
"\n", | |
"**leituras recomendadas (e que tambem precisei para escrever esse script):**\n", | |
"\n", | |
"* https://matheusfacure.github.io/2017/05/15/deep-ff-ann-pytorch/\n", | |
"* http://deeplearningbook.com.br/funcao-de-ativacao/\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import torch\n", | |
"from torch import autograd, nn\n", | |
"from torch.nn import functional as F\n", | |
"\n", | |
"from sklearn import datasets\n", | |
"import numpy as np\n", | |
"\n", | |
"import matplotlib.pyplot as plt" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class Model(nn.Module):\n", | |
" def __init__(self, input_size, hidden_size, num_classes):\n", | |
" super().__init__()\n", | |
" self.in_to_h1 = nn.Linear(input_size, hidden_size)\n", | |
" self.h1_to_h2 = nn.Linear(hidden_size, hidden_size)\n", | |
" self.h2_to_out = nn.Linear(hidden_size, num_classes)\n", | |
" \n", | |
" def forward(self, x):\n", | |
" x = F.relu(self.in_to_h1(x))\n", | |
" x = F.relu(self.h1_to_h2(x))\n", | |
" x = self.h2_to_out(x)\n", | |
" return x" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"ds = datasets.load_digits()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"x_batch = ds.data.astype(np.float32)\n", | |
"y_batch = ds.target\n", | |
"x_batch = torch.FloatTensor(x_batch.tolist())\n", | |
"y_batch = torch.LongTensor(y_batch.tolist())\n", | |
"\n", | |
"x_batch = autograd.Variable(x_batch)\n", | |
"y_batch = autograd.Variable(y_batch)\n", | |
" \n", | |
"x_batch, y_batch = autograd.Variable(x_batch, ), autograd.Variable(y_batch)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"batch_size = x_batch.shape[0]\n", | |
"input_size = x_batch.shape[1]\n", | |
"hidden_size = 128\n", | |
"num_classes = len(ds.target_names)\n", | |
"learning_rate = 1e-5" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"inpt: tensor([[ 0., 0., 5., ..., 0., 0., 0.],\n", | |
" [ 0., 0., 0., ..., 10., 0., 0.],\n", | |
" [ 0., 0., 0., ..., 16., 9., 0.],\n", | |
" ...,\n", | |
" [ 0., 0., 1., ..., 6., 0., 0.],\n", | |
" [ 0., 0., 2., ..., 12., 0., 0.],\n", | |
" [ 0., 0., 10., ..., 12., 1., 0.]])\n", | |
"target: tensor([[ 0, 1, 2, ..., 8, 9, 8]])\n" | |
] | |
} | |
], | |
"source": [ | |
"print('inpt: ', x_batch)\n", | |
"print('target: ', y_batch.view(1, -1))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Model(\n", | |
" (in_to_h1): Linear(in_features=64, out_features=128, bias=True)\n", | |
" (h1_to_h2): Linear(in_features=128, out_features=128, bias=True)\n", | |
" (h2_to_out): Linear(in_features=128, out_features=10, bias=True)\n", | |
")\n" | |
] | |
} | |
], | |
"source": [ | |
"model = Model(input_size, hidden_size, num_classes)\n", | |
"print(model)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"epoch: 0 | loss:2.4547500610351562\n", | |
"epoch: 10 | loss:0.1502559632062912\n", | |
"epoch: 20 | loss:0.040915049612522125\n", | |
"epoch: 30 | loss:0.010044598951935768\n", | |
"epoch: 40 | loss:0.0028940257616341114\n", | |
"epoch: 50 | loss:0.0011215369449928403\n", | |
"epoch: 60 | loss:0.000569865689612925\n", | |
"epoch: 70 | loss:0.00037850209628231823\n", | |
"epoch: 80 | loss:0.00028599362121894956\n", | |
"epoch: 90 | loss:0.0002365583786740899\n", | |
"CPU times: user 29 s, sys: 243 ms, total: 29.3 s\n", | |
"Wall time: 28.9 s\n" | |
] | |
} | |
], | |
"source": [ | |
"%%time\n", | |
"\n", | |
"criterion = nn.CrossEntropyLoss() # define o custo de entropia cruzada\n", | |
"optimizer = torch.optim.Adam(model.parameters(), lr = 0.01)\n", | |
"# opt = torch.optim.Adam(params=model.parameters(), lr=learning_rate)\n", | |
"\n", | |
"for epoch in range(100):\n", | |
" optimizer.zero_grad()\n", | |
" \n", | |
" logit = model(x_batch)\n", | |
" loss = criterion(logit, y_batch)\n", | |
" loss.backward()\n", | |
" optimizer.step()\n", | |
" if epoch % 10 == 0:\n", | |
" print(f'epoch: {epoch} | loss:{loss.item()}')\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"out = model(x_batch)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"tensor de saída: tensor([-36.7698, -6.9950, 31.8018, -7.3230, -18.5295, -4.9313,\n", | |
" -25.2274, -9.0327, -3.7554, 2.5035])\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 1080x360 with 2 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"index = 268\n", | |
"\n", | |
"print(\"tensor de saída: \", out[index])\n", | |
"\n", | |
"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))\n", | |
"ax1.matshow(ds.images[index], cmap=plt.cm.gray_r)\n", | |
"ax1.set_title(f\"valor esperado: {y_batch[index]}\\n\")\n", | |
"\n", | |
"ax2.plot(out[index].detach().numpy())\n", | |
"ax2.grid(True)\n", | |
"ax2.set_title(f\"valor previsto: {out[index].argmax()}\\n\")\n", | |
"plt.setp(ax2, xticks=list(range(num_classes)));" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"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.6.6" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment