{"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":30698,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport 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))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-04-22T07:08:34.866228Z","iopub.execute_input":"2024-04-22T07:08:34.866857Z","iopub.status.idle":"2024-04-22T07:08:34.876123Z","shell.execute_reply.started":"2024-04-22T07:08:34.866815Z","shell.execute_reply":"2024-04-22T07:08:34.875046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport numpy as np \nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport random \nimport tensorflow as tf  \nfrom tensorflow import keras \nfrom keras import layers  \nfrom keras import models  \nfrom keras.layers import Dropout \nfrom keras import optimizers  \nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator  \nimport matplotlib.pyplot as plt\n\nprint(os.listdir(\"../input\"))","metadata":{"execution":{"iopub.status.busy":"2024-04-22T07:56:19.736176Z","iopub.execute_input":"2024-04-22T07:56:19.736818Z","iopub.status.idle":"2024-04-22T07:56:19.747963Z","shell.execute_reply.started":"2024-04-22T07:56:19.736784Z","shell.execute_reply":"2024-04-22T07:56:19.746771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 处理数据 解压\n! unzip /kaggle/input/dogs-vs-cats/train.zip\n! unzip /kaggle/input/dogs-vs-cats/test1.zip","metadata":{"execution":{"iopub.status.busy":"2024-04-22T07:08:34.891934Z","iopub.execute_input":"2024-04-22T07:08:34.892391Z","iopub.status.idle":"2024-04-22T07:08:58.784565Z","shell.execute_reply.started":"2024-04-22T07:08:34.892349Z","shell.execute_reply":"2024-04-22T07:08:58.782963Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 数据分类\nfilenames = os.listdir('./train/')\ncategories = []\nfor filename in filenames:\n    category= filename.split('.')[0]\n    if category == 'cat':\n        categories.append('0')\n    else:\n        categories.append('1')\n\ndf = pd.DataFrame({'filename':filenames,'category':categories})\nprint('df.shape:',df.shape)\ndf.head()\n\n","metadata":{"execution":{"iopub.status.busy":"2024-04-22T08:01:37.628460Z","iopub.execute_input":"2024-04-22T08:01:37.628885Z","iopub.status.idle":"2024-04-22T08:01:37.688943Z","shell.execute_reply.started":"2024-04-22T08:01:37.628856Z","shell.execute_reply":"2024-04-22T08:01:37.687663Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 查看数据分类效果\nprint('Number of dogs in the train dataset:',df.category[df.category=='1'].count())\nprint('Number of cats in the train dataset:',df.category[df.category=='0'].count())\n ","metadata":{"execution":{"iopub.status.busy":"2024-04-22T08:01:41.305907Z","iopub.execute_input":"2024-04-22T08:01:41.306586Z","iopub.status.idle":"2024-04-22T08:01:41.330013Z","shell.execute_reply.started":"2024-04-22T08:01:41.306545Z","shell.execute_reply":"2024-04-22T08:01:41.328711Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 构建CNN\nImage_Size = (256,256)\nChannel_Size = 3 \nBatch_Size = 64 \n\ndef create_model():\n    model = models.Sequential()  \n    model.add(layers.Conv2D(32, (3, 3), activation='relu',\n                            input_shape=(256,256,3))) \n    model.add(layers.MaxPooling2D((2, 2)))  #池化\n    \n    model.add(layers.Conv2D(64, (3, 3), activation='relu')) \n    model.add(layers.MaxPooling2D((2, 2))) \n    \n    \n    model.add(layers.Conv2D(128, (3, 3), activation='relu'))  \n    model.add(layers.MaxPooling2D((2, 2)))  \n    \n    model.add(layers.Conv2D(256, (3, 3), activation='relu')) \n    model.add(layers.MaxPooling2D((2, 2)))  \n    \n    \n    model.add(layers.Flatten()) #平滑化\n    model.add(layers.Dense(128,activation='relu'))  \n    model.add(Dropout(0.2)) #停用 20% 的中间层节点\n    \n    model.add(layers.Dense(256,activation='relu'))  \n    model.add(Dropout(0.5))  \n    \n    model.add(layers.Dense(2, activation='softmax')) \n    \n    model.compile(loss='categorical_crossentropy',  \n              optimizer='rmsprop',\n              metrics=['accuracy'],)\n    return model\n\nmy_model = create_model()","metadata":{"execution":{"iopub.status.busy":"2024-04-22T08:00:52.892341Z","iopub.execute_input":"2024-04-22T08:00:52.892794Z","iopub.status.idle":"2024-04-22T08:00:53.138717Z","shell.execute_reply.started":"2024-04-22T08:00:52.892759Z","shell.execute_reply":"2024-04-22T08:00:53.137708Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"my_model.summary()","metadata":{"execution":{"iopub.status.busy":"2024-04-22T08:00:56.090548Z","iopub.execute_input":"2024-04-22T08:00:56.091021Z","iopub.status.idle":"2024-04-22T08:00:56.130474Z","shell.execute_reply.started":"2024-04-22T08:00:56.090990Z","shell.execute_reply":"2024-04-22T08:00:56.129008Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 拆分数据（25,000 张图像⇒20,000 张训练数据、5,000 张验证数据）\nfrom sklearn.model_selection  import train_test_split\ntrain_df, validation_df = train_test_split(df, test_size=0.2, random_state=45)\ntrain_df = train_df.reset_index(drop=True)\nvalidation_df = validation_df.reset_index(drop=True)\nprint(f'train_df.shpae:{train_df.shape} & validation_df.shape:{validation_df.shape}')","metadata":{"execution":{"iopub.status.busy":"2024-04-22T08:02:22.715507Z","iopub.execute_input":"2024-04-22T08:02:22.716012Z","iopub.status.idle":"2024-04-22T08:02:22.732578Z","shell.execute_reply.started":"2024-04-22T08:02:22.715978Z","shell.execute_reply":"2024-04-22T08:02:22.731332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 数据增强\n\ntrain_datagen = ImageDataGenerator(\n    rotation_range=15,  \n    rescale=1./255,  \n    shear_range=0.1,  \n    zoom_range=0.4, \n    horizontal_flip=True)  \n\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    train_df,\n    './train',\n    x_col='filename',\n    y_col='category',\n    target_size=Image_Size,\n    class_mode='categorical',\n    batch_size=Batch_Size\n)\n\nvalidation_datagen = ImageDataGenerator(\n    rescale=1./255)\n\nvalidation_generator = train_datagen.flow_from_dataframe(\n    validation_df,\n    './train',\n    x_col='filename',\n    y_col='category',\n    target_size=Image_Size,\n    class_mode='categorical',\n    batch_size=Batch_Size\n)","metadata":{"execution":{"iopub.status.busy":"2024-04-22T08:04:28.794907Z","iopub.execute_input":"2024-04-22T08:04:28.795369Z","iopub.status.idle":"2024-04-22T08:04:29.193623Z","shell.execute_reply.started":"2024-04-22T08:04:28.795336Z","shell.execute_reply":"2024-04-22T08:04:29.192651Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 训练模型\nimport warnings\n \nwarnings.filterwarnings(\"ignore\")\n\nHistory = my_model.fit(\n    train_generator,\n    epochs=10,  \n    validation_data=(validation_generator),\n    batch_size = Batch_Size\n)","metadata":{"execution":{"iopub.status.busy":"2024-04-22T08:06:35.453308Z","iopub.execute_input":"2024-04-22T08:06:35.454545Z","iopub.status.idle":"2024-04-22T13:56:57.583721Z","shell.execute_reply.started":"2024-04-22T08:06:35.454500Z","shell.execute_reply":"2024-04-22T13:56:57.579775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 显示结果  折线图\naccuracy = History.history['accuracy']\nval_accuracy = History.history['val_accuracy']\nloss = History.history['loss']\nval_loss = History.history['val_loss']\n\nepochs = range(len(accuracy))\n\nplt.plot(epochs,accuracy, label='accuracy',color='red')\nplt.plot(epochs,val_accuracy, label='val_accuracy',color='pink')\nplt.title('Training and validation accuracy')\nplt.legend()\nplt.figure()\n\nplt.plot(epochs,loss,label='loss',color='blue')\nplt.plot(epochs,val_loss,label='val_loss',color='lightblue')\nplt.title('Training and validation loss')\nplt.legend()\nplt.figure()","metadata":{"execution":{"iopub.status.busy":"2024-04-22T14:03:21.423184Z","iopub.execute_input":"2024-04-22T14:03:21.423862Z","iopub.status.idle":"2024-04-22T14:03:22.228186Z","shell.execute_reply.started":"2024-04-22T14:03:21.423818Z","shell.execute_reply":"2024-04-22T14:03:22.226944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_filenames = os.listdir('./test1/')\ntest_df = pd.DataFrame({'filename':test_filenames})\nprint('test_df.shape:',test_df.shape)\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-04-22T14:04:19.393298Z","iopub.execute_input":"2024-04-22T14:04:19.393819Z","iopub.status.idle":"2024-04-22T14:04:19.437858Z","shell.execute_reply.started":"2024-04-22T14:04:19.393782Z","shell.execute_reply":"2024-04-22T14:04:19.436842Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 从测试数据帧中读取图像数据\n\ntest_datagen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_datagen.flow_from_dataframe(\n    test_df, \n    \"./test1/\", \n    x_col='filename',\n    y_col=None,\n    class_mode=None,\n    target_size=Image_Size,\n    batch_size=Batch_Size,\n    shuffle=False\n)","metadata":{"execution":{"iopub.status.busy":"2024-04-22T14:05:04.310280Z","iopub.execute_input":"2024-04-22T14:05:04.310784Z","iopub.status.idle":"2024-04-22T14:05:04.475338Z","shell.execute_reply.started":"2024-04-22T14:05:04.310745Z","shell.execute_reply":"2024-04-22T14:05:04.473991Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 使用测试数据进行预测\nPredict = my_model.predict(test_generator)\ntest_df['category'] = np.argmax(Predict, axis=-1)","metadata":{"execution":{"iopub.status.busy":"2024-04-22T14:14:26.099091Z","iopub.execute_input":"2024-04-22T14:14:26.099601Z","iopub.status.idle":"2024-04-22T14:20:48.347411Z","shell.execute_reply.started":"2024-04-22T14:14:26.099562Z","shell.execute_reply":"2024-04-22T14:20:48.346045Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 提交最终结果\nsubmission_df = test_df.copy()\nsubmission_df['id'] = submission_df['filename'].str.split('.').str[0]\nsubmission_df['label'] = submission_df['category']\nsubmission_df.drop(['filename', 'category'], axis=1, inplace=True)\nsubmission_df.to_csv('submission.csv', index=False)\n","metadata":{"execution":{"iopub.status.busy":"2024-04-22T14:22:15.641991Z","iopub.execute_input":"2024-04-22T14:22:15.642458Z","iopub.status.idle":"2024-04-22T14:22:16.821943Z","shell.execute_reply.started":"2024-04-22T14:22:15.642425Z","shell.execute_reply":"2024-04-22T14:22:16.820745Z"},"trusted":true},"execution_count":null,"outputs":[]}]}