{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello world!\n" ] } ], "source": [ "print(\"Hello world!\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from tinygrad.core import Tensor\n", "from tinygrad.nn import SimpleMLP\n", "from tinygrad.losses import MSELoss, MaxMarginLoss\n", "from tinygrad.optimizers import SimpleSGD\n", "\n", "import random\n", "import numpy as np\n", "from sklearn.datasets import make_blobs, make_moons\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "np.random.seed(1337)\n", "random.seed(1337)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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1AFy/fUd+eCDrf7uSg6HlRtu6FxGKVHXaK158cXV/OMf3+Ny+bBYTLz55nq2br2XZs0keZaX1pqF997L5nffxWS1EhETw+0rVoTkXAd1oqlemiFDzuGtt66kefNIGjUK5667LuC55wYZHZYIIlprxo6dx9/+thSXK79rm8fjIy0tj2nTZKKZitjxySds/eAD/wqUp/bv5/NbbjE6rEqpkzXOxYv38PjjP5CX5+Gee3py8OBDcj9OlOi77/by5Ze/FpuwOD955hoTVIg68ssv/q5qkD/XwbFt2wyMqPLqXOJcuXI/1133ib95/te/fofWmkmTehkcmQhG+/adKpY0Aex2M9df36nmAwphDdq2xepwnF7cTynqt2ljbFCVVOea6jNn/lJkCGZ2tpv//ne9gRGJYNajRyxQNHNaLCbmzr2OAQNaGRNUiDr/9ttpNXAgVqeTsKgowhs04JoPPjA6rEqpczXOsDALShWZmV9m7C6nU/v28fG113Js+3YiY2O57qOPaNG3do/l7tGjGS+8MISHHlqCyaRo1CicZcvG0a6djECrKJPZzJgFCzjyyy/kpacT2707YVFRRodVKXWiA3xhO3Yco3fvGWRnu9E6fyKHuXOv4+qrOwQ4ytpF+3y8ds45pB04gPblPySxRUYyOTGRiJgYg6Orfrm5Hk6ezCEmJqLWLolSk1J27mT+XXeRduAALfv356q338YeHW10WOXuAF/napydOzfh55/v4qWX8udevOuu7gweHG90WEEvIzmZzKNH/UkT8le3PLxhA+2uvNLAyGqG3W6RfpsBkpWSwqx+/chNSwOt+XXePDIOHWL8ypVGh1ZudS5xAnTp0oR3373a6DBCij06uti61j6vF0dDabKKitn/44/4vF7//TKvy0XS2rXkpaeX2nTPTUtj6d/+xtGtW2nWoweDnnsOW0RETYZdRJ1MnKLibBERXPz446yaOhWv243ZZiN+8GCa9+5tdGgixFjDwylhQfpiqwv8wet2827//qQmJuLNyyN50yYOrVvHnWvWoEzGPN+WxCnK7ZLHH6fFRReRvHEj9dq0odN110n/V1Fh8YMHU69NG04kJuLJzcXqdNLj7rux2O0lHn9061ZO7duHNy9/OLQ3L49j27eTmphIo/btazJ0P0mcokLiBw0ifpCMrhKVZ7bZuHPNGta+9hqn9u6l1SWXcN5ZRhCV9sfZyD/akjgrSWvN0aNZREbacDpLbmIIIUpmczoZ8Oij5To2pmtX6sfHc3z3brx5eVjsdmK6dqXBuedWc5SlC8gNAqXUMKXUbqXUHqXUlBL236KU2lrwtVop1a3Qvn1KqW1Kqc1KqZAY/JuUlE779m/Qps1/qF//3zz99AqjQxKi1jJZLIxfuZLud91Fy/796TlxImOXLjXs/iYEoB+nUsoMJABDgCRgPXCz1npnoWMuAnZprU8qpa4AntRa9y7Ytw/oqbU+Xt5rVqUfZyD07TuD9esP+6ekczqtzJsnEyALEepqciLjXsBvKyP1AAAgAElEQVQerfVerbUL+AgYVfgArfVqrfXJgrc/A6E3j1QhmzcfLTKPZ26uhw0bDhsYkRCiJgUicTYHCi9lmFSwrTR3At8Ueq+BJUqpjUqpCaUVUkpNUEptUEptSElJqVLAVXXmHIx2u4WWLY0f9SCEqBmBSJwlPdoqsf2vlLqU/MT5t0Kb+2mtuwNXAPcrpS4uqazWerrWuqfWumfjxo2rGnOVzJ17LZGRNqKiwnA6rQwY0JLRo7sYGpMIXVprjh/PltUHQkggnqonAS0KvY8DirVblVJdgRnAFVrr1D+2a60PF3w/ppSaR37T/8cAxFVt+vSJIyFhMuvWHaJ+fTv9+rWU8cuiRG63lyefXM6CBQnExkbyyiuX07Hj6T/8p07lcsUVc9m0KRmfT3PnnRfw1ltXSv/YIBeIGud6oK1Sqo1SygaMBuYXPkAp1RL4AhirtU4otN2plIr84zUwFNgegJiqXdOmEYwc2Z4BA1pJ0hSlmjDha159dS1btx5jyZLf6NNnJocOpfv333PP12zalIzL5cXj8fH++1t5993NBkYsyqPKiVNr7QEmAd8Cu4BPtNY7lFITlVITCw57AmgI/PeMbkcxwE9KqS3AOmCh1npxVWOqLr//fpKFCxPYudPYe6wiNGitmTt3m3/+V63za6ALFyb6j1mzJgmXy+t/n53tZuXK/TUeq6iYgHSA11ovAhadsW1aodd3AXeVUG4v0O3M7cHo/fe3cM89C7BazbjdXqZM6c8TT1xidFhBLfGbb1g4cSK5p04RP2QIo959l7DIujXD0JmtEaUUFsvp+krr1vVISkr3D9222820bSsTpwS7OjcDfGVkZOQxYcICcnI8pKfnkZPjYerUn9i9u9xdT+uco9u28en115N24AB56ekkLFjAF2PGGB1WjVJK8cADvXE4rED+zPGRkbYic7/OmDGSBg3CiYoKIzLSRocOjXnwwT5GhSzKSYZclsPRo1mYzUVrDjabmf3702jfvpFBUQW3vUuXFpmGzpuXx29LlhgYkTGmTh1MfHx9FixIpHnzSP7v/y6hQYNw//527RqSkDCZVasOEB5u5eKLW8mKBBW0f+VKDq9fT3TLlnS89toaGVEkibMc4uKiijSvANxuH506GdstqiZorUHrCv8whkVFYbJY8Lpc/m1WpzPQ4QU9pRT33NOTe+4pfTBKgwbhjBhhzCw/oW7Nyy/zw+OP4/N4MFmtbJ49m5vnz6/2Xgl1tqmutWbOnC3cfvuXPPnk8rP2obPbLSxcOIZ69cJwOKyEh1uYM+dq4uJCc72U8tBas3TKFJ6x2/lXWBjzbrsNr9tddsEC5918M1FxcVjCw0EprA4Hw155pRojFsHCnZNDzsmTZR9YRZ7cXJZOmYI7O9u/Vvv+5cvZ/2P192asszXORx75jmnTNpCV5SYszMxHH21n8+aJ2O0lfyT9+rXk6NFHSE7OoEkTJ+Hh1hqOuGZtmjGDda+/7q8x7vzsMyJiYxny73+Xq7zV4WDCpk1sfvddso8fJ37wYFr271+dIQuDaa1Z9uijrHnpJTCZiOnalVsXL662VQLy0tOLtYSUyUROamopJQKnTtY4XS4v//nPWrKy8mtQeXleDh/OYMmS385azmYz06pVvVqfNAESFiw4vf414MnJIXHRorOUKM7mdNJr0iQGPvmkJM06YNfnn7PujTfweTz4XC6ObtnCV+PHV9v1HI0bE92iRZHk6fN6ad6rV7Vd8w91MnF6PD5KmhUqJ6f8TdHaLqp5c0yWQrVvpYiMjTUuIBH0DqxahTsry//e53aT9PPP1XY9pRRjly4lpls3TBYLkc2aMWbhQqLiqn8OoTrZVHc4rFxySWtWrTpAXp4XpfL72116aRujQwsalzzxBLvmzcOVkQFaY7JYGPaf/xgdlghi9du0wRIejicnx78tqvnZ5vupunqtWnHPpk3Veo2S1Ll11f+Qmeni/vsXsWLFPuLiopg+fUSdeEpeETknT7L7q6/weTy0HT6cyGbNjA5JBDFPbi7vXnwxx3ftApMJpRS3r1hB024hMcYFKP98nHU2cQohAs/rdrPvhx9wZWbSol8/ImJijA6pQsqbOOtkU12UTmvNzk8/5fivv9KoY0c6XX99pfvEZaWkkJ2SQv34+FJXMBS1i9lq5ZyhQ40Oo9pJ4hRFfDV+PDs/+wx3djZWh4M933zDqFmzKnyelc8+y4qnnsJss2G22bht6VKann9+NUQsRM2rk0/VRclO7NnDjk8+yX8yqjXurCy2f/ghJ3//vULnSfr5Z1Y+8wzevDxcGRnkpKby4YgR1RS1EDVPEqfwyz11CpO1aB9Vk9VK7qlTFTrP0W3bim1LP3SoyPBLIUKZJE7h17hTJ6x2O/xxT7NgqGSjDh3OXvAMDdu1O32OAo5GjTDbZP15UTtI4hR+VoeD23/8kZiuXbE6ncR068b4H3/EGh5eduFCWl9yCd3vvBNLeDhh0dHYIiO56YsvqilqIWqedEcS1eb47t1kHjlCky5dqm28cm3x9de7mTTpGzIy8rjqqna8/fZVhIdbSU3N5s4757N27SFatYrm3XdHFVmzSASW9OMUIkRs3HiYiy9+l+zs/PlL7XYL117bkQ8+uIYLL3yHrVuP4nb7UArq1bOTmDiZhg0dBkddO5U3cUpTXQiDLVqUSG7u6XWHcnM9fP31bo4fz2b79mO43T4gf80ir1ezZk2SUaGKAtKPsww5OW7eeGMde/acZMCAltxyy3mydKsIqOhoOzabmdzc0zPmO5027HYLPl/RFqHPp/1LcQjjSI3zLNxuLwMGvMsTTyxn+vSNTJy4gAcfDNpFOEWIGjeuG02aOAkLM6MUhIdbePXVy4mMDOOee3rgdOYnSrvdQseOjbj44lYGRyzkHudZfPfdb1x77SdkZp7uf2ixmDh16m84ndK1pjQH16zh4KpVRDRtSuebbsJslRpSWU6dymXWrF84eTKHK65oy0UXtQDyh8D+73/bWLXqIOee24D77ruw1Mm2RdXJWPUAyM52F1ve1WRS5OZ6JHGWYtOMGSx+4AG8bjdmm40N06Zx+/LlRef2FMXUq2fnz3/uW2y7UopbbunKLbd0NSCqwNG+/DlwTebasRCdNNXPon//lpjNyt+X22Yzc/75MUVWKRSnaa35ZvJk3NnZ+Nxu3FlZHN2yhYSFC40OTdQQrTVZx475R5tprVn297/zr/Bw/hUWxifXXYcnN9fgKKtOEudZNGzoYNWqO+jdO45mzSIZMaIdixffKg+HSuF1uYoNq9Ra18gaMMJ4eenpzOrfn1datuSFJk34cvx4tsyezdr//Aefy4X2eklctIglf/mL0aFWmbSfytCxY2PWrLnT6DBCgiUsjNju3TmyefPpNdW1puWAAcYGJmrEokmTSN64EW9e/oqxOz/5hGPbthVduyo3l9++/daoEANGapwioG5esIC4Pn0w22xENG3KjV98QcO2bY0OS9SAg6tX+5MmgDs7G3dWFqbCcxQoRUQtWLsqIIlTKTVMKbVbKbVHKTWlhP1KKfVawf6tSqnu5S0rQktETAzjV67kH3l5PJyczLmXX250SKKG1I+PL7LipDksjHYjRhARE4PV6cTqcBAWGcnwN980MMrAqHJ3JKWUGUgAhgBJwHrgZq31zkLHDAcmA8OB3sB/tNa9y1O2JDLkMjRkHjnC52PGkLxxI1FxcVzz/vvEdu9edkERkk7u3cuMPn3w5uWhfT7qx8dzx+rVaJ+P3fPn483L45zLL6/2Bdyqoia7I/UC9mit9xZc+CNgFFA4+Y0C5uj8LP2zUqqeUioWaF2OsiIEaa2ZM3gwx3fvRns8pOzcyexLL2VyYiLOJk2MDk9Ug/rx8UxOTOTgqlWYbTZaXXyxfyrBrrfcYnB0gRWIpnpz4GCh90kF28pzTHnKihCUnZLCiT170B5Pke3Vuc62MJ49Opq2w4cTP3hwrZ5/NRCJs6S+OWe2/0s7pjxl80+g1ASl1Aal1IaUlJQKhihqmtXpRPt8RbZpn4+w6GiDIhIicAKROJOAFoXexwGHy3lMecoCoLWerrXuqbXu2bixzEcY7GxOJxc98ghWpxPInyS5Wc+etJKuSWXSWvPf/67nggumcdFFM1m6dK/RIYkzBOIe53qgrVKqDXAIGA2MOeOY+cCkgnuYvYE0rXWyUiqlHGVFiBr0zDPE9e7NofXrqdeqFd3GjSvy1FWU7I031jFlyjKys90AjBz5IcuW3Ubfvi3KKClqSpUTp9bao5SaBHwLmIFZWusdSqmJBfunAYvIf6K+B8gGxp+tbFVjEjXL5/Vy6vffsdjtRMXFFdnXfuRI2o8caVBkoemNN9b7kyZATo6HmTN/kcQZRAIyckhrvYj85Fh427RCrzVwf3nLitCRffw47w0cyKnff8fn89Fu+HCu/+STWjOZgxGs1qK1cqUgLEw+z2Ai7SZRJV9PmEBqQgLu7Gy8ubnsWbyY9f/9r9FhhbQnnrjEP1mxUuBwWLn//l4GRyUKk7HqokqSf/kFn/t0s9Kdnc2htWth8mQDowptN97YmaioMGbM2ITTaeORRy6iUyd5IBpMJHGKKmnUrh3pBw+ivflr5ljCw2nSpYvBUYW+YcPOZdiwc40OQ5RCmuqiSka88w4RTZsSFhWF1ekktkcP+jz0kNFhCVGtpMYpqiS6ZUsmJySQvGkTFrudphdcIA+GRK0niVNUmdXhoGX//lU6R8rOnWQfP05M167Y69ULUGRCVA9pqgPr1x9i5MgPueyy2cydu83ocOoUrTVfjh/P9J49+XDkSF5t04bDGzcaHZYwwJHNm3ntnHN42mrljfbtObYjeLt01/ka59atRxk4cLa/w/HatYfIznZx9909DI6sbkhcuJCdn36KJycHT04OAJ9cfz0P/v57mWWPbN7Mzs8+wxIezgXjxxPZrFl1hyuqSV5GBrMvu4zckycBSE1MZPbAgTx44ADW8OBb46vO1zjfeWdTkVEa2dlunn9+tYER1S2pCQlFujMBpB88WMrRp+1bvpxZ/fqx8tlnWfHkk/y3SxfSylFOBKeUHTv8PTMA0Bqvy0VqQoJxQZ1FnU+cJQu9teZDVUzXrpgKr7uuVLmW2ljy8MP5a9lojc/jIS89nZ9ffrkaIxXVKbxhQ7xn/AH1uFw4GjY0KKKzq/OJ8+67u/tHaUD+KI1HHulnYER1S/zgwfSaNAlzWBi2yEicTZpw07x5ABzbvp01r7zCppkzcWVlFSmXl55e5L32eskpaOaJwDq+ezfzxo7lf1ddxfaPPqqWazRs25auY8didTox22xYnU56TpxYbO6DYFHlpTOMEOilM9atO8RTT60gK8vFHXd0Z+zYrgE7tyifzKNHyTlxgvrx8VjCwtizeDGfXHcdPo8Hk8VCVFwcEzZuxBYRAcD3jz/Ozy+/7F9B0epwcMOnn9J2+HAj/xm1zsnff2dat264MjNBa6wOB0Oef54L7y9x6okq0VqTuHAhx3fvpknnzpw7bFjAr1GW8i6dIYlTBKVXW7cmbf9+/3tLeDiD//1vehcM5fR5vSydMoUts2djttm47OmnOX/8eKPCrbV++L//Y+UzzxS5/xjZrBl/PnSowuc68dtvpO3fT6MOHYL2QV5NrjkkRMDlnjpV5L0nN5fs48f9701mM0NfeIGhL7xQ06HVKdrrLTaTv++M9+Xx09SprHjqKcw2Gz63m2vef5+O114bqDBrXJ2/xymCU/yQIZjDwvzvLXY78YMHGxhR3XTemDFYHQ7/e6vDwYX33Vehcxz/9VdWPPUUnpwc8tLScGdnM2/sWNwF3c9CkSROEZRGzZrFOZdfjjksDHv9+lz11luy7IYBGnfqxLjvv6f1pZcS26MHl/3rX1z8j39U6Bwn9+4tceG2rKNHAxVmjZOmughKYZGR3PzVV0aHIYDmvXox7vvvK12+UceOeF2uIttMFgsRsbFVDc0wUuMUQlSr+m3acOVbb2Gx27FFRGCLimL0/PlYCt2KCTVS4xRCVJnWGu31YrKUnFLOHzeODldfTWZyMtEtWxa5b3omr8vFtw8/zK/z5mGPjmbYa68RP2hQdYVeKVLjFEJUybo33+RZh4N/hYXx3sCBpQ5EsEdH06hDh7MmTYBFkybxy8yZZBw6RMrOnXw0ciRHtmypjtArTRKnEKLSfv/+e5b+9a94cnPRPh9Ja9Ywb+zYKp1zxyef+Cd8AfDk5ZHw9ddVDTWgJHEKISpt34oVRboVeV0u9v/4Y5XOabHbi7w3WSxYnc4qnTPQJHEKISotomnTYonO0ahRlc45+Lnn/M15k8WCvV49ulWxFhto8nBICFFpF4wfz8a33+bkb7/5RxiNnDmzSuc8f/x4IuPi+PXLL3E0bEivyZOrnIwDTcaqC8P4PB6W//OfJHz9Nc6YGC5/+WWadO5sdFiigjx5eeyeP5+8tDRaDxxIg3NDd3VOGasugt7C++5j29y5+TMcKcXMvn25b8cOolu0MDo0UQGWsDA633CD0WHUKLnHKQyzZc4c/7RwaI3P7Q66p6ehRmsd0mPAQ4UkTmEIr9sNZ94mMplQsrRwpSUsXMjU6Giei4jgP/HxHN+92+iQaq0qJU6lVAOl1HdKqcSC7/VLOKaFUuoHpdQupdQOpdQDhfY9qZQ6pJTaXPAls9DWAZ68PGb160fh++vKZMLmdNLpuusMjCx0ndq3j89uvBFXRgba5+PUvn3MGTyYUHyGEQqqWuOcAizTWrcFlhW8P5MHeFhr3RHoA9yvlOpUaP8rWuvzC74WVTEeEQK2vv8+KTt2FFmkzepwcM8vvwTd09NQkbxpU9HhjlqTnZJC1rFjxgVVi1U1cY4CZhe8ng1cfeYBWutkrfWmgtcZwC6geRWvK0JY5pEjuHNzi2zTPh9RzeXHorIimjbFV3iVyALh9Ys1AkUAVDVxxmitkyE/QQJNznawUqo1cAGwttDmSUqprUqpWSU19QuVnaCU2qCU2pCSklLFsIWRWvbvj7VQp2mT1UqLiy4yMKLQF9e3Lx2vvRar04nV6cQSHs7wN94ocR5MUXVl9uNUSi0Fmpaw6zFgtta6XqFjT2qtS0x+SqkIYAXwjNb6i4JtMcBx8tfjfRqI1VrfUVbQ0o8z9K174w2W/OUv+Nxumvfqxc1ffy3N9CrSWvP799+Ttn8/sT160LRbN6NDCjk1slibUmo3MFBrnayUigWWa63bl3CcFVgAfKu1LnHx64La6AKtdZeyriuJs3bQBV2QpFYkgkV5E2dVm+rzgXEFr8cBxabsVkopYCaw68ykWZBs/3ANsL2K8YgQopSSpClCUlUT51RgiFIqERhS8B6lVDOl1B9PyPsBY4HLSuh29LxSaptSaitwKfBQFeMRQohqV6Uhl1rrVKDY1Mxa68PA8ILXPwGqlPLBNeWJEEKUg4wcEkKICpLEKYQQFSSJU9RaeRkZfHHrrbzaqhWz+vcnZdcuo0MKWe6cHFITEsjLyDA6lKAg08qJWuvDkSNJWrMGb14eaQcPMuuii5iUkICzcWOjQwsp+1as4MORI8Hnw+fxcNU779Dt1luNDstQUuMUtZIrM5ODP/2ENy8vf4PW+Lxe9i1fbmhcocaTm8tHI0fiSk/HlZmJJzeXBRMmcGr/fqNDM5QkTlErmazWErdbw8NrOJLQln7oULEx8GabjeN1/LaHJE5RK1nCwrjw/vv9i36Zw8KIbtGC+CFDDI4stETGxvrXEvqDKzOzzk9XJ4lT1FqXv/IKw998k27jxjHg73/nrrVrsYSFGR1WSLE6HFz93nuYC31u2uvlsxtvrNMTJctibUKEMK01afv3487OpkHbtiiTCU9ODraIiIBe583OnTm+c+fpDUrR8957ufLNNwN6HaPJYm1CVCOf18vhDRvw5OTQrGfPgCeq8sbw2ejRJC5ciMlsxmy340pPR/t8NGzfnlsXLyYqLs5//NGtWzm1bx9NunShfnx8ha6lz5zrU+vT60XVQdJUF6KCPHl5zB44kDmDBvHRqFG83rYtp/btq/E4Ns2YwZ5Fi/Dk5ODKzCTn+HG8Lhc+j4fjv/7KR6NG+Y/9/h//YGbfvswbO5a3zjuPLR98UKFr9bj7bv/9YgCLw8H548adpUTtJolTiApa9/rrHN64EXdWFnnp6WSlpPDVnXfWeBzJGzeWWuvTXi9HtmxBa82xHTtY8/LLuLOzyUtPx52dzYK778aVlVXua/X585+59KmnaNi+PTFdu3L9Rx/ReuDAAP1LQo801YWooJSdO/EUWoJXe72cSEys8TiadOmCJTy8SCyFhdevj1KKtP37MVutRY5TJhPZKSnYnM5yXUspRd+HH6bvww8HJPZQJzVOIQporTm4Zg27vvjirE3v5r16FWm2mqxWYrt3P+u5s1NTWfzgg3x87bVsePvtgHTn6XnvvbQaMACr04ktMhJzWJj/tdXh4JqC5niTLl3yl2MuxBwWRmSzZlWOoa6SGqcQ5CfNL8eNY9cXX2Aym/F5PFz/ySe0u/LKYsf2mDCB/T/+6D+2Xps2jHjnnVLPnZeRwfTu3clITsbndvPbt99yfNcuhr36apViNlut3LJ4Mce2b8ednU2TLl048NNPZB8/TlyfPjQ45xwAolu25Jo5c5h3220AWOx2blm0SCaRrgLpjiQEsHfZMj4aNQp3oft+tshIpqSlkb+IQXEZycl4cnKIbtUKk9lc6rm3f/wxX991F67MTP82k8XCY7m5Rcppnw9lqr5GoCcvj+yUFCKaNi26lLDwq6mlM4SoFdIOHCi2zZ2VheeMZYwLi4yNpX58/FmTJoDP7ebM6onW2j8iJzs1lXcvvpinrVaei4piy5w5FY6/PCxhYUTFxUnSDABJnKLW2fnZZ7zapg0vxsSwaPLkYvf3ShLbvTsUbn0pRXSrVljsdta89BIvx8XxcvPmrH7xRbTW7F22jJfj4njG4WD2pZeSfugQyZs2cXTbtmJDFM8ZOhSzxQIFNVdLeDjtR4zAXDCe/tMbbyTp55/RPh+ujAwW3nsvSWvXIoKXNNVFrbJ/5Uo+uPxy/xNkq8PBBXfeyRWvvVZm2U0zZrBo0iSUUoQ3asRtS5dycNUqvpk82d/tx+p00v/vf+enZ57xb1MWS34HdKsVrTWx3bszdskSLIXWjj++ezffTJ5MelIS8YMHM+T55/37/2W3n57FifyHTZc98wz9HnkkYJ+LKB8ZOSTqpN1fflmk2407O5udn35arsTZ/a676Dp2LLmnTuFs3BhlMrFg4sQifSXdWVlsnT3bX3sE0B4PXo/Hn/wOb9jAquef55InnvAf06h9e8YuWVLide316pF19Kj/vdlmkzlDg5w01UWtYouKKnYPz1qB4ZCWsDAiYmL8D2ns0dHFjgmLji71gRGAJyeHI5s3l/uaI2fMwOpwYAkPxxoRQaMOHehy883lLi9qniROUav0nDgRe4MG/vk4LeHhXP7yy5U+36VPPYXV6QSTCUwmrE4nV/73vzTp0gWr04myWFBmM6rQAyJLeDixPXqU+xrtrrqKu9atY+iLLzLynXe4c/VqmcUpyMk9TlHrZB07xqYZM8hLT6fD1VcT16dPlc6XmpDAlvffB63pOnYsjdq3x+tysXXuXDKPHKFJ584snTKF9IMH0T4fcX37MmbhwkonP1dWFtbw8GrtmiRKVt57nJI4hQiAPybWMFmtNGzX7qxN+dKc2r+fD4YN40RiImarlavefptuBZ3WRc2Qh0NC1CCTxUKTLl2qdI7/XXklJxIS0D4fHq+XBRMnEtOtG027dQtIjL9+9RWH1q6lfnw83caN83eHEhUniVOIIODzeEjZubNIX1KlFIfWrg1I4lz66KOse/113FlZWB0Ots2dy9ilS8vsvC9KJjdRhAgCJouFsMjIMzaaAjIRR15GBmteesk/nNSdnc3hDRs48NNPVT53XSWJU4ggcfWcOVjCw7FFRGCLiKD1wIG0HT68yud1Z2UVq1kqk4m89PQqn7uuqlJTXSnVAPgYaA3sA27UWp8s4bh9QAbgBTx/3Hwtb3kh6oIOo0YxcfNmktauJSImhvjBgwPyZN0ZE0P9+HiOJySgPZ78jUpVubdBXVbV/5UpwDKtdVtgWcH70lyqtT7/jCdWFSkvRK3XsF07uo0dyzlDhwasO5JSituWLaPVgAGERUfTuHNnxv3wg4xOqoIqdUdSSu0GBmqtk5VSscByrXX7Eo7bB/TUWh+vTPkzSXckIUR1qKlp5WK01skABd+blHKcBpYopTYqpSZUojxKqQlKqQ1KqQ0pKSlVDFsIISqvzHucSqmlQNMSdj1Wgev001ofVko1Ab5TSv2qtf6xAuXRWk8HpkN+jbMiZYUItDPXM5c+kXVLmYlTaz24tH1KqaNKqdhCTe1jpZzjcMH3Y0qpeUAv4EegXOWFCCY+r5fPbryRxEWLMFksOGNiGL9yJZGxsUaHJmpIVZvq84E/FlceB3x15gFKKadSKvKP18BQYHt5ywsRbDZOn86exYvx5Obiyswkbf9+5t9xR7nLe10uslNTA7JgmzBGVRPnVGCIUioRGFLwHqVUM6XUooJjYoCflFJbgHXAQq314rOVFyKYHdm0qcgcnT6Ph6Pbtp21jNaa3fPn8+GIETzjcPBSbCxvduhA2sGD1R2uqAZV6septU4FBpWw/TAwvOD1XqDEMWOllRcimDU57zwsDgeeP2aAN5tp1KHDWcssvO8+trz3nn8NI+31cuK33/j4mmuYID1EQo6MHBKignreey8t+/fH6nQSFhVFRGwso2bNKvX4U/v2FUmaf9BeL0e3bKnucEU1kEk+hKggs9XKrYsXc2zbNtw5OcR07Yo1PLzU43NOnsRss5W4YqZDOqGHJEmcQlSCUoqYrl3LdWyj9u0xh4Xlr1NU6IGQxeHg2rlzqytEUY2kqadRNqUAAASBSURBVC5ENbM6HNy+YgWNO3XCHBZGdMuWDHnpJSbt2kWbSy81OjxRCVLjFKIGNO7Ykfu2by/7QBESpMYphBAVJIlTCCEqSBKnEEJUkCROIYSoIEmcQghRQZI4hRCigiRxCiFEBUniFEKICpLEKYQQFSSJUwghKqhKq1waRSmVAuyvZPFGwPEyjzJOMMcXzLGBxFcVwRwb1Fx8rbTWZU5ZFZKJsyqUUhvKs/ynUYI5vmCODSS+qgjm2CD44pOmuhBCVJAkTiGEqKC6mDinGx1AGYI5vmCODSS+qgjm2CDI4qtz9ziFEKKq6mKNUwghqkQSpxBCVFCtT5xKqRuUUjuUUj6lVKndGZRSw5RSu5VSe5RSU2owvgZKqe+UUokF3+uXctw+pdQ2pdRmpVS1LsRd1meh8r1WsH+rUqp7dcZTifgGKqXSCj6rzUqpJ2owtllKqWNKqRLXyTDysytHbIZ9bgXXb6GU+kEptavgd/aBEo4x9GfPT2tdq7+AjkB7YDnQs5RjzMBvQDxgA7YAnWoovueBKQWvpwD/LuW4fUCjGoinzM8CGA58AyigD7C2Bv8/yxPfQGCBQT9vFwPdge2l7DfysysrNsM+t4LrxwLdC15HAgnB9LNX+KvW1zi11ru01rvLOKwXsEdrvVdr7QI+AkZVf3RQcJ3ZBa9nA1fX0HVLU57PYhQwR+f7GainlIoNovgMo7X+EThxlkMM++zKEZuhtNbJWutNBa8zgF1A8zMOM/Jnz6/WJ85yag4cLPQ+ieL/YdUlRmudDPk/OECTUo7TwBKl1Eal1IRqjKc8n4WRn1d5r91XKbVFKfWNUqpzzYRWLkZ+duURFJ+bUqo1cAGw9oxdQfH51YrlgZVSS4GmJex6TGv9VXlOUcK2gPXTOlt8FThNP631YaVUE+A7pdSvBTWIQCvPZ1Gtn1cZynPtTeSPOc5USg0HvgTaVntk5WPkZ1eWoPjclFIRwOfAg1rr9DN3l1Ckxj+/WpE4tdaDq3iKJKBFofdxwOEqntPvbPEppY4qpWK11skFTY5jpZzjcMH3Y0qpeeQ3WasjcZbns6jWz6sMZV678C+b1nqRUuq/SqlGWutgmMTCyM/urILhc1NKWclPmnO11l+UcEhQfH7SVM+3HmirlGqjlLIBo4H5NXTt+cC4gtfjgGI1ZKWUUykV+cdrYChQ4pPRACjPZzEfuK3gCWcfIO2P2w01oMz4lFJNlVKq4HUv8n/OU2sovrIY+dmdldGfW8G1ZwK79P+3b8coCANBAEW/V9DOo4gnSOcZbFJ4FjvP4A0EC3tLo1iJtXgEsYjFThFEwS1MUvwHQ0KysMMQJiyb1PXyy7B+1K+rHbS2ApiR3lIP4A5s4/oY2DTGFaRdvCtpid9WfiNgB1ziOHzPj7SDXEWc/53fp1oAJVDG+QBYxf0TX75W6DC/RdSpAvbApMXc1sANeMZzN+9L7X7IrbO6xfxT0rL7CBwiir7Urxn+cilJmVyqS1ImG6ckZbJxSlImG6ckZbJxSlImG6ckZbJxSlKmFxgEu2a2ti5uAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x, y = make_moons(n_samples=100, noise=0.1)\n", "\n", "y = y*2 - 1 # make y be -1 or 1\n", "\n", "plt.figure(figsize=(5,5))\n", "plt.scatter(x[:,0], x[:,1], c=y, s=20, cmap='jet')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# now we initialize the model\n", "# for demo purposes we initialize a 2, 16, 16, 1 model\n", "model = SimpleMLP(2, 1, [16, 16])\n", "\n", "#temporary fix to make last neuron nonlin = False\n", "for i, layer in enumerate(model.layers):\n", " if i == len(model.layers) - 1:\n", " for n in layer.neurons:\n", " n.nonlin = False" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SimpleMLP(\n", "Linear(ins:2 outs:16 num_parameters:48)\n", "Linear(ins:16 outs:16 num_parameters:272)\n", "Linear(ins:16 outs:1 num_parameters:17)\n", ")\n", "No of model parameters: 337\n" ] } ], "source": [ "model.summary()\n", "print(\"No of model parameters: \", len(model.parameters()))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "For epoch: 0, loss: 0.8862514464368222\n", "For epoch: 5, loss: 0.3039345997419534\n", "For epoch: 10, loss: 0.23570270563284787\n", "For epoch: 15, loss: 0.21692423765783492\n", "For epoch: 20, loss: 0.1520994943457478\n", "For epoch: 25, loss: 0.11578019365064655\n", "For epoch: 30, loss: 0.08059487803507807\n", "For epoch: 35, loss: 0.10226911924959595\n", "For epoch: 40, loss: 0.06718934359576106\n", "For epoch: 45, loss: 0.05021609346959929\n", "For epoch: 50, loss: 0.07339858866572174\n", "For epoch: 55, loss: 0.014531426535936509\n", "For epoch: 60, loss: 0.013640569867793939\n", "For epoch: 65, loss: 0.00821577637588291\n", "For epoch: 70, loss: 0.013711454799957803\n", "For epoch: 75, loss: 0.010083769334297063\n", "For epoch: 80, loss: 0.0035957132908880254\n", "For epoch: 85, loss: 0.00016450233490777455\n", "For epoch: 90, loss: 0.00042543722337187175\n", "For epoch: 95, loss: 0.0\n" ] } ], "source": [ "epochs = 100\n", "lr = 0.005\n", "\n", "# now we define the loss function and optimizers\n", "loss_fn = MaxMarginLoss\n", "optim = SimpleSGD(model.parameters(), lr=lr)\n", "\n", "X = [list(map(Tensor, _x)) for _x in x] #minor preprocessing\n", "losslist = [] #to store losses\n", "\n", "for i in range(epochs):\n", " \n", " preds = list(map(model, X))\n", " \n", " loss = loss_fn(preds, y)\n", " \n", " model.zero_grad()\n", " loss.backward()\n", " \n", " lr = 1.0 - .9*i/epochs #manually change lr because schedulers havent been implemented\n", " optim.lr = lr\n", " optim.step()\n", " \n", " if i%5 == 0:\n", " print(\"For epoch: {}, loss: {}\".format(i, loss.data))\n", " losslist.append(loss.data)\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.xlabel(\"epochs\")\n", "plt.ylabel(\"Loss\")\n", "plt.plot(losslist, range(len(losslist)))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#visualize decision boundary\n", "\n", "h = 0.25\n", "x_min, x_max = x[:, 0].min() - 1, x[:, 0].max() + 1\n", "y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1\n", "xx, yy = np.meshgrid(np.arange(x_min, x_max, h),\n", " np.arange(y_min, y_max, h))\n", "Xmesh = np.c_[xx.ravel(), yy.ravel()]\n", "inputs = [list(map(Tensor, xrow)) for xrow in Xmesh]\n", "scores = list(map(model, inputs))\n", "Z = np.array([s.data > 0 for s in scores])\n", "Z = Z.reshape(xx.shape)\n", "\n", "fig = plt.figure()\n", "plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral, alpha=0.8)\n", "plt.scatter(x[:, 0], x[:, 1], c=y, s=40, cmap=plt.cm.Spectral)\n", "plt.xlim(xx.min(), xx.max())\n", "plt.ylim(yy.min(), yy.max())\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }