{"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":82654,"databundleVersionId":9073423,"sourceType":"competition"}],"dockerImageVersionId":30733,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torchvision.transforms as transforms\nfrom torch.utils.data import DataLoader, TensorDataset\nimport numpy as np\nimport pandas as pd\n\n# デバイスの設定 (GPUが利用可能な場合はGPUを使う)\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\n# ハイパーパラメータの設定\nnum_epochs = 30\nbatch_size = 100\nlearning_rate = 0.001\n\n# CSVファイルからデータを読み込む\ntrain_df = pd.read_csv('../input/digit-recognizer-uec-clone/train.csv')\ntest_df = pd.read_csv('../input/digit-recognizer-uec-clone/test.csv')\n\n# データとラベルに分割する\nX_train = train_df.iloc[:40000, 1:].values / 255.0  # 画像データ (0-255) を0-1の範囲に正規化\ny_train = train_df.iloc[:40000, 0].values  # ラベル (数字)\n\nX_valid = train_df.iloc[40000:, 1:].values / 255.0\ny_valid = train_df.iloc[40000:, 0].values\n\nX_test = test_df.iloc[:, :].values / 255.0\n\n# Tensorに変換\nX_train_tensor = torch.tensor(X_train, dtype=torch.float32)\ny_train_tensor = torch.tensor(y_train, dtype=torch.long)\n\nX_valid_tensor = torch.tensor(X_valid, dtype=torch.float32)\ny_valid_tensor = torch.tensor(y_valid, dtype=torch.long)\n\n# DataLoaderを作成\ntrain_dataset = TensorDataset(X_train_tensor, y_train_tensor)\nvalid_dataset = TensorDataset(X_valid_tensor, y_valid_tensor)\n\ntrain_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)\nvalid_loader = DataLoader(dataset=valid_dataset, batch_size=batch_size, shuffle=False)\n\n# ネットワークの定義\nclass ConvNet(nn.Module):\n    def __init__(self):\n        super(ConvNet, self).__init__()\n        self.layer1 = nn.Sequential(\n            nn.Conv2d(1, 16, kernel_size=5, stride=1, padding=2),\n            nn.BatchNorm2d(16),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2, stride=2)\n        )\n        self.layer2 = nn.Sequential(\n            nn.Conv2d(16, 32, kernel_size=5, stride=1, padding=2),\n            nn.BatchNorm2d(32),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2, stride=2)\n        )\n        self.fc = nn.Linear(7 * 7 * 32, 10)\n\n    def forward(self, x):\n        out = self.layer1(x)\n        out = self.layer2(out)\n        out = out.reshape(out.size(0), -1)\n        out = self.fc(out)\n        return out\n\nmodel = ConvNet().to(device)\n\n# 損失関数とオプティマイザの定義\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=learning_rate)\n\n# モデルの学習\ntotal_step = len(train_loader)\nfor epoch in range(num_epochs):\n    for i, (images, labels) in enumerate(train_loader):\n        images = images.view(-1, 1, 28, 28).to(device)  # バッチサイズ x チャネル数 x 画像の高さ x 画像の幅に変換\n        labels = labels.to(device)\n\n        # フォワードパス\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n\n        # バックワードパスとオプティマイズ\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n\n        if (i+1) % 100 == 0:\n            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{total_step}], Loss: {loss.item():.4f}')\n\n# モデルの評価\nmodel.eval()  # 評価モードに切り替え\nwith torch.no_grad():\n    correct = 0\n    total = 0\n    for images, labels in valid_loader:\n        images = images.view(-1, 1, 28, 28).to(device)\n        labels = labels.to(device)\n        outputs = model(images)\n        _, predicted = torch.max(outputs.data, 1)\n        total += labels.size(0)\n        correct += (predicted == labels).sum().item()\n\n    print(f'テストデータに対する正解率: {100 * correct / total}%')\n\n# モデルの保存\ntorch.save(model.state_dict(), 'mnist_cnn_from_csv.ckpt')\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-07-09T08:45:31.312566Z","iopub.execute_input":"2024-07-09T08:45:31.313224Z","iopub.status.idle":"2024-07-09T08:46:29.495324Z","shell.execute_reply.started":"2024-07-09T08:45:31.313194Z","shell.execute_reply":"2024-07-09T08:46:29.494411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# DataLoaderを作成\nX_test_tensor = torch.tensor(X_test, dtype=torch.float32)\ntest_dataset = TensorDataset(X_test_tensor)\ntest_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2024-07-09T08:46:33.371323Z","iopub.execute_input":"2024-07-09T08:46:33.372137Z","iopub.status.idle":"2024-07-09T08:46:33.411861Z","shell.execute_reply.started":"2024-07-09T08:46:33.372107Z","shell.execute_reply":"2024-07-09T08:46:33.410871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.eval()  # 評価モードに切り替え\npredtiction = np.zeros(test_df.shape[0], dtype=np.int32)\nstart_ind = 0\nwith torch.no_grad():\n    correct = 0\n    total = 0\n    for images, in test_loader:\n        images = images.view(-1, 1, 28, 28).to(device)\n        outputs = model(images)\n        _, predicted = torch.max(outputs.data, 1)\n        predicted_arr = predicted.cpu()\n        predtiction[start_ind:start_ind+images.shape[0]] = predicted_arr\n        start_ind += images.shape[0]\n        ","metadata":{"execution":{"iopub.status.busy":"2024-07-09T08:46:34.002152Z","iopub.execute_input":"2024-07-09T08:46:34.002799Z","iopub.status.idle":"2024-07-09T08:46:34.410840Z","shell.execute_reply.started":"2024-07-09T08:46:34.002768Z","shell.execute_reply":"2024-07-09T08:46:34.410088Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_df = pd.read_csv(\"../input/digit-recognizer-uec-clone/sample_submission.csv\")\nsub_df[\"Label\"] = predtiction","metadata":{"execution":{"iopub.status.busy":"2024-07-09T08:46:35.285233Z","iopub.execute_input":"2024-07-09T08:46:35.285565Z","iopub.status.idle":"2024-07-09T08:46:35.299970Z","shell.execute_reply.started":"2024-07-09T08:46:35.285542Z","shell.execute_reply":"2024-07-09T08:46:35.299088Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_df.to_csv(\"chatgpt35.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2024-07-09T08:46:35.968215Z","iopub.execute_input":"2024-07-09T08:46:35.968871Z","iopub.status.idle":"2024-07-09T08:46:36.007768Z","shell.execute_reply.started":"2024-07-09T08:46:35.968842Z","shell.execute_reply":"2024-07-09T08:46:36.007026Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}