<jupyter_start><jupyter_text>Reconocimiento de dígitos escritos a mano<jupyter_code>import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop<jupyter_output><empty_output><jupyter_text>Paso 1. Cargar la información<jupyter_code># the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()<jupyter_output><empty_output><jupyter_text>Paso 2 y 3. Comprender la información y modificarlaRecibimos una lista con 60mil ejemplos. En esa lista, tenemos una matriz (arreglo de arreglos) de 28x28. Para que una red neuronal normal pueda recibir como entrada esto, necesita recibir un vector, por lo que vamos a convertir la matrix en un vector de 784 (28x28). Luego, vamos a escalar los valores para que estén entre 0 y 1.<jupyter_code>print(x_train.shape)
print(x_test.shape)
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape)
print(x_test.shape)<jupyter_output><empty_output><jupyter_text>La siguiente función lo que hace es mostrar un dígito. Veamos como se ve el primer dígito de nuestro dataset como imagen, luego su valor en x y finalmente su valor en y.<jupyter_code>import matplotlib.pyplot as plt
%matplotlib inline

def show_digit(index):
    label = y_train[index].argmax(axis=0)
    image = x_train[index].reshape([28,28])
    plt.title('Training data. Label: {}'.format(label))
    plt.imshow(image, cmap='gray_r')
    plt.show()
show_digit(0)
x_train[0]
y_train[0]<jupyter_output><empty_output><jupyter_text>One-hot encodingYa has visto cómo se hace one-hot encoding. Utiliza el método ```keras.utils.to_categorical```para convertir y_train y y_test en vectores de 10 valores en vez de un valor.https://keras.io/utils/to_categorical<jupyter_code>## TODO: Has el one hot encoding para que 5 se convierta en [0, 0, 0, 0, 1, 0, 0, 0, 0]<jupyter_output><empty_output><jupyter_text>Paso 4. Construir Arquitectura del Modelo<jupyter_code>## TODO: Construye un modelo secuencial

## TODO: Compila el modelo con un optimizador y una función de pérdida<jupyter_output><empty_output><jupyter_text>Paso 5. Entrenamos el modeloIntenta lograr más de 97% de precisión.<jupyter_code>## TODO: Corre el modelo. Experimenta con diferentes tamaños de batch y número de epochs. 
# Usa verbose=2 para ver cómo va progresando el modelo.
# Empieza con 2 ó 3 epochs. Este es un algoritmo pesado. Al final intenta con 10 epochs.<jupyter_output><empty_output><jupyter_text>Paso 6. Evaluamos el modelo<jupyter_code>## TODO: Evalua tu modelo<jupyter_output><empty_output><jupyter_text>Soluciones: No las revises hasta haber terminado<jupyter_code>## TODO: Has el one hot encoding para que 5 se convierta en [0, 0, 0, 0, 1, 0, 0, 0, 0]
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
y_train[0]

## TODO: Construye un modelo secuencial
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))
model.summary()

## TODO: Compila el modelo con un optimizador y una función de pérdida
model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

## TODO: Corre el modelo. Experimenta con diferentes tamaños de batch y número de epochs. 
# Usa verbose=2 para ver cómo va progresando el modelo.
# Empieza con 2 ó 3 epochs. Este es un algoritmo pesado. Al final intenta con 10 epochs.

history = model.fit(x_train, y_train,
                    batch_size=128,
                    epochs=3,
                    verbose=1,
                    validation_data=(x_test, y_test))

## TODO: Evalua tu modelo
score = model.evaluate(x_test, y_test, verbose=0)
print('Test accuracy:', score[1])<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09859154929577464, 'fraction_numerical': 0.0286632073140598, 'mean_word_length': 5.096385542168675, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 37, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, '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': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '511923', 'license': 'MIT', 'n_tokens_mistral': 1578, 'n_tokens_neox': 1480, 'n_words': 431, 'path': 'Kata Intro to AI/6. DigitRecognition.ipynb', 'repo_name': 'davidandres2010/master-data-ai', 'size': '4047'}