{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import keras\nimport numpy as np\nimport pandas as pd\nimport os\nimport random\nimport matplotlib.pyplot as plt\n\nfrom sklearn.model_selection import train_test_split","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"train = pd.read_csv(\"../input/Kannada-MNIST/train.csv\")\nvalidate = pd.read_csv(\"../input/Kannada-MNIST/Dig-MNIST.csv\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_X = np.array(train.drop(\"label\",axis=1),dtype=np.float32)\ntrain_Y = np.array(train[[\"label\"]],dtype=np.int32)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"val_X = np.array(validate.drop(\"label\",axis=1),dtype=np.float32)\nval_Y = np.array(validate[[\"label\"]],dtype=np.int32)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_X[0].shape","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Посмотрим на данные"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_X = np.reshape(train_X,(-1, 28, 28))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig=plt.figure(figsize=(8, 8))\nfor i in range(1, 11):\n    fig.add_subplot(5, 5, i)\n    plt.imshow(train_X[i])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train_Y[1:11].flatten())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Штош, ноль действительно похож на ноль!"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_X = np.array(train.drop(\"label\",axis=1),dtype=np.float32)\ntrain_Y = np.array(train[[\"label\"]],dtype=np.int32)\ntrain_X = np.reshape(train_X,(-1, 28, 28, 1))\nval_X = np.reshape(val_X,(-1, 28, 28, 1))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Нормализуем"},{"metadata":{"trusted":true},"cell_type":"code","source":"all_x = np.concatenate((train_X, val_X)) / 255. * 2 - 1","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Поделим данные"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_X, val_X, train_Y, val_Y = train_test_split(all_x, np.concatenate((train_Y, val_Y)), shuffle=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.layers import Conv2D, BatchNormalization, Dense, Flatten, Dropout","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = keras.Sequential()\nmodel.add(Conv2D(64, (7, 7), strides=(2, 2), padding='same', activation='relu', input_shape=(28, 28, 1)))\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(128, (3, 3), strides=(2, 2), padding='same', activation='relu', input_shape=(28, 28, 1)))\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(256, (1, 1), strides=(2, 2), padding='same', activation='relu', input_shape=(28, 28, 1)))\nmodel.add(BatchNormalization())\nmodel.add(Flatten())\nmodel.add(Dense(256, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Dense(64, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Dense(10, activation='softmax'))\nmodel.compile(optimizer='rmsprop', loss=\"sparse_categorical_crossentropy\", metrics=[\"accuracy\"])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Добавим чекпоинтов, лр-шедулер и логирование"},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.callbacks import ModelCheckpoint\nfilepath=\"best-weights.hdf5\"\ncheckpoint = ModelCheckpoint(filepath, monitor='val_accuracy', verbose=1, save_best_only=True, mode='max')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.callbacks import LearningRateScheduler\nscheduler = LearningRateScheduler(lambda e: 0.01 if e < 5 else 0.001 if e < 10 else 0.0001 if e < 15 else 0.00001 if e < 20 else 0.0000001)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.callbacks import CSVLogger\ncsv_logger = CSVLogger('log.csv', append=True, separator=';')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"callbacks = [checkpoint, scheduler, csv_logger]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Обучаем-с"},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit(train_X, train_Y, epochs=25, validation_data=(val_X, val_Y), callbacks=callbacks)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"А теперь нужно загрузить модель"},{"metadata":{"trusted":true},"cell_type":"code","source":"model.load_weights(\"best-weights.hdf5\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Потестить"},{"metadata":{"trusted":true},"cell_type":"code","source":"print(np.argmax(model.predict(np.array([val_X[2]]))), val_Y[2][0])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"И сделать сабмишн"},{"metadata":{"trusted":true},"cell_type":"code","source":"test_csv = pd.read_csv(\"../input/Kannada-MNIST/test.csv\")\nX_test = np.array(test_csv.drop(\"id\",axis=1),dtype=np.float32)\nX_test = np.reshape(X_test,(-1, 28, 28, 1))\nX_test = X_test / 255. * 2 - 1\nresults = model.predict(X_test)\nresults = np.argmax(results, axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"results","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.read_csv(\"../input/Kannada-MNIST/sample_submission.csv\")\nsubmission['label'] = results\nsubmission.to_csv(\"submission.csv\",index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}