Aprendizaje profundo: Redes Neuronales de alimentación directa (FFNNs)

Una Red Neuronal de Alimentación Directa Profunda (FFNN), también conocida como Perceptrón de Múltiples capas (MLP)

Una Red Neuronal Artificial (ANN) está formada por muchas neuronas interconectadas:

Una sola Neurona de una Red Neuronal Artificial (ANN)

Cada neurona toma algunos números de coma flotante (por ejemplo, 1.0, 0.5, -1).0) y los multiplica por otros números de coma flotante (por ejemplo, 0.7, 0.6, 1.4) conocidos como pesos (1.0 * 0.7 = 0.7, 0.5 * 0.6 = 0.3, -1.0 * 1.4 = -1.4). Las ponderaciones actúan como un mecanismo para centrarse en, o ignorar, ciertas entradas.

Pesos actuar como suave puertas a ignorar algunas de las características (0) y foco en los demás (+1) o incluso inhibir ellos (-1)

El promedio ponderado de los insumos, a continuación, obtener suman (por ejemplo, 0.7 + 0.3 + -1.4 = -0.4) junto con un valor de sesgo (por ejemplo, -0.4 + -0.1 = -0.5).

El valor sumado (x) se transforma ahora en un valor de salida (y) de acuerdo con la función de activación de la neurona (y = f(x)). A continuación se muestran algunas funciones de activación populares:

Una pequeña selección de Funciones de activación Populares

por ejemplo, -0.5 → -0.05 si utilizamos la función de activación de la Unidad Lineal rectificada con fugas (ReLU con fugas): y = f(x) = f(-0.5) = max(0.1*-0.5, -0.5) = max(-0.05, -0.5) = -0.05

El valor de salida de la neurona (por ejemplo, -0.05) es a menudo una entrada para otra neurona.

Una Neurona de salida de valor a menudo se alimenta como una entrada a otras Neuronas de la Red Neuronal Artificial (ANN)
El tipo perceptrón, una de las primeras Redes Neuronales, está hecho de una sola Neurona

sin Embargo, uno de los primeros Rna fue conocido como el tipo perceptrón y consistía de una sola neurona.

El Perceptrón

La salida de la (única) neurona del perceptrón actúa como predicción final.

Cada neurona es un clasificador binario lineal por sí sola (por ejemplo, un valor de salida >= 0 indica la clase azul, mientras que un valor de salida < 0 indica la clase roja)

Permite codificar nuestro propio Perceptrón:

import numpy as npclass Neuron: 
def __init__(self, n_inputs, bias = 0., weights = None):
self.b = bias
if weights: self.ws = np.array(weights)
else: self.ws = np.random.rand(n_inputs)
def __call__(self, xs):
return self._f(xs @ self.ws + self.b)
def _f(self, x):
return max(x*.1, x)

(Nota: no hemos incluido cualquier algoritmo de aprendizaje en nuestro ejemplo anterior, vamos a cubrir los algoritmos de aprendizaje en otro tutorial)

perceptron = Neuron(n_inputs = 3, bias = -0.1, weights = )perceptron()
Aviso mediante el ajuste de los valores de los pesos y bias, usted puede ajustar la neurona decisión de la frontera. (NB: una neurona aprende actualizando sus pesos y valores de sesgo para reducir el error de sus decisiones).

Entonces, ¿por qué necesitamos tantas neuronas en una ANN si alguna es suficiente (como clasificador)?

Limitaciones: La neurona es un clasificador binario ya que solo puede aprender a distinguir entre dos clases (por ejemplo, azul y rojo) máx. La neurona es un clasificador lineal porque su límite de decisión se aproxima a una línea recta para datos 2D (o un plano plano para datos 3D, etc.)

Desafortunadamente, las neuronas individuales solo pueden clasificar datos separables linealmente.

sin Embargo, mediante la combinación de las neuronas juntos, podemos combinar esencialmente su decisión límites. Por lo tanto, una RNA compuesta de muchas neuronas es capaz de aprender límites de decisión complejos y no lineales.

La combinación de neuronas permite a las redes Neuronales aprender Límites de Decisión no lineales más complejos

Las neuronas están conectadas entre sí de acuerdo con una arquitectura de red específica. Aunque hay diferentes arquitecturas, casi todas contienen capas. (NOTA:: Las neuronas de la misma capa no se conectan entre sí)

Las redes neuronales contienen capas

Normalmente hay una capa de entrada (que contiene varias neuronas igual al número de entidades de entrada en los datos), una capa de salida (que contiene un número de neuronas igual al número de clases) y una capa oculta (que contiene cualquier número de neuronas).

Las redes neuronales profundas contienen múltiples capas ocultas

Puede haber más de una capa oculta para permitir que la red neuronal aprenda límites de decisión más complejos (Cualquier red con más de una capa oculta se considera una red neuronal profunda).

Construyamos un NN profundo para pintar esta imagen:

Una imagen de ejemplo que nuestra ANN aprenderá a pintar (Aprenderá a asociar ciertos colores a ciertas regiones de la imagen)

la imagen y cargar sus píxeles en una matriz

!curl -O https://pmcvariety.files.wordpress.com/2018/04/twitter-logo.jpg?w=100&h=100&crop=1from PIL import Image
image = Image.open('twitter-logo.jpg?w=100')import numpy as np
image_array = np.asarray(image)

Ahora enseñar a pintar a nuestra ANN es una tarea de aprendizaje supervisada, por lo que necesitamos crear un conjunto de entrenamiento etiquetado (Nuestros datos de entrenamiento tendrán entradas y etiquetas de salida esperadas para cada entrada). Las entradas de entrenamiento tendrán 2 valores (las coordenadas x,y de cada píxel).

Dada la simplicidad de la imagen, podríamos abordar este problema de una de dos maneras. Un problema de clasificación (donde la red neuronal predice si un píxel pertenece a la clase» azul «o a la clase» gris», dadas sus coordenadas xy) o un problema de regresión (donde la red neuronal predice valores RGB para un píxel dadas sus coordenadas).

Si se trata de un problema de regresión: las salidas de entrenamiento tendrán 3 valores (los valores normalizados r,g,b para cada píxel). – Usemos este método por ahora.

training_inputs,training_outputs = ,
for row,rgbs in enumerate(image_array):
for column,rgb in enumerate(rgbs):
training_inputs.append((row,column))
r,g,b = rgb
training_outputs.append((r/255,g/255,b/255))

Ahora vamos a crear nuestra ANN:

Una red neuronal de alimentación directa completamente conectada (FFNN), también conocida como perceptrón de múltiples capas (MLP)
  • Debe tener 2 neuronas en la capa de entrada (ya que hay 2 valores a tomar: x & coordenadas y).
  • Debe tener 3 neuronas en la capa de salida (ya que hay 3 valores para aprender: r, g, b).
  • El número de capas ocultas y el número de neuronas en cada capa oculta son dos hiperparámetros con los que experimentar (así como el número de épocas para las que lo entrenaremos, la función de activación, etc.): Usaré 10 capas ocultas con 100 neuronas en cada capa oculta (haciendo de esta una red neuronal profunda)
from sklearn.neural_network import MLPRegressorann = MLPRegressor(hidden_layer_sizes= tuple(100 for _ in range(10)))ann.fit(training_inputs, training_outputs)

La red entrenada ahora puede predecir los valores rgb normalizados para por ejemplo,x, y = 1,1).

ann.predict(])

array(])

vamos a usar la AN para predecir los valores rgb para cada coordenada y vamos a mostrar los valores rgb previstos para toda la imagen para ver qué tan bien lo hizo (cualitativamente, dejaremos las métricas de evaluación para otro tutorial)

predicted_outputs = ann.predict(training_inputs)predicted_image_array = np.zeros_like(image_array)
i = 0
for row,rgbs in enumerate(predicted_image_array):
for column in range(len(rgbs)):
r,g,b = predicted_outputs
predicted_image_array =
i += 1
Image.fromarray(predicted_image_array)
La pintura de nuestra ANN (colores de píxeles previstos)

Intente cambiar los hiperparámetros para obtener mejores resultados.

Si en lugar de tratar esto como un problema de regresión, lo tratamos como un problema de clasificación, entonces las salidas de entrenamiento tendrán 2 valores (las probabilidades del píxel perteneciente a cada una de las dos clases: «azul» y «gris»)

training_inputs,training_outputs = ,
for row,rgbs in enumerate(image_array):
for column,rgb in enumerate(rgbs):
training_inputs.append((row,column))
if sum(rgb) <= 600:
label = (0,1) #blue class
else:
label = (1,0) #grey class
training_outputs.append(label)

Podemos reconstruir nuestra ANN como un clasificador binario con 2 neuronas en la capa de entrada, 2 neuronas en la capa de salida y 100 neuronas en la capa oculta (con 10 capas ocultas)

from sklearn.neural_network import MLPClassifier
ann = MLPClassifier(hidden_layer_sizes= tuple(100 for _ in range(10)))
ann.fit(training_inputs, training_outputs)

Ahora podemos usar la ANN entrenada para predecir la clase a la que pertenece cada píxel (0: «gris» o 1: «azul»). The argmax function is used to find which class has the highest probability

np.argmax(ann.predict(]))

(this indicates the pixel with xy-coordinates 1,1 is most likely from class 0: «grey»)

predicted_outputs = ann.predict(training_inputs)predicted_image_array = np.zeros_like(image_array)
i = 0
for row,rgbs in enumerate(predicted_image_array):
for column in range(len(rgbs)):
prediction = np.argmax(predicted_outputs)
if prediction == 0:
predicted_image_array =
else:
predicted_image_array =
i += 1
Image.fromarray(predicted_image_array)
The predicted class for each pixel
The expected class for each pixel

Deja una respuesta

Tu dirección de correo electrónico no será publicada.