diff --git a/README.md b/README.md index c4ca394..1d3d398 100644 --- a/README.md +++ b/README.md @@ -47,26 +47,23 @@ DeepTensor offers a hands-on implementation of deep learning fundamentals with a pip install deeptensor ``` -
- Interested in Setting up the project? - -
+--- - ```bash - git clone --recurse-submodules -j8 git@github.com:deependujha/DeepTensor.git - cd DeepTensor +## Setup the project for development - # run ctests - make ctest +```bash +git clone --recurse-submodules -j8 git@github.com:deependujha/DeepTensor.git +cd DeepTensor - # install python package in editable mode - pip install -e . - ``` +# run ctests +make ctest -
- -
+# install python package in editable mode +pip install -e . +# run pytest +make test +``` --- @@ -82,6 +79,8 @@ pip install deeptensor - [visit docs](https://deependujha.github.io/DeepTensor) +![loss curve](https://www.deependujha.xyz/deeptensor-assets/loss-curve.png) + --- ## Basic Usage @@ -154,10 +153,19 @@ opt.zero_grad() --- -## WIP +## Features expected to be added - Save & Load model -- Train MNIST model - Train a character-level transformer model - Add support for DDP -- Add support for CUDA execution +- Add support for CUDA execution ⭐️ + +--- + +## Open to Opportunities 🎅🏻🎁 + +I am actively seeking new opportunities to contribute to impactful projects in the deep learning and AI space. + +If you are interested in collaborating or have a position that aligns with my expertise, feel free to reach out! + +You can connect with me on [GitHub](https://github.com/deependujha), [X (formerly twitter)](https://x.com/deependu__), or email me: `deependujha21@gmail.com`. diff --git a/assets/loss-curve.png b/assets/loss-curve.png new file mode 100644 index 0000000..b2e6b5c Binary files /dev/null and b/assets/loss-curve.png differ diff --git a/demo/main.ipynb b/demo/main.ipynb index aecb802..6100c6e 100644 --- a/demo/main.ipynb +++ b/demo/main.ipynb @@ -22,7 +22,7 @@ "metadata": {}, "outputs": [], "source": [ - "from deeptensor import Value, Neuron, Layer, MLP" + "import deeptensor as dt" ] }, { @@ -43,7 +43,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -68,7 +68,7 @@ "\n", "X, y = make_moons(n_samples=100, noise=0.1)\n", "\n", - "y = y * 2 - 1 # make y be -1 or 1\n", + "# y = y * 2 - 1 # make y be -1 or 1\n", "# visualize in 2D\n", "plt.figure(figsize=(5, 5))\n", "plt.scatter(X[:, 0], X[:, 1], c=y, s=20, cmap=\"jet\")" @@ -78,287 +78,173 @@ "cell_type": "code", "execution_count": 5, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1,\n", + " 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0,\n", + " 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,\n", + " 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1,\n", + " 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "MLP of [Layer(2,16), Layer(16,16), Layer(16,1), ]\n", + "Model(\n", + "\tLinearLayer(2,16),\n", + "\tSigmoid(),\n", + "\tLinearLayer(16,16),\n", + "\tSigmoid(),\n", + "\tLinearLayer(16,1),\n", + "\tSigmoid(),\n", + ")\n", "number of parameters 337\n" ] } ], "source": [ "# initialize a model\n", - "model = MLP(2, [16, 16, 1]) # 2-layer neural network\n", + "seed = 42\n", + "\n", + "model = dt.Model(\n", + " [\n", + " dt.LinearLayer(2, 16, seed, \"XAVIER\", \"NORMAL\"),\n", + " dt.Sigmoid(),\n", + " dt.LinearLayer(16, 16, seed, \"XAVIER\", \"NORMAL\"),\n", + " dt.Sigmoid(),\n", + " dt.LinearLayer(16, 1, seed, \"XAVIER\", \"NORMAL\"),\n", + " dt.Sigmoid(),\n", + " ],\n", + " False, # using_cuda\n", + ")\n", "\n", - "print(model)\n", + "print(model) # noqa: T201\n", "\n", - "print(\"number of parameters\", len(model.parameters()))" + "print(\"number of parameters\", len(model.parameters())) # noqa: T201\n" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ - "# loss function\n", - "def my_loss_fn():\n", - " scores = []\n", - " for x in X:\n", - " inp = [Value(x[0]), Value(x[1])]\n", - " out = model(inp)\n", - " scores.append(out)\n", - "\n", - " # svm \"max-margin\" loss\n", - " losses = [(1 + (-yi * scorei[0])).relu() for yi, scorei in zip(y, scores)]\n", - "\n", - " data_loss = sum(losses) * (1.0 / len(losses))\n", - " # L2 regularization\n", - " alpha = 1e-4\n", - " reg_loss = alpha * sum(p * p for p in model.parameters())\n", - " total_loss = data_loss + reg_loss\n", - "\n", - " # Also get accuracy\n", - " accuracy = [(yi > 0) == (scorei[0].data > 0) for yi, scorei in zip(y, scores)]\n", - " return total_loss, sum(accuracy) / len(accuracy)" + "opt = dt.Adam(model, 0.001) # learning rate" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "step 0 loss 1.0149677744248524, accuracy 31.0%\n", - "step 1 loss 1.0146491536756554, accuracy 32.0%\n", - "step 2 loss 1.014328263417079, accuracy 32.0%\n", - "step 3 loss 1.014005036679022, accuracy 32.0%\n", - "step 4 loss 1.0136794047839923, accuracy 32.0%\n", - "step 5 loss 1.013351297284879, accuracy 34.0%\n", - "step 6 loss 1.013020641900118, accuracy 36.0%\n", - "step 7 loss 1.0126873644460734, accuracy 37.0%\n", - "step 8 loss 1.0123513887665345, accuracy 37.0%\n", - "step 9 loss 1.012012636659147, accuracy 41.0%\n", - "step 10 loss 1.0116710277986567, accuracy 43.0%\n", - "step 11 loss 1.011326479656768, accuracy 44.0%\n", - "step 12 loss 1.0109789074184616, accuracy 44.0%\n", - "step 13 loss 1.0106282238945783, accuracy 45.0%\n", - "step 14 loss 1.0102743394304783, accuracy 45.0%\n", - "step 15 loss 1.009917161810555, accuracy 45.0%\n", - "step 16 loss 1.0095565961583983, accuracy 49.0%\n", - "step 17 loss 1.0091925448323569, accuracy 54.0%\n", - "step 18 loss 1.0088249073162543, accuracy 56.99999999999999%\n", - "step 19 loss 1.008453580105006, accuracy 57.99999999999999%\n", - "step 20 loss 1.0080784565848284, accuracy 57.99999999999999%\n", - "step 21 loss 1.007699426907771, accuracy 59.0%\n", - "step 22 loss 1.0073163778602257, accuracy 60.0%\n", - "step 23 loss 1.0069291927250896, accuracy 60.0%\n", - "step 24 loss 1.0065377511372133, accuracy 62.0%\n", - "step 25 loss 1.0061419289317513, accuracy 64.0%\n", - "step 26 loss 1.005741597984994, accuracy 64.0%\n", - "step 27 loss 1.0053366260472603, accuracy 64.0%\n", - "step 28 loss 1.0049268765673642, accuracy 64.0%\n", - "step 29 loss 1.0045122085081681, accuracy 65.0%\n", - "step 30 loss 1.0040924761526768, accuracy 65.0%\n", - "step 31 loss 1.0036675289001151, accuracy 65.0%\n", - "step 32 loss 1.0032372110513634, accuracy 65.0%\n", - "step 33 loss 1.0028013615831075, accuracy 65.0%\n", - "step 34 loss 1.0023598139100016, accuracy 65.0%\n", - "step 35 loss 1.0019123956340827, accuracy 65.0%\n", - "step 36 loss 1.0014589282806463, accuracy 65.0%\n", - "step 37 loss 1.0009992270197177, accuracy 65.0%\n", - "step 38 loss 1.000533100372178, accuracy 65.0%\n", - "step 39 loss 1.0000603498995706, accuracy 65.0%\n", - "step 40 loss 0.9995807698764999, accuracy 65.0%\n", - "step 41 loss 0.9990941469444874, accuracy 65.0%\n", - "step 42 loss 0.9986002597460293, accuracy 66.0%\n", - "step 43 loss 0.9980988785375381, accuracy 67.0%\n", - "step 44 loss 0.9975897647797203, accuracy 67.0%\n", - "step 45 loss 0.9970726707038423, accuracy 67.0%\n", - "step 46 loss 0.99654733885221, accuracy 67.0%\n", - "step 47 loss 0.9960135015910573, accuracy 67.0%\n", - "step 48 loss 0.9954708805938862, accuracy 68.0%\n", - "step 49 loss 0.9949191862931428, accuracy 69.0%\n", - "step 50 loss 0.9943581172979468, accuracy 69.0%\n", - "step 51 loss 0.9937873597753852, accuracy 69.0%\n", - "step 52 loss 0.9932065867926972, accuracy 69.0%\n", - "step 53 loss 0.9926154576174072, accuracy 69.0%\n", - "step 54 loss 0.9920136169722624, accuracy 69.0%\n", - "step 55 loss 0.9914006942415144, accuracy 69.0%\n", - "step 56 loss 0.9907763026247914, accuracy 69.0%\n", - "step 57 loss 0.9901400382344926, accuracy 69.0%\n", - "step 58 loss 0.9894914791322409, accuracy 69.0%\n", - "step 59 loss 0.9888301842995357, accuracy 69.0%\n", - "step 60 loss 0.9881556925373186, accuracy 69.0%\n", - "step 61 loss 0.987467521288627, accuracy 69.0%\n", - "step 62 loss 0.9867651653780073, accuracy 69.0%\n", - "step 63 loss 0.986048095660734, accuracy 69.0%\n", - "step 64 loss 0.9853157575742045, accuracy 69.0%\n", - "step 65 loss 0.984567569583141, accuracy 70.0%\n", - "step 66 loss 0.9838029215094062, accuracy 70.0%\n", - "step 67 loss 0.9830211727363135, accuracy 70.0%\n", - "step 68 loss 0.9822216502762657, accuracy 70.0%\n", - "step 69 loss 0.9814036466894632, accuracy 70.0%\n", - "step 70 loss 0.9805664178400652, accuracy 70.0%\n", - "step 71 loss 0.9797091804748332, accuracy 71.0%\n", - "step 72 loss 0.9788311096076139, accuracy 71.0%\n", - "step 73 loss 0.9779313356912716, accuracy 71.0%\n", - "step 74 loss 0.9770089415566171, accuracy 73.0%\n", - "step 75 loss 0.9760629590956229, accuracy 73.0%\n", - "step 76 loss 0.9750923656636465, accuracy 73.0%\n", - "step 77 loss 0.9740960801724768, accuracy 75.0%\n", - "step 78 loss 0.9730729588427558, accuracy 75.0%\n", - "step 79 loss 0.9720217905805967, accuracy 75.0%\n", - "step 80 loss 0.9709412919390372, accuracy 75.0%\n", - "step 81 loss 0.9698301016201447, accuracy 75.0%\n", - "step 82 loss 0.9686867744681686, accuracy 75.0%\n", - "step 83 loss 0.9675097748978975, accuracy 75.0%\n", - "step 84 loss 0.9662974696952761, accuracy 75.0%\n", - "step 85 loss 0.9650481201191832, accuracy 75.0%\n", - "step 86 loss 0.9637598732239292, accuracy 75.0%\n", - "step 87 loss 0.962430752311274, accuracy 77.0%\n", - "step 88 loss 0.9610586464083586, accuracy 77.0%\n", - "step 89 loss 0.9596412986536245, accuracy 77.0%\n", - "step 90 loss 0.9581762934561873, accuracy 77.0%\n", - "step 91 loss 0.9566610422748819, accuracy 77.0%\n", - "step 92 loss 0.9550927678407409, accuracy 77.0%\n", - "step 93 loss 0.9534684866205307, accuracy 78.0%\n", - "step 94 loss 0.9517849892883301, accuracy 78.0%\n", - "step 95 loss 0.9500388189362114, accuracy 79.0%\n", - "step 96 loss 0.9482262467128325, accuracy 79.0%\n", - "step 97 loss 0.9463432445288418, accuracy 79.0%\n", - "step 98 loss 0.9443854544089829, accuracy 79.0%\n", - "step 99 loss 0.9423481540006466, accuracy 79.0%\n", - "step 100 loss 0.9402262176650882, accuracy 79.0%\n", - "step 101 loss 0.9380140724777002, accuracy 80.0%\n", - "step 102 loss 0.9357056483438766, accuracy 81.0%\n", - "step 103 loss 0.9332943212928142, accuracy 81.0%\n", - "step 104 loss 0.9307728488371687, accuracy 81.0%\n", - "step 105 loss 0.9281332960749442, accuracy 81.0%\n", - "step 106 loss 0.9253669509521034, accuracy 82.0%\n", - "step 107 loss 0.9224642267888399, accuracy 81.0%\n", - "step 108 loss 0.9194145497845001, accuracy 81.0%\n", - "step 109 loss 0.9162062287370092, accuracy 80.0%\n", - "step 110 loss 0.9128263036179247, accuracy 80.0%\n", - "step 111 loss 0.909260368902405, accuracy 79.0%\n", - "step 112 loss 0.905492366622936, accuracy 80.0%\n", - "step 113 loss 0.9015043429423486, accuracy 80.0%\n", - "step 114 loss 0.8972761605533798, accuracy 80.0%\n", - "step 115 loss 0.8927851573128065, accuracy 81.0%\n", - "step 116 loss 0.8880057390792524, accuracy 81.0%\n", - "step 117 loss 0.8829088915709628, accuracy 81.0%\n", - "step 118 loss 0.8774615919561811, accuracy 81.0%\n", - "step 119 loss 0.871626095508995, accuracy 81.0%\n", - "step 120 loss 0.8653590655581226, accuracy 80.0%\n", - "step 121 loss 0.8588007396353539, accuracy 80.0%\n", - "step 122 loss 0.8535343937353804, accuracy 80.0%\n", - "step 123 loss 0.8479117944202118, accuracy 80.0%\n", - "step 124 loss 0.8418950426258527, accuracy 81.0%\n", - "step 125 loss 0.8355235087735757, accuracy 81.0%\n", - "step 126 loss 0.829829225952095, accuracy 81.0%\n", - "step 127 loss 0.8253100964977153, accuracy 81.0%\n", - "step 128 loss 0.8212084915894701, accuracy 82.0%\n", - "step 129 loss 0.8168809578948766, accuracy 83.0%\n", - "step 130 loss 0.8123076123468286, accuracy 84.0%\n", - "step 131 loss 0.8074661725032832, accuracy 84.0%\n", - "step 132 loss 0.8026390084882177, accuracy 84.0%\n", - "step 133 loss 0.7986983510904601, accuracy 84.0%\n", - "step 134 loss 0.794551904265367, accuracy 83.0%\n", - "step 135 loss 0.7901823038622178, accuracy 82.0%\n", - "step 136 loss 0.7857506388688118, accuracy 82.0%\n", - "step 137 loss 0.7815894288604248, accuracy 82.0%\n", - "step 138 loss 0.7772064466612005, accuracy 82.0%\n", - "step 139 loss 0.7725825160805462, accuracy 82.0%\n", - "step 140 loss 0.7678389079315645, accuracy 81.0%\n", - "step 141 loss 0.7637232997572104, accuracy 81.0%\n", - "step 142 loss 0.7598248488903392, accuracy 81.0%\n", - "step 143 loss 0.7557345645729662, accuracy 81.0%\n", - "step 144 loss 0.7516495391116718, accuracy 82.0%\n", - "step 145 loss 0.747768703818936, accuracy 82.0%\n", - "step 146 loss 0.7436993408348554, accuracy 82.0%\n", - "step 147 loss 0.73980538118159, accuracy 82.0%\n", - "step 148 loss 0.7368013037414524, accuracy 82.0%\n", - "step 149 loss 0.7344567000796304, accuracy 82.0%\n", - "step 150 loss 0.73203960694817, accuracy 82.0%\n", - "step 151 loss 0.7295458659117388, accuracy 82.0%\n", - "step 152 loss 0.7269709906279799, accuracy 82.0%\n", - "step 153 loss 0.7243101336157328, accuracy 82.0%\n", - "step 154 loss 0.7215580488748162, accuracy 82.0%\n", - "step 155 loss 0.718709049737698, accuracy 82.0%\n", - "step 156 loss 0.7157569612250085, accuracy 82.0%\n", - "step 157 loss 0.7127764751214944, accuracy 82.0%\n", - "step 158 loss 0.7102338882129832, accuracy 82.0%\n", - "step 159 loss 0.7076133996825557, accuracy 82.0%\n", - "step 160 loss 0.7050311687842696, accuracy 82.0%\n", - "step 161 loss 0.7027599215246706, accuracy 82.0%\n", - "step 162 loss 0.7008643785517125, accuracy 82.0%\n", - "step 163 loss 0.6992026521935297, accuracy 82.0%\n", - "step 164 loss 0.6975133371832307, accuracy 82.0%\n", - "step 165 loss 0.6957954046975642, accuracy 82.0%\n", - "step 166 loss 0.6940477730508385, accuracy 82.0%\n", - "step 167 loss 0.6922693042327266, accuracy 82.0%\n", - "step 168 loss 0.6904588001704128, accuracy 82.0%\n", - "step 169 loss 0.6886149986891497, accuracy 82.0%\n", - "step 170 loss 0.6869030334521615, accuracy 82.0%\n", - "step 171 loss 0.685303803273855, accuracy 82.0%\n", - "step 172 loss 0.6836814648054732, accuracy 82.0%\n", - "step 173 loss 0.6820352281037699, accuracy 82.0%\n", - "step 174 loss 0.6803642656998867, accuracy 82.0%\n", - "step 175 loss 0.6786677103235798, accuracy 82.0%\n", - "step 176 loss 0.6769446524597722, accuracy 82.0%\n", - "step 177 loss 0.6751941377228486, accuracy 82.0%\n", - "step 178 loss 0.6734151640326411, accuracy 82.0%\n", - "step 179 loss 0.6716066785744327, accuracy 82.0%\n", - "step 180 loss 0.6697675745234747, accuracy 82.0%\n", - "step 181 loss 0.667896687512475, accuracy 82.0%\n", - "step 182 loss 0.6659927918182417, accuracy 82.0%\n", - "step 183 loss 0.6640545962411087, accuracy 82.0%\n", - "step 184 loss 0.6620807396479023, accuracy 82.0%\n", - "step 185 loss 0.6600697861459912, accuracy 82.0%\n", - "step 186 loss 0.6581130467370793, accuracy 82.0%\n", - "step 187 loss 0.6563223073749013, accuracy 82.0%\n", - "step 188 loss 0.6545036103551851, accuracy 82.0%\n", - "step 189 loss 0.6526559384972113, accuracy 82.0%\n", - "step 190 loss 0.6507782229751968, accuracy 82.0%\n", - "step 191 loss 0.6488693399721143, accuracy 82.0%\n", - "step 192 loss 0.6469281070698264, accuracy 82.0%\n", - "step 193 loss 0.6450243210299713, accuracy 82.0%\n", - "step 194 loss 0.6432979423552997, accuracy 82.0%\n", - "step 195 loss 0.6417835184020173, accuracy 82.0%\n", - "step 196 loss 0.6402543873072676, accuracy 82.0%\n", - "step 197 loss 0.6387101556452905, accuracy 82.0%\n", - "step 198 loss 0.6371504147485543, accuracy 82.0%\n", - "step 199 loss 0.6355747399462016, accuracy 82.0%\n" + "Epoch 0 ;\tAvg Loss: 0.709918 ;\t Accuray: 50.0\n", + "Epoch 1 ;\tAvg Loss: 0.690839 ;\t Accuray: 50.0\n", + "Epoch 2 ;\tAvg Loss: 0.679926 ;\t Accuray: 57.0\n", + "Epoch 3 ;\tAvg Loss: 0.669258 ;\t Accuray: 77.0\n", + "Epoch 4 ;\tAvg Loss: 0.656656 ;\t Accuray: 77.0\n", + "Epoch 5 ;\tAvg Loss: 0.641212 ;\t Accuray: 79.0\n", + "Epoch 6 ;\tAvg Loss: 0.622454 ;\t Accuray: 80.0\n", + "Epoch 7 ;\tAvg Loss: 0.600223 ;\t Accuray: 81.0\n", + "Epoch 8 ;\tAvg Loss: 0.574744 ;\t Accuray: 82.0\n", + "Epoch 9 ;\tAvg Loss: 0.546732 ;\t Accuray: 82.0\n", + "Epoch 10 ;\tAvg Loss: 0.517432 ;\t Accuray: 82.0\n", + "Epoch 11 ;\tAvg Loss: 0.488451 ;\t Accuray: 82.0\n", + "Epoch 12 ;\tAvg Loss: 0.461336 ;\t Accuray: 83.0\n", + "Epoch 13 ;\tAvg Loss: 0.437159 ;\t Accuray: 84.0\n", + "Epoch 14 ;\tAvg Loss: 0.416361 ;\t Accuray: 85.0\n", + "Epoch 15 ;\tAvg Loss: 0.398885 ;\t Accuray: 85.0\n", + "Epoch 16 ;\tAvg Loss: 0.384381 ;\t Accuray: 85.0\n", + "Epoch 17 ;\tAvg Loss: 0.372387 ;\t Accuray: 85.0\n", + "Epoch 18 ;\tAvg Loss: 0.362439 ;\t Accuray: 85.0\n", + "Epoch 19 ;\tAvg Loss: 0.354131 ;\t Accuray: 85.0\n", + "Epoch 20 ;\tAvg Loss: 0.347127 ;\t Accuray: 85.0\n", + "Epoch 21 ;\tAvg Loss: 0.341162 ;\t Accuray: 85.0\n", + "Epoch 22 ;\tAvg Loss: 0.33603 ;\t Accuray: 85.0\n", + "Epoch 23 ;\tAvg Loss: 0.331575 ;\t Accuray: 85.0\n", + "Epoch 24 ;\tAvg Loss: 0.327675 ;\t Accuray: 85.0\n", + "Epoch 25 ;\tAvg Loss: 0.324236 ;\t Accuray: 85.0\n", + "Epoch 26 ;\tAvg Loss: 0.321188 ;\t Accuray: 85.0\n", + "Epoch 27 ;\tAvg Loss: 0.318471 ;\t Accuray: 85.0\n", + "Epoch 28 ;\tAvg Loss: 0.316042 ;\t Accuray: 86.0\n", + "Epoch 29 ;\tAvg Loss: 0.313863 ;\t Accuray: 86.0\n", + "Epoch 30 ;\tAvg Loss: 0.311905 ;\t Accuray: 86.0\n", + "Epoch 31 ;\tAvg Loss: 0.310141 ;\t Accuray: 86.0\n", + "Epoch 32 ;\tAvg Loss: 0.308552 ;\t Accuray: 86.0\n", + "Epoch 33 ;\tAvg Loss: 0.307119 ;\t Accuray: 86.0\n", + "Epoch 34 ;\tAvg Loss: 0.305825 ;\t Accuray: 86.0\n", + "Epoch 35 ;\tAvg Loss: 0.304657 ;\t Accuray: 86.0\n", + "Epoch 36 ;\tAvg Loss: 0.303602 ;\t Accuray: 86.0\n", + "Epoch 37 ;\tAvg Loss: 0.302649 ;\t Accuray: 86.0\n", + "Epoch 38 ;\tAvg Loss: 0.301788 ;\t Accuray: 86.0\n", + "Epoch 39 ;\tAvg Loss: 0.30101 ;\t Accuray: 86.0\n", + "Epoch 40 ;\tAvg Loss: 0.300306 ;\t Accuray: 86.0\n", + "Epoch 41 ;\tAvg Loss: 0.29967 ;\t Accuray: 86.0\n", + "Epoch 42 ;\tAvg Loss: 0.299094 ;\t Accuray: 86.0\n", + "Epoch 43 ;\tAvg Loss: 0.298572 ;\t Accuray: 87.0\n", + "Epoch 44 ;\tAvg Loss: 0.298099 ;\t Accuray: 87.0\n", + "Epoch 45 ;\tAvg Loss: 0.297671 ;\t Accuray: 87.0\n", + "Epoch 46 ;\tAvg Loss: 0.297281 ;\t Accuray: 87.0\n", + "Epoch 47 ;\tAvg Loss: 0.296927 ;\t Accuray: 87.0\n", + "Epoch 48 ;\tAvg Loss: 0.296605 ;\t Accuray: 87.0\n", + "Epoch 49 ;\tAvg Loss: 0.296311 ;\t Accuray: 87.0\n" ] } ], "source": [ - "# optimization\n", - "for k in range(200):\n", - " # forward\n", - " total_loss, acc = my_loss_fn()\n", + "avg_loss_progression = []\n", + "for epochs in range(50):\n", + " total_loss = 0\n", + " accuracy = 0\n", + " for i in range(len(X)):\n", + " curr_input = dt.Tensor([2])\n", + " for j in range(len(X[i])):\n", + " curr_input.set(j, dt.Value(X[i][j]))\n", "\n", - " # backward\n", - " model.zero_grad()\n", - " total_loss.backward()\n", + " y_pred = model(curr_input)\n", "\n", - " # update (sgd)\n", - " learning_rate = 0.01\n", - " for p in model.parameters():\n", - " p.data -= learning_rate * p.grad\n", + " predicted = int(y_pred.get(0).data > 0.5)\n", + " if predicted == y[i]:\n", + " accuracy += 1\n", + " loss = dt.binary_cross_entropy(y_pred, y[i])\n", + " total_loss += loss.data\n", "\n", - " if k % 1 == 0:\n", - " print(f\"step {k} loss {total_loss.data}, accuracy {acc*100}%\")" + " # backprop\n", + " opt.zero_grad()\n", + " loss.backward()\n", + " opt.step()\n", + "\n", + " del curr_input\n", + "\n", + " avg_loss = round(total_loss / len(X), 6)\n", + " avg_loss_progression.append(avg_loss)\n", + " acc_percent = round(((accuracy / len(X)) * 100), 6)\n", + " print(\"Epoch\", epochs, \";\\tAvg Loss:\", avg_loss, \";\\t Accuray: \", acc_percent) # noqa: T201\n" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -367,13 +253,13 @@ "(-1.548639298268643, 1.951360701731357)" ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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ObydoUeRpUQHS8nordwiGg0xi84zZszANddcg7vvvht79+7Fzp07ce+99+K2227rX2nU0NCA6dOnY+/evQCAmpoa/PCHP8T+/ftx5swZvPLKK7j99tuxcuVKzJkzJ1ZNJSIaNo0uupU2wVbutJ3wwOeIsjqtArQcHoVNHIkSSEz7/f7yl79g+vTpuPLKK3HddddhxYoVeOKJJ/pv93q9qKqq6l9NpNfr8fbbb+Pqq6/G9OnT8cADD+DTn/40Xn311Vg2k4ho2LJnGyJ+giZlyTBlD50X4mzzD2vfJMXDMvxEF4ppkbqMjIywBelKS0shxMB/yuLiYmzfvj2WTSIiGhWFlyah6QNX2CK0k1Yn91fqvZDWKIWvXnshCTDlcicXogtxxhUR0Qgk52hR+SUzJC0G96L0fqqWXGFC3sLg8/EyZ+ij73kRQMGy2E/QJVITxnkiohHKnGHAsn/NQNMeF9qqPBB+gdRiHQqWJSG1IPTHq8GsQf5iI5o+cEXsgcmYrkd25ci2FSBKVAwvREQXwWDWoPSqZJRelTys+02+MQWebgVtxz0DRecuIOmAokuSUHZ1MiSZZfiJLsTwQkQ0DjQ6CZXrzOiq9aLpAxec7X5otBJSCrSwlOmQVqGHlnsHEQXF8EJENE4kSUJauX7Eu00TTVScsEtERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqErPw8uMf/xiXXHIJTCYT0tLSorqPEAIPPfQQ8vPzkZSUhDVr1uDUqVOxaiIRERGpUMzCi8fjwS233IJvfOMbUd/nZz/7GX7961/j8ccfx549e5CcnIy1a9fC5XLFqplERESkMtpYPfDDDz8MAHjqqaeiOl4IgUcffRTf+9738MlPfhIA8PTTTyM3NxcvvfQSbrvttlg1lYiIiFQkbua81NbWwmq1Ys2aNf3XWSwWLF26FLt37w55P7fbDZvNNuhCREREiStuwovVagUA5ObmDro+Nze3/7ZgNm7cCIvF0n8pLi6OaTuJiIhofA0rvDz44IOQJCns5cSJE7Fqa1AbNmxAV1dX/6W+vn5Mn5+IiIjG1rDmvDzwwAO44447wh5TXl4+oobk5eUBAJqbm5Gfn99/fXNzM+bNmxfyfgaDAQaDYUTPSUREROozrPCSnZ2N7OzsmDSkrKwMeXl52LJlS39Ysdls2LNnz7BWLBEREVFii9mcl7q6Ohw8eBB1dXXw+/04ePAgDh48iJ6env5jpk+fjhdffBEAIEkS7r//fvzoRz/CK6+8gsOHD+P2229HQUEBbrrpplg1k4iIiFQmZkulH3roIfz3f/93/8/z588HAGzduhWrVq0CAFRVVaGrq6v/mO985zuw2+346le/is7OTqxYsQKbNm2C0WiMVTOJiIhIZSQhhBjvRowmm80Gi8WCx/b9L5JSkse7OURERBQFZ48d9yz6DLq6umA2m8MeGzdLpYmIiIiiwfBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKrC8EJERESqwvBCREREqsLwQkRERKoSs/Dy4x//GJdccglMJhPS0tKius8dd9wBSZIGXa655ppYNZGIiIhUSBurB/Z4PLjllluwfPly/Nd//VfU97vmmmvw5JNP9v9sMBhi0TwiIiJSqZiFl4cffhgA8NRTTw3rfgaDAXl5eTFoERERESWCuJvzsm3bNuTk5GDatGn4xje+gba2trDHu91u2Gy2QRciIiJKXHEVXq655ho8/fTT2LJlC376059i+/btuPbaa+H3+0PeZ+PG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", "text/plain": [ "
" ] @@ -390,9 +276,15 @@ "y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n", "xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n", "Xmesh = np.c_[xx.ravel(), yy.ravel()]\n", - "inputs = [list(map(Value, xrow)) for xrow in Xmesh]\n", + "# inputs = [list(map(dt.Value, xrow)) for xrow in Xmesh]\n", + "inputs = []\n", + "for xrow in Xmesh:\n", + " new_inp = dt.Tensor([len(xrow)])\n", + " for idx, _x in enumerate(xrow):\n", + " new_inp.set(idx, dt.Value(_x))\n", + " inputs.append(new_inp)\n", "scores = list(map(model, inputs))\n", - "Z = np.array([s[0].data > 0 for s in scores])\n", + "Z = np.array([s.get(0).data > 0.5 for s in scores])\n", "Z = Z.reshape(xx.shape)\n", "\n", "fig = plt.figure()\n", diff --git a/demo/roboflow-demo.ipynb b/demo/roboflow-demo.ipynb index 3801e03..0f4cdcc 100644 --- a/demo/roboflow-demo.ipynb +++ b/demo/roboflow-demo.ipynb @@ -61,16 +61,16 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'0.4.0'" + "'0.5.0'" ] }, - "execution_count": 2, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -109,7 +109,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -134,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -190,13 +190,12 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "## helper functions to print tensor\n", "\n", - "\n", "def print_one_d_tensor(t):\n", " print(\"[\") # noqa: T201\n", " for i in range(t.shape[0]):\n", @@ -224,7 +223,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -298,7 +297,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -353,7 +352,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -408,7 +407,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -423,7 +422,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -432,7 +431,7 @@ "((569, 30), (569,), array(['malignant', 'benign'], dtype='