diff --git a/workspaces/brendon/Applying_LSTM_NETCD_Files.ipynb b/workspaces/brendon/Applying_LSTM_NETCD_Files.ipynb index 956f93a..df7c84d 100644 --- a/workspaces/brendon/Applying_LSTM_NETCD_Files.ipynb +++ b/workspaces/brendon/Applying_LSTM_NETCD_Files.ipynb @@ -6,32 +6,40 @@ "metadata": { "id": "1OkqAcTNad2z" }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\brend\\anaconda3\\lib\\site-packages\\numpy\\_distributor_init.py:30: UserWarning: loaded more than 1 DLL from .libs:\n", - "C:\\Users\\brend\\anaconda3\\lib\\site-packages\\numpy\\.libs\\libopenblas.XWYDX2IKJW2NMTWSFYNGFUWKQU3LYTCZ.gfortran-win_amd64.dll\n", - "C:\\Users\\brend\\anaconda3\\lib\\site-packages\\numpy\\.libs\\libopenblas64__v0.3.21-gcc_10_3_0.dll\n", - " warnings.warn(\"loaded more than 1 DLL from .libs:\"\n" - ] - } - ], + "outputs": [], "source": [ "import os\n", "import glob\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", + "from datetime import datetime\n", + "\n", + "# Tensorflow\n", "import tensorflow as tf\n", "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.models import load_model\n", "from tensorflow.keras.layers import Dense\n", "from tensorflow.keras.layers import LSTM\n", + "from tensorflow.keras.callbacks import EarlyStopping\n", + "\n", + "# sklearn\n", "from sklearn.preprocessing import MinMaxScaler\n", "from sklearn.metrics import mean_squared_error\n", "\n", - "from matplotlib.colors import ListedColormap" + "# Imaging\n", + "import imageio.v2 as imageio\n", + "from matplotlib.colors import ListedColormap\n", + "\n", + "# Default year range\n", + "years = range(2015, 2016)\n", + "\n", + "file_type = \"png\"\n", + "# data_folder = \"png\"\n", + "data_folder = \"png_no_labels\"\n", + "# file_type = \"npy\"\n", + "# data_folder = \"npy\"\n", + "use_existing_npy = False" ] }, { @@ -48,7 +56,11 @@ } ], "source": [ - "print(\"Num GPUs Available: \", len(tf.config.experimental.list_physical_devices(\"GPU\")))" + "gpus = tf.config.experimental.list_physical_devices(\"GPU\")\n", + "print(\"Num GPUs Available: \", len(gpus))\n", + "if gpus:\n", + " for gpu in gpus:\n", + " tf.config.experimental.set_memory_growth(gpu, True)" ] }, { @@ -66,6 +78,13 @@ " return out_path" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example npy file" + ] + }, { "cell_type": "code", "execution_count": 4, @@ -80,53 +99,89 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "npy shape (2000, 2000)\n" + ] } ], "source": [ "colors = [\"#000000\", \"#FFFFFF\"]\n", "cmap = ListedColormap(colors, name=\"binary_map\", N=len(colors))\n", "\n", - "array_2D = np.load(r\"D:\\IceDyno\\IMS_images\\2023\\npy\\ims2023001_1km_v1_grid1000.npy\")\n", + "array_2D = np.load(\n", + " r\"D:\\IceDyno\\IMS_images_converted\\2015\\npy\\ims2015001_1km_v1_grid1000.npy\"\n", + ")\n", "plt.imshow(array_2D, cmap=cmap)\n", - "plt.show()" + "plt.show()\n", + "\n", + "print(f\"npy shape {array_2D.shape}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example png file" ] }, { "cell_type": "code", "execution_count": 5, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "tnTwd1dWfZEt", - "outputId": "a2dca8d8-d2f0-44a9-cf52-724ea73040bf" - }, + "metadata": {}, "outputs": [ { "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgAAAAGFCAYAAACL7UsMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+BElEQVR4nO3deXxM9/4/8NdMJvueEFsICUootcRShCJqS1SR3lQ19r0LqbhKw7X11lZfqlpr0aLU1qpLa4mlRVBEbQmCiC1S2WSZzMzn94efuc1NQpaZOTNzXs/H4zzKmXM+5zUyzXnP53zO5yiEEAJEREQkK0qpAxAREZHpsQAgIiKSIRYAREREMsQCgIiISIZYABAREckQCwAiIiIZYgFAREQkQywAiIiIZIgFABERkQyxACAiIpIhFgBEREQyxAKAiIhIhlgAEBERyRALACIiIhliAUBERCRDLACIiIhkiAUAERGRDLEAICIikiEWAERERDLEAoCIiEiGWAAQERHJEAsAIiIiGWIBQEREJEMsAIiIiGSIBQAREZEMsQAgIiKSIRYAREREMsQCgIiISIZYABAREckQCwAiIiIZYgFAREQkQywAiIiIZIgFABERkQyxACAiIpIhFgBEREQyxAKAiIhIhlgAEBERyRALACIiIhliAUBERCRDLACIiIhkiAUAERGRDLEAICIikiEWAERERDLEAoCIiEiGWAAQERHJEAsAIiIiGWIBQEREJEMsAIiIiGSIBQAREZEMsQAgIiKSIRYAREREMsQCgIiISIZUUgcgaaWkpCA+Pl7qGBZPoVCga9euUKn4vxQRWQb+tpK5AwcOIDIyUuoYFk+pVCI9PR2urq5SRyEiKhVeApApIQRGjhwpdQyrsXDhQjg6Okodg4io1BRCCCF1CDI9IQTUajW+//579gAYgIODAx4+fMgeACKyGOwBkCmFQgF7e3upY1iN3r17w9bWVuoYRESlxgJA5jp16oQuXbpIHcPijRkzBg4ODlLHICIqNQ4ClLlatWqhVq1aUsewSLVr18bvv/8OpVIJT09PqeMQEZUJCwCicmjZsiW2bduGatWqSR2FiKhceAmAEBkZicqVK0sdw2K0aNEC33zzDXtOiMii8S4AAgA0bdqUEwKVQuXKlfHHH3/A19dX6ihERBXCHgACABw9ehTNmjWTOobZU6lUqFGjhtQx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", "text/plain": [ - "(2000, 2000)" + "
" ] }, - "execution_count": 5, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "png shape (480, 640, 4)\n" + ] } ], "source": [ - "array_2D.shape" + "colors = [\"#000000\", \"#FFFFFF\"]\n", + "cmap = ListedColormap(colors, name=\"binary_map\", N=len(colors))\n", + "\n", + "array_2D = imageio.imread(\n", + " r\"D:\\IceDyno\\IMS_images_converted\\2015\\png_no_labels\\ims2015001_1km_v1_grid1000.png\"\n", + ")\n", + "plt.imshow(array_2D, cmap=cmap)\n", + "plt.axis(\"off\")\n", + "plt.show()\n", + "\n", + "print(f\"png shape {array_2D.shape}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load npy or png files" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -135,68 +190,189 @@ "outputId": "a1a3ac69-6690-4bba-bf89-2f8319000406" }, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading year: 2015\n" + ] + }, { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
File NameDate
0ims2015001_1km_v1.3.nc2015-01-01
1ims2015002_1km_v1.3.nc2015-01-02
2ims2015003_1km_v1.3.nc2015-01-03
3ims2015004_1km_v1.3.nc2015-01-04
4ims2015005_1km_v1.3.nc2015-01-05
.........
359ims2015361_1km_v1.3.nc2015-12-27
360ims2015362_1km_v1.3.nc2015-12-28
361ims2015363_1km_v1.3.nc2015-12-29
362ims2015364_1km_v1.3.nc2015-12-30
363ims2015365_1km_v1.3.nc2015-12-31
\n", + "

364 rows × 2 columns

\n", + "
" + ], "text/plain": [ - "(140, 4000000)" + " File Name Date\n", + "0 ims2015001_1km_v1.3.nc 2015-01-01\n", + "1 ims2015002_1km_v1.3.nc 2015-01-02\n", + "2 ims2015003_1km_v1.3.nc 2015-01-03\n", + "3 ims2015004_1km_v1.3.nc 2015-01-04\n", + "4 ims2015005_1km_v1.3.nc 2015-01-05\n", + ".. ... ...\n", + "359 ims2015361_1km_v1.3.nc 2015-12-27\n", + "360 ims2015362_1km_v1.3.nc 2015-12-28\n", + "361 ims2015363_1km_v1.3.nc 2015-12-29\n", + "362 ims2015364_1km_v1.3.nc 2015-12-30\n", + "363 ims2015365_1km_v1.3.nc 2015-12-31\n", + "\n", + "[364 rows x 2 columns]" ] }, - "execution_count": 37, "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ims_dataset = []\n", - "root_dir = get_path([\"D:\\IceDyno\", \"IMS_images\", \"2023\", \"npy\"])\n", - "file_list = glob.glob(get_path([root_dir, \"*.npy\"]))\n", - "for npy_file in file_list[:140]:\n", - " ims_data_today = np.load(npy_file)\n", - " ims_data_today_flattened = ims_data_today.flatten()\n", - " ims_dataset.append(ims_data_today_flattened)\n", - "ims_dataset = np.array(ims_dataset)\n", - "ims_dataset.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: total: 1.91 s\n", + "Wall time: 3.24 s\n" + ] }, - "id": "_j3kigNNdEFT", - "outputId": "83e4624b-3e37-4e67-ba5d-928564a077b3" - }, - "outputs": [ { "data": { "text/plain": [ - "((140, 4000000),\n", - " array([[0., 0., 0., ..., 1., 1., 1.],\n", - " [0., 0., 0., ..., 1., 1., 1.],\n", - " [0., 0., 0., ..., 1., 1., 1.],\n", - " ...,\n", - " [0., 0., 0., ..., 1., 1., 1.],\n", - " [0., 0., 0., ..., 1., 1., 1.],\n", - " [0., 0., 0., ..., 1., 1., 1.]], dtype=float32))" + "(364, 1228800)" ] }, - "execution_count": 38, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "scaler = MinMaxScaler(feature_range=(0, 1))\n", - "dataset = ims_dataset\n", - "# dataset = scaler.fit_transform(dataset)\n", - "dataset.shape, dataset" + "%%time\n", + "npy_file = get_path([\"D:\", \"IceDyno\", \"IMS_images_converted\", \"all_data.npy\"])\n", + "dfs = []\n", + "\n", + "if os.path.exists(npy_file) and use_existing_npy:\n", + " ims_dataset = np.load(npy_file)\n", + "else:\n", + " ims_dataset = []\n", + " for yr in years:\n", + " print(f\"Loading year: {yr}\")\n", + " root_dir = get_path([\"D:\\IceDyno\", \"IMS_images_converted\", yr, data_folder])\n", + " file_list = glob.glob(get_path([root_dir, f\"*.{file_type}\"]))\n", + " for data_file in file_list:\n", + " if file_type == \"png\":\n", + " ims_data_today = imageio.imread(data_file)\n", + " else:\n", + " ims_data_today = np.load(data_file)\n", + " ims_data_today_flattened = ims_data_today.flatten()\n", + " ims_dataset.append(ims_data_today_flattened)\n", + "\n", + " csv_filename = get_path(\n", + " [\"D:\\IceDyno\", \"IMS_images_converted\", yr, \"image_dates.csv\"]\n", + " )\n", + " if os.path.exists(csv_filename):\n", + " df = pd.read_csv(csv_filename, index_col=False)\n", + " dfs.append(df)\n", + "\n", + " ims_dataset = np.array(ims_dataset)\n", + "\n", + " np.save(npy_file, ims_dataset)\n", + "\n", + "# Set dataframe that holds indices for image dates\n", + "df = pd.concat(dfs, ignore_index=True)\n", + "\n", + "# Create scaled dataset from input\n", + "scaled_dataset = ims_dataset / 255.0\n", + "ims_dataset = [] # Free memory\n", + "scaled_dataset.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create train/val/train" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -209,20 +385,37 @@ "name": "stdout", "output_type": "stream", "text": [ - "93 47\n" + "Size of train: 254\n", + "Size of validation: 72\n", + "Size of test: 38\n" ] } ], "source": [ - "train_size = int(len(dataset) * 0.67)\n", - "test_size = len(dataset) - train_size\n", - "train, test = dataset[0:train_size, :], dataset[train_size : len(dataset), :]\n", - "print(len(train), len(test))" + "train_size = int(len(scaled_dataset) * 0.7)\n", + "val_size = int(len(scaled_dataset) * 0.2)\n", + "test_size = int(len(scaled_dataset) * 0.1)\n", + "\n", + "train = scaled_dataset[:train_size]\n", + "val = scaled_dataset[train_size : train_size + val_size]\n", + "test = scaled_dataset[train_size + val_size :]\n", + "\n", + "scaled_dataset = [] # Free memory\n", + "print(\n", + " f\"Size of train: {len(train)}\\nSize of validation: {len(val)}\\nSize of test: {len(test)}\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create time series with lookback = 1" ] }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 8, "metadata": { "id": "aQ9VyYKhdc_r" }, @@ -240,7 +433,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -253,8 +446,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "(91, 1, 4000000) (91, 4000000)\n", - "(45, 1, 4000000) (45, 4000000)\n" + "train X: (252, 1, 1228800)\ttrain Y: (252, 1228800)\n", + "val X: (70, 1, 1228800)\tval Y: (70, 1228800)\n", + "test X: (36, 1, 1228800)\ttest Y: (36, 1228800)\n" ] } ], @@ -262,15 +456,17 @@ "# reshape into X=t and Y=t+1\n", "look_back = 1\n", "trainX, trainY = create_dataset(train, look_back)\n", + "valX, valY = create_dataset(val, look_back)\n", "testX, testY = create_dataset(test, look_back)\n", "\n", - "print(trainX.shape, trainY.shape)\n", - "print(testX.shape, testY.shape)" + "print(f\"train X: {trainX.shape}\\ttrain Y: {trainY.shape}\")\n", + "print(f\"val X: {valX.shape}\\tval Y: {valY.shape}\")\n", + "print(f\"test X: {testX.shape}\\ttest Y: {testY.shape}\")" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -283,20 +479,32 @@ "name": "stdout", "output_type": "stream", "text": [ - "(91, 1, 4000000) (45, 1, 4000000)\n" + "reshaped train X: (252, 1, 1228800)\n", + "reshaped val X: (70, 1, 1228800)\n", + "reshaped test X: (36, 1, 1228800)\n" ] } ], "source": [ "# reshape input to be [samples, time steps, features]\n", "trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[2]))\n", + "valX = np.reshape(valX, (valX.shape[0], 1, valX.shape[2]))\n", "testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[2]))\n", - "print(trainX.shape, testX.shape)" + "print(\n", + " f\"reshaped train X: {trainX.shape}\\nreshaped val X: {valX.shape}\\nreshaped test X: {testX.shape}\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Build Conv LSTM model and train" ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -310,254 +518,124 @@ "name": "stdout", "output_type": "stream", "text": [ + "INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)\n", + "INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).\n", + "INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).\n", + "INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).\n", + "INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).\n", "Epoch 1/100\n", - "91/91 - 5s - loss: 0.6872 - 5s/epoch - 59ms/step\n", + "INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).\n", + "INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).\n", + "INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).\n", + "INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).\n", + "INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).\n", + "INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).\n", + "252/252 - 8s - loss: 0.7151 - val_loss: 0.5331 - 8s/epoch - 30ms/step\n", "Epoch 2/100\n", - "91/91 - 4s - loss: 0.5311 - 4s/epoch - 47ms/step\n", + "252/252 - 3s - loss: 0.4460 - val_loss: 0.3217 - 3s/epoch - 12ms/step\n", "Epoch 3/100\n", - "91/91 - 4s - loss: 0.3879 - 4s/epoch - 46ms/step\n", + "252/252 - 3s - loss: 0.2611 - val_loss: 0.1870 - 3s/epoch - 12ms/step\n", "Epoch 4/100\n", - "91/91 - 4s - loss: 0.2724 - 4s/epoch - 45ms/step\n", + "252/252 - 3s - loss: 0.1457 - val_loss: 0.1091 - 3s/epoch - 12ms/step\n", "Epoch 5/100\n", - "91/91 - 4s - loss: 0.1848 - 4s/epoch - 43ms/step\n", + "252/252 - 3s - loss: 0.0796 - val_loss: 0.0687 - 3s/epoch - 12ms/step\n", "Epoch 6/100\n", - "91/91 - 4s - loss: 0.1213 - 4s/epoch - 43ms/step\n", + "252/252 - 3s - loss: 0.0453 - val_loss: 0.0504 - 3s/epoch - 12ms/step\n", "Epoch 7/100\n", - "91/91 - 4s - loss: 0.0769 - 4s/epoch - 43ms/step\n", + "252/252 - 3s - loss: 0.0293 - val_loss: 0.0439 - 3s/epoch - 12ms/step\n", "Epoch 8/100\n", - "91/91 - 4s - loss: 0.0472 - 4s/epoch - 42ms/step\n", + "252/252 - 3s - loss: 0.0228 - val_loss: 0.0423 - 3s/epoch - 12ms/step\n", "Epoch 9/100\n", - "91/91 - 4s - loss: 0.0280 - 4s/epoch - 43ms/step\n", + "252/252 - 3s - loss: 0.0204 - val_loss: 0.0428 - 3s/epoch - 12ms/step\n", "Epoch 10/100\n", - "91/91 - 4s - loss: 0.0160 - 4s/epoch - 43ms/step\n", + "252/252 - 3s - loss: 0.0197 - val_loss: 0.0432 - 3s/epoch - 12ms/step\n", "Epoch 11/100\n", - "91/91 - 4s - loss: 0.0089 - 4s/epoch - 43ms/step\n", + "252/252 - 3s - loss: 0.0195 - val_loss: 0.0437 - 3s/epoch - 12ms/step\n", "Epoch 12/100\n", - "91/91 - 4s - loss: 0.0048 - 4s/epoch - 43ms/step\n", + "252/252 - 3s - loss: 0.0194 - val_loss: 0.0440 - 3s/epoch - 12ms/step\n", "Epoch 13/100\n", - "91/91 - 4s - loss: 0.0025 - 4s/epoch - 43ms/step\n", + "252/252 - 3s - loss: 0.0194 - val_loss: 0.0442 - 3s/epoch - 12ms/step\n", "Epoch 14/100\n", - "91/91 - 4s - loss: 0.0012 - 4s/epoch - 42ms/step\n", + "252/252 - 3s - loss: 0.0194 - val_loss: 0.0445 - 3s/epoch - 12ms/step\n", "Epoch 15/100\n", - "91/91 - 4s - loss: 5.9743e-04 - 4s/epoch - 44ms/step\n", + "252/252 - 3s - loss: 0.0194 - val_loss: 0.0446 - 3s/epoch - 12ms/step\n", "Epoch 16/100\n", - "91/91 - 4s - loss: 2.8000e-04 - 4s/epoch - 47ms/step\n", + "252/252 - 3s - loss: 0.0194 - val_loss: 0.0445 - 3s/epoch - 12ms/step\n", "Epoch 17/100\n", - "91/91 - 4s - loss: 1.2704e-04 - 4s/epoch - 45ms/step\n", + "252/252 - 3s - loss: 0.0194 - val_loss: 0.0448 - 3s/epoch - 12ms/step\n", "Epoch 18/100\n", - "91/91 - 4s - loss: 5.5816e-05 - 4s/epoch - 46ms/step\n", - "Epoch 19/100\n", - "91/91 - 4s - loss: 2.3756e-05 - 4s/epoch - 45ms/step\n", - "Epoch 20/100\n", - "91/91 - 4s - loss: 9.7978e-06 - 4s/epoch - 43ms/step\n", - "Epoch 21/100\n", - "91/91 - 4s - loss: 3.9171e-06 - 4s/epoch - 43ms/step\n", - "Epoch 22/100\n", - "91/91 - 4s - loss: 1.5185e-06 - 4s/epoch - 43ms/step\n", - "Epoch 23/100\n", - "91/91 - 4s - loss: 5.7095e-07 - 4s/epoch - 43ms/step\n", - "Epoch 24/100\n", - "91/91 - 4s - loss: 2.0829e-07 - 4s/epoch - 42ms/step\n", - "Epoch 25/100\n", - "91/91 - 4s - loss: 7.3747e-08 - 4s/epoch - 43ms/step\n", - "Epoch 26/100\n", - "91/91 - 4s - loss: 2.5348e-08 - 4s/epoch - 43ms/step\n", - "Epoch 27/100\n", - "91/91 - 4s - loss: 8.4615e-09 - 4s/epoch - 43ms/step\n", - "Epoch 28/100\n", - "91/91 - 4s - loss: 2.7445e-09 - 4s/epoch - 43ms/step\n", - "Epoch 29/100\n", - "91/91 - 4s - loss: 8.6520e-10 - 4s/epoch - 43ms/step\n", - "Epoch 30/100\n", - "91/91 - 4s - loss: 2.6508e-10 - 4s/epoch - 43ms/step\n", - "Epoch 31/100\n", - "91/91 - 4s - loss: 8.4188e-11 - 4s/epoch - 42ms/step\n", - "Epoch 32/100\n", - "91/91 - 4s - loss: 2.1448e-11 - 4s/epoch - 43ms/step\n", - "Epoch 33/100\n", - "91/91 - 4s - loss: 1.8676e-11 - 4s/epoch - 43ms/step\n", - "Epoch 34/100\n", - "91/91 - 4s - loss: 1.8676e-11 - 4s/epoch - 43ms/step\n", - "Epoch 35/100\n", - "91/91 - 4s - loss: 1.8303e-11 - 4s/epoch - 43ms/step\n", - "Epoch 36/100\n", - "91/91 - 4s - loss: 1.7656e-11 - 4s/epoch - 43ms/step\n", - "Epoch 37/100\n", - "91/91 - 4s - loss: 1.6960e-11 - 4s/epoch - 43ms/step\n", - "Epoch 38/100\n", - "91/91 - 4s - loss: 1.6380e-11 - 4s/epoch - 43ms/step\n", - "Epoch 39/100\n", - "91/91 - 4s - loss: 1.5823e-11 - 4s/epoch - 44ms/step\n", - "Epoch 40/100\n", - "91/91 - 4s - loss: 1.5266e-11 - 4s/epoch - 42ms/step\n", - "Epoch 41/100\n", - "91/91 - 4s - loss: 1.4785e-11 - 4s/epoch - 43ms/step\n", - "Epoch 42/100\n", - "91/91 - 4s - loss: 1.4342e-11 - 4s/epoch - 43ms/step\n", - "Epoch 43/100\n", - "91/91 - 4s - loss: 1.3904e-11 - 4s/epoch - 44ms/step\n", - "Epoch 44/100\n", - "91/91 - 4s - loss: 1.3506e-11 - 4s/epoch - 43ms/step\n", - "Epoch 45/100\n", - "91/91 - 4s - loss: 1.3114e-11 - 4s/epoch - 42ms/step\n", - "Epoch 46/100\n", - "91/91 - 4s - loss: 1.2763e-11 - 4s/epoch - 43ms/step\n", - "Epoch 47/100\n", - "91/91 - 4s - loss: 1.2421e-11 - 4s/epoch - 42ms/step\n", - "Epoch 48/100\n", - "91/91 - 4s - loss: 1.2121e-11 - 4s/epoch - 43ms/step\n", - "Epoch 49/100\n", - "91/91 - 4s - loss: 1.1834e-11 - 4s/epoch - 43ms/step\n", - "Epoch 50/100\n", - "91/91 - 4s - loss: 1.1591e-11 - 4s/epoch - 42ms/step\n", - "Epoch 51/100\n", - "91/91 - 4s - loss: 1.1251e-11 - 4s/epoch - 42ms/step\n", - "Epoch 52/100\n", - "91/91 - 4s - loss: 1.1023e-11 - 4s/epoch - 43ms/step\n", - "Epoch 53/100\n", - "91/91 - 4s - loss: 1.0853e-11 - 4s/epoch - 43ms/step\n", - "Epoch 54/100\n", - "91/91 - 4s - loss: 1.0569e-11 - 4s/epoch - 43ms/step\n", - "Epoch 55/100\n", - "91/91 - 4s - loss: 1.0373e-11 - 4s/epoch - 46ms/step\n", - "Epoch 56/100\n", - "91/91 - 4s - loss: 1.0236e-11 - 4s/epoch - 47ms/step\n", - "Epoch 57/100\n", - "91/91 - 4s - loss: 9.9599e-12 - 4s/epoch - 47ms/step\n", - "Epoch 58/100\n", - "91/91 - 4s - loss: 9.9076e-12 - 4s/epoch - 44ms/step\n", - "Epoch 59/100\n", - "91/91 - 4s - loss: 9.5918e-12 - 4s/epoch - 43ms/step\n", - "Epoch 60/100\n", - "91/91 - 4s - loss: 9.5866e-12 - 4s/epoch - 43ms/step\n", - "Epoch 61/100\n", - "91/91 - 4s - loss: 9.3000e-12 - 4s/epoch - 42ms/step\n", - "Epoch 62/100\n", - "91/91 - 4s - loss: 9.2697e-12 - 4s/epoch - 43ms/step\n", - "Epoch 63/100\n", - "91/91 - 4s - loss: 9.0691e-12 - 4s/epoch - 43ms/step\n", - "Epoch 64/100\n", - "91/91 - 4s - loss: 8.9581e-12 - 4s/epoch - 42ms/step\n", - "Epoch 65/100\n", - "91/91 - 4s - loss: 8.9381e-12 - 4s/epoch - 43ms/step\n", - "Epoch 66/100\n", - "91/91 - 4s - loss: 8.6519e-12 - 4s/epoch - 42ms/step\n", - "Epoch 67/100\n", - "91/91 - 4s - loss: 8.6519e-12 - 4s/epoch - 42ms/step\n", - "Epoch 68/100\n", - "91/91 - 4s - loss: 8.5965e-12 - 4s/epoch - 42ms/step\n", - "Epoch 69/100\n", - "91/91 - 4s - loss: 8.3510e-12 - 4s/epoch - 43ms/step\n", - "Epoch 70/100\n", - "91/91 - 4s - loss: 8.3510e-12 - 4s/epoch - 43ms/step\n", - "Epoch 71/100\n", - "91/91 - 4s - loss: 8.3510e-12 - 4s/epoch - 43ms/step\n", - "Epoch 72/100\n", - "91/91 - 4s - loss: 8.1130e-12 - 4s/epoch - 43ms/step\n", - "Epoch 73/100\n", - "91/91 - 4s - loss: 8.0554e-12 - 4s/epoch - 43ms/step\n", - "Epoch 74/100\n", - "91/91 - 4s - loss: 8.0554e-12 - 4s/epoch - 43ms/step\n", - "Epoch 75/100\n", - "91/91 - 4s - loss: 8.0554e-12 - 4s/epoch - 42ms/step\n", - "Epoch 76/100\n", - "91/91 - 4s - loss: 7.8086e-12 - 4s/epoch - 43ms/step\n", - "Epoch 77/100\n", - "91/91 - 4s - loss: 7.7651e-12 - 4s/epoch - 43ms/step\n", - "Epoch 78/100\n", - "91/91 - 4s - loss: 7.7651e-12 - 4s/epoch - 44ms/step\n", - "Epoch 79/100\n", - "91/91 - 4s - loss: 7.7651e-12 - 4s/epoch - 46ms/step\n", - "Epoch 80/100\n", - "91/91 - 4s - loss: 7.7651e-12 - 4s/epoch - 48ms/step\n", - "Epoch 81/100\n", - "91/91 - 4s - loss: 7.4933e-12 - 4s/epoch - 45ms/step\n", - "Epoch 82/100\n", - "91/91 - 4s - loss: 7.4802e-12 - 4s/epoch - 44ms/step\n", - "Epoch 83/100\n", - "91/91 - 4s - loss: 7.4802e-12 - 4s/epoch - 44ms/step\n", - "Epoch 84/100\n", - "91/91 - 4s - loss: 7.4802e-12 - 4s/epoch - 45ms/step\n", - "Epoch 85/100\n", - "91/91 - 4s - loss: 7.4802e-12 - 4s/epoch - 45ms/step\n", - "Epoch 86/100\n", - "91/91 - 4s - loss: 7.4802e-12 - 4s/epoch - 45ms/step\n", - "Epoch 87/100\n", - "91/91 - 4s - loss: 7.2891e-12 - 4s/epoch - 47ms/step\n", - "Epoch 88/100\n", - "91/91 - 4s - loss: 7.2006e-12 - 4s/epoch - 45ms/step\n", - "Epoch 89/100\n", - "91/91 - 4s - loss: 7.2006e-12 - 4s/epoch - 46ms/step\n", - "Epoch 90/100\n", - "91/91 - 4s - loss: 7.2006e-12 - 4s/epoch - 45ms/step\n", - "Epoch 91/100\n", - "91/91 - 4s - loss: 7.2006e-12 - 4s/epoch - 43ms/step\n", - "Epoch 92/100\n", - "91/91 - 4s - loss: 7.2006e-12 - 4s/epoch - 43ms/step\n", - "Epoch 93/100\n", - "91/91 - 4s - loss: 7.2006e-12 - 4s/epoch - 43ms/step\n", - "Epoch 94/100\n", - "91/91 - 4s - loss: 7.2006e-12 - 4s/epoch - 42ms/step\n", - "Epoch 95/100\n", - "91/91 - 4s - loss: 7.2006e-12 - 4s/epoch - 42ms/step\n", - "Epoch 96/100\n", - "91/91 - 4s - loss: 6.9866e-12 - 4s/epoch - 43ms/step\n", - "Epoch 97/100\n", - "91/91 - 4s - loss: 6.9263e-12 - 4s/epoch - 45ms/step\n", - "Epoch 98/100\n", - "91/91 - 4s - loss: 6.9263e-12 - 4s/epoch - 45ms/step\n", - "Epoch 99/100\n", - "91/91 - 4s - loss: 6.9263e-12 - 4s/epoch - 43ms/step\n", - "Epoch 100/100\n", - "91/91 - 4s - loss: 6.9263e-12 - 4s/epoch - 43ms/step\n" + "252/252 - 3s - loss: 0.0194 - val_loss: 0.0446 - 3s/epoch - 12ms/step\n", + "Epoch 18: early stopping\n", + "CPU times: total: 12.4 s\n", + "Wall time: 1min 1s\n" ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "# create and fit the LSTM network\n", - "model = Sequential()\n", - "model.add(LSTM(4, input_shape=(1, trainX.shape[2])))\n", - "model.add(Dense(trainX.shape[2]))\n", - "model.compile(loss=\"mean_squared_error\", optimizer=\"adam\")\n", - "model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)" + "%%time\n", + "\"\"\"\n", + "create and fit the LSTM network\n", + "run on CPU due to limitations of GPU memory\n", + "`mirroredstrategy` will still feed operations to GPU (if available)\n", + "\"\"\"\n", + "\n", + "strategy = tf.distribute.MirroredStrategy()\n", + "\n", + "with strategy.scope():\n", + " model = Sequential()\n", + " model.add(LSTM(4, input_shape=(1, trainX.shape[2])))\n", + " model.add(Dense(trainX.shape[2]))\n", + "\n", + " model.compile(loss=\"mean_squared_error\", optimizer=\"adam\")\n", + "\n", + "early_stopping = EarlyStopping(monitor=\"val_loss\", patience=10, verbose=1)\n", + "with tf.device(\"/CPU:0\"):\n", + " model.fit(\n", + " trainX,\n", + " trainY,\n", + " epochs=100,\n", + " batch_size=1,\n", + " verbose=2,\n", + " callbacks=[early_stopping],\n", + " validation_data=(valX, valY),\n", + " )" ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 12, "metadata": {}, - "outputs": [ - { - "ename": "InternalError", - "evalue": "stream did not block host until done; was already in an error state", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mInternalError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[46], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m31424.h5\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32m~\\anaconda3\\lib\\site-packages\\keras\\utils\\traceback_utils.py:67\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 65\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e: \u001b[38;5;66;03m# pylint: disable=broad-except\u001b[39;00m\n\u001b[0;32m 66\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n\u001b[1;32m---> 67\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\u001b[38;5;241m.\u001b[39mwith_traceback(filtered_tb) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 68\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 69\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m filtered_tb\n", - "File \u001b[1;32m~\\anaconda3\\lib\\site-packages\\tensorflow\\python\\framework\\ops.py:1127\u001b[0m, in \u001b[0;36m_EagerTensorBase._numpy\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1125\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_numpy_internal()\n\u001b[0;32m 1126\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m core\u001b[38;5;241m.\u001b[39m_NotOkStatusException \u001b[38;5;28;01mas\u001b[39;00m e: \u001b[38;5;66;03m# pylint: disable=protected-access\u001b[39;00m\n\u001b[1;32m-> 1127\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m core\u001b[38;5;241m.\u001b[39m_status_to_exception(e) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;31mInternalError\u001b[0m: stream did not block host until done; was already in an error state" - ] - } - ], + "outputs": [], "source": [ - "model.save(\"31424.h5\")" + "today = datetime.today()\n", + "formatted_date = today.strftime(\"%m%d%y\")\n", + "model.save(f\"{formatted_date}_{file_type}.h5\")\n", + "model = None" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "tf.keras.backend.clear_session()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Due to memory constraints on GPU, predict using CPU\n", + "with tf.device(\"/CPU:0\"):\n", + " model = tf.keras.models.load_model(f\"{formatted_date}_{file_type}.h5\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -567,29 +645,36 @@ }, "outputs": [ { - "ename": "InternalError", - "evalue": "Graph execution error:\n\nFailed to call ThenRnnForward with model config: [rnn_mode, rnn_input_mode, rnn_direction_mode]: 2, 0, 0 , [num_layers, input_size, num_units, dir_count, max_seq_length, batch_size, cell_num_units]: [1, 4000000, 4, 1, 1, 32, 4] \n\t [[{{node CudnnRNN}}]]\n\t [[sequential_2/lstm_2/PartitionedCall]] [Op:__inference_predict_function_43553]", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mInternalError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[44], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# make predictions\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m trainPredict \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpredict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtrainX\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3\u001b[0m testPredict \u001b[38;5;241m=\u001b[39m model\u001b[38;5;241m.\u001b[39mpredict(testX)\n\u001b[0;32m 4\u001b[0m testPredict\u001b[38;5;241m.\u001b[39mshape, testPredict, testPredict[\u001b[38;5;241m0\u001b[39m]\n", - "File \u001b[1;32m~\\anaconda3\\lib\\site-packages\\keras\\utils\\traceback_utils.py:67\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 65\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e: \u001b[38;5;66;03m# pylint: disable=broad-except\u001b[39;00m\n\u001b[0;32m 66\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n\u001b[1;32m---> 67\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\u001b[38;5;241m.\u001b[39mwith_traceback(filtered_tb) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 68\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 69\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m filtered_tb\n", - "File \u001b[1;32m~\\anaconda3\\lib\\site-packages\\tensorflow\\python\\eager\\execute.py:54\u001b[0m, in \u001b[0;36mquick_execute\u001b[1;34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[0m\n\u001b[0;32m 52\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 53\u001b[0m ctx\u001b[38;5;241m.\u001b[39mensure_initialized()\n\u001b[1;32m---> 54\u001b[0m tensors \u001b[38;5;241m=\u001b[39m pywrap_tfe\u001b[38;5;241m.\u001b[39mTFE_Py_Execute(ctx\u001b[38;5;241m.\u001b[39m_handle, device_name, op_name,\n\u001b[0;32m 55\u001b[0m inputs, attrs, num_outputs)\n\u001b[0;32m 56\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m core\u001b[38;5;241m.\u001b[39m_NotOkStatusException \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 57\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", - "\u001b[1;31mInternalError\u001b[0m: Graph execution error:\n\nFailed to call ThenRnnForward with model config: [rnn_mode, rnn_input_mode, rnn_direction_mode]: 2, 0, 0 , [num_layers, input_size, num_units, dir_count, max_seq_length, batch_size, cell_num_units]: [1, 4000000, 4, 1, 1, 32, 4] \n\t [[{{node CudnnRNN}}]]\n\t [[sequential_2/lstm_2/PartitionedCall]] [Op:__inference_predict_function_43553]" + "name": "stdout", + "output_type": "stream", + "text": [ + "8/8 [==============================] - 1s 58ms/step\n", + "2/2 [==============================] - 0s 13ms/step\n", + "Test predict shape: (36, 1228800)\n", + "Test predict full array: [[0.99999547 0.99999547 0.99999547 ... 0.99999547 0.99999547 0.99999547]\n", + " [0.99999547 0.99999547 0.99999547 ... 0.99999547 0.99999547 0.99999547]\n", + " [0.99999547 0.99999547 0.99999547 ... 0.99999547 0.99999547 0.99999547]\n", + " ...\n", + " [0.99999547 0.99999547 0.99999547 ... 0.99999547 0.99999547 0.99999547]\n", + " [0.99999547 0.99999547 0.99999547 ... 0.99999547 0.99999547 0.99999547]\n", + " [0.99999547 0.99999547 0.99999547 ... 0.99999547 0.99999547 0.99999547]]\n", + "Test predict sample image: [0.99999547 0.99999547 0.99999547 ... 0.99999547 0.99999547 0.99999547]\n" ] } ], "source": [ "# make predictions\n", - "trainPredict = model.predict(trainX)\n", - "testPredict = model.predict(testX)\n", - "testPredict.shape, testPredict, testPredict[0]" + "with tf.device(\"/CPU:0\"):\n", + " trainPredict = model.predict(trainX)\n", + " testPredict = model.predict(testX)\n", + "print(f\"Test predict shape: {testPredict.shape}\")\n", + "print(f\"Test predict full array: {testPredict}\")\n", + "print(f\"Test predict sample image: {testPredict[0]}\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -601,12 +686,15 @@ "outputs": [], "source": [ "# We can reshape the output dataframe into the origional format\n", - "testPredict[0].reshape(2000, 2000)" + "if file_type == \"npy\":\n", + " testPredict[0].reshape(2000, 2000)\n", + "else:\n", + " testPredict[0].reshape(480, 640, 4)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -614,14 +702,25 @@ "id": "Vax0w0uZeqeU", "outputId": "62ac1200-d508-42f4-87d9-d3c28008f483" }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(252, 1228800)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "trainY.shape" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -629,7 +728,18 @@ "id": "VueX4jnMeqhU", "outputId": "71b9be82-8540-4d00-c182-dfa8d9724727" }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0.012317438098051841" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "A = trainPredict[0]\n", "B = testY[0]\n", @@ -639,52 +749,106 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 435 - }, - "id": "qVnoEexleqka", - "outputId": "af830f35-135e-4add-a494-116eff60f668" - }, + "execution_count": 19, + "metadata": {}, "outputs": [], "source": [ - "plt.imshow(testPredict[0].reshape(2000, 2000), cmap=\"hot\", interpolation=\"nearest\")\n", - "plt.show()" + "## Convert predictions to [0, 255] same as input data\n", + "def transform(in_array):\n", + " # Change predicted values to scale of 255\n", + " scaled_array = in_array * 255\n", + "\n", + " # Change scale to integers\n", + " int_array = np.round(scaled_array).astype(int)\n", + "\n", + " # Set values , 128 to 0 (black) and >= 128 255 (white)\n", + " int_array[int_array < 128] = 0\n", + " int_array[int_array >= 128] = 255\n", + "\n", + " return int_array" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "converted_testPredict = transform(testPredict)\n", + "converted_testY = transform(testY)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 435 }, - "id": "gyVDCBk4eqne", - "outputId": "eab99229-76cd-4704-b435-628b5db6aa4d" + "id": "qVnoEexleqka", + "outputId": "af830f35-135e-4add-a494-116eff60f668" }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgAAAAGZCAYAAAD/+YnsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAW4ElEQVR4nO3dX6gcZ/kH8Gd/TWrVJJS00RLBViyorQ1CGgyiTTUtRFpRI70QBLF4I4oWBBGraUL0RhEUL/RCjAVtRNQiqPVCGwqKSmpB0guVaqOCqEWlTcUiaed3IXvcc87unv0zO/POPJ8PHNrs2T377pw9+3zned+ZGVRVVQUAkMr/tT0AAKB5AgAAJCQAAEBCAgAAJCQAAEBCAgAAJCQAAEBCAgAAJCQAAEBCAgAs6cEHH4w777wzXvnKV8YLX/jCeMlLXhJvfetb45e//OWm+z7yyCNxyy23xI4dO+Lyyy+Po0ePxu9///tN9/vc5z4XR48ejZe97GUxGAzi5ptvHvvcX/3qV2MwGIz9+stf/jLza6h7XNM8/fTTcdddd8XevXvjsssui9e85jXxjW98Y9P9fvKTn8R73/ve2L9/fzzvec+LwWAQ58+fn/v5gPEEAFjSF7/4xTh//nx86EMfih/84Afx+c9/Pv72t7/FwYMH48EHH1y7369//eu4+eab4z//+U9885vfjK985Svx29/+Nt7whjfEE088se5nfulLX4o//OEP8aY3vSn27Nmz5RhOnToVP/vZz9Z9XXHFFTONf5XjGufo0aNx7733xj333BMPPPBAHDhwIN75znfGfffdt+5+P/7xj+NHP/pRvPSlL43Xve51Cz0XMEUFLOWvf/3rptsuXLhQvfjFL64OHz68dtsdd9xRXXnlldWTTz65dtv58+er7du3Vx/5yEfWPf7ZZ59d+//rr7++OnTo0NjnPnXqVBUR1dmzZxce/yrGNcn3v//9KiKq++67b93tt956a7V3797q4sWLY5/rM5/5TBUR1eOPPz7X8wGT6QDAkl70ohdtum3Hjh1x3XXXxZ/+9KeIiLh48WJ873vfi3e84x2xa9eutftdffXV8cY3vjHuv//+dY//v/9r5k+z6XHdf//9sWPHjrjjjjvW3f6e97wn/vznP8cvfvGL2p4LmM5fGKzAk08+GY888khcf/31ERHxu9/9Lv7973/Hvn37Nt1337598dhjj8Uzzzyz8PPdfvvtcckll8Tu3bvj6NGj8eijj870uFWPa6NHH300XvWqV8W2bds2Pdfw+0AzBABYgfe///3xr3/9K+6+++6IiPj73/8eERG7d+/edN/du3dHVVXxz3/+c+7nueqqq+Luu++OL3/5y3HmzJk4efJknD17Ng4ePBi/+tWvtnz8qsY17fkmPdfoeIDV27b1XYB5fOITn4ivf/3r8YUvfCH279+/7nuDwWDi46Z9b5IjR47EkSNH1v590003xW233RY33HBDHDt2LL773e9GRMRzzz0Xzz333LrnuuSSS1Yyrqqq4tlnn1132+gef93bAFiMDgDU6MSJE/HJT34yPvWpT8UHPvCBtduHK/LH7eH+4x//iMFgEJdffnktY7jmmmvi9a9/ffz85z9fu+3OO++M7du3r30dPnx4ZeN66KGH1j3X9u3b1w7fu+KKKyY+V8T4TgSwGjoAUJMTJ07E8ePH4/jx4/Gxj31s3fde/vKXx/Of//w4d+7cpsedO3curr322rjssstqG0tVVesW0R0/fnxdINm5c+fKxrV///44e/bsutv27t0bERE33HBDnD59Oi5evLiuKzB8/le/+tVzPRewOB0AqMHJkyfj+PHj8fGPfzzuueeeTd/ftm1bvOUtb4nvfOc7ceHChbXb//jHP8aZM2fi6NGjtY3l8ccfj5/+9Kdx8ODBtduuueaauPHGG9e+XvGKV6xsXDt37lz3XDfeeGNceumlERHx9re/PZ5++un49re/ve4x9957b+zduzde+9rXLvKSgQXoAMCSPvvZz8axY8fiyJEjcdttt61rvUfEWiE+ceJEHDhwIG6//fb46Ec/Gs8880wcO3Ysrrzyyvjwhz+87jEPP/zwWtv8qaeeiqqq4lvf+lZERBw4cCCuvvrqiIi45ZZb4qabbop9+/bFrl274ty5c/HpT386BoNBnDx5cqbxr2Jck7z5zW+OW2+9Nd73vvfFU089Fddee22cPn06fvjDH8bXvva1desSnnjiiXjooYci4n8dggceeCD27NkTe/bsiUOHDs30+oAJ2jwJAfTBoUOHqoiY+DXq4Ycfrg4fPly94AUvqHbt2lW97W1vqx577LFNP/Pd7373xJ936tSptfvddddd1XXXXVft3Lmz2rZtW7V3797qXe96V/Wb3/xmrtdQ97im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0EOzLiybdJKg4WNH1X2qWUWkObN2YGb5nfi99YcAAD026QQwJbSWl70uwSw/m+lso9wEAOihrdr0W33wj7aH573OwDwFvYQgAlkJAJDEonvFW80T24uEbhIAoKc2Fvw6r+9e8tQCMBsBAHpo0VX3ixRzRb881kAwCwEACrTMB3hdjx33MyYdTjarJrsF2YvgvFcAHBcamz58k2YJAFCgZT5o23os5VokbOns9J9TAQMzW+awvbZOe0u9FjmVMGUSAKCj2voQnmc9wehXG+MtpaPRl4LZl9fBf5kCAJZSSpHdqKRxlTSWumw8kVNp1y5gazoA0FFdKypNj1cxWr3RbWx7d48AADSuiWLRtYC0kYLKqpkCABrVt+KvUNNVOgAAW5hU5Oc9B4JTKFMSHQDokK6f3KbLe8uLXL1w0mV4p31/0nND3QaVd1avdblY0C9NfdTU9Z6fd7yr/lvzUU3dBAAASMgaAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIQEAABISAAAgIT+H4eXu0lZaEheAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "plt.imshow(testY[0].reshape(2000, 2000), cmap=\"hot\", interpolation=\"nearest\")\n", + "if file_type == \"npy\":\n", + " plt.imshow(testPredict[0].reshape(2000, 2000), cmap=cmap, interpolation=\"nearest\")\n", + "else:\n", + " image_date = df.loc[0, \"Date\"]\n", + " plt.imshow(\n", + " converted_testPredict[0].reshape(480, 640, 4),\n", + " cmap=cmap,\n", + " interpolation=\"nearest\",\n", + " )\n", + " plt.title(image_date)\n", + "plt.axis(\"off\")\n", "plt.show()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 435 }, - "id": "qpOt8Qhleqqe", - "outputId": "38145178-fcb5-4623-f708-2efa3a504949" + "id": "gyVDCBk4eqne", + "outputId": "eab99229-76cd-4704-b435-628b5db6aa4d" }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgAAAAGZCAYAAAD/+YnsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAXT0lEQVR4nO3dXYhdV/kH4HfbBL+SUGLjRws2ohfSanoRC0E0aU2EQCvGiHeCUlSEClUUEasxoQoSERQVhYrxxhspLYKoF9pSsCi29ia9UIkmKoJa1EQRS227/xd/znjmzDlzvvbHWns9DwwkM2fm7LPnzH5/691rr13VdV0HAFCU5/W9AQBA9wQAACiQAAAABRIAAKBAAgAAFEgAAIACCQAAUCABAAAKJAAAQIEEAFjTgw8+GHfccUe89rWvjRe/+MVx3XXXxdvf/vb45S9/ueWxjz/+eBw7dix27doVV199dZw8eTJ+97vfbXncl770pTh58mS86lWviqqq4pZbbpn63N/+9rejqqqpH3/+858X2v6f/vSn8b73vS8OHjwYz3/+86Oqqrh06dLUxy66XbMss6/G1XUdhw8fjqqq4kMf+tBSzwlMJwDAmr7+9a/HpUuX4q677oof/OAH8eUvfzn++te/xqFDh+LBBx/ceNyvfvWruOWWW+Lpp5+O7373u/Gtb30rfvOb38Sb3/zmePLJJzf9zG984xvx+9//Pt7ylrfEvn375m7DuXPn4mc/+9mmj5e85CULbf9PfvKT+PGPfxyvfOUr441vfOO2j112uyYtuq8mfe1rX4sLFy4s/XzANmpgLX/5y1+2fO5f//pX/bKXvaw+evToxufe9a531ddcc0195cqVjc9dunSp3rlzZ/3xj3980/c/++yzG/++8cYb6yNHjkx97nPnztURUT/66KMrb//4c33hC1+oI6K+ePHi3Mdut12zLLqvxl28eLHetWtXff/999cRUd95551LPScwnQ4ArOmlL33pls/t2rUrbrjhhvjjH/8YERHPPPNMfP/73493vvOdsWfPno3HXX/99XHrrbfGAw88sOn7n/e87v40l3mudbdrkX016QMf+EC89a1vjXe84x1rPTewmQAALbhy5Uo8/vjjceONN0ZExG9/+9v4z3/+EwcOHNjy2AMHDsSFCxfiqaeeWvn5br/99rjqqqti7969cfLkyXjiiSdW/lldm9xX4775zW/GL37xi/jqV7/aw5bBsO3oewNgiO68887497//HXfffXdERPztb3+LiIi9e/dueezevXujruv4xz/+Ea94xSuWep6Xv/zlcffdd8ehQ4diz549cf78+fj85z8fhw4dikceeSRuuumm9V9Myyb31cif/vSn+NjHPhZnz56Na6+9tqetg+ESAKBhn/70p+M73/lOfOUrX4mDBw9u+lpVVTO/b7uvzXL8+PE4fvz4xv8PHz4ct912W7z+9a+PU6dOxfe+972IiHjuuefiueee2/RcV1111dLPt4i6ruPZZ5/d9LkdO6YfarbbVx/84Afjpptuive///2tbCeUzikAaNCZM2fis5/9bHzuc5/bdLnaaEb+qBMw7u9//3tUVRVXX311I9uwf//+eNOb3hQ///nPNz53xx13xM6dOzc+jh492shzTfPwww9veq6dO3dOvaxw1r6KiLjvvvviRz/6UZw9ezauXLkSly9fjsuXL0dExNNPPx2XL1+O//73v629BiiBDgA05MyZM3H69Ok4ffp0fPKTn9z0tVe/+tXxwhe+MM6fP7/l+86fPx+vec1r4gUveEFj21LX9aYJe6dPn95UZHfv3t3Yc006ePBgPProo5s+N9nC325fRUQ88cQT8cwzz8ShQ4e2fO3ee++Ne++9Nx544IE4ceJEo9sOJREAoAH33HNPnD59Oj71qU/FZz7zmS1f37FjR7ztbW+L+++/P86ePbtRgP/whz/EQw89FB/5yEca25aLFy/GI488EseOHdv43P79+2P//v2NPcd2du/eHW94wxtmfn3evoqIeO973zt1kaFbb701Tpw4EXfddVe87nWva2qToUgCAKzpi1/8Ypw6dSqOHz8et91226bWe0RsjGLPnDkTN998c9x+++3xiU98Ip566qk4depUXHPNNfHRj3500/c89thjG23zf/7zn1HXddx3330REXHzzTfH9ddfHxERx44di8OHD8eBAwc2JgGePXs2qqqKe+65Z6Htf/LJJ+Phhx+OiNjoUPzwhz+Mffv2xb59++LIkSNLb9e6+2q7wHLdddctvQIhMEWvqxDAABw5cqSOiJkf4x577LH66NGj9Yte9KJ6z5499YkTJ+oLFy5s+Znvec97Zv68c+fObTzuwx/+cH3DDTfUu3fvrnfs2FFfe+219bvf/e76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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "plt.imshow(testPredict[0].reshape(2000, 2000), cmap=\"hot\", interpolation=\"nearest\")\n", + "if file_type == \"npy\":\n", + " plt.imshow(testY[0].reshape(2000, 2000), cmap=cmap, interpolation=\"nearest\")\n", + "else:\n", + " plt.imshow(\n", + " converted_testY[0].reshape(480, 640, 4), cmap=cmap, interpolation=\"nearest\"\n", + " )\n", + " image_date = df.loc[len(train) + len(val), \"Date\"]\n", + " plt.title(image_date)\n", + "plt.axis(\"off\")\n", "plt.show()" ] } @@ -708,7 +872,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.18" + "version": "3.10.13" } }, "nbformat": 4,