Herramientas de usuario

Herramientas del sitio


clase:iabd:pia:1eval:tema06

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

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,1,0) b_5 =get_b(model,1,0)
  
 +print(w_2,w_3,w_4,w_52,w_53,w_54,b_2,b_3,b_4,b_5)
 +</sxh>
 +
 +  * 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
 </sxh> </sxh>
  
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:
 </sxh> </sxh>
  
 +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  |  Lineal  |
 +| 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/negativo, es decir con dos valores,
 +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:\text{Es la salida de la parte lineal de la única neurona}
 +\\
 +y_1:\text{Es la salida de la única neurona}
 +\\
 +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:\text{Es la salida de la parte lineal de la 1º neurona}
 +\\
 +y_1:\text{Es la salida de la 1º neurona}
 +\\
 +y_1=softmax(z_1)=\frac{e^{z_1}}{e^{z_1}+e^{z_2}}
 +$$
 +
 +$$
 +z_2:\text{Es la salida de la parte lineal de la 2º neurona}
 +\\
 +y_2:\text{Es la salida de la 2º neurona}
 +\\
 +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
 +$$
 +
 +</note>
  
  
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, activation="sigmoid",input_dim=2))
 +model.compile(loss="mse")
 +history=model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=10,verbose=False)
 +
 +model.save('my_red_neuronal.keras'
 +</sxh>
 +
 +  * Para cargar la red en otro programa
 +
 +<sxh python>
 +model=tf.keras.models.load_model('my_red_neuronal.keras')
 +</sxh>
 +
 +  * Si el modelo al crearse usó funciones personalizadas, se debe usar el parámetro ''custom_objects''. Por ejemplo si se usó la función ''specificity'' se debe cargar:
 +<sxh python>
 +model=tf.keras.models.load_model('my_red_neuronal.keras',custom_objects={"specificity": specificity})
 +
 +</sxh>
 +
 +
 +Más información:
 +  * [[https://www.tensorflow.org/versions/r2.15/api_docs/python/tf/keras/saving/save_model|v2.15 tf.keras.saving.save_model]]
 +  * [[https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/keras/models/save_model|v2.9 tf.keras.models.save_model]]
 +  * [[https://www.tensorflow.org/api_docs/python/tf/keras/models/save_model|v.2.16 tf.keras.models.save_model]]
  
 ===== Redes Neuronales Famosas ===== ===== Redes Neuronales Famosas =====
clase/iabd/pia/1eval/tema06.1706167747.txt.gz · Última modificación: 2024/01/25 08:29 por admin