{"metadata":{"accelerator":"GPU","anaconda-cloud":{},"colab":{"provenance":[{"file_id":"https://github.com/jeffheaton/t81_558_deep_learning/blob/master/t81_558_class_06_3_resnet.ipynb","timestamp":1681413659708}],"machine_shape":"hm"},"gpuClass":"premium","kernelspec":{"display_name":"Python 3.9 (tensorflow)","language":"python","name":"tensorflow"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.9.7"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Detect Colab if present\ntry:\n    from google.colab import drive\n    COLAB = True\n    print(\"Note: using Google CoLab\")\n    %tensorflow_version 2.x\nexcept:\n    print(\"Note: not using Google CoLab\")\n    COLAB = False","metadata":{"executionInfo":{"elapsed":358,"status":"ok","timestamp":1682287395416,"user":{"displayName":"gr Li","userId":"13139480787399786915"},"user_tz":300},"id":"fU9UhAxTmp8S","outputId":"bb1167b7-ffbb-4ebc-d461-da2f07cd2d48"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install keras_preprocessing","metadata":{"executionInfo":{"elapsed":4205,"status":"ok","timestamp":1682288027956,"user":{"displayName":"gr Li","userId":"13139480787399786915"},"user_tz":300},"id":"QjwLCXWvCqCY","outputId":"53f041a0-566d-448f-e258-d031e73dacf3"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nimport keras_preprocessing\nfrom keras_preprocessing import image\nfrom keras_preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications.resnet50 import ResNet50\nfrom tensorflow.keras.layers import Input\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.metrics import RootMeanSquaredError\n\nfrom tensorflow.keras.applications import MobileNet\nfrom tensorflow.keras.applications.mobilenet import preprocess_input\nfrom tensorflow.keras.optimizers import Adam","metadata":{"id":"jpN-M-BScz5K","executionInfo":{"status":"ok","timestamp":1682287320272,"user_tz":300,"elapsed":3336,"user":{"displayName":"gr Li","userId":"13139480787399786915"}}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"PATH = \"/content\"\nEXTRACT_TARGET = os.path.join(PATH,\"beach\")\nSOURCE = os.path.join(EXTRACT_TARGET, \"beach\")\n\n#create the path\n!mkdir -p {SOURCE}\n!mkdir -p {TARGET}\n!mkdir -p {EXTRACT_TARGET}","metadata":{"executionInfo":{"elapsed":2,"status":"ok","timestamp":1682287392322,"user":{"displayName":"gr Li","userId":"13139480787399786915"},"user_tz":300},"id":"c8ixjIi5p8Uy"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#download and unzip the dataset\n!pip install -U -q kaggle\n!mkdir -p ~/.kaggle\n!echo '{\"username\":\"xx\",\"key\":\"xxx\"}' > ~/.kaggle/kaggle.json\n!chmod 600 ~/.kaggle/kaggle.json\n!kaggle competitions download -c applications-of-deep-learning-wustlspring-2023\n!unzip -o -j -d {SOURCE} {os.path.join(PATH, \"applications-of-deep-learning-wustlspring-2023.zip\")} >/dev/null","metadata":{"id":"gqD8oV37GuKd","executionInfo":{"status":"ok","timestamp":1682287834036,"user_tz":300,"elapsed":128593,"user":{"displayName":"gr Li","userId":"13139480787399786915"}},"outputId":"5f4caffa-3b01-46f3-dbe1-f70658146e84"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv(\n    os.path.join(SOURCE, \"train.csv\"), \n    na_values=['NA', '?'])","metadata":{"id":"gnUXdlK_KY2u","executionInfo":{"status":"ok","timestamp":1682288002528,"user_tz":300,"elapsed":332,"user":{"displayName":"gr Li","userId":"13139480787399786915"}}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train and validation ratio\nTRAIN_PCT = 0.8\nTRAIN_CUT = int(len(df_train) * TRAIN_PCT)\n\ndf_train_cut = df_train[0:TRAIN_CUT]\ndf_validate_cut = df_train[TRAIN_CUT:]\n\nprint(f\"Training size: {len(df_train_cut)}\")\nprint(f\"Validate size: {len(df_validate_cut)}\")","metadata":{"id":"KOVV842BshWp","executionInfo":{"status":"ok","timestamp":1682288005588,"user_tz":300,"elapsed":482,"user":{"displayName":"gr Li","userId":"13139480787399786915"}},"outputId":"5b4dd1ae-5dc7-4bb0-96bb-ad21436d502f"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"WIDTH = 256\nHEIGHT = 256\n\ntraining_datagen = ImageDataGenerator(\n  rescale = 1./255,\n  horizontal_flip=True,\n  #vertical_flip=True,\n  fill_mode='nearest')\n\ntrain_generator = training_datagen.flow_from_dataframe(\n        dataframe=df_train_cut,\n        directory=SOURCE,\n        x_col=\"filename\",\n        y_col=\"count\",\n        target_size=(HEIGHT, WIDTH),\n        # Keeping the training batch size small \n        # USUALLY increases performance\n        batch_size=32, \n        class_mode='raw')\n\nvalidation_datagen = ImageDataGenerator(rescale = 1./255)\n\nval_generator = validation_datagen.flow_from_dataframe(\n        dataframe=df_validate_cut,\n        directory=SOURCE,\n        x_col=\"filename\",\n        y_col=\"count\",\n        target_size=(HEIGHT, WIDTH),\n        # Make the validation batch size as large as you \n        # have memory for\n        batch_size=256, \n        class_mode='raw')","metadata":{"executionInfo":{"elapsed":332,"status":"ok","timestamp":1682289124548,"user":{"displayName":"gr Li","userId":"13139480787399786915"},"user_tz":300},"id":"GYiMObEJsoof","outputId":"18781303-79d6-48dc-f17c-ef596c11f804"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#create ResNet model\ninput_tensor = Input(shape=(HEIGHT, WIDTH, 3))\n\nbase_model = ResNet50(\n    include_top=False, weights=None, input_tensor=input_tensor,\n    input_shape=None)","metadata":{"id":"6MJpmLyhtahJ","executionInfo":{"status":"ok","timestamp":1682289211022,"user_tz":300,"elapsed":1255,"user":{"displayName":"gr Li","userId":"13139480787399786915"}}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#add a few layers to the end of the neural network so that it becomes a regression model.\nx=base_model.output\nx=GlobalAveragePooling2D()(x)\nx=Dense(1024,activation='relu')(x) \nx=Dense(1024,activation='relu')(x) \nmodel=Model(inputs=base_model.input,outputs=Dense(1)(x))","metadata":{"id":"gXO3lTFIs_U1","executionInfo":{"status":"ok","timestamp":1682290077742,"user_tz":300,"elapsed":344,"user":{"displayName":"gr Li","userId":"13139480787399786915"}}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"id":"bF_yGK5q6wx7","executionInfo":{"status":"ok","timestamp":1682290080013,"user_tz":300,"elapsed":954,"user":{"displayName":"gr Li","userId":"13139480787399786915"}},"outputId":"498d9f6b-7c6a-4972-ebed-a2f7e06b7192"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#fit the model\n# Important, calculate a valid step size for the validation dataset\nSTEP_SIZE_VALID=val_generator.n//val_generator.batch_size\n\nmodel.compile(loss = 'mean_squared_error', optimizer='adam', \n              metrics=[RootMeanSquaredError(name=\"rmse\")])\nmonitor = EarlyStopping(monitor='val_loss', min_delta=1e-3, \n        patience=10, verbose=1, mode='auto',\n        restore_best_weights=True)\n\n#steps_per_epoch=250,\nhistory = model.fit(train_generator, epochs=1000, \n                    validation_data = val_generator, callbacks=[monitor],\n                    verbose = 1, validation_steps=STEP_SIZE_VALID)","metadata":{"executionInfo":{"elapsed":6447812,"status":"ok","timestamp":1681535766180,"user":{"displayName":"gr Li","userId":"13139480787399786915"},"user_tz":300},"id":"nonHOozTtpD3","outputId":"40ec61c2-63de-43c0-bd75-da5c1d0b98fa"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test = pd.read_csv(\n    os.path.join(SOURCE,\"test.csv\"),\n    na_values=['NA', '?'])\n\ntest_datagen = ImageDataGenerator(rescale = 1./255)\n\ntest_generator = validation_datagen.flow_from_dataframe(\n        dataframe=df_test,\n        directory=SOURCE,\n        x_col=\"filename\",\n        batch_size=1,\n        shuffle=False,\n        target_size=(256, 256),\n        class_mode=None)","metadata":{"id":"kJQU-RDfLV30","executionInfo":{"status":"ok","timestamp":1681536142425,"user_tz":300,"elapsed":370,"user":{"displayName":"gr Li","userId":"13139480787399786915"}},"outputId":"9f9eccf3-fdb1-4aa5-b75b-f7647e2579a6"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_generator.reset()\npred = model.predict(test_generator,steps=len(df_test))\n\ndf_submit = pd.DataFrame({'id':df_test['id'],'count':pred.flatten()})\n","metadata":{"id":"ZzxsVtaBLbY9","executionInfo":{"status":"ok","timestamp":1681536198811,"user_tz":300,"elapsed":52578,"user":{"displayName":"gr Li","userId":"13139480787399786915"}},"outputId":"c7c56fc5-bef0-4203-fb3c-c856b0b17e20"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_submit.to_csv(\"/content/beach/submit.csv\",index=False)","metadata":{"id":"Jt9y0T1Laz9A"},"execution_count":null,"outputs":[]}]}