{"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":"none","dataSources":[{"sourceId":7327,"databundleVersionId":861871,"sourceType":"competition"}],"dockerImageVersionId":30746,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## 各ライブラリをインポートする","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nimport cv2\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport tensorflow as tf","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:47:17.200426Z","iopub.execute_input":"2024-07-26T07:47:17.200731Z","iopub.status.idle":"2024-07-26T07:47:40.969248Z","shell.execute_reply.started":"2024-07-26T07:47:17.200705Z","shell.execute_reply":"2024-07-26T07:47:40.968487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## トレーニング画像とテスト画像のパスを指定し、ラベルデータの読み込みを行う\n画像ごとにどの犬種かのラベル付けを行う","metadata":{}},{"cell_type":"code","source":"# データのパス\ntrain_dir = '/kaggle/input/dog-breed-identification/train/'\ntest_dir = '/kaggle/input/dog-breed-identification/test/'\nlabels_file = '/kaggle/input/dog-breed-identification/labels.csv'\n  \n# ラベルの読み込み\nlabels = pd.read_csv(labels_file)\nprint(labels.head())","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:47:40.971077Z","iopub.execute_input":"2024-07-26T07:47:40.972032Z","iopub.status.idle":"2024-07-26T07:47:41.026014Z","shell.execute_reply.started":"2024-07-26T07:47:40.971997Z","shell.execute_reply":"2024-07-26T07:47:41.025172Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 画像ディレクトリ内の全てのファイルのパスを取得し、ラベルデータと各画像の関連付けを行う\n以下の出力結果は、最初の５行のみ表示されている","metadata":{}},{"cell_type":"code","source":"from os.path import join\n\nfor dirname, _, filenames in os.walk(train_dir):\n    for filename in filenames:\n        os.path.join(dirname, filename)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:47:41.026925Z","iopub.execute_input":"2024-07-26T07:47:41.027231Z","iopub.status.idle":"2024-07-26T07:47:48.268918Z","shell.execute_reply.started":"2024-07-26T07:47:41.027195Z","shell.execute_reply":"2024-07-26T07:47:48.268050Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = labels.assign(img_path = lambda x : train_dir + x['id'] + '.jpg')\ntrain_data.head()","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:47:48.271443Z","iopub.execute_input":"2024-07-26T07:47:48.271738Z","iopub.status.idle":"2024-07-26T07:47:48.292333Z","shell.execute_reply.started":"2024-07-26T07:47:48.271713Z","shell.execute_reply":"2024-07-26T07:47:48.291353Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 画像をRGB形式に変換する\nOpenCVを用いて画像を読み込んだ場合、デフォルトではBGR形式になっているため","metadata":{}},{"cell_type":"code","source":"img=cv2.imread('/kaggle/input/dog-breed-identification/test/000621fb3cbb32d8935728e48679680e.jpg')\nimg=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:47:48.293887Z","iopub.execute_input":"2024-07-26T07:47:48.294457Z","iopub.status.idle":"2024-07-26T07:47:48.376631Z","shell.execute_reply.started":"2024-07-26T07:47:48.294429Z","shell.execute_reply":"2024-07-26T07:47:48.375773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 犬種識別のための画像データに前処理を行う\n・画像のリサイズ→画像の高さと幅を128ピクセルにリサイズし、チャネル数を３に設定（RGBのため）　　　　　\n・ラベルデータをワンホットエンコーディングする→カテゴリ変数を0と1で表された数値データに変換し、簡単な分類を行う","metadata":{}},{"cell_type":"code","source":"from keras.preprocessing.image import load_img, img_to_array\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n# from keras.preprocessing.image import ImageDataGenerator\n# from tensorflow.keras.preprocessing.image import ImageDataGenerator\nH=128\nW=128\nC=3\n\nX = np.array([img_to_array(load_img(img,target_size = (H,W))) for img in train_data['img_path'].values.tolist()])\nprint(X.shape)\nY = pd.get_dummies(train_data['breed'])\nprint(Y.shape)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:47:48.377746Z","iopub.execute_input":"2024-07-26T07:47:48.378106Z","iopub.status.idle":"2024-07-26T07:48:58.777873Z","shell.execute_reply.started":"2024-07-26T07:47:48.378073Z","shell.execute_reply":"2024-07-26T07:48:58.776816Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 学習用のデータセットをトレーニング用とテスト用に分割する\nデータセット数：10222、トレーニングセット：7666、テストセット：2556","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX_train,X_test,Y_train,Y_test  = train_test_split(X,Y,test_size = 0.25)\nprint(X_train.shape,Y_train.shape)\nprint(X_test.shape,Y_test.shape)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:48:58.779118Z","iopub.execute_input":"2024-07-26T07:48:58.779442Z","iopub.status.idle":"2024-07-26T07:48:59.345413Z","shell.execute_reply.started":"2024-07-26T07:48:58.779415Z","shell.execute_reply":"2024-07-26T07:48:59.344354Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## ニューラルネットワークを構築するための準備","metadata":{}},{"cell_type":"code","source":"from tensorflow import keras\nfrom keras.layers import LeakyReLU\nfrom keras.models import Sequential\nfrom keras.layers import Dense,Conv2D,MaxPool2D,Dropout,Flatten,Activation","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:48:59.346892Z","iopub.execute_input":"2024-07-26T07:48:59.347617Z","iopub.status.idle":"2024-07-26T07:48:59.353952Z","shell.execute_reply.started":"2024-07-26T07:48:59.347577Z","shell.execute_reply":"2024-07-26T07:48:59.353005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 畳み込みニューラルネットワークの構築\nConv2D（畳み込み層）：特徴を抽出するための層で、フィルタ数やカーネルサイズを指定して特徴マップを生成する　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　\nMaxPool2D（プーリング層）：特徴マップをダウンサンプリングし、計算負荷を軽減しつつ重要な特徴を強調する　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　\nDense（全結合層）：畳み込みで得られた特徴を基に、最終的な予測を行う　　　　　　　　　　　　　　　　　　\nLeakyReLU：勾配消失問題を防ぐ　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　\nDropout：過学習を防ぐ　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　\nsoftmax：クラスの確率を出力するために使用する","metadata":{}},{"cell_type":"code","source":"model=Sequential()\n\nmodel.add(Conv2D(32,(3,3),input_shape=(H,W,C)))\nmodel.add(LeakyReLU(alpha=0.01))\n# model.add(Activation('relu'))\n\nmodel.add(MaxPool2D((2,2)))\n\nmodel.add(Conv2D(64,(3,3)))#3×3のフィルタを64種類用いて畳み込み\nmodel.add(LeakyReLU(alpha=0.01))\n# model.add(Activation('relu'))\n\nmodel.add(MaxPool2D((2,2)))\n\nmodel.add(Conv2D(128,(3,3)))\nmodel.add(LeakyReLU(alpha=0.01))\n# model.add(Activation('relu'))\n\nmodel.add(MaxPool2D((2,2)))\n\nmodel.add(Conv2D(128,(3,3)))#3×3のフィルタを128種類用いて畳み込み\nmodel.add(LeakyReLU(alpha=0.01))\n# model.add(Activation('relu'))\n\nmodel.add(MaxPool2D((2,2)))\n\nmodel.add(Flatten())\n\nmodel.add(Dropout(0.5))\n\nmodel.add(Dense(512))\nmodel.add(LeakyReLU(alpha=0.01))\n# model.add(Activation('relu'))\n\nmodel.add(Dense(Y.shape[1]))\nmodel.add(Activation('softmax'))\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:48:59.355118Z","iopub.execute_input":"2024-07-26T07:48:59.355486Z","iopub.status.idle":"2024-07-26T07:49:00.619710Z","shell.execute_reply.started":"2024-07-26T07:48:59.355462Z","shell.execute_reply":"2024-07-26T07:49:00.618891Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## モデルのトレーニングを行う\nトレーニングは２０回繰り返し行われる。トレーニング中、モデルはトレーニングデータを使用して重みを更新し、損失（誤差）の最小化を目指す","metadata":{}},{"cell_type":"code","source":"batch=32","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:49:00.622594Z","iopub.execute_input":"2024-07-26T07:49:00.622907Z","iopub.status.idle":"2024-07-26T07:49:00.626998Z","shell.execute_reply.started":"2024-07-26T07:49:00.622882Z","shell.execute_reply":"2024-07-26T07:49:00.626140Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(\n      optimizer='adam',\n      loss='categorical_crossentropy',\n      metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:49:00.628355Z","iopub.execute_input":"2024-07-26T07:49:00.628603Z","iopub.status.idle":"2024-07-26T07:49:00.647302Z","shell.execute_reply.started":"2024-07-26T07:49:00.628582Z","shell.execute_reply":"2024-07-26T07:49:00.646443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trained_model=model.fit(X_train,Y_train,\n         epochs=20,\n         batch_size=batch,\n         steps_per_epoch=X_train.shape[0]//batch,\n         validation_steps=X_test.shape[0]//batch,\n         validation_data=(X_test,Y_test),\n         verbose=2)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:49:00.648516Z","iopub.execute_input":"2024-07-26T07:49:00.648844Z","iopub.status.idle":"2024-07-26T07:50:06.827968Z","shell.execute_reply.started":"2024-07-26T07:49:00.648815Z","shell.execute_reply":"2024-07-26T07:50:06.827071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## トレーニング済みのモデルを用いて、テストデータにおける犬種の予測を行う\n","metadata":{}},{"cell_type":"code","source":"test_datagen = ImageDataGenerator()\n\ntest_set = test_datagen.flow_from_directory(\n    '/kaggle/input/dog-breed-identification',\n    target_size = (128,128),\n    classes=['test']\n)\ny_pred = model.predict(test_set)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:50:06.829443Z","iopub.execute_input":"2024-07-26T07:50:06.829723Z","iopub.status.idle":"2024-07-26T07:51:27.368386Z","shell.execute_reply.started":"2024-07-26T07:50:06.829699Z","shell.execute_reply":"2024-07-26T07:51:27.367588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## トレーニングセットに関する予測を行う","metadata":{}},{"cell_type":"code","source":"import re\nfile_list = test_set.filenames\nid_list = []\nfor name in file_list:\n    m = re.sub('test/', '', name)\n    m = re.sub('.jpg', '', m)\n    id_list.append(m)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:51:27.369722Z","iopub.execute_input":"2024-07-26T07:51:27.370022Z","iopub.status.idle":"2024-07-26T07:51:27.417341Z","shell.execute_reply.started":"2024-07-26T07:51:27.369998Z","shell.execute_reply":"2024-07-26T07:51:27.416400Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator()\n\ntrain_set = train_datagen.flow_from_directory(\n    '/kaggle/input/dog-breed-identification',\n    target_size = (128,128),\n    classes=['train']\n)\ny_pred_train = model.predict(train_set)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:51:27.418625Z","iopub.execute_input":"2024-07-26T07:51:27.419221Z","iopub.status.idle":"2024-07-26T07:52:02.136692Z","shell.execute_reply.started":"2024-07-26T07:51:27.419174Z","shell.execute_reply":"2024-07-26T07:52:02.135722Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 予測精度の表示","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import log_loss\nlog_loss(Y, y_pred_train)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:52:02.137902Z","iopub.execute_input":"2024-07-26T07:52:02.138195Z","iopub.status.idle":"2024-07-26T07:52:02.263530Z","shell.execute_reply.started":"2024-07-26T07:52:02.138156Z","shell.execute_reply":"2024-07-26T07:52:02.262635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## モデルの予測結果をcsvファイルに保存する\nkaggleのコンペに提出できる形式になっている","metadata":{}},{"cell_type":"code","source":"submission = pd.read_csv('/kaggle/input/dog-breed-identification/sample_submission.csv')\nsubmission.head()\nsubmission['id'] = id_list\nsubmission.iloc[:,1:] =y_pred\nsubmission.head()\n\ndf = pd.DataFrame(submission)\ndf = submission.set_index('id')\ndf = submission.drop('id', axis=1)\ndf.to_csv('submission.csv')","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:52:52.068525Z","iopub.execute_input":"2024-07-26T07:52:52.068896Z","iopub.status.idle":"2024-07-26T07:52:55.154462Z","shell.execute_reply.started":"2024-07-26T07:52:52.068859Z","shell.execute_reply":"2024-07-26T07:52:55.153400Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(df)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T07:55:09.513361Z","iopub.execute_input":"2024-07-26T07:55:09.513990Z","iopub.status.idle":"2024-07-26T07:55:09.531119Z","shell.execute_reply.started":"2024-07-26T07:55:09.513959Z","shell.execute_reply":"2024-07-26T07:55:09.530065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}