{"cells":[{"metadata":{"_uuid":"640c26b21cc9aefcdadb9089697eae84ec3d7b51"},"cell_type":"markdown","source":"Carga de datos"},{"metadata":{"_cell_guid":"c70a3347-f9c8-44ca-b217-0233fb962ac7","_uuid":"23d66211319996bc2703b131e2e3f74fc64e67cf","collapsed":true,"trusted":true},"cell_type":"code","source":"import numpy as np # biblioteca para algebra lineal\nimport pandas as pd # librería para procesamiento de data\n\ndf_train = pd.read_csv('../input/train.csv')\ndf_test = pd.read_csv('../input/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"cb0575da-4177-4046-b80d-0649ed67da7d","_uuid":"b54f5b1f14ee438dc1c60e231cc43bfe553e8aa1","trusted":true,"collapsed":true},"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten\nfrom keras.layers.convolutional import Conv2D, MaxPooling2D\nfrom keras.utils import np_utils\nfrom keras.optimizers import RMSprop\nfrom keras.callbacks import ReduceLROnPlateau\nfrom keras.preprocessing.image import ImageDataGenerator\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"b79af2ce-e5a2-4f89-9ecf-cb310866573b","_uuid":"0bd801f790a6cef333c0a52b7bede3dfefe38f2d","trusted":true,"collapsed":true},"cell_type":"code","source":"df_train.head()","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"4b8ff14e-74dc-462e-b164-e087dc2a520a","_uuid":"a13cc8cb331e297fbda3c4e413550f188330713b","collapsed":true,"trusted":true},"cell_type":"code","source":"df_train_x = df_train.iloc[:,1:] \ndf_train_y = df_train.iloc[:,:1] ","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"45e11072-3854-4ea9-a862-df0629060cf6","_uuid":"d0143d564c1e723dc2a36f022a72e578696340d6","trusted":true,"collapsed":true},"cell_type":"code","source":"ax = plt.subplots(1,5)\nfor i in range(0,5):   \n    ax[1][i].imshow(df_train_x.values[i].reshape(28,28), cmap='gray')\n    ax[1][i].set_title(df_train_y.values[i])","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f3cbfa93fa86efe90e9460061c95de5917167871"},"cell_type":"markdown","source":"### Entrenamiento"},{"metadata":{"_cell_guid":"d0fc68f8-9cfa-4df1-a775-07fea07b5c22","_uuid":"ce53b4ffdca0eb8dbc8c5a16a849c53d28e1b0b6","collapsed":true,"trusted":true},"cell_type":"code","source":"def cnn_model(result_class_size):\n    model = Sequential()\n    model.add(Conv2D(32, (5, 5), input_shape=(28,28,1), activation='relu')) #capa de convolución\n    model.add(MaxPooling2D(pool_size=(2, 2))) #capa de pooling\n    model.add(Conv2D(16, (3, 3), activation='relu'))\n    model.add(Dropout(0.2)) #20% de la capa cambia a cero(porcentaje que abandona)\n    model.add(Flatten()) #convierte la matriz en un vector\n    model.add(Dense(130, activation='relu')) #capa totalmente conectada\n    model.add(Dense(50, activation='relu'))\n    model.add(Dense(result_class_size, activation='softmax'))   \n    model.compile(loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy'])\n    return model","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"7ec2d8b1-bfe4-4b00-a3db-cd3301cd9116","_uuid":"8b8bbf206eb8d146ad2f02bf52a121d6f0992240","trusted":true,"collapsed":true},"cell_type":"code","source":"arr_train_y = np_utils.to_categorical(df_train_y['label'].values)\nmodel = cnn_model(arr_train_y.shape[1])\nmodel.summary()\n","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"222d9cc1-2b7b-424c-ad96-ca0dd4b18427","_uuid":"2e111d8ccf3fea71cc4bad5bbf96bba9d317fb0d","collapsed":true,"trusted":true},"cell_type":"code","source":"#normalización de tonos de gris a 1 ó 0\ndf_test = df_test / 255\ndf_train_x = df_train_x / 255","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"70f9cc76-aacf-491f-82e8-4166cd333b99","_uuid":"0e9789f54c1dab101b3cf522cb7b9fb9909cf803","collapsed":true,"trusted":true},"cell_type":"code","source":"arr_train_x_28x28 = np.reshape(df_train_x.values, (df_train_x.values.shape[0], 28, 28, 1))\narr_test_x_28x28 = np.reshape(df_test.values, (df_test.values.shape[0], 28, 28, 1))","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"9d128991-416f-4621-ba32-af38d7679a8f","_uuid":"f63e48119cbafbc884b2783c7aaf180832a81409","collapsed":true,"trusted":true},"cell_type":"code","source":"random_seed = 3\n#analizamos el 80% del set de entrenamiento\nsplit_train_x, split_val_x, split_train_y, split_val_y, = train_test_split(arr_train_x_28x28, arr_train_y, test_size = 0.08, random_state=random_seed)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"a8406f96-6b3e-4162-85ef-f9ddd1fbf36c","_uuid":"ecb450840f6416baeac5ad578a84d07b5a604995","collapsed":true,"trusted":true},"cell_type":"code","source":"reduce_lr = ReduceLROnPlateau(monitor='val_acc', \n                              factor=0.5,\n                              patience=3, \n                              min_lr=0.00001)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"c6e07831-d736-44c3-918a-1d1169f10b89","_uuid":"759ce1cbb9cc5629ef3ca5581f35a4070c349e46","collapsed":true,"trusted":true},"cell_type":"code","source":"# ImageDataGenerator permite generar variaciones en la imagen analizada\ndatagen = ImageDataGenerator(\n        rotation_range=10,  \n        zoom_range = 0.1, \n        width_shift_range=0.1,  \n        height_shift_range=0.1  \n        )\n\ndatagen.fit(split_train_x)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"19e608feb99312769d03b991cd0b934b69665013"},"cell_type":"markdown","source":"Entrenamos 30 generaciones(epochs)"},{"metadata":{"_cell_guid":"24f5a61e-d038-468e-9f40-8be70563874a","_uuid":"8c0f8fd658d637c66b601fa20701e83b16f5f9e7","trusted":true,"collapsed":true},"cell_type":"code","source":"model.fit_generator(datagen.flow(split_train_x,split_train_y, batch_size=64),\n                              epochs = 30, validation_data = (split_val_x,split_val_y),\n                              verbose = 2, steps_per_epoch=700 \n                              , callbacks=[reduce_lr])","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"71a23a85-bad6-41eb-9ac9-999c5cd55ea6","_uuid":"02193192ff17a925515c8d8adf46c382cf8228ce","collapsed":true,"trusted":true},"cell_type":"code","source":"prediction = model.predict_classes(arr_test_x_28x28, verbose=0)\ndata_to_submit = pd.DataFrame({\"ImageId\": list(range(1,len(prediction)+1)), \"Label\": prediction})\ndata_to_submit.to_csv(\"result.csv\", header=True, index = False)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"60fe7957-0b19-4791-a18d-7b4691d92af5","_uuid":"23d61dea6c58bfdea0816dcfbba51b300323596f","collapsed":true,"trusted":true},"cell_type":"code","source":"from random import randrange\n#escogemos 10 imagenes del set de entrenamiento\nstart_idx = randrange(df_test.shape[0]-10) ","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"f0ef79e4-6cc3-4a42-b1e0-a607c95749e3","_uuid":"dea2ec826c9b38cd31765d2b0d4cea9350a7ece7","trusted":true,"collapsed":true},"cell_type":"code","source":"fig, ax = plt.subplots(2,5, figsize=(15,8))\nfor j in range(0,2): \n  for i in range(0,5):\n     ax[j][i].imshow(df_test.values[start_idx].reshape(28,28), cmap='gray')\n     ax[j][i].set_title(\"Index:{} \\nPrediction:{}\".format(start_idx, prediction[start_idx]))\n     start_idx +=1","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}