{
"nbformat": 4,
"nbformat_minor": 5,
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.9.7"
},
"colab": {
"name": "Logistic Regression - Ego.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"
"
]
},
{
"cell_type": "code",
"metadata": {
"id": "27c3a3f7"
},
"source": [
"import ego\n",
"import ego.nn as nn\n",
"import ego.nn.functional as F\n",
"from random import shuffle, randint"
],
"id": "27c3a3f7",
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "e93b8958"
},
"source": [
"def sigmoid(x):\n",
" return 0.5 * (F.tanh(x) + 1)\n",
"\n",
"def logistic_model(x, *params):\n",
" return sigmoid(F.linear(x, *params))\n",
"\n",
"def loss_fn(h, y):\n",
" p = h*y + (1 - h) * (1 - y)\n",
" return -ego.sum(ego.log(p))"
],
"id": "e93b8958",
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "df994dde",
"outputId": "8c360faf-1654-4fd8-fc6d-13959065e47c"
},
"source": [
"inputs = ego.tensor([[0.52, 1.12, 0.77],\n",
" [0.88, -1.08, 0.15],\n",
" [0.52, 0.06, -1.30],\n",
" [0.74, -2.49, 1.39]])\n",
"targets = ego.tensor([1, 1, 0, 1])\n",
"\n",
"# initialize the parameters\n",
"use_bias = True\n",
"params = [\n",
" nn.Parameter(ego.tensor([[0., 0, 0]])),\n",
" nn.Parameter(ego.tensor([0.])) if use_bias else None]\n",
"print(params)"
],
"id": "df994dde",
"execution_count": null,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[Parameter containing:\n",
"tensor([[0., 0., 0.]], requires_grad=True), Parameter containing:\n",
"tensor([0.0000], requires_grad=True)]\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": false,
"id": "1abdf571",
"outputId": "b4df8ca6-3018-4446-9816-264a44702326"
},
"source": [
"lr = 0.1\n",
"rate = 3\n",
"steps = 30\n",
"# setup a fake \"dataloader\"\n",
"dataloader = list(zip(inputs.clone(), targets.clone()))\n",
"for step in range(1, steps + 1):\n",
" losses = []\n",
" shuffle(dataloader) # shuffle at every step\n",
" for batch in dataloader:\n",
" x, y = batch\n",
" yhat = logistic_model(x.view(1, -1), *params)\n",
" loss = loss_fn(yhat, y)\n",
" loss.backward()\n",
" with ego.no_grad():\n",
" for param in params:\n",
" if param is None: # handle when bias is None\n",
" continue\n",
" param -= lr * param.grad\n",
" param.grad.zero_() # zero the gradients\n",
" losses.append(loss.detach())\n",
" if step % rate == 1:\n",
" cost = ego.mean(ego.stack(losses))\n",
" print(f't={step} z={cost.item():.5f}')"
],
"id": "1abdf571",
"execution_count": null,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"t=1 z=0.63303\n",
"t=4 z=0.19865\n",
"t=7 z=0.12029\n",
"t=10 z=0.08629\n",
"t=13 z=0.06727\n",
"t=16 z=0.05512\n",
"t=19 z=0.04669\n",
"t=22 z=0.04049\n",
"t=25 z=0.03574\n",
"t=28 z=0.03199\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "2413585b",
"outputId": "7c563f24-1b30-4023-a938-607b7bb36dcb"
},
"source": [
"params"
],
"id": "2413585b",
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"[Parameter containing:\n",
" tensor([[ 0.5230, -0.3229, 1.7643]], requires_grad=True),\n",
" Parameter containing:\n",
" tensor([0.5188], requires_grad=True)]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "a70f0612",
"outputId": "c3ea23dd-f8cc-4242-defb-ec7e1380415e"
},
"source": [
"with ego.no_grad():\n",
" probs = logistic_model(inputs, *params)\n",
"probs = probs.flatten()\n",
"preds = ego.zeros(probs.size(),\n",
" dtype=ego.long).masked_fill_(probs > 0.5, 1)\n",
"acc = 100 * ((targets == preds).sum() / targets.numel()).item()\n",
"print(f'scores : {probs}')\n",
"print(f'predictions : {preds}')\n",
"print(f'accuracy : {acc} %')"
],
"id": "a70f0612",
"execution_count": null,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"scores : tensor([0.9728, 0.9603, 0.0455, 0.9998])\n",
"predictions : tensor([1, 1, 0, 1])\n",
"accuracy : 100.0 %\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "021e81de",
"outputId": "47b70410-c08c-41bc-c27a-bd883957a2a1"
},
"source": [
"with ego.enable_profile():\n",
" print('\\t----- Forward ----\\n')\n",
" track_loss = loss_fn(logistic_model(inputs, *params), targets)\n",
" print('\\t----- Backward ----\\n')\n",
" track_loss.backward()"
],
"id": "021e81de",
"execution_count": null,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\t----- Forward ----\n",
"\n",
"\u001b[1m\u001b[36m Transpose (in:[1], out:[1]) : 0.02 ms [(1, 3)]\u001b[0m\n",
"\u001b[1m\u001b[36m NoGrad (in:[1], out:[1]) : 0.00 ms [(1,)]\u001b[0m\n",
"\u001b[1m\u001b[36m NoGrad (in:[1], out:[1]) : 0.00 ms [(4, 3)]\u001b[0m\n",
"\u001b[1m\u001b[36m NoGrad (in:[1], out:[1]) : 0.00 ms [(3, 1)]\u001b[0m\n",
"\u001b[1m\u001b[36m Addmm (in:[3], out:[1]) : 0.91 ms [(1,), (4, 3), (3, 1)]\u001b[0m\n",
"\u001b[1m\u001b[36m Tanh (in:[1], out:[1]) : 0.01 ms [(4, 1)]\u001b[0m\n",
"\u001b[1m\u001b[36m Add (in:[2], out:[1]) : 0.01 ms [(4, 1), ('tensor',)]\u001b[0m\n",
"\u001b[1m\u001b[36m Mul (in:[2], out:[1]) : 0.01 ms [('tensor',), (4, 1)]\u001b[0m\n",
"\u001b[1m\u001b[36m Mul (in:[2], out:[1]) : 0.01 ms [(4, 1), (4,)]\u001b[0m\n",
"\u001b[1m\u001b[36m Sub (in:[2], out:[1]) : 0.01 ms [('tensor',), (4, 1)]\u001b[0m\n",
"\u001b[1m\u001b[36m Sub (in:[2], out:[1]) : 0.01 ms [('tensor',), (4,)]\u001b[0m\n",
"\u001b[1m\u001b[36m Mul (in:[2], out:[1]) : 0.01 ms [(4, 1), (4,)]\u001b[0m\n",
"\u001b[1m\u001b[36m Add (in:[2], out:[1]) : 0.01 ms [(4, 4), (4, 4)]\u001b[0m\n",
"\u001b[1m\u001b[36m Log (in:[1], out:[1]) : 0.03 ms [(4, 4)]\u001b[0m\n",
"\u001b[1m\u001b[36m Sum (in:[1], out:[1]) : 0.01 ms [(4, 4)]\u001b[0m\n",
"\u001b[1m\u001b[36m Neg (in:[1], out:[1]) : 0.01 ms [('tensor',)]\u001b[0m\n",
"\t----- Backward ----\n",
"\n",
"\u001b[1m\u001b[35m (in:[1], out:[1]) : 0.01 ms [('ndarray',)]\u001b[0m\n",
"\u001b[1m\u001b[35m (in:[1], out:[1]) : 0.04 ms [('ndarray',)]\u001b[0m\n",
"\u001b[1m\u001b[35m (in:[1], out:[1]) : 0.01 ms [(4, 4)]\u001b[0m\n",
"\u001b[1m\u001b[35m (in:[1], out:[2]) : 0.01 ms [(4, 4)]\u001b[0m\n",
"\u001b[1m\u001b[35m (in:[1], out:[2]) : 0.04 ms [(4, 4)]\u001b[0m\n",
"\u001b[1m\u001b[35m (in:[1], out:[2]) : 0.02 ms [(4, 1)]\u001b[0m\n",
"\u001b[1m\u001b[35m (in:[1], out:[2]) : 0.04 ms [(4, 4)]\u001b[0m\n",
"\u001b[1m\u001b[35m (in:[1], out:[2]) : 0.03 ms [(4, 1)]\u001b[0m\n",
"\u001b[1m\u001b[35m (in:[1], out:[2]) : 0.02 ms [(4, 1)]\u001b[0m\n",
"\u001b[1m\u001b[35m (in:[1], out:[1]) : 0.02 ms [(4, 1)]\u001b[0m\n",
"\u001b[1m\u001b[36m Sum (in:[1], out:[1]) : 0.01 ms [(4, 1)]\u001b[0m\n",
"\u001b[1m\u001b[36m Transpose (in:[1], out:[1]) : 0.01 ms [(4, 1)]\u001b[0m\n",
"\u001b[1m\u001b[36m NoGrad (in:[1], out:[1]) : 0.00 ms [(1, 3)]\u001b[0m\n",
"\u001b[1m\u001b[36m NoGrad (in:[1], out:[1]) : 0.00 ms [(1, 4)]\u001b[0m\n",
"\u001b[1m\u001b[36m NoGrad (in:[1], out:[1]) : 0.00 ms [(4, 3)]\u001b[0m\n",
"\u001b[1m\u001b[36m Mm (in:[3], out:[1]) : 0.46 ms [(1, 3), (1, 4), (4, 3)]\u001b[0m\n",
"\u001b[1m\u001b[36m Transpose (in:[1], out:[1]) : 0.01 ms [(1, 3)]\u001b[0m\n",
"\u001b[1m\u001b[35m (in:[1], out:[3]) : 0.90 ms [(4, 1)]\u001b[0m\n",
"\u001b[1m\u001b[35m (in:[1], out:[1]) : 0.01 ms [(3, 1)]\u001b[0m\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "c0701897",
"outputId": "925fbf28-3b48-4306-83ec-0e7192877355"
},
"source": [
"params[0].grad"
],
"id": "c0701897",
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"tensor([[ 0.9547, -5.1347, 11.7294]])"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "17a58308",
"outputId": "aca6c48e-22a1-44f4-c10a-8ec57cf734fb"
},
"source": [
"params[1].grad"
],
"id": "17a58308",
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"tensor([-0.1740])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "46229832"
},
"source": [
""
],
"id": "46229832",
"execution_count": null,
"outputs": []
}
]
}