{"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":"## Importowanie bibliotek","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report\nimport keras\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Conv2D, MaxPool2D, UpSampling2D, Activation\nfrom keras import backend as K\nfrom sklearn.cluster import KMeans\nfrom sklearn.metrics import confusion_matrix\nimport seaborn as sns\nfrom sklearn import manifold\nfrom sklearn import datasets","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-01-26T14:00:53.755979Z","iopub.execute_input":"2022-01-26T14:00:53.756469Z","iopub.status.idle":"2022-01-26T14:01:02.089020Z","shell.execute_reply.started":"2022-01-26T14:00:53.756368Z","shell.execute_reply":"2022-01-26T14:01:02.087793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Importowanie danych","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('../input/digit-recognizer/train.csv')\ntest = pd.read_csv('../input/digit-recognizer/test.csv')\n\nX = train.drop(['label'], axis=1)\ny = train['label']\n\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=123)\nX_train, X_validate, y_train, y_validate = train_test_split(X_train, y_train, test_size=0.25, stratify=y_train, random_state=123)\n\n# Zmiana kształtu i skalowanie obrazów\nX_train = X_train.values.reshape(-1,28,28,1) / 255\nX_test = X_test.values.reshape(-1,28,28,1) / 255\nX_validate = X_validate.values.reshape(-1,28,28,1) / 255","metadata":{"execution":{"iopub.status.busy":"2022-01-26T14:01:02.090789Z","iopub.execute_input":"2022-01-26T14:01:02.091176Z","iopub.status.idle":"2022-01-26T14:01:10.088345Z","shell.execute_reply.started":"2022-01-26T14:01:02.091138Z","shell.execute_reply":"2022-01-26T14:01:10.087340Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Budowanie autokodera","metadata":{}},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(14, kernel_size=3, padding='same', activation='relu', input_shape=(28,28,1)))\nmodel.add(MaxPool2D((2,2), padding='same'))\nmodel.add(Dropout(0.2))\nmodel.add(Conv2D(7, kernel_size=3, padding='same', activation='relu'))\nmodel.add(MaxPool2D((2,2), padding='same'))\nmodel.add(Dropout(0.2))\nmodel.add(Conv2D(7, kernel_size=3, padding='same', activation='relu'))\nmodel.add(UpSampling2D((2,2)))\nmodel.add(Dropout(0.2))\nmodel.add(Conv2D(14, kernel_size=3, padding='same', activation='relu'))\nmodel.add(UpSampling2D((2,2)))\nmodel.add(Dropout(0.2))\nmodel.add(Conv2D(1, kernel_size=3, padding='same', activation='relu'))\n\nmodel.compile(optimizer='adam', loss=\"mse\")\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-01-26T14:02:19.464134Z","iopub.execute_input":"2022-01-26T14:02:19.464527Z","iopub.status.idle":"2022-01-26T14:02:19.694720Z","shell.execute_reply.started":"2022-01-26T14:02:19.464487Z","shell.execute_reply":"2022-01-26T14:02:19.693233Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Trenowanie modelu","metadata":{}},{"cell_type":"code","source":"model.fit(X_train, X_train, epochs=3, batch_size=64, validation_data=(X_validate, X_validate), verbose=1)","metadata":{"execution":{"iopub.status.busy":"2022-01-26T14:02:19.696856Z","iopub.execute_input":"2022-01-26T14:02:19.697379Z","iopub.status.idle":"2022-01-26T14:03:36.234746Z","shell.execute_reply.started":"2022-01-26T14:02:19.697320Z","shell.execute_reply":"2022-01-26T14:03:36.233827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Dopasowanie testowego zbioru danych","metadata":{}},{"cell_type":"code","source":"restored_testing_dataset = model.predict(X_test)","metadata":{"execution":{"iopub.status.busy":"2022-01-26T14:03:36.238935Z","iopub.execute_input":"2022-01-26T14:03:36.241200Z","iopub.status.idle":"2022-01-26T14:03:38.905238Z","shell.execute_reply.started":"2022-01-26T14:03:36.241123Z","shell.execute_reply":"2022-01-26T14:03:38.903815Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Obserwacja jakości zrekonstruowanego obrazu","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(20,5))\nfor i in range(10):\n    index = y_test.tolist().index(i)\n    plt.subplot(2, 10, i+1)\n    plt.imshow(X_test[index].reshape((28,28)))\n    plt.gray()\n    plt.subplot(2, 10, i+11)\n    plt.imshow(restored_testing_dataset[index].reshape((28,28)))\n    plt.gray()","metadata":{"execution":{"iopub.status.busy":"2022-01-26T14:03:38.906792Z","iopub.execute_input":"2022-01-26T14:03:38.907208Z","iopub.status.idle":"2022-01-26T14:03:40.943188Z","shell.execute_reply.started":"2022-01-26T14:03:38.907170Z","shell.execute_reply":"2022-01-26T14:03:40.941986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Wyodrębnienie kodera","metadata":{}},{"cell_type":"code","source":"encoder = K.function([model.layers[0].input], [model.layers[4].output])","metadata":{"execution":{"iopub.status.busy":"2022-01-26T14:03:40.946473Z","iopub.execute_input":"2022-01-26T14:03:40.947007Z","iopub.status.idle":"2022-01-26T14:03:40.957792Z","shell.execute_reply.started":"2022-01-26T14:03:40.946949Z","shell.execute_reply":"2022-01-26T14:03:40.956795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Zakodowanie zestawu treningowego","metadata":{}},{"cell_type":"code","source":"encoded_images = encoder([X_test])[0].reshape(-1,7*7*7)","metadata":{"execution":{"iopub.status.busy":"2022-01-26T14:03:40.959492Z","iopub.execute_input":"2022-01-26T14:03:40.960155Z","iopub.status.idle":"2022-01-26T14:03:42.466379Z","shell.execute_reply.started":"2022-01-26T14:03:40.960104Z","shell.execute_reply":"2022-01-26T14:03:42.465209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Zgrupowanie zestawu treningowego","metadata":{}},{"cell_type":"code","source":"kmeans = KMeans(n_clusters=10,max_iter=200)\nclustered_training_set = kmeans.fit_predict(encoded_images)","metadata":{"execution":{"iopub.status.busy":"2022-01-26T14:03:42.468009Z","iopub.execute_input":"2022-01-26T14:03:42.468434Z","iopub.status.idle":"2022-01-26T14:03:47.606348Z","shell.execute_reply.started":"2022-01-26T14:03:42.468388Z","shell.execute_reply":"2022-01-26T14:03:47.605062Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Obserwacja i porównanie wyników grupowania z rzeczywistą etykietą, używając macierzy pomyłek","metadata":{}},{"cell_type":"code","source":"cm = confusion_matrix(y_test, clustered_training_set)\nplt.figure(figsize=(10, 10))\nsns.heatmap(cm, annot=True, fmt=\"d\")\nplt.title(\"Confusion matrix\", fontsize=30)\nplt.ylabel('True label', fontsize=25)\nplt.xlabel('Clustering label', fontsize=25)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-26T14:03:47.608176Z","iopub.execute_input":"2022-01-26T14:03:47.608572Z","iopub.status.idle":"2022-01-26T14:03:48.350925Z","shell.execute_reply.started":"2022-01-26T14:03:47.608527Z","shell.execute_reply":"2022-01-26T14:03:48.350083Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Wykreślenie rzeczywistych zdjęć pogrupowanych według klastrów","metadata":{}},{"cell_type":"code","source":"fig = plt.figure(figsize=(20,20))\nfor r in range(10):\n    cluster = cm[r].argmax()\n    for c, val in enumerate(X_test[clustered_training_set == cluster][0:10]):\n        fig.add_subplot(10, 10, 10*r+c+1)\n        plt.imshow(val.reshape((28,28)))\n        plt.gray()\n        plt.xticks([])\n        plt.yticks([])\n        plt.xlabel('cluster: '+str(cluster))\n        plt.ylabel('digit: '+str(r))","metadata":{"execution":{"iopub.status.busy":"2022-01-26T14:03:48.352050Z","iopub.execute_input":"2022-01-26T14:03:48.352474Z","iopub.status.idle":"2022-01-26T14:03:55.020509Z","shell.execute_reply.started":"2022-01-26T14:03:48.352440Z","shell.execute_reply":"2022-01-26T14:03:55.019169Z"},"trusted":true},"execution_count":null,"outputs":[]}]}