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/03/13 13:38]
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 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 844: Línea 854:
   * Deberíamos empezar siempre probando con ''ReLU'' y ''Leaky ReLU'' ya que son las más rápidas y en general funcionan bien.   * Deberíamos empezar siempre probando con ''ReLU'' y ''Leaky ReLU'' ya que son las más rápidas y en general funcionan bien.
   * Si ''ReLU'' y ''Leaky ReLU'' no dan un resultado lo suficientemente bueno, probar con ''SELU'' o ''ELU''   * Si ''ReLU'' y ''Leaky ReLU'' no dan un resultado lo suficientemente bueno, probar con ''SELU'' o ''ELU''
-  * El último lugar probar con ''GELU''+  * El último lugar probar con ''swish''
   * Nunca deberíamos usar ni ''Sigmoide'' ni ''Tanh'' a menos que no nos quede mas remedio   * Nunca deberíamos usar ni ''Sigmoide'' ni ''Tanh'' a menos que no nos quede mas remedio
  
Línea 872: Línea 882:
  
 {{ :clase:iabd:pia:1eval:funciones_activacion_tipo_lineal.png?direct |}} {{ :clase:iabd:pia:1eval:funciones_activacion_tipo_lineal.png?direct |}}
 +
 +$$lineal(x)=x$$
  
 La forma de usarla en keras es simplemente no diciendo nada sobre la función de activación en la capa de salida. La forma de usarla en keras es simplemente no diciendo nada sobre la función de activación en la capa de salida.
Línea 905: 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 958: 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 975: 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 986: 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.1678711097.txt.gz · Última modificación: 2023/03/13 13:38 por admin