{"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":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":30674,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-28T07:47:06.926977Z","iopub.execute_input":"2024-03-28T07:47:06.927369Z","iopub.status.idle":"2024-03-28T07:47:06.944263Z","shell.execute_reply.started":"2024-03-28T07:47:06.927340Z","shell.execute_reply":"2024-03-28T07:47:06.943322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.datasets import mnist\nfrom keras.layers import Dense, Dropout, Flatten, Activation\nfrom keras.layers import Conv2D, MaxPooling2D\nfrom keras.models import Sequential, load_model\nfrom keras.utils import to_categorical\nfrom tensorflow.keras.utils import plot_model\nimport numpy as np\nimport matplotlib.pyplot as plt\n%matplotlib inline","metadata":{"execution":{"iopub.status.busy":"2024-03-28T07:47:09.533148Z","iopub.execute_input":"2024-03-28T07:47:09.533506Z","iopub.status.idle":"2024-03-28T07:47:09.543359Z","shell.execute_reply.started":"2024-03-28T07:47:09.533479Z","shell.execute_reply":"2024-03-28T07:47:09.542430Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# train.zip, train.zip 압축 파일 풀기","metadata":{}},{"cell_type":"code","source":"!unzip -q -o /kaggle/input/dogs-vs-cats/train.zip \n!unzip -q -o /kaggle/input/dogs-vs-cats/test.zip \nimport glob \nglob.glob(\"train/*\")[:5] ","metadata":{"execution":{"iopub.status.busy":"2024-03-28T07:05:14.093505Z","iopub.status.idle":"2024-03-28T07:05:27.300141Z","shell.execute_reply.started":"2024-03-28T07:05:14.093794Z","shell.execute_reply":"2024-03-28T07:05:27.299048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\nImage.open(\"train/cat.5978.jpg\")","metadata":{"execution":{"iopub.status.busy":"2024-03-27T11:10:18.088049Z","iopub.execute_input":"2024-03-27T11:10:18.088375Z","iopub.status.idle":"2024-03-27T11:10:18.178446Z","shell.execute_reply.started":"2024-03-27T11:10:18.088348Z","shell.execute_reply":"2024-03-27T11:10:18.177496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.DataFrame({'path': glob.glob('train/*')})\ntrain","metadata":{"execution":{"iopub.status.busy":"2024-03-28T07:39:30.140778Z","iopub.execute_input":"2024-03-28T07:39:30.141437Z","iopub.status.idle":"2024-03-28T07:39:30.241812Z","shell.execute_reply.started":"2024-03-28T07:39:30.141406Z","shell.execute_reply":"2024-03-28T07:39:30.240869Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['label'] = train['path'].apply(lambda x:x.split('/')[-1].split('.')[0] )\ntrain","metadata":{"execution":{"iopub.status.busy":"2024-03-28T07:39:37.122242Z","iopub.execute_input":"2024-03-28T07:39:37.122949Z","iopub.status.idle":"2024-03-28T07:39:37.156237Z","shell.execute_reply.started":"2024-03-28T07:39:37.122916Z","shell.execute_reply":"2024-03-28T07:39:37.155150Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\nidg = ImageDataGenerator()\n\ntrain_generator = idg.flow_from_dataframe(train, x_col='path', y_col='label', batch_size=64, target_size=(100,100))","metadata":{"execution":{"iopub.status.busy":"2024-03-28T07:39:40.143245Z","iopub.execute_input":"2024-03-28T07:39:40.143607Z","iopub.status.idle":"2024-03-28T07:39:40.424536Z","shell.execute_reply.started":"2024-03-28T07:39:40.143581Z","shell.execute_reply":"2024-03-28T07:39:40.423581Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 이미지 크기 통일화(resize)","metadata":{}},{"cell_type":"code","source":"import cv2\nimport os\n\n# 이미지 파일들의 경로\nimage_paths = train[0:10]['path']\n\n# 각 이미지 파일의 크기를 확인\nfor path in image_paths:\n    image = cv2.imread(path)\n    height, width, channels = image.shape\n    print(f\"이미지 파일 '{os.path.basename(path)}'의 크기: {width}x{height} 픽셀, 채널 수: {channels}\")\n","metadata":{"execution":{"iopub.status.busy":"2024-03-27T11:10:18.596416Z","iopub.execute_input":"2024-03-27T11:10:18.596694Z","iopub.status.idle":"2024-03-27T11:10:18.801222Z","shell.execute_reply.started":"2024-03-27T11:10:18.596670Z","shell.execute_reply":"2024-03-27T11:10:18.800288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nfrom PIL import Image\nimport os\n\n# 원하는 크기\ntarget_size = (100, 100)\n\n# 이미지 파일들의 경로\nimage_paths = train['path']\n\n# 각 이미지 파일을 원하는 크기로 resize\nresized_images = []\nfor path in image_paths:\n    image = Image.open(path)\n    resized_image = image.resize(target_size)\n    resized_images.append(resized_image)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-27T11:10:18.802606Z","iopub.execute_input":"2024-03-27T11:10:18.803203Z","iopub.status.idle":"2024-03-27T11:11:21.393170Z","shell.execute_reply.started":"2024-03-27T11:10:18.803168Z","shell.execute_reply":"2024-03-27T11:11:21.392326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\n\n# 각 이미지의 크기를 확인\nfor i, image in enumerate(resized_images[:10]):\n    width, height = image.size\n    print(f\"Resized Image {i+1}의 크기: {width}x{height} 픽셀\")\n\nflag = True\nfor image in (resized_images):\n    width, height = image.size\n    if width != 100 or height != 100:\n        print(\"reszie 실패\")\n        flag= False\n        break\nif(flag):\n    print(\"resize 성공\")","metadata":{"execution":{"iopub.status.busy":"2024-03-27T11:11:21.395758Z","iopub.execute_input":"2024-03-27T11:11:21.396060Z","iopub.status.idle":"2024-03-27T11:11:21.414165Z","shell.execute_reply.started":"2024-03-27T11:11:21.396035Z","shell.execute_reply":"2024-03-27T11:11:21.413288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras import layers, models, optimizers\n\n\n# 모델 구성\nmodel = models.Sequential()\nmodel.add(layers.Conv2D(32, kernel_size=(3,3), input_shape=(100,100,3)))\nmodel.add(layers.BatchNormalization())  # 배치 정규화 레이어 추가\nmodel.add(layers.Activation('relu'))\nmodel.add(layers.Conv2D(filters=64, kernel_size=(3,3)))\nmodel.add(layers.BatchNormalization())  # 배치 정규화 레이어 추가\nmodel.add(layers.Activation('relu'))\nmodel.add(layers.MaxPooling2D(pool_size=(2,2)))\nmodel.add(layers.Dropout(0.25))\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(128))\nmodel.add(layers.BatchNormalization())  # 배치 정규화 레이어 추가\nmodel.add(layers.Activation('relu'))\nmodel.add(layers.Dropout(0.5))\nmodel.add(layers.Dense(2, activation='sigmoid'))\n\n# 옵티마이저 설정 (Adam 사용)\noptimizer = optimizers.Adam()\n\n# 모델 컴파일\nmodel.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])\n\n# 모델 훈련\nhistory = model.fit(train_generator, epochs=10)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-27T12:56:41.960235Z","iopub.execute_input":"2024-03-27T12:56:41.961179Z","iopub.status.idle":"2024-03-27T13:02:40.056105Z","shell.execute_reply.started":"2024-03-27T12:56:41.961139Z","shell.execute_reply":"2024-03-27T13:02:40.055227Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# 훈련 손실과 정확도 그래프\nplt.plot(history.history['loss'], label='Training Loss')\nplt.plot(history.history['accuracy'], label='Training Accuracy')\nplt.title('Training Loss and Accuracy')\nplt.xlabel('Epoch')\nplt.ylabel('Value')\nplt.legend()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-27T13:04:03.882383Z","iopub.execute_input":"2024-03-27T13:04:03.882818Z","iopub.status.idle":"2024-03-27T13:04:04.187281Z","shell.execute_reply.started":"2024-03-27T13:04:03.882788Z","shell.execute_reply":"2024-03-27T13:04:04.186275Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras import *\nfrom tensorflow.keras.layers import *\n\nfrom tensorflow.keras.applications.inception_v3 import InceptionV3\n\nmodel = Sequential()\n\niv = InceptionV3(include_top=False, pooling='avg')\n\nmodel.add(iv)\nmodel.add(Dense(2, activation='softmax')) \n\nmodel.compile(metrics=['acc'], loss='binary_crossentropy', optimizer='adam') \n\nhistory = model.fit(train_generator, epochs=10)\n\n\n\nimport matplotlib.pyplot as plt\n\n# 훈련 과정에서의 정확도와 손실 그래프\nplt.plot(history.history['acc'], label='Training Accuracy')\nplt.plot(history.history['loss'], label='Training Loss')\nplt.xlabel('Epoch')\nplt.ylabel('Value')\nplt.legend()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-27T13:19:06.220387Z","iopub.execute_input":"2024-03-27T13:19:06.220807Z","iopub.status.idle":"2024-03-27T13:26:23.875138Z","shell.execute_reply.started":"2024-03-27T13:19:06.220777Z","shell.execute_reply":"2024-03-27T13:26:23.874152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras import regularizers\n\n# 모델 구성\nmodel = models.Sequential()\nmodel.add(layers.Conv2D(32, kernel_size=(3,3), input_shape=(100,100,3),kernel_regularizer=regularizers.l2(0.01)))# L2 가중치 규제 추가\nmodel.add(layers.BatchNormalization())  \nmodel.add(layers.Activation('relu'))\n\nmodel.add(layers.Conv2D(filters=64, kernel_size=(3,3),kernel_regularizer=regularizers.l2(0.01)))# L2 가중치 규제 추가\nmodel.add(layers.BatchNormalization())  \nmodel.add(layers.Activation('relu'))\nmodel.add(layers.MaxPooling2D(pool_size=(2,2)))\nmodel.add(layers.Dropout(0.25))\n\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(128, kernel_regularizer=regularizers.l2(0.01)))  # L2 가중치 규제 추가\nmodel.add(layers.BatchNormalization())  \nmodel.add(layers.Activation('relu'))\nmodel.add(layers.Dropout(0.5))\n\nmodel.add(layers.Dense(2, activation='sigmoid'))\n\n# 모델 컴파일\noptimizer = optimizers.Adam()\nmodel.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])\n\n# 모델 훈련\nhistory = model.fit(train_generator, epochs=10)\n\n# 훈련 과정에서의 정확도와 손실 그래프\nplt.plot(history.history['accuracy'], label='Training Accuracy')\nplt.plot(history.history['loss'], label='Training Loss')\nplt.xlabel('Epoch')\nplt.ylabel('Value')\nplt.legend()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-27T16:05:10.223115Z","iopub.execute_input":"2024-03-27T16:05:10.223924Z","iopub.status.idle":"2024-03-27T16:11:48.238773Z","shell.execute_reply.started":"2024-03-27T16:05:10.223894Z","shell.execute_reply":"2024-03-27T16:11:48.236996Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras import regularizers\n\n# 모델 구성\nmodel = models.Sequential()\nmodel.add(layers.Conv2D(32, kernel_size=(3,3), input_shape=(100,100,3)))\nmodel.add(layers.BatchNormalization())  \nmodel.add(layers.Activation('relu'))\n\nmodel.add(layers.Conv2D(filters=64, kernel_size=(3,3)))\nmodel.add(layers.BatchNormalization())  \nmodel.add(layers.Activation('relu'))\nmodel.add(layers.MaxPooling2D(pool_size=(2,2)))\nmodel.add(layers.Dropout(0.25))\n\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(128, kernel_regularizer=regularizers.l2(0.01)))  # L2 가중치 규제 추가\nmodel.add(layers.BatchNormalization())  \nmodel.add(layers.Activation('relu'))\nmodel.add(layers.Dropout(0.5))\n\nmodel.add(layers.Dense(2, activation='sigmoid'))\n\n# 모델 컴파일\noptimizer = optimizers.Adam()\nmodel.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])\n\n# 모델 훈련\nhistory = model.fit(train_generator, epochs=30)\n\n# 훈련 과정에서의 정확도와 손실 그리기\nimport matplotlib.pyplot as plt\nplt.plot(history.history['accuracy'], label='Training Accuracy')\nplt.plot(history.history['loss'], label='Training Loss')\nplt.xlabel('Epoch')\nplt.ylabel('Value')\nplt.legend()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-28T07:53:16.629679Z","iopub.execute_input":"2024-03-28T07:53:16.630042Z","iopub.status.idle":"2024-03-28T08:09:32.444600Z","shell.execute_reply.started":"2024-03-28T07:53:16.630013Z","shell.execute_reply":"2024-03-28T08:09:32.443644Z"},"trusted":true},"execution_count":null,"outputs":[]}]}