Created
January 28, 2017 00:02
-
-
Save tanemaki/339340d654906ea90feeeb1105b662aa to your computer and use it in GitHub Desktop.
This file contains 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": [ | |
"## Understanding how torch.nn.Module works\n", | |
"\n", | |
"https://discuss.pytorch.org/t/understanding-how-torch-nn-module-works/122" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib inline\n", | |
"import matplotlib.pyplot as plt" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### First code\n", | |
"\n", | |
"- Written by rasbt\n", | |
"- Implemented OLS regression manually using `Variable`" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"('n_iter', 1188)\n", | |
"0.000448712933576\n" | |
] | |
} | |
], | |
"source": [ | |
"from torch.autograd import Variable\n", | |
"import torch\n", | |
"\n", | |
"\n", | |
"x = Variable(torch.Tensor([[1.0, 1.0], \n", | |
" [1.0, 2.1], \n", | |
" [1.0, 3.6], \n", | |
" [1.0, 4.2], \n", | |
" [1.0, 6.0], \n", | |
" [1.0, 7.0]]))\n", | |
"y = Variable(torch.Tensor([1.0, 2.1, 3.6, 4.2, 6.0, 7.0]))\n", | |
"weights = Variable(torch.zeros(2, 1), requires_grad=True)\n", | |
"\n", | |
"losses = [] # Added\n", | |
"\n", | |
"for i in range(5000):\n", | |
"\n", | |
" net_input = x.mm(weights)\n", | |
" loss = torch.mean((net_input - y)**2)\n", | |
" losses.append(loss.data[0]) # Added\n", | |
" loss.backward()\n", | |
" weights.data.add_(-0.0001 * weights.grad.data)\n", | |
" \n", | |
" if loss.data[0] < 1e-3:\n", | |
" break\n", | |
"\n", | |
"print('n_iter', i)\n", | |
"print(loss.data[0])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x10d110a90>]" | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x10bfada10>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(losses)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Second code\n", | |
"\n", | |
"- Use `nn.Parameter` instead of `Variable`" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"('n_iter', 4999)\n", | |
"0.00521271163598\n" | |
] | |
} | |
], | |
"source": [ | |
"import torch.nn.functional as F\n", | |
"\n", | |
"class Model(torch.nn.Module):\n", | |
"\n", | |
" def __init__(self):\n", | |
" super(Model, self).__init__()\n", | |
" # The following code is modified to use nn.Parameter instead of Variable\n", | |
" self.weights = torch.nn.Parameter(torch.zeros(2, 1))\n", | |
" \n", | |
" def forward(self, x):\n", | |
" net_input = x.mm(self.weights)\n", | |
" return net_input\n", | |
" \n", | |
"model = Model() \n", | |
"criterion = torch.nn.MSELoss()\n", | |
"optimizer = torch.optim.SGD(model.parameters(), lr=0.0001)\n", | |
"\n", | |
"losses = [] # Added\n", | |
"\n", | |
"for i in range(5000):\n", | |
" optimizer.zero_grad()\n", | |
" outputs = model(x)\n", | |
" \n", | |
" loss = criterion(outputs, y)\n", | |
" losses.append(loss.data[0]) # Added\n", | |
" loss.backward()\n", | |
" \n", | |
" optimizer.step()\n", | |
" \n", | |
" if loss.data[0] < 1e-3:\n", | |
" break \n", | |
" \n", | |
"print('n_iter', i)\n", | |
"print(loss.data[0])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x110f15150>]" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x110ee3d50>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(losses)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Third code\n", | |
"\n", | |
"- uses `torch.nn.Linear`" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"('n_iter', 4999)\n", | |
"0.00142372772098\n" | |
] | |
} | |
], | |
"source": [ | |
"class Model(torch.nn.Module):\n", | |
"\n", | |
" def __init__(self):\n", | |
" super(Model, self).__init__()\n", | |
" self.fc = torch.nn.Linear(2, 1)\n", | |
" \n", | |
" def forward(self, x):\n", | |
" return self.fc(x)\n", | |
" \n", | |
"model = Model() \n", | |
"criterion = torch.nn.MSELoss()\n", | |
"optimizer = torch.optim.SGD(model.parameters(), lr=0.0001)\n", | |
"\n", | |
"losses = [] # Added\n", | |
"\n", | |
"for i in range(5000):\n", | |
" optimizer.zero_grad()\n", | |
" outputs = model(x)\n", | |
" \n", | |
" loss = criterion(outputs, y)\n", | |
" losses.append(loss.data[0]) # Added\n", | |
" loss.backward()\n", | |
" \n", | |
" optimizer.step()\n", | |
" \n", | |
" if loss.data[0] < 1e-3:\n", | |
" break \n", | |
" \n", | |
"print('n_iter', i)\n", | |
"print(loss.data[0])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x111272210>]" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\nSUVORK5CYII=\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x110f30310>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(losses)" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python [conda root]", | |
"language": "python", | |
"name": "conda-root-py" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 2 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython2", | |
"version": "2.7.11" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment