Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
clase:iabd:pia:1eval:tema06 [2024/01/25 08:29] admin [Tipos de funciones de activación en la capa de salida] |
clase:iabd:pia:1eval:tema06 [2025/01/21 20:09] (actual) admin [Guardando modelos a disco] |
||
---|---|---|---|
Línea 495: | Línea 495: | ||
b_5 =get_b(model, | b_5 =get_b(model, | ||
+ | print(w_2, | ||
+ | </ | ||
+ | |||
+ | * Y muestra por pantalla los valores de cada parámetro: | ||
+ | |||
+ | <sxh text> | ||
+ | 0.5020887 -0.24834822 0.57721144 0.6283854 -1.241883 0.28643206 -0.2868785 0.085751235 -0.35422727 -0.05326964 | ||
</ | </ | ||
Línea 965: | Línea 972: | ||
<sxh python> | <sxh python> | ||
+ | from sklearn.preprocessing import LabelBinarizer | ||
+ | |||
y=iris.target | y=iris.target | ||
label_binarizer = LabelBinarizer() | label_binarizer = LabelBinarizer() | ||
Línea 982: | Línea 991: | ||
</ | </ | ||
+ | Para finalizar vamos a mostrar en una tabla resumen cuando se usa función de activación | ||
+ | |||
+ | Para acabar vamos a ver una tabla con la relación entre las funciones de activación usadas en la salida de una red neuronal y la función de coste que se podría usar. | ||
+ | |||
+ | ^ Problema ^ Función de Activación a la salida | ||
+ | | Regresión | ||
+ | | Clasificación con 2 posibles valores | Sigmoide | ||
+ | | Clasificación con más de 2 posibles valores NO excluyentes entre si | Sigmoide | ||
+ | | Clasificación con más de 2 posibles valores SI excluyentes entre si | Softmax | ||
+ | |||
+ | |||
+ | <note tip> | ||
+ | **La sigmoide es un caso particular de Softmax con 2 neuronas** | ||
+ | |||
+ | Uno se puede preguntar en redes en las solo queremos saber si es positivo/ | ||
+ | porqué en vez de usar una única neurona con sigmoide, no usamos softmax con 2 valores. ¿Sería lo mismo? Pues vamos a desarrollarlo. | ||
+ | |||
+ | * Imaginemos una única neurona que acaba en sigmoide. | ||
+ | |||
+ | $$ | ||
+ | z_1: | ||
+ | \\ | ||
+ | y_1: | ||
+ | \\ | ||
+ | y_1=sigmoid(z_1)=\frac{1}{1+e^{-z_1}} | ||
+ | $$ | ||
+ | |||
+ | * Ahora vamos a tener 2 neuronas de forma que la primera neurona de el mismo resultado que cuando solo hay una neurona | ||
+ | |||
+ | $$ | ||
+ | z_1: | ||
+ | \\ | ||
+ | y_1: | ||
+ | \\ | ||
+ | y_1=softmax(z_1)=\frac{e^{z_1}}{e^{z_1}+e^{z_2}} | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | z_2: | ||
+ | \\ | ||
+ | y_2: | ||
+ | \\ | ||
+ | y_2=softmax(z_2)=\frac{e^{z_2}}{e^{z_1}+e^{z_2}} | ||
+ | $$ | ||
+ | |||
+ | * Además se debe cumplir que | ||
+ | |||
+ | $$ | ||
+ | y_1+y_2=1 | ||
+ | $$ | ||
+ | |||
+ | Ya que la probabilidad de ser positivo o ser negativo debe sumar 1. | ||
+ | |||
+ | * Como ambas redes deben tener el mismo resultado en la 1º reurona se cumple que | ||
+ | |||
+ | $$ | ||
+ | \frac{1}{1+e^{-z_1}}=\frac{e^{z_1}}{e^{z_1}+e^{z_2}} | ||
+ | $$ | ||
+ | |||
+ | * Y ahora vamos a despejar cuando debe valer $z_2$ para que se cumple esa igualdad y para ello multiplicamos en cruz | ||
+ | |||
+ | $$ | ||
+ | e^{z_1}+e^{z_1-z_1}=e^{z_1}+e^{z_2} | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | e^{z_1}+e^{0}=e^{z_1}+e^{z_2} | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | e^{z_1}+1=e^{z_1}+e^{z_2} | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | 1=e^{z_2} | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | \ln{1}=\ln{e^{z_2}} | ||
+ | $$ | ||
+ | |||
+ | |||
+ | $$ | ||
+ | z_2=0 | ||
+ | $$ | ||
+ | |||
+ | Por lo tanto: | ||
+ | |||
+ | $$ | ||
+ | y_1=\frac{e^{z_1}}{e^{z_1}+1}=\frac{1}{1+e^{-z_1}} | ||
+ | $$ | ||
+ | |||
+ | Es decir que la 2º neurona siempre debe valer 0 en la parte lineal. $z_2=0$ | ||
+ | |||
+ | * ¿Pero que valor tendrá realmente a la salida de la 2º neurona? | ||
+ | |||
+ | $$ | ||
+ | y_2=softmax(z_2)=\frac{e^{z_2}}{e^{z_1}+e^{z_2}} | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | y_2=\frac{e^{0}}{e^{z_1}+e^{0}} | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | y_2=\frac{1}{1+e^{z_1}} | ||
+ | $$ | ||
+ | |||
+ | * Pero, ¿es ese valor realmente el complementario de $y_1$. Es decir $¿y_1+y_2=1? | ||
+ | |||
+ | $$ | ||
+ | y_1=\frac{1}{1+e^{-z_1}} | ||
+ | \\ | ||
+ | y_2=\frac{1}{1+e^{z_1}} | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | y_1+y_2=\frac{1}{1+e^{-z_1}}+\frac{1}{1+e^{z_1}}= | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | \frac{1+e^{z_1}+1+e^{-z_1}}{(1+e^{-z_1})(1+e^{z_1})}= | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | \frac{2+e^{z_1}+e^{-z_1}}{1+e^{-z_1}+e^{z_1}+e^{z_1-z_1}}= | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | \frac{2+e^{z_1}+e^{-z_1}}{1+e^{-z_1}+e^{z_1}+e^{0}}= | ||
+ | $$ | ||
+ | $$ | ||
+ | \frac{2+e^{z_1}+e^{-z_1}}{1+e^{-z_1}+e^{z_1}+1}= | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | \frac{2+e^{z_1}+e^{-z_1}}{2+e^{z_1}+e^{-z_1}}=1 | ||
+ | $$ | ||
+ | |||
+ | </ | ||
Línea 993: | Línea 1142: | ||
+ | ===== Guardando modelos a disco ===== | ||
+ | Una vez tenemos la red neuronal entrenada, la podemos guardar a disco para poder usarla en otro programa. | ||
+ | |||
+ | |||
+ | * Para guardar la red | ||
+ | <sxh python> | ||
+ | |||
+ | model=Sequential() | ||
+ | model.add(Dense(10, | ||
+ | model.compile(loss=" | ||
+ | history=model.fit(x_train, | ||
+ | |||
+ | model.save(' | ||
+ | </ | ||
+ | |||
+ | * Para cargar la red en otro programa | ||
+ | |||
+ | <sxh python> | ||
+ | model=tf.keras.models.load_model(' | ||
+ | </ | ||
+ | |||
+ | * Si el modelo al crearse usó funciones personalizadas, | ||
+ | <sxh python> | ||
+ | model=tf.keras.models.load_model(' | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Más información: | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
===== Redes Neuronales Famosas ===== | ===== Redes Neuronales Famosas ===== |