<jupyter_start><jupyter_text>Si tienes algún error al ejecutar la celda anterior verifica que tu ambiente de anaconda tenga las librerías necesarias.  Clasificación con K-nearest neighborsEn este notebook vamos a implementar K-nearest neighbor, nuestro algoritmo va a **clasificar** a que raza pertenece la imagen de un perro, para entrenar nuestro algoritmo vamos a utilizar un set de datos contiene imagenes de 120 razas de perros, en total son 10,222 imagenes.Data: [Dog Breed Identification](https://www.kaggle.com/c/dog-breed-identification/data)  Pre-procesamientoEl pre-procesamiento ya fue realizado y el dataset preparado y esta listo para usarse, para esto se aplico un proceso conocido como "transfer learning" usando la red neuronal "Inception" de Google(tema a cubrirse en proximas clases)  , para esta tarea ignoremos este detalle  y pensemos que se nos da un dataset con features donde cada columna representa una característica de entrada importante,pero no nos interesa conocer los detalles. Estas features/características fueron almacenadas en un matriz de numpy.En esta parte del notebook solo hay que ejecutar las celdas para cargar los datos, estos datos van a servir de entrada para nuestra implementación de K-nearest neighbors con tensorflow. Referencias opcionales para transfer learning y "Google inception" Inceptionhttps://www.tensorflow.org/tutorials/image_recognitionhttps://research.googleblog.com/2016/03/train-your-own-image-classifier-with.html Transfer Learninghttps://www.datacamp.com/community/tutorials/transfer-learning<jupyter_code>images_inception_features = './pre-processing/training_inception_features_array.npy'
training_image_labels_array = './pre-processing/training_image_labels_array.npy'
training_image_names_array = './pre-processing/training_image_names_array.npy'
TRAIN_DICTIONARY_KEYS = ["images", "label","features"]

training_set_dict = dict()
    
training_set_dict['images_name'] = np.load(training_image_names_array, allow_pickle=True)
training_set_dict['label'] = np.load(training_image_labels_array, allow_pickle=True)
training_set_dict['features'] = np.load(images_inception_features, allow_pickle=True)<jupyter_output><empty_output><jupyter_text>K-Nearest Neighbors La data la vamos a manejar en los siguientes 3 arreglos: - features    : features de la imagen dadas por google Inception- labels      : label de la imagen, identifica que raza es- images_name : nombre de la imgen original, si descargan el dataset con link en la descripcion pueden buscar la imagen original por este nombre.<jupyter_code>## Cargamos las features y las labes de cada feature
features = training_set_dict['features']
labels = training_set_dict['label']
images_name = training_set_dict['images_name']
len(features)<jupyter_output><empty_output><jupyter_text>Las labels pertenecientes a las features tienen el mismo indice, Ejemplo:<jupyter_code># Indice 4

print('Label: ',labels[4])

print('Nombre: ',images_name[4])

img = imio.imread('./data/train/'+images_name[4]+'.jpg')
plt.imshow(img)<jupyter_output>Label:  golden_retriever
Nombre:  0021f9ceb3235effd7fcde7f7538ed62<jupyter_text>Implementa tu codigo de  K-Neighbors aqui:El siguiente es un ejemplo de como puedes  definir tu función para predecir la raza sobre un punto x_predict ,a través de uscar los "k" vecinos mas cercanos en X_train y devolver como predicción el "y" que mas se repite(la moda) correspondiente a esos "k" valores de X_train , este "y" estará dado por Y_train.Un ejemplo  de KNN en tensorflow: http://marubon-ds.blogspot.com/2017/09/knn-k-nearest-neighbors-by-tensorflow.html (este tiene diferencias, usar como guía no copiar literal, por ejemplo este usa una métrica de distancia diferente a la que debemos usar: distancia euclidiana ) Instrucciones:1. Implementar KNN2. Agregar el grafo de tensorboard3. Ejecutar el modelo con las 2 imagenes de prueba.<jupyter_code>def predecir_raza_KNN(x_predict,X_train,Y_train,k):
    tf.reset_default_graph()
    g = tf.Graph()
    # Definición del grafo
    with g.as_default():
        # Placeholders
        X_Train = tf.placeholder(tf.float32, shape = (None, 2048), name="x_train")
        X_Predict = tf.placeholder(tf.float32, shape = (None, 2048), name="x_predict")
        y_labels = tf.placeholder(tf.string, name="y_labels")
        
        # Calculo de la distancia euclidiana
        with tf.name_scope("Distancia"):
            dist = tf.sqrt(
                    tf.reduce_sum(
                        tf.pow(
                            tf.subtract(X_Train, tf.expand_dims(X_Predict,0)), 2.
                        ), axis = 2), name = "Distancia"
                )
        # Implementación del clasificador
        with tf.name_scope("Clasificador"):
            _, k_nearest = tf.nn.top_k(tf.negative(dist), k=k, name="k_nearest")
            k_nearest_labels = tf.gather(y_labels, k_nearest, name="k_nearest_labels")
            
            labels, _, maxval = tf.unique_with_counts(k_nearest_labels[0], name="UniqueValues")
            max_i = tf.argmax(maxval)
            
    # Ejecución del grafo
    feed_dict = {X_Train:X_train,X_Predict:np.reshape(x_predict, [1, -1]), y_labels:Y_train}
    with tf.Session(graph = g) as s:
        writer = tf.summary.FileWriter("/graph/KNN_graph", g)
        label, index = s.run([labels, max_i], feed_dict = feed_dict)
        
    return label[index].decode()<jupyter_output><empty_output><jupyter_text>Probamos el algoritmo con nuevas imagenes Como buena practica luego de entrenar nuestro algoritmo, lo probamos con imagenes que no ha visto antes<jupyter_code>test_features = np.load('./data/test/test_inception_features_array.npy')<jupyter_output><empty_output><jupyter_text>Prueba 1<jupyter_code>img_test = imio.imread('./data/test/test1.jpg')
plt.imshow(img_test)
predict_image = test_features[0]

## Ejecuta tu modelo con la entrada de `predict_image`
predecir_raza_KNN(predict_image, features, labels, 5)<jupyter_output><empty_output><jupyter_text>Prueba 2<jupyter_code>img_test = imio.imread('./data/test/test2.jpg')
plt.imshow(img_test)
## Ejecuta tu modelo con la entrada de `predict_image`
# Deberiamos obtener: american_staffordshire_terrier #
predict_image = test_features[1]
predecir_raza_KNN(predict_image, features, labels, 5)<jupyter_output><empty_output><jupyter_text>Grafo creado![](images/KNN_graph.png)<jupyter_code>%load_ext tensorboard
%tensorboard --logdir '/graph/'<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09073987901349465, 'fraction_numerical': 0.011167985109353188, 'mean_word_length': 4.767441860465116, 'pattern_counts': {'":': 0, '<': 32, '<?xml version=': 0, '>': 32, 'https://': 4, 'lorem ipsum': 0, 'www.': 3, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '373323', 'license': 'MIT', 'n_tokens_mistral': 2203, 'n_tokens_neox': 2143, 'n_words': 553, 'path': 'TareaNo3.ipynb', 'repo_name': 'jfpIE16/SL_I_Tareas', 'size': '6447'}