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 [2023/12/20 18:04]
admin [Selección de función de activación]
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 702: Línea 709:
   * Uso en Keras: Sigmoide   * Uso en Keras: Sigmoide
 <sxh python> <sxh python>
-model.add(Dense(3, input_dim=1,activation=tf.keras.activations.sigmoid)) +model.add(Dense(3, activation="sigmoid")) 
-model.add(Dense(3, input_dim=1,activation="sigmoid"))+model.add(Dense(3, activation=tf.keras.activations.sigmoid)) 
 </sxh> </sxh>
  
Línea 709: Línea 717:
  
 <sxh python> <sxh python>
-model.add(Dense(3, input_dim=1,activation=tf.keras.activations.tanh)) +model.add(Dense(3, activation="tanh")) 
-model.add(Dense(3, input_dim=1,activation="tanh"))+model.add(Dense(3, activation=tf.keras.activations.tanh)) 
 </sxh> </sxh>
  
Línea 753: Línea 762:
  
 <sxh python> <sxh python>
-model.add(Dense(3, input_dim=1,activation=tf.keras.activations.relu)) +model.add(Dense(3, activation="relu")) 
-model.add(Dense(3, input_dim=1,activation="relu")) +model.add(Dense(3, activation=tf.keras.activations.relu)) 
-model.add(Dense(3, input_dim=1,activation=tf.keras.layers.ReLU()))+model.add(Dense(3, activation=tf.keras.layers.ReLU()))
 </sxh> </sxh>
  
Línea 761: Línea 770:
  
 <sxh python> <sxh python>
-model.add(Dense(3, input_dim=1,activation=tf.keras.layers.LeakyReLU())) +model.add(Dense(3, activation="LeakyReLU")) 
-model.add(Dense(3, input_dim=1,activation=tf.keras.layers.LeakyReLU(alpha=0.2)))+model.add(Dense(3, activation=tf.keras.layers.LeakyReLU())) 
 +model.add(Dense(3, activation=tf.keras.layers.LeakyReLU(alpha=0.2)))
 </sxh> </sxh>
  
Línea 806: Línea 816:
  
 <sxh python> <sxh python>
-model.add(Dense(3, input_dim=1,activation=tf.keras.activations.elu)) +model.add(Dense(3, activation="elu")) 
-model.add(Dense(3, input_dim=1,activation="elu")) +model.add(Dense(3, activation=tf.keras.activations.elu)) 
-model.add(Dense(3, input_dim=1,activation=tf.keras.layers.ELU(alpha=0.2)))+model.add(Dense(3, activation=tf.keras.layers.ELU(alpha=0.2)))
 </sxh> </sxh>
  
Línea 814: Línea 824:
  
 <sxh python> <sxh python>
-model.add(Dense(3, input_dim=1,activation=tf.keras.activations.selu,kernel_initializer="lecun_normal")) +model.add(Dense(3, activation="selu")) 
-model.add(Dense(3, input_dim=1,activation="selu",kernel_initializer="lecun_normal"))+model.add(Dense(3, activation=tf.keras.activations.selu))
 </sxh> </sxh>
  
Línea 907: Línea 917:
   * La probabilidad de que haya que comprar mañana acciones de la empresa Y.   * La probabilidad de que haya que comprar mañana acciones de la empresa Y.
   * La probabilidad de que haya que comprar mañana acciones de la empresa Z.   * La probabilidad de que haya que comprar mañana acciones de la empresa Z.
 +
 +Es decir se puede usar para clasificar entre 2 opciones pero también se puede usar cuando son más de dos opciones pero que no sean excluyentes entre ellas.
  
 <note tip> <note tip>
Línea 960: 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 977: 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 988: 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.1703091844.txt.gz · Última modificación: 2023/12/20 18:04 por admin