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 [2023/12/20 18:04] admin [Selección de función de activación] |
clase:iabd:pia:1eval:tema06 [2025/05/16 12:24] (actual) admin [Recreando la red neuronal] |
||
---|---|---|---|
Línea 495: | Línea 495: | ||
b_5 =get_b(model, | b_5 =get_b(model, | ||
+ | print(f" | ||
</ | </ | ||
+ | * Y muestra por pantalla los valores de cada parámetro: | ||
+ | |||
+ | <sxh text> | ||
+ | w_2=0.49803927540779114 | ||
+ | w_3=0.4119996428489685 | ||
+ | w_4=-0.46713322401046753 | ||
+ | w_52=0.8982692956924438 | ||
+ | w_53=-0.0004859123146161437 | ||
+ | w_54=0.3734080493450165 | ||
+ | b_2=-0.3795720934867859 | ||
+ | b_3=-0.20187339186668396 | ||
+ | b_4=-0.3774943947792053 | ||
+ | b_5=-0.3136947453022003 | ||
+ | </ | ||
+ | |||
+ | |||
+ | y5=11+e−(0.8982⋅11+e−(0.4980x−0.3795)+(−0.0004)⋅11+e−(0.4119x−0.2018)+0.3734⋅11+e−(−0.4671x−0.3774)+(−0.3136)) | ||
Por fin vamos a crear la fórmula que hará las predicciones pero usando únicamente los parámetros en vez de la red neuronal, para ello hemos creado la función '' | Por fin vamos a crear la fórmula que hará las predicciones pero usando únicamente los parámetros en vez de la red neuronal, para ello hemos creado la función '' | ||
Línea 702: | Línea 720: | ||
* Uso en Keras: Sigmoide | * Uso en Keras: Sigmoide | ||
<sxh python> | <sxh python> | ||
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, |
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, |
</ | </ | ||
Línea 709: | Línea 728: | ||
<sxh python> | <sxh python> | ||
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, |
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, |
</ | </ | ||
Línea 753: | Línea 773: | ||
<sxh python> | <sxh python> | ||
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, |
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, |
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, |
</ | </ | ||
Línea 761: | Línea 781: | ||
<sxh python> | <sxh python> | ||
- | model.add(Dense(3, | + | model.add(Dense(3, |
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, activation=tf.keras.layers.LeakyReLU())) |
+ | model.add(Dense(3, | ||
</ | </ | ||
Línea 806: | Línea 827: | ||
<sxh python> | <sxh python> | ||
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, |
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, |
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, |
</ | </ | ||
Línea 814: | Línea 835: | ||
<sxh python> | <sxh python> | ||
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, |
- | model.add(Dense(3, input_dim=1, | + | model.add(Dense(3, |
</ | </ | ||
Línea 907: | Línea 928: | ||
* 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 983: | ||
<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 1002: | ||
</ | </ | ||
+ | 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 z2 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. z2=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 y1. Es decir ¿y1+y2=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 988: | Línea 1153: | ||
+ | ===== 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 ===== |