{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import sklearn.datasets" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "X,y = sklearn.datasets.make_moons(200,noise=0.15)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "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": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(200, 2)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.shape" ] }, { "cell_type": "code", "execution_count": 6, "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": 7, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'W1' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmodel_dic\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'W1'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mW1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'b1'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mb1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'W2'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mW2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'b2'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mb2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'W1' is not defined" ] } ], "source": [ "model_dic = {'W1': W1, 'b1': b1,'W2': W2, 'b2': b2}" ] }, { "cell_type": "code", "execution_count": null, "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": 12, "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 z1,a1,softmax\n", " " ] }, { "cell_type": "code", "execution_count": 13, "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": 10, "metadata": {}, "outputs": [], "source": [ "def predict(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 np.argmax(softmax, axis=1)\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def backpropagation(x,y,model_dict,epochs):\n", " for i in range(epochs):\n", " W1,b1,W2,b2 = retrieve(model_dict)\n", " z1,a1,probs = forward(x,model_dict)\n", " delta3 = np.copy(probs)\n", " delta3[range(x.shaape[0]),y] -= 1\n", " dW2 = (a1.T).dot(delta3)\n", " db2 = np.sum(delta3,axis=0,keepdims=True)\n", " delta2 = delta3.dot(W2.T) * (1-np.power(np.tanh(z1),2))\n", " dW1 = np.dot(x.T,delta2)\n", " db1 = np.sum(delta2,axis=0,keepdims=True)\n", " # Add regularization terms\n", " dW2 += lambda_reg * np.sum(W2)\n", " dW1 += lambda_reg * np.sum(W1)\n", " # Update weights\n", " W1 += -learning_rate * dW1\n", " b1 += -learning_rate * db1\n", " W2 += -learning_rate * dW2\n", " b2 += -learning_rate * db2\n", " # Update the model dictionary\n", " model_dict = {'W1': W1, 'b1': b1,'W2': W2, 'b2': b2}\n", " # Print loss every 50 epochs\n", " if i%50 == 0:\n", " print(\"Loss at epoch {} is: {}\".format(i,loss(probs,y,model_dict)))\n", " \n", " return model_dict\n", " " ] }, { "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 }