{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"competition","sourceId":3004,"databundleVersionId":861823}],"dockerImageVersionId":31328,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom tensorflow.keras import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, BatchNormalization\nfrom tensorflow.keras.layers import Flatten, Dense, Dropout\n\n\ndef locate_dataset(base_dir='/kaggle/input'):\n    default_path = os.path.join(base_dir, 'digit-recognizer')\n    if os.path.isdir(default_path):\n        return default_path\n\n    for root, _, files in os.walk(base_dir):\n        if 'train.csv' in files:\n            return root\n    raise FileNotFoundError('Dataset not found')\n\n\ndef load_data(path):\n    train_df = pd.read_csv(os.path.join(path, 'train.csv'))\n    test_df = pd.read_csv(os.path.join(path, 'test.csv'))\n\n    features = train_df.drop(columns=['label']).to_numpy()\n    targets = train_df['label'].to_numpy()\n\n    test_features = test_df.to_numpy()\n\n    features = features.reshape(-1, 28, 28, 1).astype('float32') / 255\n    test_features = test_features.reshape(-1, 28, 28, 1).astype('float32') / 255\n\n    return features, targets, test_features\n\n\ndef build_network(input_shape=(28, 28, 1)):\n    net = Sequential()\n\n    net.add(Conv2D(32, kernel_size=3, activation='relu', input_shape=input_shape))\n    net.add(BatchNormalization())\n    net.add(MaxPooling2D(pool_size=2))\n\n    net.add(Conv2D(64, kernel_size=3, activation='relu'))\n    net.add(BatchNormalization())\n    net.add(MaxPooling2D(pool_size=2))\n\n    net.add(Flatten())\n    net.add(Dense(128, activation='relu'))\n    net.add(Dropout(0.3))\n    net.add(Dense(10, activation='softmax'))\n\n    net.compile(\n        optimizer='adam',\n        loss='sparse_categorical_crossentropy',\n        metrics=['accuracy']\n    )\n    return net\n\n\ndef train_model(model, x, y):\n    print('Обучение запущено...')\n    model.fit(\n        x, y,\n        epochs=10,\n        batch_size=64,\n        validation_split=0.1,\n        verbose=1\n    )\n\n\ndef make_submission(model, test_data, filename='submission.csv'):\n    probs = model.predict(test_data)\n    labels = np.argmax(probs, axis=1)\n\n    output = pd.DataFrame({\n        'ImageId': np.arange(1, len(labels) + 1),\n        'Label': labels\n    })\n\n    output.to_csv(filename, index=False)\n    print(f'Файл {filename} сохранён')\n\n\ndef main():\n    data_path = locate_dataset()\n    X, y, X_test = load_data(data_path)\n\n    cnn = build_network()\n    train_model(cnn, X, y)\n\n    make_submission(cnn, X_test)\n\n\nif __name__ == '__main__':\n    main()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-03-25T19:54:02.487031Z","iopub.execute_input":"2026-03-25T19:54:02.487866Z","iopub.status.idle":"2026-03-25T19:58:54.590119Z","shell.execute_reply.started":"2026-03-25T19:54:02.487814Z","shell.execute_reply":"2026-03-25T19:58:54.588942Z"}},"outputs":[],"execution_count":null}]}