{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","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":30616,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!unzip /kaggle/input/dogs-vs-cats/train.zip\n!unzip /kaggle/input/dogs-vs-cats/test1.zip","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#define the model\nfrom keras.applications import VGG19\nfrom keras.models import Model\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, BatchNormalization,Input\nfrom keras.applications import ResNet50\nfrom keras.layers import GlobalAveragePooling2D, Dense\nfrom keras.models import Model\nimport tensorflow as tf\nfrom keras.optimizers import Adam\nfrom keras.callbacks import EarlyStopping\nfrom keras.regularizers import l1_l2\ndef my_VGG19(fine_tune=True):\n    # Load the VGG16 base model, pretrained on ImageNet, without the top layers\n    base_model = VGG19(weights='imagenet', include_top=False, input_tensor=Input(shape=(224, 224, 3)))\n    # # Freeze the base model layers to prevent them from being updated during training\n    # for layer in base_model.layers:\n    #     layer.trainable = False\n    # Decide whether to freeze layers\n    if fine_tune:\n        # Unfreeze the last convolutional block\n        for layer in base_model.layers[:-4]:\n            layer.trainable = False\n    else:\n        for layer in base_model.layers:\n            layer.trainable = False\n\n    # Compile the model\n    # # Use a lower learning rate if fine-tuning\n    # if fine_tune:\n    #     optimizer = Adam(lr=0.0001)\n    # else:\n    #     optimizer = Adam(lr=0.001)\n\n    x = base_model.output\n    # Continue with flattening and dense layers\n    x = Flatten()(x)\n    x=BatchNormalization()(x)\n    x=Dense(1024, activation='relu', kernel_regularizer=l1_l2(l1=0.01, l2=0.01))(x)\n    x=Dropout(0.5,name='Dropout1')(x)\n    x=BatchNormalization()(x)\n    x=Dense(512, activation='relu', kernel_regularizer=l1_l2(l1=0.01, l2=0.01))(x)\n    #x=Dropout(0.5,name='Dropout2')(x)\n    predictions = Dense(2, activation='softmax')(x) \n    model = Model(inputs=base_model.input, outputs=predictions)\n    #optimizer = Adam(lr=0.001)\n    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n    model.summary()\n    return model","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-12-08T00:05:58.680519Z","iopub.execute_input":"2023-12-08T00:05:58.681440Z","iopub.status.idle":"2023-12-08T00:05:58.692273Z","shell.execute_reply.started":"2023-12-08T00:05:58.681407Z","shell.execute_reply":"2023-12-08T00:05:58.691253Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\nPrepare the traindataset and testdataset .\n '''\nimport tensorflow as tf\nimport pandas as pd\nimport os\nimport math\nfrom keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split\n\ndef decode_image(filename, label):\n    image = tf.io.read_file(filename)\n\n    image = tf.image.decode_jpeg(image, channels=3)\n    image = tf.image.resize(image, [224, 224])\n    image = tf.image.random_flip_left_right(image)\n    image = tf.image.random_brightness(image, max_delta=0.1)\n    image = tf.image.random_saturation(image, lower=0.6, upper=1.4)\n    image = tf.image.convert_image_dtype(image, tf.float64)\n  \n    return image, label\n\n\ndef load_test_dataset():\n    current_directory = '/kaggle/working'\n    train_directory = os.path.join(current_directory, \"test1\")\n    filenames = []\n    labels = []\n    i = 0\n    for file in os.listdir(train_directory):\n        if file.lower().endswith((\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\")):\n            filename = train_directory + \"/\" + file\n            labels.append(0)\n            filenames.append(filename)\n\n            i += 1\n            if i > 1000000:\n                break\n    labels = to_categorical(labels)\n\n    test_dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))\n    test_dataset = test_dataset.map(decode_image)\n    return  test_dataset,filenames\n\n\n# train_dataset, val_dataset = load_dataset()\n\n# import tensorflow as tf\n# import matplotlib.pyplot as plt\n\n# i = 0\n# for features, labels in train_dataset:\n#     image = tf.cast(features * 255, tf.uint8)\n#     print(labels)\n#     plt.imshow(image)\n#     plt.axis(\"off\")  # 不显示坐标轴\n#     plt.show()\n#     i += 1\n#     if i > 10:\n#         break\n\n\n\ndef load_dataset():\n    current_directory = '/kaggle/working'\n    train_directory = os.path.join(current_directory, \"train\")\n    filenames = []\n    labels = []\n    i = 0\n    for file in os.listdir(train_directory):\n        if file.lower().endswith((\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\")):\n            filename = train_directory + \"/\" + file\n            animal = file.split(\".\")[0]\n            # 1 dog  ,0 cat\n            if animal == \"dog\":\n                label = 1\n            elif animal == \"cat\":\n                label = 0\n            labels.append(label)\n            filenames.append(filename)\n\n            i += 1\n            if i > 1000000:\n                break\n\n    # l = math.floor(len(filenames) * 0.8)\n    # files1 = filenames[0:l]\n    # files2 = filenames[l + 1 :]\n   \n    # labels1 = labels[0:l]\n    # labels2 = labels[l + 1 :]\n    labels = to_categorical(labels)\n    files1,files2,labels1,labels2=train_test_split(filenames, labels, test_size=0.2, random_state=42)\n    train_dataset = tf.data.Dataset.from_tensor_slices((files1, labels1))\n    val_dataset = tf.data.Dataset.from_tensor_slices((files2, labels2))\n    \n   \n    train_dataset = train_dataset.map(decode_image)\n    val_dataset = val_dataset.map(decode_image)\n    return train_dataset, val_dataset\n\n","metadata":{"execution":{"iopub.status.busy":"2023-12-08T00:06:21.766501Z","iopub.execute_input":"2023-12-08T00:06:21.766840Z","iopub.status.idle":"2023-12-08T00:06:21.784123Z","shell.execute_reply.started":"2023-12-08T00:06:21.766815Z","shell.execute_reply":"2023-12-08T00:06:21.783095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''Train the model '''\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Activation, Flatten\nfrom keras.optimizers import Adam\nfrom keras.layers import BatchNormalization\nfrom keras.utils import to_categorical\nfrom keras.layers import Conv2D, MaxPooling2D, ZeroPadding2D, GlobalAveragePooling2D\nfrom keras.layers import LeakyReLU\nfrom keras.preprocessing.image import ImageDataGenerator\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nimport datetime \nfrom keras.callbacks import EarlyStopping\n\nbatch_size = 128\nnumber_of_classes = 2\n(train, val) = load_dataset()\ntrain_dataset=train.batch(batch_size)\nval_dataset=val.batch(batch_size)\n\n\n\nearly_stopping = EarlyStopping(monitor='val_loss', patience=10)\nmodel=my_VGG19(True)\nmodel.fit(train_dataset, epochs=30,validation_data=val_dataset,callbacks=[early_stopping])\nscore = model.evaluate(val_dataset)\nprint('Test accuracy: ', score[1])\npredictions = model.predict(val_dataset)\npredictions = list(predictions)\nmodel.save('model.keras')\n","metadata":{"execution":{"iopub.status.busy":"2023-12-08T00:06:30.964926Z","iopub.execute_input":"2023-12-08T00:06:30.965512Z","iopub.status.idle":"2023-12-08T00:32:40.529581Z","shell.execute_reply.started":"2023-12-08T00:06:30.965478Z","shell.execute_reply":"2023-12-08T00:32:40.528431Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''Predict the test dataset, load the file from the previous trained model'''\nfrom keras.models import Sequential,load_model\nfrom keras.layers import Dense, Dropout, Activation, Flatten\nfrom keras.optimizers import Adam\nfrom keras.layers import BatchNormalization\nfrom keras.utils import to_categorical\nfrom keras.layers import Conv2D, MaxPooling2D, ZeroPadding2D, GlobalAveragePooling2D\nfrom keras.layers import LeakyReLU\nfrom keras.preprocessing.image import ImageDataGenerator\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\ntest_data,filenames=load_test_dataset()\nmodel=load_model('model.keras')\ntest_data=test_data.batch(128)\npredictions = model.predict(test_data)","metadata":{"execution":{"iopub.status.busy":"2023-12-08T00:32:55.953873Z","iopub.execute_input":"2023-12-08T00:32:55.954549Z","iopub.status.idle":"2023-12-08T00:33:40.673312Z","shell.execute_reply.started":"2023-12-08T00:32:55.954515Z","shell.execute_reply":"2023-12-08T00:33:40.672519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''write the predictons to cvs and show some samples'''\nimport re\npred=[]\nfor i in range(len(predictions)):\n \n    #index 1 is dog=1,index 0 is cat=0\n    if (predictions[i][0]>=predictions[i][1]):\n        breed= 0\n    else:\n        breed=1\n    path=filenames[i]\n\n \n    match = re.search(r'(\\d+)\\.jpg$', path)\n    if match:\n     number = int(match.group(1))\n     pred.append([number,breed])\n     \nimport csv\nheaders = [\"id\", \"label\"]\nsorted_pred=sorted(pred,key=lambda x: x[0])\nwith open('Submission.csv', 'w', newline='') as file:\n    writer = csv.writer(file)\n    # Write the header\n    writer.writerow(headers)\n    # Write the data\n    writer.writerows(sorted_pred)\n\nplt.figure(figsize=(20, 8))\nfor i in range(40):\n    ax = plt.subplot(4, 10, i + 1)  \n    image = tf.io.read_file(filenames[i]) \n    image = tf.image.decode_jpeg(image, channels=3)\n    plt.imshow(image)   \n    [number,breed]=pred[i]\n    if breed==1:\n        title=str(number)+':dog'\n    else:\n        title=str(number)+':cat'\n    ax.set_title(title)  \n    ax.get_xaxis().set_visible(False)\n    ax.get_yaxis().set_visible(False)\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-12-08T00:33:45.663298Z","iopub.execute_input":"2023-12-08T00:33:45.664016Z","iopub.status.idle":"2023-12-08T00:33:48.398188Z","shell.execute_reply.started":"2023-12-08T00:33:45.663985Z","shell.execute_reply":"2023-12-08T00:33:48.397196Z"},"trusted":true},"execution_count":null,"outputs":[]}]}