From 918c9e150e5c764a14b97a936f3361b8a7f2012e Mon Sep 17 00:00:00 2001 From: Eduardo Cueto Mendoza Date: Mon, 27 Apr 2020 13:53:55 -0600 Subject: [PATCH] [ADD] doing NN in numpy --- Numpy_NN.ipynb | 196 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 Numpy_NN.ipynb diff --git a/Numpy_NN.ipynb b/Numpy_NN.ipynb new file mode 100644 index 0000000..82a47f9 --- /dev/null +++ b/Numpy_NN.ipynb @@ -0,0 +1,196 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import sklearn.datasets" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "X,y = sklearn.datasets.make_moons(200,noise=0.15)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "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.scatter(X[:,0],X[:,1],c=y)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(200, 2)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Hyperparameters\n", + "input_neurons = 2\n", + "output_neurons = 2\n", + "samples = X.shape[0]\n", + "learning_rate = 0.001\n", + "lambda_reg = 0.01\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model_dic = {'W1': W1, 'b1': b1,'W2': W2, 'b2': b2}" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def retrieve(model_dict):\n", + " W1 = model_dic['W1']\n", + " b1 = model_dic['b1']\n", + " W2 = model_dic['W2']\n", + " b2 = model_dic['b2']\n", + " return W1,b1,W2,b2\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def forward(x, model_dict):\n", + " W1,b1,W2,b2 = retrieve(model_dict)\n", + " z1 = x.dot(W1) + b1\n", + " a1 = np.tanh(z1)\n", + " z2 = a1.dot(W2) + b2\n", + " a2 = np.tanh(z2)\n", + " exp_scores = np.exp(a2)\n", + " softmax = exp_scores / np.sum(exp_scores, dim=1, keepdims=True)\n", + " return softmax\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "def loss(softmax, y):\n", + " W1,b1,W2,b2 = retrieve(model_dict)\n", + " m = np.zeros(200)\n", + " for i,correct_index in enumerate(y):\n", + " predicted = softmax[i][correct_index]\n", + " m[i] = predicted\n", + " log_prob = -np.log(predicted)\n", + " softmax_loss = np.sum(log_prob)\n", + " reg_loss = lambda_reg / 2*(np.sum(np.square(W1)) + np.sum(np.square(W2)))\n", + " loss = softmax_loss + reg_loss\n", + " return float(loss/y.shape[0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "softmax = np.random.randn(200,2)\n" + ] + } + ], + "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 +}