{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom tensorflow import keras\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport numpy as np\n\n%matplotlib inline\nprint(pd.__version__, np.__version__, keras.__version__)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\")\ndata.describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X, y = data.iloc[:, 1:] / 255, data.iloc[:, 0]\nX, y = X.values, y.values\nprint(X.dtype, y.dtype)\nX.resize(X.shape[0], 28, 28, 1)\n# to_categorical\nfrom keras.utils import to_categorical\ny = to_categorical(y, num_classes=10)\n# shape\nprint(type(X), X.shape)\nprint(type(y), y.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# help(train_test_split)\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.1, random_state=3)\nprint(X_train.shape, y_train.shape)\nprint(X_val.shape, y_val.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\ndatagen = ImageDataGenerator(\n    rotation_range=10,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    shear_range=0.1,\n    zoom_range=0.1\n)\n\n# datagen.fit\ndatagen.fit(X_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i, img in zip(range(27), datagen.flow(X_train, batch_size=1, shuffle=True)):\n    img.resize(28, 28)\n    plt.subplot(3, 9, i+1)\n    plt.imshow(img, cmap=\"gray\")\n    plt.axis('off')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# help(keras.layers.Conv2D)\nregularizer=10E-4\n\ndef res_block(x, i, regularizer=regularizer):\n    x1 = keras.layers.Conv2D(pow(2, i), (3, 3), activation='relu', \n                             padding='same', kernel_initializer=\"he_normal\", \n                             kernel_regularizer=keras.regularizers.l2(regularizer))(x)\n    x2 = keras.layers.Conv2D(pow(2, i), (3, 3), activation='relu', \n                             padding='same', kernel_initializer=\"he_normal\",\n                             kernel_regularizer=keras.regularizers.l2(regularizer))(x1)\n    x2 = keras.layers.Conv2D(pow(2, i), (3, 3), activation='relu', \n                             padding='same', kernel_initializer=\"he_normal\",\n                             kernel_regularizer=keras.regularizers.l2(regularizer))(x2)\n    x = keras.layers.concatenate([x1, x2])\n    return x\n\ninput_X = keras.layers.Input(shape=(28, 28, 1))\nx = input_X\nfor i in range(3, 7):\n    x = res_block(x, i)\n    x = keras.layers.MaxPooling2D(2, 2)(x)\n    x = keras.layers.BatchNormalization()(x)\nx = keras.layers.Flatten()(x)\ny = keras.layers.Dense(units=10, activation='softmax')(x)\nmodel = keras.models.Model(inputs=input_X, outputs=y)\n\n# ------------------------------------------------------------------------------------\nmodel.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])\nmodel.summary()\n\n# plot_model\nfrom tensorflow.keras.utils import plot_model\nplot_model(model, show_shapes=True)\n\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"es = keras.callbacks.EarlyStopping(monitor='val_loss', patience=7, restore_best_weights=True)\nhistory = model.fit_generator(\n    datagen.flow(X_train, y_train, batch_size=64),\n    epochs=32,\n    verbose=1,\n    validation_data=(X_val, y_val),\n    shuffle=True,\n    callbacks=[es]\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_data = pd.read_csv(\"/kaggle/input/digit-recognizer/test.csv\")\ntest_imgs = test_data / 255\ntest_imgs = test_imgs.values\ntest_imgs.resize(test_imgs.shape[0], 28, 28, 1)\nprint(test_imgs.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predictions = model.predict(test_imgs).argmax(axis=1)\nprint(predictions.shape)\nprint(predictions)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"results = pd.DataFrame({\"ImageID\": range(1, len(test_imgs) + 1),\n                        \"Label\": predictions})\nprint(results)\nresults.to_csv(\"sample_submission.csv\", header=True, index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":1}