{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":7327,"databundleVersionId":861871,"sourceType":"competition"}],"dockerImageVersionId":30746,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## 1. 必要なライブラリのインポートさせる。","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-26T08:16:35.827560Z","iopub.execute_input":"2024-07-26T08:16:35.827952Z","iopub.status.idle":"2024-07-26T08:16:35.833662Z","shell.execute_reply.started":"2024-07-26T08:16:35.827920Z","shell.execute_reply":"2024-07-26T08:16:35.832396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2. トレーニングデータとテストデータを設定し、ラベルデータの読み込みを開始。","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())\n","metadata":{"execution":{"iopub.status.busy":"2024-07-26T08:16:35.835644Z","iopub.execute_input":"2024-07-26T08:16:35.836425Z","iopub.status.idle":"2024-07-26T08:16:35.863480Z","shell.execute_reply.started":"2024-07-26T08:16:35.836383Z","shell.execute_reply":"2024-07-26T08:16:35.862513Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3. 画像データのパスをラベルデータに追加する。","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)\n","metadata":{"execution":{"iopub.status.busy":"2024-07-26T08:16:35.865551Z","iopub.execute_input":"2024-07-26T08:16:35.866460Z","iopub.status.idle":"2024-07-26T08:16:40.626203Z","shell.execute_reply.started":"2024-07-26T08:16:35.866420Z","shell.execute_reply":"2024-07-26T08:16:40.625295Z"},"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-26T08:16:40.627394Z","iopub.execute_input":"2024-07-26T08:16:40.627717Z","iopub.status.idle":"2024-07-26T08:16:40.643204Z","shell.execute_reply.started":"2024-07-26T08:16:40.627689Z","shell.execute_reply":"2024-07-26T08:16:40.642079Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 4. 画像データを読み込み、RGB形式に変換","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-26T08:16:40.646638Z","iopub.execute_input":"2024-07-26T08:16:40.647445Z","iopub.status.idle":"2024-07-26T08:16:40.662113Z","shell.execute_reply.started":"2024-07-26T08:16:40.647401Z","shell.execute_reply":"2024-07-26T08:16:40.661051Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 5. 画像データを配列に変換し、ラベルデータをone-hotエンコーディング(ダミー変数：0，1に数値化)する。\n## ダミー変数：画像データの配列それぞれに対し、犬種（ラベルデータ）が正しければ1，それ以外では0に数値化する。\n## X＝画像データ配列、Y＝ラベルデータ（犬種）配列","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-26T08:16:40.663248Z","iopub.execute_input":"2024-07-26T08:16:40.663552Z","iopub.status.idle":"2024-07-26T08:17:11.209755Z","shell.execute_reply.started":"2024-07-26T08:16:40.663518Z","shell.execute_reply":"2024-07-26T08:17:11.208565Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 6. データを訓練データとテストデータを、テストデータ＝25%(＝2556)になるよう分割する。データが4つ出力されている理由は、2 (X,Y) × 2 (train, test)。","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-26T08:17:11.211092Z","iopub.execute_input":"2024-07-26T08:17:11.211396Z","iopub.status.idle":"2024-07-26T08:17:11.813000Z","shell.execute_reply.started":"2024-07-26T08:17:11.211369Z","shell.execute_reply":"2024-07-26T08:17:11.811999Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 7. Sequential＝入力層の作成、(Conv2D＝2次元畳み込み層、LeakyReLU＝負の入力値に対する勾配消失の緩和、MaxPool2D＝2次元最大プーリング層)×4、Dropout＝過学習を防ぐ、Dense＝全結合層を作成、Activation＝ニューラルネットワークの層の出力を非線形に変換、softmax関数＝確率を表すように出力を変換するための関数","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-26T08:17:11.814465Z","iopub.execute_input":"2024-07-26T08:17:11.814825Z","iopub.status.idle":"2024-07-26T08:17:11.820106Z","shell.execute_reply.started":"2024-07-26T08:17:11.814795Z","shell.execute_reply":"2024-07-26T08:17:11.819012Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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-26T08:17:11.821756Z","iopub.execute_input":"2024-07-26T08:17:11.822438Z","iopub.status.idle":"2024-07-26T08:17:12.065569Z","shell.execute_reply.started":"2024-07-26T08:17:11.822401Z","shell.execute_reply":"2024-07-26T08:17:12.064584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 8. 訓練中に一度に処理するサンプルの数を示す。速度と精度に影響を与える重要なパラメータ。","metadata":{}},{"cell_type":"code","source":"batch=32","metadata":{"execution":{"iopub.status.busy":"2024-07-26T08:17:12.066913Z","iopub.execute_input":"2024-07-26T08:17:12.067226Z","iopub.status.idle":"2024-07-26T08:17:12.071982Z","shell.execute_reply.started":"2024-07-26T08:17:12.067200Z","shell.execute_reply":"2024-07-26T08:17:12.070836Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 9. adam＝最適化アルゴリズムを使用 loss＝'.....'＝損失関数、モデルの予測が真ラベルからどれだけ離れているかを測定。","metadata":{}},{"cell_type":"code","source":"model.compile(\n      optimizer='adam',\n      loss='categorical_crossentropy',\n      metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-07-26T08:17:12.076557Z","iopub.execute_input":"2024-07-26T08:17:12.076893Z","iopub.status.idle":"2024-07-26T08:17:12.087882Z","shell.execute_reply.started":"2024-07-26T08:17:12.076867Z","shell.execute_reply":"2024-07-26T08:17:12.086827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 10. モデルは訓練データに対して訓練を開始し、各エポックの後に検証データに対する性能を評価する。\n## epochs＝全ての訓練データがネットワークを通過する回数。steps_per_epoch＝各エポックでのステップ数（＝訓練データのサンプル数をバッチサイズで割った整数部分）を設定。validation_steps＝検証データに対するステップ数（＝テストデータのサンプル数をバッチサイズで割った整数）を設定。","metadata":{}},{"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-26T08:17:12.089147Z","iopub.execute_input":"2024-07-26T08:17:12.089441Z","iopub.status.idle":"2024-07-26T08:18:13.119651Z","shell.execute_reply.started":"2024-07-26T08:17:12.089416Z","shell.execute_reply":"2024-07-26T08:18:13.118701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 11. ImageDataGenerator()＝画像データの読み込みと前処理。flow_from_directory＝指定したディレクトリ内の画像をバッチごとに自動的に読み込み、前処理し、モデルに供給。すべての画像は128×128ピクセルにリサイズされ、'test'ディレクトリ内の画像が読み込まれる。","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-26T08:18:13.121060Z","iopub.execute_input":"2024-07-26T08:18:13.121361Z","iopub.status.idle":"2024-07-26T08:18:50.598756Z","shell.execute_reply.started":"2024-07-26T08:18:13.121337Z","shell.execute_reply":"2024-07-26T08:18:50.597564Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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)\n","metadata":{"execution":{"iopub.status.busy":"2024-07-26T08:18:50.600296Z","iopub.execute_input":"2024-07-26T08:18:50.600651Z","iopub.status.idle":"2024-07-26T08:18:50.659693Z","shell.execute_reply.started":"2024-07-26T08:18:50.600621Z","shell.execute_reply":"2024-07-26T08:18:50.658561Z"},"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-26T08:18:50.661381Z","iopub.execute_input":"2024-07-26T08:18:50.662315Z","iopub.status.idle":"2024-07-26T08:19:28.226738Z","shell.execute_reply.started":"2024-07-26T08:18:50.662272Z","shell.execute_reply":"2024-07-26T08:19:28.225453Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import log_loss\nlog_loss(Y, y_pred_train)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T08:19:28.228750Z","iopub.execute_input":"2024-07-26T08:19:28.229160Z","iopub.status.idle":"2024-07-26T08:19:28.369960Z","shell.execute_reply.started":"2024-07-26T08:19:28.229122Z","shell.execute_reply":"2024-07-26T08:19:28.368746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## csvファイルにする。","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.to_csv('submission.csv')\n# print(df)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T08:19:28.372015Z","iopub.execute_input":"2024-07-26T08:19:28.372468Z","iopub.status.idle":"2024-07-26T08:19:31.932941Z","shell.execute_reply.started":"2024-07-26T08:19:28.372427Z","shell.execute_reply":"2024-07-26T08:19:31.931767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 12. 全ての結果を出す。","metadata":{}},{"cell_type":"code","source":"print(df)","metadata":{"execution":{"iopub.status.busy":"2024-07-26T08:19:31.934323Z","iopub.execute_input":"2024-07-26T08:19:31.934713Z","iopub.status.idle":"2024-07-26T08:19:31.956334Z","shell.execute_reply.started":"2024-07-26T08:19:31.934685Z","shell.execute_reply":"2024-07-26T08:19:31.955146Z"},"trusted":true},"execution_count":null,"outputs":[]}]}