{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "machine_shape": "hm", "gpuType": "V100" }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "accelerator": "GPU" }, "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "id": "wS_st3blv2jp", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "193f0747-4cc9-4078-ded9-41b0b4a2a8ff" }, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "Downloading...\n", "From: https://drive.google.com/uc?id=1mqCsj6uO4WIbv3FRO9OTKXc8Wd8lYbKa\n", "To: /content/Dataset.zip\n", "\r 0%| | 0.00/700M [00:00= num_samples_for_smote:\n", " break\n", "\n", "X_train = np.concatenate(X_train)\n", "y_train = np.concatenate(y_train)\n", "\n", "# SMOTE 적용\n", "smote = SMOTE(sampling_strategy='auto', random_state=42)\n", "X_train_resampled, y_train_resampled = smote.fit_resample(X_train.reshape(-1, 224 * 224 * 3), y_train)\n", "\n", "# 텐서로 변환\n", "X_train_resampled = torch.tensor(X_train_resampled.reshape(-1, 3, 224, 224))\n", "y_train_resampled = torch.tensor(y_train_resampled)" ], "metadata": { "id": "CmUPTYdYkmDe" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ " # 로지스틱 회귀 모델 정의\n", "class LogisticRegressionModel(nn.Module):\n", " def __init__(self, input_size):\n", " super(LogisticRegressionModel, self).__init__()\n", " self.flatten = nn.Flatten()\n", " self.linear = nn.Linear(input_size, 1)\n", " self.sigmoid = nn.Sigmoid()\n", "\n", " def forward(self, x):\n", " x = self.flatten(x)\n", " x = self.linear(x)\n", " x = self.sigmoid(x)\n", " return x" ], "metadata": { "id": "V5c8SK718-3W" }, "execution_count": 21, "outputs": [] }, { "cell_type": "code", "source": [ "# 모델 초기화\n", "input_size = 224 * 224 * 3 # 이미지 크기 및 채널 수에 따라 조정\n", "model = LogisticRegressionModel(input_size).cuda()\n", "\n", "# 손실 함수 및 최적화 알고리즘 설정 (AdamW)\n", "criterion = nn.BCELoss()\n", "optimizer = optim.AdamW(model.parameters(), lr=0.0001)\n" ], "metadata": { "id": "LDscXKbR8_4Q" }, "execution_count": 22, "outputs": [] }, { "cell_type": "code", "source": [ "# 학습\n", "num_epochs = 50\n", "for epoch in range(num_epochs):\n", " model.train()\n", " for i, (inputs, labels) in enumerate(train_loader):\n", " inputs, labels = inputs.cuda(), labels.cuda()\n", " optimizer.zero_grad()\n", " outputs = model(inputs)\n", "\n", " loss = criterion(outputs, labels.float().view(-1, 1))\n", " loss.backward()\n", " optimizer.step()\n", " total_steps = int(129600/batch_size)\n", " print(f'Epoch:[{epoch+1}/{num_epochs}] Step:[{i+1}/{total_steps+1}] Step_loss:{loss.item():.5f}')\n", " # Print progress\n", " print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}')\n", " # 모델 평가\n", " model.eval()\n", " all_predictions = []\n", " all_labels = []\n", " with torch.no_grad():\n", " for inputs, labels in valid_loader:\n", " inputs, labels = inputs.cuda(), labels.cuda()\n", " outputs = model(inputs).cuda()\n", " predictions = (outputs > 0.5).float()\n", " all_predictions.append(predictions)\n", " all_labels.append(labels)\n", " all_predictions = torch.cat(all_predictions).cpu()\n", " all_labels = torch.cat(all_labels).cpu()\n", " accuracy = accuracy_score(all_labels, all_predictions)\n", " print(f'Validation Accuracy: {accuracy}')\n", " f1 = f1_score(all_labels, all_predictions)\n", " print(f'Validation F1 Score: {f1}')" ], "metadata": { "id": "74dutkal9DtG", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "00e0dfc4-22cd-4267-d47a-a858a895f6aa" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch [1/50] Step:[1/64] Step_loss: 0.58745\n", "Epoch [1/50] Step:[2/64] Step_loss: 0.58196\n", "Epoch [1/50] Step:[3/64] Step_loss: 0.57389\n", "Epoch [1/50] Step:[4/64] Step_loss: 0.59231\n", "Epoch [1/50] Step:[5/64] Step_loss: 0.57840\n", "Epoch [1/50] Step:[6/64] Step_loss: 0.57138\n", "Epoch [1/50] Step:[7/64] Step_loss: 0.57638\n", "Epoch [1/50] Step:[8/64] Step_loss: 0.56401\n", "Epoch [1/50] Step:[9/64] Step_loss: 0.58184\n", "Epoch [1/50] Step:[10/64] Step_loss: 0.57189\n", "Epoch [1/50] Step:[11/64] Step_loss: 0.56412\n", "Epoch [1/50] Step:[12/64] Step_loss: 0.57424\n", "Epoch [1/50] Step:[13/64] Step_loss: 0.56927\n", "Epoch [1/50] Step:[14/64] Step_loss: 0.55216\n", "Epoch [1/50] Step:[15/64] Step_loss: 0.57783\n", "Epoch [1/50] Step:[16/64] Step_loss: 0.55716\n", "Epoch [1/50] Step:[17/64] Step_loss: 0.56030\n", "Epoch [1/50] Step:[18/64] Step_loss: 0.56626\n", "Epoch [1/50] Step:[19/64] Step_loss: 0.54872\n", "Epoch [1/50] Step:[20/64] Step_loss: 0.56241\n", "Epoch [1/50] Step:[21/64] Step_loss: 0.56201\n", "Epoch [1/50] Step:[22/64] Step_loss: 0.55821\n", "Epoch [1/50] Step:[23/64] Step_loss: 0.56016\n", "Epoch [1/50] Step:[24/64] Step_loss: 0.56836\n", "Epoch [1/50] Step:[25/64] Step_loss: 0.55823\n", "Epoch [1/50] Step:[26/64] Step_loss: 0.55694\n", "Epoch [1/50] Step:[27/64] Step_loss: 0.55958\n", "Epoch [1/50] Step:[28/64] Step_loss: 0.55113\n", "Epoch [1/50] Step:[29/64] Step_loss: 0.55596\n", "Epoch [1/50] Step:[30/64] Step_loss: 0.54465\n", "Epoch [1/50] Step:[31/64] Step_loss: 0.54343\n", "Epoch [1/50] Step:[32/64] Step_loss: 0.54366\n", "Epoch [1/50] Step:[33/64] Step_loss: 0.54128\n", "Epoch [1/50] Step:[34/64] Step_loss: 0.54744\n", "Epoch [1/50] Step:[35/64] Step_loss: 0.55186\n", "Epoch [1/50] Step:[36/64] Step_loss: 0.54697\n", "Epoch [1/50] Step:[37/64] Step_loss: 0.54832\n", "Epoch [1/50] Step:[38/64] Step_loss: 0.54394\n", "Epoch [1/50] Step:[39/64] Step_loss: 0.53079\n", "Epoch [1/50] Step:[40/64] Step_loss: 0.54948\n", "Epoch [1/50] Step:[41/64] Step_loss: 0.53726\n", "Epoch [1/50] Step:[42/64] Step_loss: 0.54393\n", "Epoch [1/50] Step:[43/64] Step_loss: 0.53918\n", "Epoch [1/50] Step:[44/64] Step_loss: 0.54003\n", "Epoch [1/50] Step:[45/64] Step_loss: 0.54803\n", "Epoch [1/50] Step:[46/64] Step_loss: 0.53045\n", "Epoch [1/50] Step:[47/64] Step_loss: 0.53130\n", "Epoch [1/50] Step:[48/64] Step_loss: 0.53213\n", "Epoch [1/50] Step:[49/64] Step_loss: 0.53309\n", "Epoch [1/50] Step:[50/64] Step_loss: 0.53307\n", "Epoch [1/50] Step:[51/64] Step_loss: 0.53282\n", "Epoch [1/50] Step:[52/64] Step_loss: 0.52812\n", "Epoch [1/50] Step:[53/64] Step_loss: 0.52012\n", "Epoch [1/50] Step:[54/64] Step_loss: 0.52923\n", "Epoch [1/50] Step:[55/64] Step_loss: 0.52933\n", "Epoch [1/50] Step:[56/64] Step_loss: 0.52348\n", "Epoch [1/50] Step:[57/64] Step_loss: 0.52567\n", "Epoch [1/50] Step:[58/64] Step_loss: 0.51367\n", "Epoch [1/50] Step:[59/64] Step_loss: 0.53834\n", "Epoch [1/50] Step:[60/64] Step_loss: 0.52386\n", "Epoch [1/50] Step:[61/64] Step_loss: 0.53638\n", "Epoch [1/50] Step:[62/64] Step_loss: 0.51488\n", "Epoch [1/50] Step:[63/64] Step_loss: 0.54372\n", "Epoch [1/50] Step:[64/64] Step_loss: 0.53531\n", "Epoch [1/50], Loss: 0.5353068709373474\n", "Validation Accuracy: 0.6314377682403434\n", "Validation F1 Score: 0.7740874712265702\n", "Epoch [2/50] Step:[1/64] Step_loss: 0.53095\n", "Epoch [2/50] Step:[2/64] Step_loss: 0.52171\n", "Epoch [2/50] Step:[3/64] Step_loss: 0.53188\n", "Epoch [2/50] Step:[4/64] Step_loss: 0.50675\n", "Epoch [2/50] Step:[5/64] Step_loss: 0.51028\n", "Epoch [2/50] Step:[6/64] Step_loss: 0.52670\n", "Epoch [2/50] Step:[7/64] Step_loss: 0.51836\n", "Epoch [2/50] Step:[8/64] Step_loss: 0.51599\n", "Epoch [2/50] Step:[9/64] Step_loss: 0.50562\n", "Epoch [2/50] Step:[10/64] Step_loss: 0.49185\n", "Epoch [2/50] Step:[11/64] Step_loss: 0.51065\n", "Epoch [2/50] Step:[12/64] Step_loss: 0.50994\n", "Epoch [2/50] Step:[13/64] Step_loss: 0.50348\n", "Epoch [2/50] Step:[14/64] Step_loss: 0.50455\n", "Epoch [2/50] Step:[15/64] Step_loss: 0.49326\n", "Epoch [2/50] Step:[16/64] Step_loss: 0.50965\n", "Epoch [2/50] Step:[17/64] Step_loss: 0.50516\n", "Epoch [2/50] Step:[18/64] Step_loss: 0.50401\n", "Epoch [2/50] Step:[19/64] Step_loss: 0.50499\n", "Epoch [2/50] Step:[20/64] Step_loss: 0.49590\n", "Epoch [2/50] Step:[21/64] Step_loss: 0.50605\n", "Epoch [2/50] Step:[22/64] Step_loss: 0.50388\n", "Epoch [2/50] Step:[23/64] Step_loss: 0.49169\n", "Epoch [2/50] Step:[24/64] Step_loss: 0.50895\n", "Epoch [2/50] Step:[25/64] Step_loss: 0.49507\n", "Epoch [2/50] Step:[26/64] Step_loss: 0.49121\n", "Epoch [2/50] Step:[27/64] Step_loss: 0.48667\n", "Epoch [2/50] Step:[28/64] Step_loss: 0.50104\n", "Epoch [2/50] Step:[29/64] Step_loss: 0.49185\n", "Epoch [2/50] Step:[30/64] Step_loss: 0.50014\n", "Epoch [2/50] Step:[31/64] Step_loss: 0.51080\n", "Epoch [2/50] Step:[32/64] Step_loss: 0.48850\n" ] } ] }, { "cell_type": "code", "source": [ "# 모델 평가\n", "model.eval()\n", "all_predictions = []\n", "all_labels = []\n", "with torch.no_grad():\n", " for inputs, labels in valid_loader:\n", " inputs, labels = inputs.cuda(), labels.cuda()\n", " outputs = model(inputs).cuda()\n", " predictions = (outputs > 0.5).float()\n", " all_predictions.append(predictions)\n", " all_labels.append(labels)\n", "\n", "# 전체 데이터에 대한 예측과 레이블을 하나로 합침\n", "all_predictions = torch.cat(all_predictions).cpu()\n", "all_labels = torch.cat(all_labels).cpu()" ], "metadata": { "id": "RLWn-yczZ4RY" }, "execution_count": 16, "outputs": [] }, { "cell_type": "code", "source": [ "# 정확도 계산\n", "accuracy = accuracy_score(all_labels, all_predictions)\n", "print(f'Validation Accuracy: {accuracy}')\n", "\n", "# F1 스코어 계산\n", "f1 = f1_score(all_labels, all_predictions)\n", "print(f'Validation F1 Score: {f1}')" ], "metadata": { "id": "H86915ck9E4a", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "e45d2686-7660-4690-8c47-a19a881ed42c" }, "execution_count": 17, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Validation Accuracy: 0.8342592592592593\n", "Validation F1 Score: 0.76177801437317\n" ] } ] } ] }