Skip to content

Instantly share code, notes, and snippets.

@jmcalvomartin
Created July 20, 2020 12:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jmcalvomartin/fb487168c5288122c3498600511c7573 to your computer and use it in GitHub Desktop.
Save jmcalvomartin/fb487168c5288122c3498600511c7573 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Crear Red Neural desde las matemáticas"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Importamos las librerias necesarias"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import math, random\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline \n",
"from sklearn.datasets import make_circles, make_classification, make_gaussian_quantiles\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"from IPython.display import display, Math, Latex\n",
"import time\n",
"from IPython.display import clear_output "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Creamos las funciones necesarias"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"#Creamos la función sigmoide con lambda , donde lambda[0] es la sigmoide y lambda[1] es su derivada\n",
"sigm = (lambda x:1/(1+np.e**(-x)),lambda x:x * (1-x))\n",
"\n",
"#Tangente Hiperbólica y su derivada\n",
"cosh = (lambda x: (np.e**(x) + np.e**(-x))/2) #Saco la función de coseno hiperbólico para la derivada de la tangh\n",
"tanh = (lambda x: (np.e**(x) - np.e**(-x))/(np.e**(x) + np.e**(-x)), lambda x: 1/cosh(x)**2)\n",
"\n",
"#Relu Rectified Lineal Unit\n",
"relu = (lambda x: np.maximum(0,x), lambda x: 1. * (x > 0))\n",
"\n",
"mse_loss= (lambda Yp,Yr: np.mean((Yp-Yr)**2), lambda Yp,Yr: (Yp-Yr))\n",
"\n",
"cross_loss = (lambda Yp,Yr:-np.nanmean(Yr * np.log(Yp) + (1-Yr) * np.log(1-Yp)), \n",
" lambda Yp,Yr: -(np.divide(Yr,Yp)- np.divide(1-Yr, 1-Yp)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Clase para la estrutura de la red neuronal\n",
"* Creamos una clase en Python que nos permite crear una red neural de n neuronas y l capas\n",
"* Esta clase generará de forma aleatoria los valores de los pesos (W) y el del sesgo (BIAS)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"class neural_layer():\n",
" def __init__(self, n_conn, n_neur, act_f):\n",
" self.act_f=act_f\n",
" self.b=np.random.randn(1,n_neur)\n",
" self.w=np.random.randn(n_conn,n_neur)\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Creamos nuestra Red\n",
"* Creamos una función que usará la clase neural_layer para crear nuestra red neuronal\n",
"* Además a esta red le pasaremos la función de activación en las capas ocultas y en la capa de salida"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"def create_nn(topology, act_f, last_f=sigm):\n",
" nn=[]\n",
" for l, layer in enumerate(topology[:-1]):\n",
" if l+1 is len(topology[:-1]): # Añadimos a la ultima capa la función de activación distinta\n",
" nn.append(neural_layer(topology[l],topology[l+1],last_f))\n",
" else:\n",
" nn.append(neural_layer(topology[l],topology[l+1],act_f)) \n",
" return nn "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Definimos la función de entrenamiento de nuestra red"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"#Función de entrenamiento\n",
"def train(neural_net, X, Y, f_cost,lr=0.5,train=True):\n",
" out=[(None,X)] # En este array guarda los pares de z y a [(z0,a0),(z1,a1),...]\n",
" \n",
" #Forward Pass\n",
" for l, layer in enumerate(neural_net):\n",
" \n",
" z = np.dot(out[-1][1],neural_net[l].w) + neural_net[l].b\n",
" a = neural_net[l].act_f[0](z)\n",
" \n",
" out.append((z,a))\n",
"\n",
" \n",
" #Backpropagation and Gradient descent\n",
" \n",
" if train:\n",
" delta=[]\n",
" \n",
" for l in reversed(range(0,len(neural_net))):\n",
" z=out[l+1][0]\n",
" a=out[l+1][1]\n",
" \n",
" #Si estamos en la ultima capa\n",
" if l == len(neural_net) - 1:\n",
" delta.insert(0, f_cost[1](a, Y) * neural_net[l].act_f[1](a))\n",
" #Calculamos delta en las capas previas\n",
" else:\n",
" delta.insert(0,np.dot(delta[0],aux_w.T) * neural_net[l].act_f[1](a)) \n",
" #Cuidado con los indices de las capas, son distinos (1+) en el array Out\n",
" \n",
" aux_w=neural_net[l].w \n",
" #Lo guardamos en una variable auxiliar para poder modificar los valores al mismo tiempo usando el Gradiente descendente\n",
" \n",
" #Gradient Descent : Ajuste de los pesos y el valor BIAS\n",
" neural_net[l].b = neural_net[l].b - lr * np.mean(delta[0], axis=0, keepdims=True)\n",
" #Hago la media de los valores que tengo en el vector de Bias y con keepdims conservo su dimensión\n",
" neural_net[l].w = neural_net[l].w - np.dot(out[l][1].T,delta[0])*lr\n",
" return out[-1][1] "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Entrenamos nuestra red neuronal"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Creamos el dataset\n",
"#### Make Circles\n",
"* Crear un círculo grande que contenga un círculo más pequeño en 2d.\n",
"* Un conjunto de datos simple para visualizar algoritmos de agrupamiento y clasificación.\n",
"* https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_circles.html?highlight=make%20circles#sklearn.datasets.make_circles"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"n=800 #número de puntos utilizados en el dataset\n",
"X, Y = make_circles(n_samples=n, noise=0.04, shuffle=True, factor=0.3)\n",
"Y = Y[:,np.newaxis] #Le genero una dimensión a los valores de Y para poder operar con ellos en train\n",
"\n",
"#Creamos dos circulos para realziar un aprendizaje un poco más complejo\n",
"# Al circulo original le sumammos una constante aleatoria entre 2 y 4 para desplazarla en el eje\n",
"X=X+random.uniform(-2,4)\n",
"X_1=X+random.uniform(-2,4)\n",
"\n",
"#unimos ambos arrays\n",
"Y=np.concatenate((Y,Y), axis=0)\n",
"X=np.concatenate((X,X_1),axis=0)\n",
"\n",
"#Escalamos los valores entre -1 y 1\n",
"scaler = MinMaxScaler(feature_range=(-1, 1))\n",
"X = scaler.fit_transform(X)\n",
"\n",
"#Mezclamos los valores dentro del array para evitar el posible patrón de suma de la constante\n",
"state=np.random.get_state()\n",
"np.random.shuffle(X)\n",
"#Guardamos el esto aleatorio para plicarlo igual en la Y y así mantener la clasificación del circulo exterior e interior\n",
"np.random.set_state(state) \n",
"np.random.shuffle(Y)\n",
"\n",
"#Dibujamos ambos circulos\n",
"plt.scatter(X[Y[:,0]==0,0],X[Y[:,0]==0,1],color=\"blue\")\n",
"plt.scatter(X[Y[:,0]==1,0],X[Y[:,0]==1,1],color=\"salmon\")\n",
"plt.axis(\"equal\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Creamos la estructura de la red neuronal que aprenderá a clasificar este dataset\n",
"* ***Topology*** : Estructura de capas que tendrá nuestrad\n",
"* ***create_nn*** : Función que crea nuestra red pasando las funciones de activación (capas ocultas y capa de salida)\n",
"* ***f_loss*** : Función de perdida que usaremos (MSE ó Entropía cruzada binaria)\n",
"* ***epochs*** : Número de épocas de nuestra red, es decir, el número de veces que realzizrá la retropropagación\n",
"* ***lr*** : Ratio de aprendizaje, parametro por el cual avanza nuestro algoritmo en la función de coste"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"topology=[2,12,6,1] #Recuerda que la primera capa debe ser igual al número de clases que tienes que clasificar\n",
"neural_n=create_nn(topology,relu,sigm)\n",
"f_loss=cross_loss\n",
"epochs=1500\n",
"lr=0.0001"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Ejecutamos el entrenamiento"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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DzH7ricEeiIiIg1TaaWIiIiIiEjKKJATERERERFJGQVyIiIiIiIiKaNATkREREREJGUUyImIiIiIiKSMAjkREREREZGUUSAnIiIiIiKSMgrkREREREREUkaBnIiIyDRz8wPb+Jdf9fLIE72TPRQRERkjBXIiIiLTzO7eQX6/o8ju3sHJHoqIiIyRAjkREZFppj2XBaBvsDDJIxERkbFSICciIjLNtOfC03//UHGSRyIiImOlQE5ERGSaac8rIyciknYK5ERERKYZZeRERNJPgZyIiMg006GMnIhI6imQExERmWaUkRMRST8FciIiItNMKSOnQE5EJL0UyImIiEwz7fkoI6fSShGR1FIgJyIiMs105JSRExFJOwVyIiIi00w+axhqdiIikmYK5ERERKYZMyOfUUZORCTNFMiJiIhMQ/msMnIiImmmQE5ERGQaymeM/kFl5ERE0kqBnIiIyDTUloW+IWXkRETSSoGciIjINJTPoIyciEiKKZATERGZhtoyRr8yciIiqaVATkREZBoKzU6UkRMRSSsFciIiItNQWH5AGTkRkbRSICciIjIN5TOmjJyISIopkBMREZmG8lll5ERE0iw32QMQEZkKDBu3azs+btcWGau2jNHXp4yciEhaKSMnIiIyDYU5cgrkRETSSoGciIjINJTPQv+gSitFRNJKgZyIiMg0lM+YMnIiIimmQE5ERGQaasvCQKFIsag5nCIiaaRATkREZBrKR68AlJUTEUknBXIiIiLTUD4TOrVqCQIRkXRSICciIjINtWXDZy0KLiKSTlpHTkRSYzzXesOSrl3nPS9XRkPSZ7i0Un+/IiJppIyciIjINJTPhjcvlJETEUknBXIiIiLTkDJyIiLpptJKERGRJpnZFcDpwOPu/vQa+98HvDr6NgccAyxw9x1m9hCwBygAQ+5+4kSMuS2jjJyISJopIyciItK8LwMvjdvp7v/m7s9092cCHwR+4u47yg55QbR/QoI4gHzU7EQZORGRdFIgJyIi0iR3vwnYUffA4Gzg6+M4nIa0lUorlZETEUklBXIiIiITxMxmEDJ33yzb7MAPzWyjmZ03UWMprSPXp4yciEgqaY6ciIjIxDkD+HlVWeXz3H2LmR0C3Ghmd0cZvgpRkHcewMKFC9mwYUNTAxno2wcYt99xFzN33NvUtSbC3r17m77PE0VjHR9pGiuk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\n",
"text/plain": [
"<Figure size 1080x1080 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-19-0df27592b3f3>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 15\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mi0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx0\u001b[0m \u001b[1;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0m_x0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 16\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mi1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx1\u001b[0m \u001b[1;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0m_x1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 17\u001b[1;33m \u001b[0m_Y\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mi1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtrain\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mneural_n\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mx0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mx1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mY\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mf_loss\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mtrain\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 18\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 19\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m15\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m15\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m<ipython-input-16-213fb2e1acd7>\u001b[0m in \u001b[0;36mtrain\u001b[1;34m(neural_net, X, Y, f_cost, lr, train)\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0ml\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlayer\u001b[0m \u001b[1;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mneural_net\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 8\u001b[1;33m \u001b[0mz\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mout\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mneural_net\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0ml\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mw\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mneural_net\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0ml\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mb\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 9\u001b[0m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mneural_net\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0ml\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mact_f\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mz\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mdot\u001b[1;34m(*args, **kwargs)\u001b[0m\n",
"\u001b[1;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"loss=[] #Array donde guardaremos los errores de las sucesivas interacciones\n",
"\n",
"for i in range(epochs):\n",
" pY=train(neural_n,X,Y,f_loss,lr)\n",
" if i %25 == 0:\n",
" loss.append(f_loss[0](pY,Y))\n",
" \n",
" res=50\n",
" \n",
" _x0 = np.linspace(-1.5,1.5, res)\n",
" _x1 = np.linspace(-1.5,1.5, res)\n",
" \n",
" _Y = np.zeros((res,res))\n",
" \n",
" for i0, x0 in enumerate(_x0):\n",
" for i1, x1 in enumerate(_x1):\n",
" _Y[i0, i1] = train(neural_n, np.array([[x0,x1]]), Y, f_loss,train=False)[0][0]\n",
" \n",
" plt.figure(1,figsize=(15,15))\n",
" plt.subplot(221)\n",
" plt.title(\"Aprendizaje de clasificación\") \n",
" plt.pcolormesh(_x0, _x1, _Y, cmap=\"inferno\")\n",
" plt.axis(\"equal\")\n",
"\n",
" plt.scatter(X[Y[:,0]==0,0],X[Y[:,0]==0,1],color=\"blue\")\n",
" plt.scatter(X[Y[:,0]==1,0],X[Y[:,0]==1,1],color=\"salmon\")\n",
" \n",
" clear_output(wait=True)\n",
" plt.subplot(222)\n",
" plt.title(\"Función de error\")\n",
" plt.xlabel(\"epochs\")\n",
" plt.ylabel(\"error\")\n",
" plt.grid()\n",
" plt.plot(range(len(loss)),loss)\n",
" plt.show()\n",
" time.sleep(0.5)"
]
},
{
"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.7"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment