{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"},{"sourceId":9243,"sourceType":"datasetVersion","datasetId":2243}],"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd \nimport numpy as np ","metadata":{"execution":{"iopub.status.busy":"2024-04-27T17:08:47.774011Z","iopub.execute_input":"2024-04-27T17:08:47.774353Z","iopub.status.idle":"2024-04-27T17:08:49.896865Z","shell.execute_reply.started":"2024-04-27T17:08:47.774322Z","shell.execute_reply":"2024-04-27T17:08:49.895898Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Скачаем датасеты\nfashion_train_df = pd.read_csv('/kaggle/input/fashionmnist/fashion-mnist_train.csv',sep=',')\nfashion_test_df = pd.read_csv('/kaggle/input/fashionmnist/fashion-mnist_test.csv', sep = ',')","metadata":{"execution":{"iopub.status.busy":"2024-04-27T17:08:49.898810Z","iopub.execute_input":"2024-04-27T17:08:49.899323Z","iopub.status.idle":"2024-04-27T17:08:58.374426Z","shell.execute_reply.started":"2024-04-27T17:08:49.899294Z","shell.execute_reply":"2024-04-27T17:08:58.373614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Преобразуем в массивы\ntrain = np.array(fashion_train_df, dtype='float32')\ntest = np.array(fashion_test_df, dtype='float32')","metadata":{"execution":{"iopub.status.busy":"2024-04-27T17:10:28.517122Z","iopub.execute_input":"2024-04-27T17:10:28.517977Z","iopub.status.idle":"2024-04-27T17:10:28.696466Z","shell.execute_reply.started":"2024-04-27T17:10:28.517934Z","shell.execute_reply":"2024-04-27T17:10:28.695519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Подготовим данные: центрируем и нормируем\nX_train = train[:, 1:] / 255\ny_train = train[:, 0]\n\nX_test = test[:, 1:] / 255\ny_test = test[:,0]","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2024-04-27T17:11:06.376169Z","iopub.execute_input":"2024-04-27T17:11:06.376794Z","iopub.status.idle":"2024-04-27T17:11:06.444660Z","shell.execute_reply.started":"2024-04-27T17:11:06.376758Z","shell.execute_reply":"2024-04-27T17:11:06.443774Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX_train, X_validate, y_train, y_validate = train_test_split(X_train, y_train, test_size=0.2, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2024-04-27T17:11:29.176935Z","iopub.execute_input":"2024-04-27T17:11:29.177767Z","iopub.status.idle":"2024-04-27T17:11:29.912443Z","shell.execute_reply.started":"2024-04-27T17:11:29.177725Z","shell.execute_reply":"2024-04-27T17:11:29.911657Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# догрузим необходимые библиотеки \nimport keras\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout, BatchNormalization\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import TensorBoard","metadata":{"execution":{"iopub.status.busy":"2024-04-27T17:12:35.337816Z","iopub.execute_input":"2024-04-27T17:12:35.338165Z","iopub.status.idle":"2024-04-27T17:12:47.140309Z","shell.execute_reply.started":"2024-04-27T17:12:35.338135Z","shell.execute_reply":"2024-04-27T17:12:47.139471Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"1. Sequential(): Создание пустой модели нейронной сети.\n2. Conv2D(filters=32, kernel_size=(3, 3), input_shape=(28,28,1), activation='relu', padding='same'): Добавление слоя свертки с 32 фильтрами, размером ядра (3, 3), функцией активации ReLU и параметром padding='same', который добавляет нулевые значения входных данных по краям, чтобы сохранить размерность после свертки. input_shape=(28,28,1) указывает размерность входных данных: 28x28 пикселей и 1 канал (черно-белое изображение).\n3. BatchNormalization(): Добавление слоя нормализации пакета, который нормализует активации предыдущего слоя по мере обучения, ускоряя сходимость.\n4. MaxPooling2D(pool_size=(2, 2)): Добавление слоя пулинга с размером окна (2, 2), который уменьшает размерность данных, выбирая максимальное значение из каждой области.\n5. Dropout(0.2): Добавление слоя регуляризации Dropout с коэффициентом отсева 0.2, который случайным образом исключает 20% нейронов на этом слое во время обучения для предотвращения переобучения.\n6. Повторение шагов 2-5 для создания еще одного блока свертки и пулинга с 64 фильтрами.\n7. Flatten(): Добавление слоя сглаживания, который преобразует двумерные данные в одномерные перед передачей их в полносвязный слой.\n8. Dense(units=128, activation='relu'): Добавление полносвязного слоя с 128 нейронами и функцией активации ReLU.\n9. Dense(units=10, activation='softmax'): Добавление полносвязного слоя с 10 нейронами и функцией активации Softmax, который выдает вероятности принадлежности к каждому классу (в данном случае 10 классов).","metadata":{}},{"cell_type":"code","source":"cnn_model = Sequential()\n\ncnn_model.add(Conv2D(filters=32, kernel_size=(3, 3), input_shape=(28,28,1), activation='relu', padding='same'))\ncnn_model.add(BatchNormalization())\ncnn_model.add(Conv2D(filters=32, kernel_size=(3, 3), input_shape=(28,28,1), activation='relu', padding='same'))\ncnn_model.add(BatchNormalization())\ncnn_model.add(MaxPooling2D(pool_size=(2, 2)))\ncnn_model.add(Dropout(0.2))\n\ncnn_model.add(Conv2D(filters=64, kernel_size=(3, 3), input_shape=(28,28,1), activation='relu', padding='same'))\ncnn_model.add(BatchNormalization())\ncnn_model.add(Conv2D(filters=64, kernel_size=(3, 3), input_shape=(28,28,1), activation='relu', padding='same'))\ncnn_model.add(BatchNormalization())\ncnn_model.add(MaxPooling2D(pool_size=(2, 2)))\ncnn_model.add(Dropout(0.2))\n\ncnn_model.add(Flatten())\ncnn_model.add(Dense(units=128, activation='relu'))\ncnn_model.add(Dropout(0.2))\ncnn_model.add(Dense(units=10, activation='softmax'))","metadata":{"execution":{"iopub.status.busy":"2024-04-27T17:12:58.155960Z","iopub.execute_input":"2024-04-27T17:12:58.156292Z","iopub.status.idle":"2024-04-27T17:12:59.029633Z","shell.execute_reply.started":"2024-04-27T17:12:58.156267Z","shell.execute_reply":"2024-04-27T17:12:59.028843Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# определяем метрику и функцию потерь\nmetrics = [\n    'accuracy',\n    tf.keras.metrics.Precision(name='precision'),\n    tf.keras.metrics.Recall(name='recall')\n]\n\ncnn_model.compile(loss ='sparse_categorical_crossentropy', optimizer='adam' ,metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-04-27T17:44:24.812184Z","iopub.execute_input":"2024-04-27T17:44:24.813023Z","iopub.status.idle":"2024-04-27T17:44:24.826121Z","shell.execute_reply.started":"2024-04-27T17:44:24.812988Z","shell.execute_reply":"2024-04-27T17:44:24.825303Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# проводим обучение\nepochs = 50\nbatch_size = 512\n\nhistory = cnn_model.fit(\n    X_train, y_train, \n    batch_size=batch_size, \n    epochs=epochs,\n    verbose=1, \n    validation_data=(X_validate, y_validate)\n)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-04-27T17:13:20.989950Z","iopub.execute_input":"2024-04-27T17:13:20.990310Z","iopub.status.idle":"2024-04-27T17:15:06.862021Z","shell.execute_reply.started":"2024-04-27T17:13:20.990280Z","shell.execute_reply":"2024-04-27T17:15:06.860982Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#считаем метрику \nevaluation = cnn_model.evaluate(X_test, y_test)\nprint(f'Test Accuracy : {evaluation[1]:.3f}')","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2024-04-27T17:15:32.372593Z","iopub.execute_input":"2024-04-27T17:15:32.373387Z","iopub.status.idle":"2024-04-27T17:15:34.679736Z","shell.execute_reply.started":"2024-04-27T17:15:32.373357Z","shell.execute_reply":"2024-04-27T17:15:34.678679Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# получаем предсказания\npredicted_classes = cnn_model.predict(X_test)\npredicted_classes = np.argmax(predicted_classes, axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-04-27T17:25:40.544354Z","iopub.execute_input":"2024-04-27T17:25:40.545063Z","iopub.status.idle":"2024-04-27T17:25:41.233375Z","shell.execute_reply.started":"2024-04-27T17:25:40.545030Z","shell.execute_reply":"2024-04-27T17:25:41.232549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"results_df = pd.DataFrame({'Id': range(len(predicted_classes)), 'Label': predicted_classes})\nresults_df.to_csv('predictions.csv', index=False)\nresults_df","metadata":{"execution":{"iopub.status.busy":"2024-04-27T17:36:55.674394Z","iopub.execute_input":"2024-04-27T17:36:55.674798Z","iopub.status.idle":"2024-04-27T17:36:55.701677Z","shell.execute_reply.started":"2024-04-27T17:36:55.674762Z","shell.execute_reply":"2024-04-27T17:36:55.700537Z"},"trusted":true},"execution_count":null,"outputs":[]}]}