Una Red Neuronal Artificial (ANN) está formada por muchas neuronas interconectadas:
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).
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:
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:
- 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)
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)