{"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":5441,"databundleVersionId":38425,"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 numpy as np \nimport pandas as pd \nimport os\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import models, optimizers, layers\nimport tensorflow.keras.layers as layers\nfrom tensorflow.keras.preprocessing import image\nimport matplotlib.pyplot as plt\nimport shutil\nimport glob\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-07-19T07:47:34.855586Z","iopub.execute_input":"2024-07-19T07:47:34.856202Z","iopub.status.idle":"2024-07-19T07:47:34.865825Z","shell.execute_reply.started":"2024-07-19T07:47:34.856125Z","shell.execute_reply":"2024-07-19T07:47:34.863803Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"画像データの前処理","metadata":{}},{"cell_type":"code","source":"# データの解凍とコピー\nshutil.unpack_archive('/kaggle/input/dogs-vs-cats-redux-kernels-edition/train.zip', '/kaggle/working')\nshutil.unpack_archive('/kaggle/input/dogs-vs-cats-redux-kernels-edition/test.zip', '/kaggle/working')\nshutil.copyfile('/kaggle/input/dogs-vs-cats-redux-kernels-edition/sample_submission.csv', '/kaggle/working/sample_submission.csv')\n\n# 犬・猫の画像をそれぞれのフォルダに移動\ndog_dir = '/kaggle/working/train/dog'\ncat_dir = '/kaggle/working/train/cat'\nos.makedirs(dog_dir, exist_ok=True)\nos.makedirs(cat_dir, exist_ok=True)\n\nfiles = glob.glob('/kaggle/working/train/*.jpg')\nfor file in files:\n    file_name = os.path.basename(file)\n    if 'cat' in file_name:\n        shutil.move(file, '/kaggle/working/train/cat/' + file_name)\n    else:\n        shutil.move(file, '/kaggle/working/train/dog/' + file_name)\n        \n# データ拡張の設定\ntrain_datagen = ImageDataGenerator(\n    rescale=1.0 / 255,\n    rotation_range=40,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    vertical_flip=True,\n    fill_mode='nearest',\n    validation_split=0.2\n)\n\n# ディレクトリの設定\ntrain_dir = '/kaggle/working/train'\ntest_dir = '/kaggle/working/test'\nbatch_size = 32\n\n# train_generator と test_generator の定義\ntrain_generator = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=(150, 150),\n    batch_size=batch_size,\n    class_mode='binary',\n    subset='training'\n)\n\ntest_generator = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=(150, 150),\n    batch_size=batch_size,\n    class_mode='binary',\n    subset='validation'\n)","metadata":{"execution":{"iopub.status.busy":"2024-07-19T07:47:34.868269Z","iopub.execute_input":"2024-07-19T07:47:34.868841Z","iopub.status.idle":"2024-07-19T07:47:51.155564Z","shell.execute_reply.started":"2024-07-19T07:47:34.868802Z","shell.execute_reply":"2024-07-19T07:47:51.153628Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"モデル作成","metadata":{}},{"cell_type":"code","source":"# モデルの構築\nmodel = models.Sequential()\nmodel.add(layers.Conv2D(32, (4, 4), activation='relu', input_shape=(150, 150, 3)))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(64, (4, 4), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(128, (4, 4), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(256, (4, 4), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(512, activation='relu'))\nmodel.add(layers.Dense(1, activation='sigmoid'))\n\n# モデルのコンパイル\nmodel.compile(loss='binary_crossentropy',\n              optimizer=optimizers.Adam(learning_rate=1e-4),\n              metrics=['acc'])\n\n# モデルのサマリー表示\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2024-07-19T07:47:51.162287Z","iopub.execute_input":"2024-07-19T07:47:51.162899Z","iopub.status.idle":"2024-07-19T07:47:51.405272Z","shell.execute_reply.started":"2024-07-19T07:47:51.162854Z","shell.execute_reply":"2024-07-19T07:47:51.403412Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"CNNモデルの訓練","metadata":{}},{"cell_type":"code","source":"# モデルの訓練\nhistory = model.fit(\n    train_generator,\n    steps_per_epoch=int(20000 / batch_size),\n    epochs=1,  # 訓練回数の指定\n    validation_data=test_generator,\n    validation_steps=int(5000 / batch_size)\n)\n\n# モデルの保存\nmodel.save(\"/kaggle/working/dog_cat.h5\")","metadata":{"execution":{"iopub.status.busy":"2024-07-19T07:47:51.407117Z","iopub.execute_input":"2024-07-19T07:47:51.407756Z","iopub.status.idle":"2024-07-19T08:03:11.533457Z","shell.execute_reply.started":"2024-07-19T07:47:51.407592Z","shell.execute_reply":"2024-07-19T08:03:11.531701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"訓練データの調査","metadata":{}},{"cell_type":"code","source":"# 訓練結果の可視化\nacc = history.history['acc']\nval_acc = history.history['val_acc']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\nepochs = range(len(acc))\n\n# 精度のグラフ\nplt.plot(epochs, acc, 'bo', label='Training acc')\nplt.plot(epochs, val_acc, 'b', label='Validation acc')\nplt.title('Training and validation acc')\nplt.legend()\nplt.figure()\n\n# 損失のグラフ\nplt.plot(epochs, loss, 'bo', label='Training loss')\nplt.plot(epochs, val_loss, 'b', label='Validation loss')\nplt.title('Training and validation loss')\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-07-19T08:03:11.538022Z","iopub.execute_input":"2024-07-19T08:03:11.538448Z","iopub.status.idle":"2024-07-19T08:03:12.068965Z","shell.execute_reply.started":"2024-07-19T08:03:11.538410Z","shell.execute_reply":"2024-07-19T08:03:12.067852Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"テストデータ","metadata":{}},{"cell_type":"code","source":"import numpy as np\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nimport os\nimport random\n\n# ディレクトリのパスを定義する\ndog_dir = '/kaggle/working/train/dog/'\ncat_dir = '/kaggle/working/train/cat/'\n\n# 犬と猫の画像をランダムに選択する\ndog_img_file = random.choice(os.listdir(dog_dir))\ncat_img_file = random.choice(os.listdir(cat_dir))\n\n# 犬と猫の画像のパスを定義する\ndog_img_path = os.path.join(dog_dir, dog_img_file)\ncat_img_path = os.path.join(cat_dir, cat_img_file)\n\n# 仮の画像ファイルを作成\nimg = np.random.randint(255, size=(150, 150, 3), dtype=np.uint8)\nimg = Image.fromarray(img)\nimg_path = '/kaggle/working/random_image.jpg'\nimg.save(img_path)\n# モデルのロード\nmodel = tf.keras.models.load_model('/kaggle/working/dog_cat.h5')\n\n# 予測関数の定義と実行\ndef predict_image(img_path):\n    img = Image.open(img_path).resize((150, 150))  # 画像を読み込んでサイズを調整\n    img_array = np.array(img) / 255.0  # 画像を配列に変換して正規化\n    img_array = np.expand_dims(img_array, axis=0)  # バッチの次元を追加\n\n    prediction = model.predict(img_array)\n\n    if prediction[0] > 0.5:\n        label = \"dog\"\n    else:\n        label = \"cat\"\n# 画像の表示\n    img = Image.open(img_path)\n    plt.imshow(img)\n    plt.title(label)\n    plt.axis('off')\n    plt.show()\n\n# 犬の画像の予測\npredict_image(dog_img_path)\n\n# 猫の画像の予測\npredict_image(cat_img_path)","metadata":{"execution":{"iopub.status.busy":"2024-07-19T08:04:07.692704Z","iopub.execute_input":"2024-07-19T08:04:07.693208Z","iopub.status.idle":"2024-07-19T08:04:08.713929Z","shell.execute_reply.started":"2024-07-19T08:04:07.693143Z","shell.execute_reply":"2024-07-19T08:04:08.712688Z"},"trusted":true},"execution_count":null,"outputs":[]}]}