{"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"},{"sourceId":8868919,"sourceType":"datasetVersion","datasetId":5337426}],"dockerImageVersionId":30746,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false},"colab":{"provenance":[]}},"nbformat_minor":4,"nbformat":4,"cells":[{"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":{"id":"oiAN475C90qF","execution":{"iopub.status.busy":"2024-07-26T08:13:04.813225Z","iopub.execute_input":"2024-07-26T08:13:04.813634Z","iopub.status.idle":"2024-07-26T08:13:04.820337Z","shell.execute_reply.started":"2024-07-26T08:13:04.813605Z","shell.execute_reply":"2024-07-26T08:13:04.81813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"必要なライブラリのインポート","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":{"id":"EvRhCqyc90qP","outputId":"8d9e41c9-2fd6-4b73-d571-f07aa086a981","execution":{"iopub.status.busy":"2024-07-26T08:13:04.833034Z","iopub.execute_input":"2024-07-26T08:13:04.834304Z","iopub.status.idle":"2024-07-26T08:13:04.856946Z","shell.execute_reply.started":"2024-07-26T08:13:04.834264Z","shell.execute_reply":"2024-07-26T08:13:04.855676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"トレーニングデータとテストデータのパスを設定","metadata":{}},{"cell_type":"markdown","source":"ラベルデータの読み込み","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":{"id":"XRaAz9rU90qR","execution":{"iopub.status.busy":"2024-07-26T08:13:04.858972Z","iopub.execute_input":"2024-07-26T08:13:04.859457Z","iopub.status.idle":"2024-07-26T08:13:07.525555Z","shell.execute_reply.started":"2024-07-26T08:13:04.859422Z","shell.execute_reply":"2024-07-26T08:13:07.524372Z"},"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":{"id":"DThN_jev90qS","outputId":"b5cbd594-33b1-4434-8d0c-932ff2a4074f","execution":{"iopub.status.busy":"2024-07-26T08:13:07.526982Z","iopub.execute_input":"2024-07-26T08:13:07.527443Z","iopub.status.idle":"2024-07-26T08:13:07.544122Z","shell.execute_reply.started":"2024-07-26T08:13:07.527402Z","shell.execute_reply":"2024-07-26T08:13:07.542447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"画像データのパスをラベルデータに追加","metadata":{}},{"cell_type":"code","source":"img=cv2.imread('/kaggle/input/dog-breed-identification/test/000621fb3cbb32d8935728e48679680e.jpg')\nimg=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)","metadata":{"id":"U8QMC6mm90qT","execution":{"iopub.status.busy":"2024-07-26T08:13:07.548242Z","iopub.execute_input":"2024-07-26T08:13:07.549277Z","iopub.status.idle":"2024-07-26T08:13:07.563159Z","shell.execute_reply.started":"2024-07-26T08:13:07.549228Z","shell.execute_reply":"2024-07-26T08:13:07.561562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"画像データを読み込み、RGB形式に変換","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":{"id":"BQQ8y-g_90qT","outputId":"cb676097-076e-468b-c28f-39fa8641406a","execution":{"iopub.status.busy":"2024-07-26T08:13:07.564953Z","iopub.execute_input":"2024-07-26T08:13:07.565587Z","iopub.status.idle":"2024-07-26T08:13:35.671484Z","shell.execute_reply.started":"2024-07-26T08:13:07.565538Z","shell.execute_reply":"2024-07-26T08:13:35.670312Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"画像データを配列に変換し、ラベルデータをone-hotエンコーディング(ダミー変数：0,1に数値化)する","metadata":{}},{"cell_type":"markdown","source":"ダミー変数：画像データの配列それぞれに対して、犬種（ラベルデータ）が正しければ１、そうでなければ０に数値化する。","metadata":{}},{"cell_type":"markdown","source":"X=画像データ配列、Y=ラベルデータ（犬種）配列","metadata":{}},{"cell_type":"markdown","source":"","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":{"id":"Xkwc52Zk90qU","outputId":"a949d061-af56-4a8f-dc43-68f56b170e40","execution":{"iopub.status.busy":"2024-07-26T08:13:35.672837Z","iopub.execute_input":"2024-07-26T08:13:35.673184Z","iopub.status.idle":"2024-07-26T08:13:36.290844Z","shell.execute_reply.started":"2024-07-26T08:13:35.673155Z","shell.execute_reply":"2024-07-26T08:13:36.289712Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"データを訓練データとテストデータを，テストデータ＝25%（＝2556）になるよう分割する．データが4つ出力されている理由は，２（X,Y）×２（train,test）．","metadata":{}},{"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":{"id":"tvhSWMJ190qV","execution":{"iopub.status.busy":"2024-07-26T08:13:36.292346Z","iopub.execute_input":"2024-07-26T08:13:36.292789Z","iopub.status.idle":"2024-07-26T08:13:36.298479Z","shell.execute_reply.started":"2024-07-26T08:13:36.292749Z","shell.execute_reply":"2024-07-26T08:13:36.297351Z"},"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":{"id":"A_SK6VJs90qW","outputId":"6132697a-096c-4626-9458-a431db27e832","execution":{"iopub.status.busy":"2024-07-26T08:13:36.300286Z","iopub.execute_input":"2024-07-26T08:13:36.300635Z","iopub.status.idle":"2024-07-26T08:13:36.560568Z","shell.execute_reply.started":"2024-07-26T08:13:36.300606Z","shell.execute_reply":"2024-07-26T08:13:36.559341Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Sequential＝入力層の作成、（Conv2D=2次元畳み込み層、LeakyReLU=負の入力値に対する勾配消失の緩和、MaxPool２D＝2次元最大プーリング層)×4、Dropout=過学習を防ぐ、Dense=全結合層を作成、Activation=ニューラルネットワークの層の出力を非線形に変換、softmax関数=確率を表すように出力を変換するための関数","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"batch=32","metadata":{"id":"nla-8C1T90qY","execution":{"iopub.status.busy":"2024-07-26T08:13:36.561966Z","iopub.execute_input":"2024-07-26T08:13:36.562328Z","iopub.status.idle":"2024-07-26T08:13:36.567908Z","shell.execute_reply.started":"2024-07-26T08:13:36.562297Z","shell.execute_reply":"2024-07-26T08:13:36.566187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"訓練中に一度に処理するサンプルの数を示す。速度と精度に影響を与える重要なパラメータ。","metadata":{}},{"cell_type":"code","source":"model.compile(\n      optimizer='adam',\n      loss='categorical_crossentropy',\n      metrics=['accuracy'])","metadata":{"id":"woa3gPvY90qZ","execution":{"iopub.status.busy":"2024-07-26T08:13:36.572324Z","iopub.execute_input":"2024-07-26T08:13:36.57273Z","iopub.status.idle":"2024-07-26T08:13:36.582935Z","shell.execute_reply.started":"2024-07-26T08:13:36.572699Z","shell.execute_reply":"2024-07-26T08:13:36.5813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"adam=最適化アルゴリズムを使用\nloss='.....'=損失関数、モデルの予測が真のラベルからどれだけ離れているかを測定。","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":{"id":"R4JN0AuW90qZ","outputId":"5bb2dc0a-f27b-4875-b1e2-14f7ecc29511","execution":{"iopub.status.busy":"2024-07-26T08:13:36.584716Z","iopub.execute_input":"2024-07-26T08:13:36.585367Z","iopub.status.idle":"2024-07-26T08:36:48.264644Z","shell.execute_reply.started":"2024-07-26T08:13:36.585311Z","shell.execute_reply":"2024-07-26T08:36:48.259373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"モデルは訓練データに対して訓練を開始し、各エポックの後に検証データに対する性能を評価。\n\nepochs=全ての訓練データがネットワークを通過する回数。\nsteps_per_epoch=各エポックでのステップ数（＝訓練データのサンプル数をバッチサイズで割った整数部分）を設定。\nvalidation_steps=検証データに対するステップ数（＝テストデータのサンプル数をバッチサイズで割った整数）を設定。\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":{"id":"qfIJ7yoI90qa","outputId":"82738ac5-4154-4a55-ab2a-f1e68ccfca83","execution":{"iopub.status.busy":"2024-07-26T08:36:48.276555Z","iopub.execute_input":"2024-07-26T08:36:48.28132Z","iopub.status.idle":"2024-07-26T08:38:17.577502Z","shell.execute_reply.started":"2024-07-26T08:36:48.281196Z","shell.execute_reply":"2024-07-26T08:38:17.576322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"ImageDataGenerator()＝画像データの読み込みと前処理。\nflow_from_directory＝指定したディレクトリ内の画像をバッチごとに自動的に読み込み、前処理し、モデルに供給。すべての画像は128x128ピクセルにリサイズされ、'test’ディレクトリ内の画像が読み込まれる。","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)\n\n","metadata":{"id":"dnPPTkfw90qb","execution":{"iopub.status.busy":"2024-07-26T08:38:17.57916Z","iopub.execute_input":"2024-07-26T08:38:17.579612Z","iopub.status.idle":"2024-07-26T08:38:17.619303Z","shell.execute_reply.started":"2024-07-26T08:38:17.579579Z","shell.execute_reply":"2024-07-26T08:38:17.618074Z"},"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:38:17.620764Z","iopub.execute_input":"2024-07-26T08:38:17.621142Z","iopub.status.idle":"2024-07-26T08:39:17.065462Z","shell.execute_reply.started":"2024-07-26T08:38:17.621105Z","shell.execute_reply":"2024-07-26T08:39:17.064183Z"},"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:39:17.067357Z","iopub.execute_input":"2024-07-26T08:39:17.067743Z","iopub.status.idle":"2024-07-26T08:39:17.215235Z","shell.execute_reply.started":"2024-07-26T08:39:17.067712Z","shell.execute_reply":"2024-07-26T08:39:17.213997Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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', index=False)\n# print(df)","metadata":{"id":"Kajl0mhT90qb","execution":{"iopub.status.busy":"2024-07-26T08:39:17.216823Z","iopub.execute_input":"2024-07-26T08:39:17.217305Z","iopub.status.idle":"2024-07-26T08:39:20.222225Z","shell.execute_reply.started":"2024-07-26T08:39:17.21726Z","shell.execute_reply":"2024-07-26T08:39:20.220986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(df)","metadata":{"id":"4BHrMrfq90qb","outputId":"1d09c73d-72af-422d-c64b-982c6eaf3fc6","execution":{"iopub.status.busy":"2024-07-26T08:39:20.223615Z","iopub.execute_input":"2024-07-26T08:39:20.224419Z","iopub.status.idle":"2024-07-26T08:39:20.250311Z","shell.execute_reply.started":"2024-07-26T08:39:20.224375Z","shell.execute_reply":"2024-07-26T08:39:20.249142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.to_csv('submission3.csv', index=False)","metadata":{"id":"eVUk58EK90qc","execution":{"iopub.status.busy":"2024-07-26T08:39:20.251939Z","iopub.execute_input":"2024-07-26T08:39:20.252506Z","iopub.status.idle":"2024-07-26T08:39:22.631635Z","shell.execute_reply.started":"2024-07-26T08:39:20.252473Z","shell.execute_reply":"2024-07-26T08:39:22.630566Z"},"trusted":true},"execution_count":null,"outputs":[]}]}