{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"**MNIST** - це набір даних із 60 000 зображень у відтінках сірого розміром 28x28 із 10 цифрами, разом із тестовим набором із 10 000 зображень.\n\n(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()\n\nx_train: NumPy масив даних зображень у відтінках сірого з розмірністю (60000, 28, 28), що містить навчальні дані. Діапазон значень пікселів від 0 до 255.\ny_train: NumPy масив міток цифр (цілі числа в діапазоні 0-9) із розмірністю (60000,) для навчальних даних.\nx_test: NumPy масив даних зображень у відтінках сірого з розмірністю (10000, 28, 28), що містить тестові дані. Діапазон значень пікселів від 0 до 255.\ny_test: NumPy масив міток цифр (цілі числа в діапазоні 0-9) із розмірністю (10000) для тестових даних.","metadata":{"papermill":{"duration":0.005043,"end_time":"2022-11-22T13:12:46.292177","exception":false,"start_time":"2022-11-22T13:12:46.287134","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nimport matplotlib.pyplot as plt \nfrom sklearn import metrics","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.execute_input":"2022-11-22T13:12:46.303817Z","iopub.status.busy":"2022-11-22T13:12:46.302427Z","iopub.status.idle":"2022-11-22T13:12:53.605409Z","shell.execute_reply":"2022-11-22T13:12:53.604125Z"},"papermill":{"duration":7.312802,"end_time":"2022-11-22T13:12:53.608695","exception":false,"start_time":"2022-11-22T13:12:46.295893","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Завантаження даних, розбитих на тренувальні та дані для тестування\n(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()","metadata":{"execution":{"iopub.execute_input":"2022-11-22T13:12:53.617298Z","iopub.status.busy":"2022-11-22T13:12:53.616588Z","iopub.status.idle":"2022-11-22T13:12:54.193291Z","shell.execute_reply":"2022-11-22T13:12:54.192050Z"},"papermill":{"duration":0.584269,"end_time":"2022-11-22T13:12:54.196338","exception":false,"start_time":"2022-11-22T13:12:53.612069","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Візуалізація деяких зображень\nfor i in range(3):\n    plt.subplot(330 + 1 + i)\n    plt.imshow(x_train[i], cmap=plt.get_cmap('gray'))\nplt.show()","metadata":{"execution":{"iopub.execute_input":"2022-11-22T13:12:54.205603Z","iopub.status.busy":"2022-11-22T13:12:54.205155Z","iopub.status.idle":"2022-11-22T13:12:54.491039Z","shell.execute_reply":"2022-11-22T13:12:54.489798Z"},"papermill":{"duration":0.293421,"end_time":"2022-11-22T13:12:54.493630","exception":false,"start_time":"2022-11-22T13:12:54.200209","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Парамтери моделі/даних\nnum_classes = 10\ninput_shape = (28, 28, 1)\n\n# Перетворення даних пікселів з діапазону від 1 до 255 до діапазону від 0 до 1\nx_train = x_train.astype(\"float32\") / 255\nx_test = x_test.astype(\"float32\") / 255\n\n# Впевнюємось, що зображення мають розмірність (28, 28, 1)\nx_train = np.expand_dims(x_train, -1)\nx_test = np.expand_dims(x_test, -1)\nprint(\"x_train shape:\", x_train.shape)\nprint(x_train.shape[0], \"train samples\")\nprint(x_test.shape[0], \"test samples\")\n\n# One-hot для target записів (на виході замість цілого числа буде матриця 1х10)\ny_train = keras.utils.to_categorical(y_train, num_classes)\ny_test = keras.utils.to_categorical(y_test, num_classes)","metadata":{"execution":{"iopub.execute_input":"2022-11-22T13:12:54.503872Z","iopub.status.busy":"2022-11-22T13:12:54.503030Z","iopub.status.idle":"2022-11-22T13:12:54.614891Z","shell.execute_reply":"2022-11-22T13:12:54.613258Z"},"papermill":{"duration":0.120577,"end_time":"2022-11-22T13:12:54.618386","exception":false,"start_time":"2022-11-22T13:12:54.497809","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = keras.Sequential(\n    [\n        layers.Flatten(),\n        layers.Dense(200, activation=\"relu\"),\n        layers.Dense(num_classes, activation=\"softmax\"),\n    ]\n)\n\nbatch_size = 128\nepochs = 15\n\nmodel.compile(loss=\"categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"])\n\nhistory = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1)","metadata":{"execution":{"iopub.execute_input":"2022-11-22T13:12:54.629407Z","iopub.status.busy":"2022-11-22T13:12:54.628282Z","iopub.status.idle":"2022-11-22T13:13:18.805637Z","shell.execute_reply":"2022-11-22T13:13:18.804548Z"},"papermill":{"duration":24.185804,"end_time":"2022-11-22T13:13:18.808629","exception":false,"start_time":"2022-11-22T13:12:54.622825","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = history.history\nn_epochs = len(history['loss'])\n\nplt.figure(figsize=[10,4])\nplt.subplot(1,2,1)\nplt.plot(range(1, n_epochs+1), history['loss'], label='Training')\nplt.plot(range(1, n_epochs+1), history['val_loss'], label='Validation')\nplt.xlabel('Epoch'); plt.ylabel('Loss'); plt.title('Loss')\nplt.legend()\nplt.subplot(1,2,2)\nplt.plot(range(1, n_epochs+1), history['accuracy'], label='Training')\nplt.plot(range(1, n_epochs+1), history['val_accuracy'], label='Validation')\nplt.xlabel('Epoch'); plt.ylabel('Accuracy'); plt.title('Accuracy')\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.execute_input":"2022-11-22T13:13:18.874999Z","iopub.status.busy":"2022-11-22T13:13:18.874574Z","iopub.status.idle":"2022-11-22T13:13:19.167522Z","shell.execute_reply":"2022-11-22T13:13:19.165010Z"},"papermill":{"duration":0.33014,"end_time":"2022-11-22T13:13:19.170413","exception":false,"start_time":"2022-11-22T13:13:18.840273","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"score = model.evaluate(x_test, y_test, verbose=0)\nprint(\"Test loss:\", score[0])\nprint(\"Test accuracy:\", score[1])","metadata":{"execution":{"iopub.execute_input":"2022-11-22T13:13:19.234819Z","iopub.status.busy":"2022-11-22T13:13:19.234354Z","iopub.status.idle":"2022-11-22T13:13:19.696194Z","shell.execute_reply":"2022-11-22T13:13:19.694525Z"},"papermill":{"duration":0.49799,"end_time":"2022-11-22T13:13:19.699683","exception":false,"start_time":"2022-11-22T13:13:19.201693","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_test_arg = np.argmax(y_test,axis=1)\ny_pred = np.argmax(model.predict(x_test),axis=1)\n\ncm = metrics.confusion_matrix(y_test_arg, y_pred)\n\ncmd_obj = metrics.ConfusionMatrixDisplay(cm, display_labels=list(range(0, 10)))\nfig, ax = plt.subplots(figsize=(10,10))\ncmd_obj.plot(ax=ax)\nplt.show()","metadata":{"execution":{"iopub.execute_input":"2022-11-22T13:13:19.764197Z","iopub.status.busy":"2022-11-22T13:13:19.762964Z","iopub.status.idle":"2022-11-22T13:13:20.776719Z","shell.execute_reply":"2022-11-22T13:13:20.775447Z"},"papermill":{"duration":1.048554,"end_time":"2022-11-22T13:13:20.779340","exception":false,"start_time":"2022-11-22T13:13:19.730786","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]}]}