better version for low light images

#1
.gitattributes CHANGED
@@ -70,36 +70,3 @@ sample_06_050244.png filter=lfs diff=lfs merge=lfs -text
70
  sample_07_040111.png filter=lfs diff=lfs merge=lfs -text
71
  sample_08_170404.png filter=lfs diff=lfs merge=lfs -text
72
  sample_09_130480.png filter=lfs diff=lfs merge=lfs -text
73
- checkpoints/ckpt-34.data-00000-of-00001 filter=lfs diff=lfs merge=lfs -text
74
- img_00000.png filter=lfs diff=lfs merge=lfs -text
75
- img_00005.png filter=lfs diff=lfs merge=lfs -text
76
- img_00010.png filter=lfs diff=lfs merge=lfs -text
77
- img_00585.png filter=lfs diff=lfs merge=lfs -text
78
- img_00600.png filter=lfs diff=lfs merge=lfs -text
79
- img_00605.png filter=lfs diff=lfs merge=lfs -text
80
- img_00610.png filter=lfs diff=lfs merge=lfs -text
81
- img_00775.png filter=lfs diff=lfs merge=lfs -text
82
- img_00785.png filter=lfs diff=lfs merge=lfs -text
83
- img_01020.png filter=lfs diff=lfs merge=lfs -text
84
- img_01135.png filter=lfs diff=lfs merge=lfs -text
85
- img_01775.png filter=lfs diff=lfs merge=lfs -text
86
- img_01780.png filter=lfs diff=lfs merge=lfs -text
87
- img_01815.png filter=lfs diff=lfs merge=lfs -text
88
- img_01820.png filter=lfs diff=lfs merge=lfs -text
89
- img_02130.png filter=lfs diff=lfs merge=lfs -text
90
- img_02135.png filter=lfs diff=lfs merge=lfs -text
91
- img_02140.png filter=lfs diff=lfs merge=lfs -text
92
- img_02860.png filter=lfs diff=lfs merge=lfs -text
93
- img_02865.png filter=lfs diff=lfs merge=lfs -text
94
- img_03180.png filter=lfs diff=lfs merge=lfs -text
95
- img_03185.png filter=lfs diff=lfs merge=lfs -text
96
- img_03980.png filter=lfs diff=lfs merge=lfs -text
97
- img_03985.png filter=lfs diff=lfs merge=lfs -text
98
- img_06220.png filter=lfs diff=lfs merge=lfs -text
99
- img_06225.png filter=lfs diff=lfs merge=lfs -text
100
- img_06780.png filter=lfs diff=lfs merge=lfs -text
101
- img_06785.png filter=lfs diff=lfs merge=lfs -text
102
- img_07545.png filter=lfs diff=lfs merge=lfs -text
103
- img_07550.png filter=lfs diff=lfs merge=lfs -text
104
- img_09935.png filter=lfs diff=lfs merge=lfs -text
105
- img_09975.png filter=lfs diff=lfs merge=lfs -text
 
70
  sample_07_040111.png filter=lfs diff=lfs merge=lfs -text
71
  sample_08_170404.png filter=lfs diff=lfs merge=lfs -text
72
  sample_09_130480.png filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
checkpoints/checkpoint DELETED
@@ -1,4 +0,0 @@
1
- model_checkpoint_path: "ckpt-34"
2
- all_model_checkpoint_paths: "ckpt-34"
3
- all_model_checkpoint_timestamps: 1770885364.6021488
4
- last_preserved_timestamp: 1770885364.6021488
 
 
 
 
 
checkpoints/ckpt-34.data-00000-of-00001 DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:ef70f3bd501ffb9f7c237d49042ca432ac074beecbd4f6853ba23b4e70fb06df
3
- size 207904461
 
 
 
 
checkpoints/ckpt-34.index DELETED
Binary file (6.15 kB)
 
img_00000.png DELETED

Git LFS Details

  • SHA256: 1df8f953119188935abf70a3063c8001913cae3583ee1a238ef786baa9f11ea2
  • Pointer size: 131 Bytes
  • Size of remote file: 210 kB
img_00005.png DELETED

Git LFS Details

  • SHA256: f90d52a634649dc6c7a09aa5f5f835fb6b97e79b732ad1a538fe412e4b7195ea
  • Pointer size: 131 Bytes
  • Size of remote file: 245 kB
img_00010.png DELETED

Git LFS Details

  • SHA256: 990b3117ddacc58fde49755b6adc71951c34dca3785559482473dd032405f41a
  • Pointer size: 131 Bytes
  • Size of remote file: 233 kB
img_00585.png DELETED

Git LFS Details

  • SHA256: a18fb9fea2ba5e0f2b17251ccfc3e971b58e08fd581df395d98299a0f1ace7e0
  • Pointer size: 131 Bytes
  • Size of remote file: 239 kB
img_00600.png DELETED

Git LFS Details

  • SHA256: c771c223ad0b6bca4bc52fa5a1756a5e204fadd78aa4882a2ce656f6cb3d37b4
  • Pointer size: 131 Bytes
  • Size of remote file: 266 kB
img_00605.png DELETED

Git LFS Details

  • SHA256: f29a4e48788c3f959d7705c9dd7906697d162bfe86619afad44dd774973b9d08
  • Pointer size: 131 Bytes
  • Size of remote file: 270 kB
img_00610.png DELETED

Git LFS Details

  • SHA256: a556e1ead9b6e20cf5cb1e48f48698b7e732b8b4c9232c7de6cecebd8d85fa55
  • Pointer size: 131 Bytes
  • Size of remote file: 324 kB
img_00775.png DELETED

Git LFS Details

  • SHA256: 0c2bea9e5216e73dc05d1d71f64c69962ae6caae0ab27d02d03b489727612c1b
  • Pointer size: 131 Bytes
  • Size of remote file: 300 kB
img_00785.png DELETED

Git LFS Details

  • SHA256: 8b45f2ff4301eecdfe7a5155bb3846c8ddbfaa6e32e3b1b8227cabdb09672c32
  • Pointer size: 131 Bytes
  • Size of remote file: 276 kB
img_01020.png DELETED

Git LFS Details

  • SHA256: 88c3b21e68309eddd7432e6ad956b374f9d3b501e6032ce33146eb9e01c12179
  • Pointer size: 131 Bytes
  • Size of remote file: 319 kB
img_01135.png DELETED

Git LFS Details

  • SHA256: 9e8f39b4ed5dcb9ec98594b23b781ec132b6f79c6e2e670ddddfc64d4af5917a
  • Pointer size: 131 Bytes
  • Size of remote file: 290 kB
img_01775.png DELETED

Git LFS Details

  • SHA256: 3c53e672c41d0f59eb6523da8836c06e40f7b6eb50deb15c5380bf48f420c8d9
  • Pointer size: 131 Bytes
  • Size of remote file: 284 kB
img_01780.png DELETED

Git LFS Details

  • SHA256: c6bcf31b07a0294e4bd120497ce62683f3aeac106d3c52f7f661a532af51480e
  • Pointer size: 131 Bytes
  • Size of remote file: 265 kB
img_01815.png DELETED

Git LFS Details

  • SHA256: c8273477af0024f460ff8c8a3d28ce97be00e593f84dfd4be433d53d70453197
  • Pointer size: 131 Bytes
  • Size of remote file: 302 kB
img_01820.png DELETED

Git LFS Details

  • SHA256: c8eaebf21e82055951b02099323f7c3b25680e7b7b4f6c599b412cc7dcafb178
  • Pointer size: 131 Bytes
  • Size of remote file: 268 kB
img_02130.png DELETED

Git LFS Details

  • SHA256: 1f46126184147962d96f7c1fcc5b2c722b464691d6a0ea9302ddf6f48d22c3b7
  • Pointer size: 131 Bytes
  • Size of remote file: 224 kB
img_02135.png DELETED

Git LFS Details

  • SHA256: 95742e8312eca2bbeea2e7244d91bac412423d7fd2c3457b16876acb820cd4a2
  • Pointer size: 131 Bytes
  • Size of remote file: 242 kB
img_02140.png DELETED

Git LFS Details

  • SHA256: e2679acb3af19899738e50464459e78f5af0c66e176b52fed316241d49fe5921
  • Pointer size: 131 Bytes
  • Size of remote file: 241 kB
img_02860.png DELETED

Git LFS Details

  • SHA256: d8f5ada6d23f57672c3002d61eb5814434433e3b8f7bf6865d3dd352b8492b4d
  • Pointer size: 131 Bytes
  • Size of remote file: 301 kB
img_02865.png DELETED

Git LFS Details

  • SHA256: e49b00770919ccae7d0c460f4a7b3d94347e27895ba62d5dd625404c2c358f20
  • Pointer size: 131 Bytes
  • Size of remote file: 296 kB
img_03180.png DELETED

Git LFS Details

  • SHA256: fe14832236635731268d659d0b4318e3025a2b9887ca250a45f32c54198bc792
  • Pointer size: 131 Bytes
  • Size of remote file: 324 kB
img_03185.png DELETED

Git LFS Details

  • SHA256: 450fe67e2e5373a6d4e79def123be754cee3743d1b60e9a4d8aa5d0b471c2e31
  • Pointer size: 131 Bytes
  • Size of remote file: 327 kB
img_03980.png DELETED

Git LFS Details

  • SHA256: fcbf4d64746794bb951d96d2c313c2a72e01bfa623d9cf916f40468e28f832a8
  • Pointer size: 131 Bytes
  • Size of remote file: 296 kB
img_03985.png DELETED

Git LFS Details

  • SHA256: 59da481d52ca5a4f98575272857b34369b9a489a63bfb0e850b894af67f11240
  • Pointer size: 131 Bytes
  • Size of remote file: 305 kB
img_06220.png DELETED

Git LFS Details

  • SHA256: d2ce42fd4495164e196d5844defba5f9ac30a6b8914bdb6082be0c549ef863a6
  • Pointer size: 131 Bytes
  • Size of remote file: 380 kB
img_06225.png DELETED

Git LFS Details

  • SHA256: 6435b4f16dda3da8254ec5c22c58d6f38fe9acb2bc729ae33a5babf0b2f0c3d2
  • Pointer size: 131 Bytes
  • Size of remote file: 362 kB
img_06780.png DELETED

Git LFS Details

  • SHA256: 411677c7204cb5d45dc040600c937d481b7f4a1d8826c340055c918744f9f028
  • Pointer size: 131 Bytes
  • Size of remote file: 395 kB
img_06785.png DELETED

Git LFS Details

  • SHA256: e961897efe970a13e8a850644097ce984937c31c3b2940133023d6e9d42fb914
  • Pointer size: 131 Bytes
  • Size of remote file: 401 kB
img_07545.png DELETED

Git LFS Details

  • SHA256: 1ef26d9b75651916c7d0a9cb6dd0cd8f6e80b3cc77c862d457c0b39bd334b14c
  • Pointer size: 131 Bytes
  • Size of remote file: 348 kB
img_07550.png DELETED

Git LFS Details

  • SHA256: bf8eabc45338e6768cf0edec4776f7812e918f4fe390f10d95c8c007e69548a0
  • Pointer size: 131 Bytes
  • Size of remote file: 346 kB
img_09935.png DELETED

Git LFS Details

  • SHA256: 750415959e06778964330a84f74cc6ef145c4ebf97423da34fed24c1ae77e918
  • Pointer size: 131 Bytes
  • Size of remote file: 300 kB
img_09975.png DELETED

Git LFS Details

  • SHA256: 284161e20faf76343d0e6f1d026a8fedbdaae70d55e7fd210eab5463a2c7486a
  • Pointer size: 131 Bytes
  • Size of remote file: 290 kB
visible-to-thermal-f7984f (1).ipynb DELETED
@@ -1,3574 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": 1,
6
- "id": "3df26cb5",
7
- "metadata": {
8
- "execution": {
9
- "iopub.execute_input": "2026-02-12T21:58:41.908567Z",
10
- "iopub.status.busy": "2026-02-12T21:58:41.908310Z",
11
- "iopub.status.idle": "2026-02-12T21:59:00.902318Z",
12
- "shell.execute_reply": "2026-02-12T21:59:00.901653Z"
13
- },
14
- "papermill": {
15
- "duration": 19.000924,
16
- "end_time": "2026-02-12T21:59:00.903787",
17
- "exception": false,
18
- "start_time": "2026-02-12T21:58:41.902863",
19
- "status": "completed"
20
- },
21
- "tags": []
22
- },
23
- "outputs": [
24
- {
25
- "name": "stderr",
26
- "output_type": "stream",
27
- "text": [
28
- "2026-02-12 21:58:43.423256: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
29
- "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n",
30
- "E0000 00:00:1770933523.610196 20 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
31
- "E0000 00:00:1770933523.667872 20 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
32
- "I0000 00:00:1770933537.686778 20 gpu_device.cc:2022] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 15511 MB memory: -> device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:00:04.0, compute capability: 6.0\n"
33
- ]
34
- }
35
- ],
36
- "source": [
37
- "import glob\n",
38
- "import os\n",
39
- "import time\n",
40
- "import numpy as np\n",
41
- "import tensorflow as tf\n",
42
- "from tensorflow.keras import layers, Model, Input\n",
43
- "from tensorflow.keras.layers import Conv2D, Conv2DTranspose, LeakyReLU, Dropout, Concatenate\n",
44
- "from tensorflow.keras.optimizers import Adam\n",
45
- "from tensorflow.keras.applications import VGG19\n",
46
- "\n",
47
- "# -------------------- Settings --------------------\n",
48
- "IMG_SIZE = 256\n",
49
- "BATCH_SIZE = 1\n",
50
- "EPOCHS = 190\n",
51
- "BASE_DIR = \"/kaggle/input/llvip-dataset/LLVIP\" # change if needed\n",
52
- "CHECKPOINT_DIR = \"checkpoints\"\n",
53
- "OUTPUT_DIR = \"outputs\"\n",
54
- "LOG_INTERVAL = 100\n",
55
- "SAVE_INTERVAL_EPOCHS = 10\n",
56
- "\n",
57
- "# Discriminator update steps per generator step (1 or 2)\n",
58
- "D_steps_per_G = 1\n",
59
- "\n",
60
- "# -------------------- Dataset Helpers --------------------\n",
61
- "def load_image_pair(visible_path, ir_path, image_size=(IMG_SIZE, IMG_SIZE)):\n",
62
- " vis = tf.io.read_file(visible_path)\n",
63
- " vis = tf.image.decode_png(vis, channels=3)\n",
64
- " vis = tf.image.resize(vis, image_size)\n",
65
- " vis = tf.cast(vis, tf.float32) / 127.5 - 1.0 # [-1,1]\n",
66
- "\n",
67
- " ir = tf.io.read_file(ir_path)\n",
68
- " ir = tf.image.decode_png(ir, channels=3)\n",
69
- " ir = tf.image.resize(ir, image_size)\n",
70
- " ir = tf.cast(ir, tf.float32) / 127.5 - 1.0\n",
71
- "\n",
72
- " return vis, ir\n",
73
- "def augment_image(vis, ir):\n",
74
- " vis = tf.image.random_contrast(vis, lower=0.8, upper=1.2)\n",
75
- " vis = tf.image.random_brightness(vis, max_delta=0.1)\n",
76
- " ir = tf.image.random_contrast(ir, lower=0.8, upper=1.2)\n",
77
- " return vis, ir\n",
78
- "\n",
79
- "def make_dataset(\n",
80
- " visible_dir,\n",
81
- " ir_dir,\n",
82
- " image_size=256,\n",
83
- " batch_size=1,\n",
84
- " shuffle=False,\n",
85
- " start=None,\n",
86
- " limit=None # NEW\n",
87
- "):\n",
88
- " visible_files = sorted(glob.glob(os.path.join(visible_dir, \"*\")))\n",
89
- " ir_files = sorted(glob.glob(os.path.join(ir_dir, \"*\")))\n",
90
- "\n",
91
- " print(f\"Found {len(visible_files)} visible images and {len(ir_files)} IR images\")\n",
92
- "\n",
93
- " if len(visible_files) == 0 or len(ir_files) == 0:\n",
94
- " raise ValueError(\"❌ No images found! Check paths.\")\n",
95
- "\n",
96
- " # ---- LIMIT DATASET SIZE ----\n",
97
- " if limit is not None:\n",
98
- " visible_files = visible_files[start:limit]\n",
99
- " ir_files = ir_files[start:limit]\n",
100
- " print(f\"Using only {limit} image pairs\")\n",
101
- "\n",
102
- " dataset = tf.data.Dataset.from_tensor_slices((visible_files, ir_files))\n",
103
- "\n",
104
- " if shuffle and len(visible_files) > 1:\n",
105
- " dataset = dataset.shuffle(buffer_size=len(visible_files))\n",
106
- "\n",
107
- " dataset = dataset.map(\n",
108
- " lambda v, i: load_image_pair(v, i, image_size),\n",
109
- " num_parallel_calls=tf.data.AUTOTUNE\n",
110
- " )\n",
111
- "\n",
112
- " dataset = dataset.batch(batch_size).prefetch(tf.data.AUTOTUNE)\n",
113
- " dataset = dataset.map(augment_image, num_parallel_calls=tf.data.AUTOTUNE)\n",
114
- "\n",
115
- " return dataset\n",
116
- "\n",
117
- "\n",
118
- "def get_train_dataset(base_dir=BASE_DIR):\n",
119
- " train_visible = os.path.join(base_dir, \"visible/train\")\n",
120
- " train_ir = os.path.join(base_dir, \"infrared/train\")\n",
121
- "\n",
122
- " return make_dataset(\n",
123
- " train_visible,\n",
124
- " train_ir,\n",
125
- " (IMG_SIZE, IMG_SIZE),\n",
126
- " batch_size=BATCH_SIZE,\n",
127
- " start=0,\n",
128
- " limit=12025 # 🔥 10K TRAIN\n",
129
- " )\n",
130
- "\n",
131
- "\n",
132
- "def get_val_dataset(base_dir=BASE_DIR):\n",
133
- " val_visible = os.path.join(base_dir, \"visible/train\")\n",
134
- " val_ir = os.path.join(base_dir, \"infrared/train\")\n",
135
- "\n",
136
- " return make_dataset(\n",
137
- " val_visible,\n",
138
- " val_ir,\n",
139
- " (IMG_SIZE, IMG_SIZE),\n",
140
- " batch_size=1,\n",
141
- " shuffle=True,\n",
142
- " start=10000,\n",
143
- " limit=12025 # 🔥 2.5K TEST\n",
144
- " )\n",
145
- "\n",
146
- "\n",
147
- "# -------------------- Instance Normalization (per-channel) --------------------\n",
148
- "class InstanceNormalization(layers.Layer):\n",
149
- " def __init__(self, epsilon=1e-5, **kwargs):\n",
150
- " super().__init__(**kwargs)\n",
151
- " self.epsilon = epsilon\n",
152
- "\n",
153
- " def build(self, input_shape):\n",
154
- " channels = int(input_shape[-1])\n",
155
- " self.gamma = self.add_weight(name='gamma', shape=(1,1,1,channels), initializer='ones', trainable=True)\n",
156
- " self.beta = self.add_weight(name='beta', shape=(1,1,1,channels), initializer='zeros', trainable=True)\n",
157
- "\n",
158
- " def call(self, inputs):\n",
159
- " mean, var = tf.nn.moments(inputs, axes=[1,2], keepdims=True)\n",
160
- " normalized = (inputs - mean) / tf.sqrt(var + self.epsilon)\n",
161
- " return self.gamma * normalized + self.beta\n",
162
- "\n",
163
- "from tensorflow.keras.layers import Layer\n",
164
- "\n",
165
- "class AddNoise(Layer):\n",
166
- " def __init__(self, stddev=0.02, **kwargs):\n",
167
- " super().__init__(**kwargs)\n",
168
- " self.stddev = stddev\n",
169
- "\n",
170
- " def call(self, inputs, training=None):\n",
171
- " # you might choose to only add noise during training, or always\n",
172
- " noise = tf.random.normal(tf.shape(inputs), mean=0.0, stddev=self.stddev)\n",
173
- " return inputs + noise\n",
174
- "\n",
175
- " def get_config(self):\n",
176
- " config = super().get_config()\n",
177
- " config.update({\"stddev\": self.stddev})\n",
178
- " return config\n",
179
- "\n",
180
- "\n",
181
- "def build_generator_attention(img_size=256):\n",
182
- " inputs = Input(shape=(img_size, img_size, 3))\n",
183
- " x = AddNoise(stddev=0.02)(inputs)\n",
184
- "\n",
185
- " e1 = Conv2D(64, 4, strides=2, padding='same')(x)\n",
186
- " e1 = LeakyReLU(0.2)(e1)\n",
187
- "\n",
188
- " e2 = Conv2D(128, 4, strides=2, padding='same')(e1)\n",
189
- " e2 = LeakyReLU(0.2)(e2)\n",
190
- "\n",
191
- " e3 = Conv2D(256, 4, strides=2, padding='same')(e2)\n",
192
- " e3 = LeakyReLU(0.2)(e3)\n",
193
- "\n",
194
- " e4 = Conv2D(512, 4, strides=2, padding='same')(e3)\n",
195
- " e4 = LeakyReLU(0.2)(e4)\n",
196
- "\n",
197
- " # Bottleneck + Attention block (optional)\n",
198
- " b = Conv2D(512, 4, strides=2, padding='same')(e4)\n",
199
- " b = LeakyReLU(0.2)(b)\n",
200
- "\n",
201
- " # Decoder\n",
202
- " d1 = Conv2DTranspose(512, 4, strides=2, padding='same')(b)\n",
203
- " d1 = tf.keras.layers.ReLU()(d1)\n",
204
- " d1 = Concatenate()([d1, e4])\n",
205
- "\n",
206
- " d2 = Conv2DTranspose(256, 4, strides=2, padding='same')(d1)\n",
207
- " d2 = tf.keras.layers.ReLU()(d2)\n",
208
- " d2 = Concatenate()([d2, e3])\n",
209
- "\n",
210
- " d3 = Conv2DTranspose(128, 4, strides=2, padding='same')(d2)\n",
211
- " d3 = tf.keras.layers.ReLU()(d3)\n",
212
- " d3 = Concatenate()([d3, e2])\n",
213
- "\n",
214
- " d4 = Conv2DTranspose(64, 4, strides=2, padding='same')(d3)\n",
215
- " d4 = tf.keras.layers.ReLU()(d4)\n",
216
- " d4 = Concatenate()([d4, e1])\n",
217
- "\n",
218
- " output = Conv2DTranspose(3, 4, strides=2, padding='same', activation='tanh')(d4)\n",
219
- "\n",
220
- " return Model(inputs, output, name='Generator')\n",
221
- "\n",
222
- "\n",
223
- "# -------------------- Stronger PatchGAN Discriminator --------------------\n",
224
- "def build_patch_discriminator(img_size=IMG_SIZE):\n",
225
- " inp = Input(shape=(img_size, img_size, 3))\n",
226
- " tar = Input(shape=(img_size, img_size, 3))\n",
227
- " x = Concatenate()([inp, tar]) # condition on input\n",
228
- "\n",
229
- " x = Conv2D(64, 4, strides=2, padding='same')(x)\n",
230
- " x = LeakyReLU(0.2)(x)\n",
231
- "\n",
232
- " x = Conv2D(128, 4, strides=2, padding='same', use_bias=False)(x)\n",
233
- " x = InstanceNormalization()(x)\n",
234
- " x = LeakyReLU(0.2)(x)\n",
235
- "\n",
236
- " x = Conv2D(256, 4, strides=2, padding='same', use_bias=False)(x)\n",
237
- " x = InstanceNormalization()(x)\n",
238
- " x = LeakyReLU(0.2)(x)\n",
239
- "\n",
240
- " out = Conv2D(1, 4, strides=1, padding='same')(x)\n",
241
- " return Model([inp, tar], out, name='PatchDiscriminator')\n",
242
- "\n",
243
- "\n",
244
- "# -------------------- Losses & VGG perceptual --------------------\n",
245
- "\n",
246
- "\n",
247
- "# -------------------- Perceptual model setup --------------------\n",
248
- "from tensorflow.keras.applications.vgg19 import VGG19, preprocess_input\n",
249
- "from tensorflow.keras import Model\n",
250
- "\n",
251
- "from tensorflow.keras.applications import VGG19\n",
252
- "from tensorflow.keras.models import Model\n",
253
- "\n",
254
- "# Initialize VGG19 without top layers and no weights\n",
255
- "vgg_model = VGG19(include_top=False, weights=None, input_shape=(256, 256, 3))\n",
256
- "\n",
257
- "# Load the manually downloaded weights\n",
258
- "weights_path = '/kaggle/input/models/saisumathappala/vgg19-base-model/tensorflow2/default/1/vgg19_weights_tf_dim_ordering_tf_kernels_notop.h5'\n",
259
- "vgg_model.load_weights(weights_path)\n",
260
- "\n",
261
- "# Freeze all layers\n",
262
- "vgg_model.trainable = False\n",
263
- "\n",
264
- "# Use block4_conv2 output for perceptual loss\n",
265
- "perceptual_model = Model(inputs=vgg_model.input,\n",
266
- " outputs=vgg_model.get_layer('block4_conv2').output)\n",
267
- "# from tensorflow.keras.applications import VGG19\n",
268
- "# from tensorflow.keras.models import Model\n",
269
- "# from tensorflow.keras.applications.vgg19 import preprocess_input\n",
270
- "\n",
271
- "# base_model = tf.keras.applications.VGG19(\n",
272
- "# weights='imagenet',\n",
273
- "# input_shape=(IMG_SIZE, IMG_SIZE, 3),\n",
274
- "# include_top=False)\n",
275
- "\n",
276
- "# base_model.trainable = False\n",
277
- "\n",
278
- "# Perceptual layer\n",
279
- "\n",
280
- "\n",
281
- "bce = tf.keras.losses.BinaryCrossentropy(from_logits=True)\n",
282
- "def discriminator_loss_fn(real_logits, fake_logits):\n",
283
- " real_loss = bce(tf.ones_like(real_logits), real_logits)\n",
284
- " fake_loss = bce(tf.zeros_like(fake_logits), fake_logits)\n",
285
- " total_loss = (real_loss + fake_loss) * 0.5\n",
286
- " return total_loss\n",
287
- "\n",
288
- "# ---------------- GAN loss ----------------\n",
289
- "def generator_adv_loss(d_outs):\n",
290
- " loss = 0.0\n",
291
- " for out in d_outs:\n",
292
- " loss += bce(tf.ones_like(out), out)\n",
293
- " return loss / len(d_outs)\n",
294
- "\n",
295
- "\n",
296
- "# ---------------- Weighted L1 ----------------\n",
297
- "def weighted_l1_loss(target, gen):\n",
298
- " t = (target + 1.0) / 2.0\n",
299
- " g = (gen + 1.0) / 2.0\n",
300
- " weight = tf.clip_by_value(t ** 2 * 4.0, 1.0, 4.0)\n",
301
- " return tf.reduce_mean(weight * tf.abs(t - g))\n",
302
- "\n",
303
- "\n",
304
- "# ---------------- Perceptual ----------------\n",
305
- "from tensorflow.keras.applications.vgg19 import preprocess_input\n",
306
- "\n",
307
- "def perceptual_loss(target, gen):\n",
308
- " target_rgb = preprocess_input((target + 1.0) * 127.5)\n",
309
- " gen_rgb = preprocess_input((gen + 1.0) * 127.5)\n",
310
- "\n",
311
- " f_t = perceptual_model(target_rgb)\n",
312
- " f_g = perceptual_model(gen_rgb)\n",
313
- "\n",
314
- " return tf.reduce_mean(tf.abs(f_t - f_g))\n",
315
- "\n",
316
- "def generator_total_loss(d_out, gen_out, target):\n",
317
- "\n",
318
- " adv = generator_adv_loss([d_out]) # wrap in list\n",
319
- " wl1 = weighted_l1_loss(target, gen_out)\n",
320
- " perc = perceptual_loss(target, gen_out)\n",
321
- "\n",
322
- " # Recommended weights for LLVIP\n",
323
- " total_loss = (\n",
324
- " 1.0 * adv + # realism\n",
325
- " 100.0 * wl1 + # alignment\n",
326
- " 10.0 * perc # structure\n",
327
- " )\n",
328
- "\n",
329
- " return total_loss, adv, wl1, perc\n",
330
- "\n",
331
- "\n",
332
- "\n",
333
- "\n",
334
- "\n",
335
- "generator = build_generator_attention(IMG_SIZE)\n",
336
- "D_full = build_patch_discriminator(IMG_SIZE)\n",
337
- "\n",
338
- "# TTUR: different LRs for G and D\n",
339
- "generator_optimizer = Adam(2e-4, beta_1=0.5)\n",
340
- "d_optimizer = Adam(5e-5, beta_1=0.5)\n",
341
- "\n",
342
- "# Checkpoints\n",
343
- "import tensorflow as tf\n",
344
- "import numpy as np\n",
345
- "import cv2\n",
346
- "import os\n",
347
- "from tqdm import tqdm\n",
348
- "import matplotlib.pyplot as plt\n",
349
- "\n",
350
- "# -------------------- Checkpoint Paths --------------------\n",
351
- "\n",
352
- "# 1️⃣ Pretrained checkpoint (read-only Kaggle input)\n",
353
- "PRETRAINED_DIR = \"/kaggle/input/models/saisumathappala/image-to-ir-gan/tensorflow2/default/2\"\n",
354
- "\n",
355
- "# 2️⃣ Training checkpoint (writeable)\n",
356
- "CHECKPOINT_DIR = \"checkpoints\"\n",
357
- "\n",
358
- "os.makedirs(CHECKPOINT_DIR, exist_ok=True)\n",
359
- "\n",
360
- "\n",
361
- "# -------------------- Checkpoint Objects --------------------\n",
362
- "ckpt = tf.train.Checkpoint(\n",
363
- " generator=generator,\n",
364
- " D_full=D_full,\n",
365
- " generator_optimizer=generator_optimizer,\n",
366
- " d_optimizer=d_optimizer\n",
367
- ")\n",
368
- "\n",
369
- "# Manager for TRAINING checkpoints\n",
370
- "ckpt_manager = tf.train.CheckpointManager(\n",
371
- " ckpt,\n",
372
- " CHECKPOINT_DIR,\n",
373
- " max_to_keep=5\n",
374
- ")\n"
375
- ]
376
- },
377
- {
378
- "cell_type": "code",
379
- "execution_count": 2,
380
- "id": "0c5c2773",
381
- "metadata": {
382
- "execution": {
383
- "iopub.execute_input": "2026-02-12T21:59:00.912705Z",
384
- "iopub.status.busy": "2026-02-12T21:59:00.911688Z",
385
- "iopub.status.idle": "2026-02-12T21:59:01.885299Z",
386
- "shell.execute_reply": "2026-02-12T21:59:01.884435Z"
387
- },
388
- "papermill": {
389
- "duration": 0.979,
390
- "end_time": "2026-02-12T21:59:01.886677",
391
- "exception": false,
392
- "start_time": "2026-02-12T21:59:00.907677",
393
- "status": "completed"
394
- },
395
- "tags": []
396
- },
397
- "outputs": [
398
- {
399
- "name": "stdout",
400
- "output_type": "stream",
401
- "text": [
402
- "No training checkpoint found. Loading pretrained weights...\n",
403
- "✅ Restored pretrained weights from: /kaggle/input/models/saisumathappala/image-to-ir-gan/tensorflow2/default/2/ckpt-34\n"
404
- ]
405
- }
406
- ],
407
- "source": [
408
- "# -------------------- Restore Logic --------------------\n",
409
- "\n",
410
- "if ckpt_manager.latest_checkpoint:\n",
411
- " # Case 1 → Resume training normally\n",
412
- " ckpt.restore(ckpt_manager.latest_checkpoint).expect_partial()\n",
413
- " print(f\"✅ Resumed from training checkpoint: {ckpt_manager.latest_checkpoint}\")\n",
414
- "\n",
415
- "else:\n",
416
- " # Case 2 → First run → Load pretrained weights ONCE\n",
417
- " print(\"No training checkpoint found. Loading pretrained weights...\")\n",
418
- "\n",
419
- " pretrained_ckpt = tf.train.latest_checkpoint(PRETRAINED_DIR)\n",
420
- "\n",
421
- " if pretrained_ckpt:\n",
422
- " ckpt.restore(pretrained_ckpt).expect_partial()\n",
423
- " print(f\"✅ Restored pretrained weights from: {pretrained_ckpt}\")\n",
424
- " else:\n",
425
- " print(\"⚠️ No pretrained checkpoint found. Training from scratch.\")\n"
426
- ]
427
- },
428
- {
429
- "cell_type": "code",
430
- "execution_count": 3,
431
- "id": "358eb256",
432
- "metadata": {
433
- "execution": {
434
- "iopub.execute_input": "2026-02-12T21:59:01.895018Z",
435
- "iopub.status.busy": "2026-02-12T21:59:01.894351Z",
436
- "iopub.status.idle": "2026-02-12T21:59:01.900980Z",
437
- "shell.execute_reply": "2026-02-12T21:59:01.900207Z"
438
- },
439
- "papermill": {
440
- "duration": 0.011908,
441
- "end_time": "2026-02-12T21:59:01.902226",
442
- "exception": false,
443
- "start_time": "2026-02-12T21:59:01.890318",
444
- "status": "completed"
445
- },
446
- "tags": []
447
- },
448
- "outputs": [],
449
- "source": [
450
- "@tf.function\n",
451
- "def d_train_step(input_vis, target_ir, gen_out):\n",
452
- "\n",
453
- " with tf.GradientTape() as tape:\n",
454
- "\n",
455
- " d_real = D_full([input_vis, target_ir], training=True)\n",
456
- " d_fake = D_full([input_vis, gen_out], training=True)\n",
457
- "\n",
458
- " d_loss = discriminator_loss_fn(d_real, d_fake)\n",
459
- "\n",
460
- " d_vars = D_full.trainable_variables\n",
461
- " d_grads = tape.gradient(d_loss, d_vars)\n",
462
- "\n",
463
- " d_optimizer.apply_gradients(zip(d_grads, d_vars))\n",
464
- "\n",
465
- " return d_loss\n",
466
- "\n",
467
- "# -------------------- Generator Train Step --------------------\n",
468
- "@tf.function\n",
469
- "def g_train_step(input_vis, target_ir):\n",
470
- "\n",
471
- " with tf.GradientTape() as tape:\n",
472
- "\n",
473
- " gen_out = generator(input_vis, training=True)\n",
474
- "\n",
475
- " d_fake = D_full([input_vis, gen_out], training=True)\n",
476
- "\n",
477
- " total_g_loss, adv_loss, wl1_loss, perc_loss = \\\n",
478
- " generator_total_loss(d_fake, gen_out, target_ir)\n",
479
- "\n",
480
- " g_vars = generator.trainable_variables\n",
481
- " g_grads = tape.gradient(total_g_loss, g_vars)\n",
482
- "\n",
483
- " generator_optimizer.apply_gradients(zip(g_grads, g_vars))\n",
484
- "\n",
485
- " return total_g_loss, adv_loss, wl1_loss, perc_loss, gen_out\n"
486
- ]
487
- },
488
- {
489
- "cell_type": "code",
490
- "execution_count": 4,
491
- "id": "f2e569db",
492
- "metadata": {
493
- "execution": {
494
- "iopub.execute_input": "2026-02-12T21:59:01.910320Z",
495
- "iopub.status.busy": "2026-02-12T21:59:01.909856Z",
496
- "iopub.status.idle": "2026-02-12T21:59:01.916085Z",
497
- "shell.execute_reply": "2026-02-12T21:59:01.915351Z"
498
- },
499
- "papermill": {
500
- "duration": 0.011612,
501
- "end_time": "2026-02-12T21:59:01.917295",
502
- "exception": false,
503
- "start_time": "2026-02-12T21:59:01.905683",
504
- "status": "completed"
505
- },
506
- "tags": []
507
- },
508
- "outputs": [],
509
- "source": [
510
- "def train(train_ds, val_ds=None, epochs=EPOCHS):\n",
511
- "\n",
512
- " global_step = 0\n",
513
- "\n",
514
- " for epoch in range(1, epochs + 1):\n",
515
- "\n",
516
- " start = time.time()\n",
517
- " print(f\"\\nEpoch {epoch}/{epochs}\")\n",
518
- "\n",
519
- " for batch, (inp, tar) in enumerate(train_ds):\n",
520
- "\n",
521
- " # --------------------\n",
522
- " # Generator forward\n",
523
- " # --------------------\n",
524
- " gen_out = generator(inp, training=True)\n",
525
- "\n",
526
- " # --------------------\n",
527
- " # Train Discriminator\n",
528
- " # --------------------\n",
529
- " for _ in range(D_steps_per_G):\n",
530
- " d_loss_val = d_train_step(inp, tar, gen_out)\n",
531
- "\n",
532
- " # --------------------\n",
533
- " # Train Generator\n",
534
- " # --------------------\n",
535
- " g_total, g_adv, g_l1, g_perc, gen_out = \\\n",
536
- " g_train_step(inp, tar)\n",
537
- "\n",
538
- " global_step += 1\n",
539
- "\n",
540
- " # Step logging\n",
541
- " if batch % 50 == 0:\n",
542
- " print(\n",
543
- " f\"Step {global_step}: \"\n",
544
- " f\"D={d_loss_val:.4f}, \"\n",
545
- " f\"G={g_total:.4f}, \"\n",
546
- " f\"Adv={g_adv:.4f}, \"\n",
547
- " f\"L1={g_l1:.4f}, \"\n",
548
- " f\"Perc={g_perc:.4f}\"\n",
549
- " )\n",
550
- "\n",
551
- " # --------------------\n",
552
- " # Visualization (TEST SET)\n",
553
- " # --------------------\n",
554
- " if val_ds is not None:\n",
555
- " print(\"🖼 Generating validation samples...\")\n",
556
- " generate_and_save_images(generator, val_ds, epoch)\n",
557
- "\n",
558
- " # --------------------\n",
559
- " # Checkpoint\n",
560
- " # --------------------\n",
561
- " if epoch % SAVE_INTERVAL_EPOCHS == 0:\n",
562
- " path = ckpt_manager.save()\n",
563
- " print(f\" Saved checkpoint: {path}\")\n",
564
- "\n",
565
- " print(f\" Epoch {epoch} finished in {time.time()-start:.1f}s\")\n"
566
- ]
567
- },
568
- {
569
- "cell_type": "code",
570
- "execution_count": 5,
571
- "id": "bb729cec",
572
- "metadata": {
573
- "execution": {
574
- "iopub.execute_input": "2026-02-12T21:59:01.924705Z",
575
- "iopub.status.busy": "2026-02-12T21:59:01.924476Z",
576
- "iopub.status.idle": "2026-02-12T21:59:01.931295Z",
577
- "shell.execute_reply": "2026-02-12T21:59:01.930717Z"
578
- },
579
- "papermill": {
580
- "duration": 0.011607,
581
- "end_time": "2026-02-12T21:59:01.932316",
582
- "exception": false,
583
- "start_time": "2026-02-12T21:59:01.920709",
584
- "status": "completed"
585
- },
586
- "tags": []
587
- },
588
- "outputs": [],
589
- "source": [
590
- "import os\n",
591
- "import tensorflow as tf\n",
592
- "\n",
593
- "# -------------------- Visualization Utilities --------------------\n",
594
- "def to_uint8(x):\n",
595
- " \"\"\"Convert tensor from [-1,1] → uint8 [0,255].\"\"\"\n",
596
- " x = (x + 1.0) * 127.5\n",
597
- " x = tf.clip_by_value(x, 0, 255)\n",
598
- " return tf.cast(x, tf.uint8)\n",
599
- "\n",
600
- "def generate_and_save_images(model, val_ds, epoch, out_dir=OUTPUT_DIR, num_rows=5):\n",
601
- " \"\"\"\n",
602
- " Creates a 5-row image where each row = [Visible | Real IR | Generated IR].\n",
603
- " \"\"\"\n",
604
- " os.makedirs(out_dir, exist_ok=True)\n",
605
- "\n",
606
- " # Collect up to num_rows samples\n",
607
- " rows = []\n",
608
- " for i, (v_inp, v_tar) in enumerate(val_ds.take(num_rows)):\n",
609
- " pred = model(v_inp, training=False)\n",
610
- "\n",
611
- " vis = to_uint8(v_inp[0])\n",
612
- " targ = to_uint8(v_tar[0])\n",
613
- " gen = to_uint8(pred[0])\n",
614
- "\n",
615
- " # Ensure same height\n",
616
- " h = min(vis.shape[0], targ.shape[0], gen.shape[0])\n",
617
- " w = min(vis.shape[1], targ.shape[1], gen.shape[1])\n",
618
- " vis, targ, gen = vis[:h, :w], targ[:h, :w], gen[:h, :w]\n",
619
- "\n",
620
- " # Concatenate horizontally\n",
621
- " row = tf.concat([vis, targ, gen], axis=1)\n",
622
- " rows.append(row)\n",
623
- "\n",
624
- " # Stack vertically → 5-row image\n",
625
- " grid = tf.concat(rows, axis=0)\n",
626
- "\n",
627
- " out_path = os.path.join(out_dir, f\"epoch_{epoch:03d}.png\")\n",
628
- " tf.keras.preprocessing.image.save_img(out_path, grid.numpy())\n"
629
- ]
630
- },
631
- {
632
- "cell_type": "code",
633
- "execution_count": 6,
634
- "id": "302e6898",
635
- "metadata": {
636
- "execution": {
637
- "iopub.execute_input": "2026-02-12T21:59:01.939607Z",
638
- "iopub.status.busy": "2026-02-12T21:59:01.939374Z",
639
- "iopub.status.idle": "2026-02-12T21:59:01.945225Z",
640
- "shell.execute_reply": "2026-02-12T21:59:01.944630Z"
641
- },
642
- "papermill": {
643
- "duration": 0.010711,
644
- "end_time": "2026-02-12T21:59:01.946333",
645
- "exception": false,
646
- "start_time": "2026-02-12T21:59:01.935622",
647
- "status": "completed"
648
- },
649
- "tags": []
650
- },
651
- "outputs": [],
652
- "source": [
653
- "def train(train_ds, val_ds=None, epochs=EPOCHS):\n",
654
- " global_step = 0\n",
655
- " for epoch in range(1, epochs + 1):\n",
656
- " start = time.time()\n",
657
- " print(f\"\\nEpoch {epoch}/{epochs}\")\n",
658
- "\n",
659
- " for batch, (inp, tar) in enumerate(train_ds):\n",
660
- " gen_out = generator(inp, training=True)\n",
661
- "\n",
662
- " # Train Discriminator\n",
663
- " for _ in range(D_steps_per_G):\n",
664
- " d_loss_val = d_train_step(inp, tar, gen_out)\n",
665
- "\n",
666
- " # Train Generator\n",
667
- " g_total_loss, g_adv, g_l1,g_prec, gen_out2 = g_train_step(inp, tar)\n",
668
- " global_step += 1\n",
669
- " print(f\" step {global_step}: \"\n",
670
- " f\"D={d_loss_val:.4f}, G={g_total_loss:.4f}, Adv={g_adv:.4f}, L1={g_l1:.4f} , prec={g_prec:.4f}\")\n",
671
- "\n",
672
- " # Save visualization\n",
673
- " if val_ds is not None:\n",
674
- " print(f\"🖼 Generating sample output for epoch {epoch}...\")\n",
675
- " generate_and_save_images(generator, val_ds, epoch)\n",
676
- "\n",
677
- " # Save checkpoint\n",
678
- " if epoch % SAVE_INTERVAL_EPOCHS == 0:\n",
679
- " path = ckpt_manager.save()\n",
680
- " print(f\" Saved checkpoint: {path}\")\n",
681
- "\n",
682
- " print(f\" Epoch {epoch} finished in {time.time() - start:.1f}s\")"
683
- ]
684
- },
685
- {
686
- "cell_type": "code",
687
- "execution_count": 7,
688
- "id": "2581acd4",
689
- "metadata": {
690
- "execution": {
691
- "iopub.execute_input": "2026-02-12T21:59:01.953697Z",
692
- "iopub.status.busy": "2026-02-12T21:59:01.953474Z",
693
- "iopub.status.idle": "2026-02-12T21:59:02.537240Z",
694
- "shell.execute_reply": "2026-02-12T21:59:02.536482Z"
695
- },
696
- "papermill": {
697
- "duration": 0.589004,
698
- "end_time": "2026-02-12T21:59:02.538691",
699
- "exception": false,
700
- "start_time": "2026-02-12T21:59:01.949687",
701
- "status": "completed"
702
- },
703
- "tags": []
704
- },
705
- "outputs": [
706
- {
707
- "name": "stdout",
708
- "output_type": "stream",
709
- "text": [
710
- "Found 12025 visible images and 12025 IR images\n",
711
- "Using only 12025 image pairs\n"
712
- ]
713
- }
714
- ],
715
- "source": [
716
- "train_ds = get_train_dataset()"
717
- ]
718
- },
719
- {
720
- "cell_type": "code",
721
- "execution_count": 8,
722
- "id": "9f18cfa2",
723
- "metadata": {
724
- "execution": {
725
- "iopub.execute_input": "2026-02-12T21:59:02.548373Z",
726
- "iopub.status.busy": "2026-02-12T21:59:02.547591Z",
727
- "iopub.status.idle": "2026-02-12T21:59:02.551403Z",
728
- "shell.execute_reply": "2026-02-12T21:59:02.550725Z"
729
- },
730
- "papermill": {
731
- "duration": 0.009773,
732
- "end_time": "2026-02-12T21:59:02.552655",
733
- "exception": false,
734
- "start_time": "2026-02-12T21:59:02.542882",
735
- "status": "completed"
736
- },
737
- "tags": []
738
- },
739
- "outputs": [],
740
- "source": [
741
- "# val_ds = train_ds.take(75)\n",
742
- "# train_ds = train_ds.skip(75)"
743
- ]
744
- },
745
- {
746
- "cell_type": "code",
747
- "execution_count": 9,
748
- "id": "7b2a39df",
749
- "metadata": {
750
- "execution": {
751
- "iopub.execute_input": "2026-02-12T21:59:02.561724Z",
752
- "iopub.status.busy": "2026-02-12T21:59:02.561429Z",
753
- "iopub.status.idle": "2026-02-12T21:59:02.573514Z",
754
- "shell.execute_reply": "2026-02-12T21:59:02.572847Z"
755
- },
756
- "papermill": {
757
- "duration": 0.018255,
758
- "end_time": "2026-02-12T21:59:02.575056",
759
- "exception": false,
760
- "start_time": "2026-02-12T21:59:02.556801",
761
- "status": "completed"
762
- },
763
- "tags": []
764
- },
765
- "outputs": [],
766
- "source": [
767
- "import matplotlib.pyplot as plt\n",
768
- "import tensorflow as tf\n",
769
- "import numpy as np\n",
770
- "\n",
771
- "def to_uint8(x):\n",
772
- " \"\"\"Convert tensor from [-1,1] → uint8 [0,255].\"\"\"\n",
773
- " x = (x + 1.0) * 127.5\n",
774
- " x = tf.clip_by_value(x, 0, 255)\n",
775
- " return tf.cast(x, tf.uint8)\n",
776
- "\n",
777
- "# Shuffle the dataset to take random samples\n",
778
- "train_ds_shuffled = train_ds.shuffle(buffer_size=1000, reshuffle_each_iteration=True)\n",
779
- "\n",
780
- "# Take 10 images\n",
781
- "sample_ds = train_ds_shuffled.take(10)"
782
- ]
783
- },
784
- {
785
- "cell_type": "code",
786
- "execution_count": 10,
787
- "id": "4f876063",
788
- "metadata": {
789
- "execution": {
790
- "iopub.execute_input": "2026-02-12T21:59:02.584167Z",
791
- "iopub.status.busy": "2026-02-12T21:59:02.583876Z",
792
- "iopub.status.idle": "2026-02-12T21:59:02.587381Z",
793
- "shell.execute_reply": "2026-02-12T21:59:02.586759Z"
794
- },
795
- "papermill": {
796
- "duration": 0.009294,
797
- "end_time": "2026-02-12T21:59:02.588465",
798
- "exception": false,
799
- "start_time": "2026-02-12T21:59:02.579171",
800
- "status": "completed"
801
- },
802
- "tags": []
803
- },
804
- "outputs": [],
805
- "source": [
806
- "# train(train_ds, val_ds, epochs=EPOCHS)"
807
- ]
808
- },
809
- {
810
- "cell_type": "code",
811
- "execution_count": null,
812
- "id": "a4a82990",
813
- "metadata": {
814
- "papermill": {
815
- "duration": 0.003627,
816
- "end_time": "2026-02-12T21:59:02.596030",
817
- "exception": false,
818
- "start_time": "2026-02-12T21:59:02.592403",
819
- "status": "completed"
820
- },
821
- "tags": []
822
- },
823
- "outputs": [],
824
- "source": []
825
- },
826
- {
827
- "cell_type": "code",
828
- "execution_count": 11,
829
- "id": "bb6cd8e0",
830
- "metadata": {
831
- "execution": {
832
- "iopub.execute_input": "2026-02-12T21:59:02.604728Z",
833
- "iopub.status.busy": "2026-02-12T21:59:02.604438Z",
834
- "iopub.status.idle": "2026-02-12T22:08:25.100908Z",
835
- "shell.execute_reply": "2026-02-12T22:08:25.099998Z"
836
- },
837
- "papermill": {
838
- "duration": 562.502476,
839
- "end_time": "2026-02-12T22:08:25.102199",
840
- "exception": false,
841
- "start_time": "2026-02-12T21:59:02.599723",
842
- "status": "completed"
843
- },
844
- "tags": []
845
- },
846
- "outputs": [
847
- {
848
- "name": "stdout",
849
- "output_type": "stream",
850
- "text": [
851
- "No training checkpoint found. Loading pretrained weights...\n",
852
- "✅ Restored pretrained weights from: /kaggle/input/models/saisumathappala/image-to-ir-gan/tensorflow2/default/2/ckpt-34\n",
853
- "No checkpoint found, using uninitialized model\n",
854
- "Found 12025 visible images and 12025 IR images\n",
855
- "Using only 12025 image pairs\n"
856
- ]
857
- },
858
- {
859
- "name": "stderr",
860
- "output_type": "stream",
861
- "text": [
862
- " 0%| | 0/12025 [00:00<?, ?it/s]I0000 00:00:1770933543.075318 20 cuda_dnn.cc:529] Loaded cuDNN version 90300\n",
863
- "100%|██████████| 12025/12025 [09:22<00:00, 21.39it/s]"
864
- ]
865
- },
866
- {
867
- "name": "stdout",
868
- "output_type": "stream",
869
- "text": [
870
- "==== Test Dataset Metrics ====\n",
871
- "L1 Loss : 0.1371\n",
872
- "PSNR : 20.8206\n",
873
- "SSIM : 0.5706\n"
874
- ]
875
- },
876
- {
877
- "name": "stderr",
878
- "output_type": "stream",
879
- "text": [
880
- "\n"
881
- ]
882
- }
883
- ],
884
- "source": [
885
- "import tensorflow as tf\n",
886
- "import numpy as np\n",
887
- "import cv2\n",
888
- "import os\n",
889
- "from tqdm import tqdm\n",
890
- "import matplotlib.pyplot as plt\n",
891
- "# -------------------- Load Checkpoint --------------------\n",
892
- "ckpt = tf.train.Checkpoint(generator=generator,\n",
893
- " D_full=D_full,\n",
894
- " generator_optimizer=generator_optimizer,\n",
895
- " d_optimizer=d_optimizer)\n",
896
- "ckpt_manager = tf.train.CheckpointManager(ckpt, CHECKPOINT_DIR, max_to_keep=1)\n",
897
- "# -------------------- Restore Logic --------------------\n",
898
- "\n",
899
- "if ckpt_manager.latest_checkpoint:\n",
900
- " # Case 1 → Resume training normally\n",
901
- " ckpt.restore(ckpt_manager.latest_checkpoint).expect_partial()\n",
902
- " print(f\"✅ Resumed from training checkpoint: {ckpt_manager.latest_checkpoint}\")\n",
903
- "\n",
904
- "else:\n",
905
- " # Case 2 → First run → Load pretrained weights ONCE\n",
906
- " print(\"No training checkpoint found. Loading pretrained weights...\")\n",
907
- "\n",
908
- " pretrained_ckpt = tf.train.latest_checkpoint(PRETRAINED_DIR)\n",
909
- "\n",
910
- " if pretrained_ckpt:\n",
911
- " ckpt.restore(pretrained_ckpt).expect_partial()\n",
912
- " print(f\"✅ Restored pretrained weights from: {pretrained_ckpt}\")\n",
913
- " else:\n",
914
- " print(\"⚠️ No pretrained checkpoint found. Training from scratch.\")\n",
915
- "\n",
916
- "\n",
917
- "# Restore latest checkpoint\n",
918
- "if ckpt_manager.latest_checkpoint:\n",
919
- " ckpt.restore(ckpt_manager.latest_checkpoint).expect_partial()\n",
920
- " print(f\"Restored from {ckpt_manager.latest_checkpoint}\")\n",
921
- "else:\n",
922
- " print(\"No checkpoint found, using uninitialized model\")\n",
923
- "\n",
924
- "# -------------------- Dataset Evaluation --------------------\n",
925
- "def l1_loss(y_true, y_pred):\n",
926
- " return tf.reduce_mean(tf.abs(y_true - y_pred))\n",
927
- "\n",
928
- "def evaluate(test_ds):\n",
929
- " l1_list, psnr_list, ssim_list = [], [], []\n",
930
- " for vis, ir in tqdm(test_ds):\n",
931
- " pred = generator(vis, training=False)\n",
932
- " l1 = l1_loss(ir, pred).numpy()\n",
933
- " psnr = tf.image.psnr(ir, pred, max_val=2.0).numpy()\n",
934
- " ssim = tf.image.ssim(ir, pred, max_val=2.0).numpy()\n",
935
- "\n",
936
- " l1_list.append(l1)\n",
937
- " psnr_list.append(np.mean(psnr))\n",
938
- " ssim_list.append(np.mean(ssim))\n",
939
- "\n",
940
- " print(\"==== Test Dataset Metrics ====\")\n",
941
- " print(f\"L1 Loss : {np.mean(l1_list):.4f}\")\n",
942
- " print(f\"PSNR : {np.mean(psnr_list):.4f}\")\n",
943
- " print(f\"SSIM : {np.mean(ssim_list):.4f}\")\n",
944
- "\n",
945
- "# Example usage\n",
946
- "test_ds = get_val_dataset() # Define this function\n",
947
- "evaluate(train_ds)"
948
- ]
949
- },
950
- {
951
- "cell_type": "code",
952
- "execution_count": 12,
953
- "id": "268eb52f",
954
- "metadata": {
955
- "execution": {
956
- "iopub.execute_input": "2026-02-12T22:08:25.423242Z",
957
- "iopub.status.busy": "2026-02-12T22:08:25.422959Z",
958
- "iopub.status.idle": "2026-02-12T22:08:25.430078Z",
959
- "shell.execute_reply": "2026-02-12T22:08:25.429489Z"
960
- },
961
- "papermill": {
962
- "duration": 0.166727,
963
- "end_time": "2026-02-12T22:08:25.431112",
964
- "exception": false,
965
- "start_time": "2026-02-12T22:08:25.264385",
966
- "status": "completed"
967
- },
968
- "tags": []
969
- },
970
- "outputs": [],
971
- "source": [
972
- "import os\n",
973
- "import tensorflow as tf\n",
974
- "\n",
975
- "OUTPUT_DIR = \"outputs\"\n",
976
- "\n",
977
- "\n",
978
- "# -------------------- Utils --------------------\n",
979
- "def to_uint8(x):\n",
980
- " \"\"\"\n",
981
- " Convert tensor from [-1,1] → uint8 [0,255]\n",
982
- " \"\"\"\n",
983
- " x = (x + 1.0) * 127.5\n",
984
- " x = tf.clip_by_value(x, 0, 255)\n",
985
- " return tf.cast(x, tf.uint8)\n",
986
- "\n",
987
- "\n",
988
- "# -------------------- Save 3 Images in 1 --------------------\n",
989
- "def generate(\n",
990
- " model,\n",
991
- " dataset,\n",
992
- " epoch,\n",
993
- " out_dir=OUTPUT_DIR):\n",
994
- "\n",
995
- " os.makedirs(out_dir, exist_ok=True)\n",
996
- "\n",
997
- " for idx, (visible, real_ir) in enumerate(dataset):\n",
998
- " if idx%5==0:\n",
999
- "\n",
1000
- " # Generate fake IR\n",
1001
- " fake_ir = model(visible, training=False)\n",
1002
- " \n",
1003
- " # Convert → uint8\n",
1004
- " vis = to_uint8(visible[0])\n",
1005
- " real = to_uint8(real_ir[0])\n",
1006
- " fake = to_uint8(fake_ir[0])\n",
1007
- " \n",
1008
- " # Safety crop (if any mismatch)\n",
1009
- " h = min(vis.shape[0], real.shape[0], fake.shape[0])\n",
1010
- " w = min(vis.shape[1], real.shape[1], fake.shape[1])\n",
1011
- " \n",
1012
- " vis = vis[:h, :w]\n",
1013
- " real = real[:h, :w]\n",
1014
- " fake = fake[:h, :w]\n",
1015
- "\n",
1016
- " # -------- Concatenate 3 images horizontally --------\n",
1017
- " trio = tf.concat([vis, real, fake], axis=1)\n",
1018
- " \n",
1019
- " # Save path\n",
1020
- " save_path = os.path.join(\n",
1021
- " out_dir,\n",
1022
- " f\"img_{idx:05d}.png\"\n",
1023
- " )\n",
1024
- " \n",
1025
- " # Save image\n",
1026
- " tf.keras.preprocessing.image.save_img(\n",
1027
- " save_path,\n",
1028
- " trio.numpy()\n",
1029
- " )\n",
1030
- " print(idx)"
1031
- ]
1032
- },
1033
- {
1034
- "cell_type": "code",
1035
- "execution_count": 13,
1036
- "id": "161508e1",
1037
- "metadata": {
1038
- "execution": {
1039
- "iopub.execute_input": "2026-02-12T22:08:25.750226Z",
1040
- "iopub.status.busy": "2026-02-12T22:08:25.749948Z",
1041
- "iopub.status.idle": "2026-02-12T22:12:22.229019Z",
1042
- "shell.execute_reply": "2026-02-12T22:12:22.228225Z"
1043
- },
1044
- "papermill": {
1045
- "duration": 236.642335,
1046
- "end_time": "2026-02-12T22:12:22.230235",
1047
- "exception": false,
1048
- "start_time": "2026-02-12T22:08:25.587900",
1049
- "status": "completed"
1050
- },
1051
- "tags": []
1052
- },
1053
- "outputs": [
1054
- {
1055
- "name": "stdout",
1056
- "output_type": "stream",
1057
- "text": [
1058
- "0\n",
1059
- "5\n",
1060
- "10\n",
1061
- "15\n",
1062
- "20\n",
1063
- "25\n",
1064
- "30\n",
1065
- "35\n",
1066
- "40\n",
1067
- "45\n",
1068
- "50\n",
1069
- "55\n",
1070
- "60\n",
1071
- "65\n",
1072
- "70\n",
1073
- "75\n",
1074
- "80\n",
1075
- "85\n",
1076
- "90\n",
1077
- "95\n",
1078
- "100\n",
1079
- "105\n",
1080
- "110\n",
1081
- "115\n",
1082
- "120\n",
1083
- "125\n",
1084
- "130\n",
1085
- "135\n",
1086
- "140\n",
1087
- "145\n",
1088
- "150\n",
1089
- "155\n",
1090
- "160\n",
1091
- "165\n",
1092
- "170\n",
1093
- "175\n",
1094
- "180\n",
1095
- "185\n",
1096
- "190\n",
1097
- "195\n",
1098
- "200\n",
1099
- "205\n",
1100
- "210\n",
1101
- "215\n",
1102
- "220\n",
1103
- "225\n",
1104
- "230\n",
1105
- "235\n",
1106
- "240\n",
1107
- "245\n",
1108
- "250\n",
1109
- "255\n",
1110
- "260\n",
1111
- "265\n",
1112
- "270\n",
1113
- "275\n",
1114
- "280\n",
1115
- "285\n",
1116
- "290\n",
1117
- "295\n",
1118
- "300\n",
1119
- "305\n",
1120
- "310\n",
1121
- "315\n",
1122
- "320\n",
1123
- "325\n",
1124
- "330\n",
1125
- "335\n",
1126
- "340\n",
1127
- "345\n",
1128
- "350\n",
1129
- "355\n",
1130
- "360\n",
1131
- "365\n",
1132
- "370\n",
1133
- "375\n",
1134
- "380\n",
1135
- "385\n",
1136
- "390\n",
1137
- "395\n",
1138
- "400\n",
1139
- "405\n",
1140
- "410\n",
1141
- "415\n",
1142
- "420\n",
1143
- "425\n",
1144
- "430\n",
1145
- "435\n",
1146
- "440\n",
1147
- "445\n",
1148
- "450\n",
1149
- "455\n",
1150
- "460\n",
1151
- "465\n",
1152
- "470\n",
1153
- "475\n",
1154
- "480\n",
1155
- "485\n",
1156
- "490\n",
1157
- "495\n",
1158
- "500\n",
1159
- "505\n",
1160
- "510\n",
1161
- "515\n",
1162
- "520\n",
1163
- "525\n",
1164
- "530\n",
1165
- "535\n",
1166
- "540\n",
1167
- "545\n",
1168
- "550\n",
1169
- "555\n",
1170
- "560\n",
1171
- "565\n",
1172
- "570\n",
1173
- "575\n",
1174
- "580\n",
1175
- "585\n",
1176
- "590\n",
1177
- "595\n",
1178
- "600\n",
1179
- "605\n",
1180
- "610\n",
1181
- "615\n",
1182
- "620\n",
1183
- "625\n",
1184
- "630\n",
1185
- "635\n",
1186
- "640\n",
1187
- "645\n",
1188
- "650\n",
1189
- "655\n",
1190
- "660\n",
1191
- "665\n",
1192
- "670\n",
1193
- "675\n",
1194
- "680\n",
1195
- "685\n",
1196
- "690\n",
1197
- "695\n",
1198
- "700\n",
1199
- "705\n",
1200
- "710\n",
1201
- "715\n",
1202
- "720\n",
1203
- "725\n",
1204
- "730\n",
1205
- "735\n",
1206
- "740\n",
1207
- "745\n",
1208
- "750\n",
1209
- "755\n",
1210
- "760\n",
1211
- "765\n",
1212
- "770\n",
1213
- "775\n",
1214
- "780\n",
1215
- "785\n",
1216
- "790\n",
1217
- "795\n",
1218
- "800\n",
1219
- "805\n",
1220
- "810\n",
1221
- "815\n",
1222
- "820\n",
1223
- "825\n",
1224
- "830\n",
1225
- "835\n",
1226
- "840\n",
1227
- "845\n",
1228
- "850\n",
1229
- "855\n",
1230
- "860\n",
1231
- "865\n",
1232
- "870\n",
1233
- "875\n",
1234
- "880\n",
1235
- "885\n",
1236
- "890\n",
1237
- "895\n",
1238
- "900\n",
1239
- "905\n",
1240
- "910\n",
1241
- "915\n",
1242
- "920\n",
1243
- "925\n",
1244
- "930\n",
1245
- "935\n",
1246
- "940\n",
1247
- "945\n",
1248
- "950\n",
1249
- "955\n",
1250
- "960\n",
1251
- "965\n",
1252
- "970\n",
1253
- "975\n",
1254
- "980\n",
1255
- "985\n",
1256
- "990\n",
1257
- "995\n",
1258
- "1000\n",
1259
- "1005\n",
1260
- "1010\n",
1261
- "1015\n",
1262
- "1020\n",
1263
- "1025\n",
1264
- "1030\n",
1265
- "1035\n",
1266
- "1040\n",
1267
- "1045\n",
1268
- "1050\n",
1269
- "1055\n",
1270
- "1060\n",
1271
- "1065\n",
1272
- "1070\n",
1273
- "1075\n",
1274
- "1080\n",
1275
- "1085\n",
1276
- "1090\n",
1277
- "1095\n",
1278
- "1100\n",
1279
- "1105\n",
1280
- "1110\n",
1281
- "1115\n",
1282
- "1120\n",
1283
- "1125\n",
1284
- "1130\n",
1285
- "1135\n",
1286
- "1140\n",
1287
- "1145\n",
1288
- "1150\n",
1289
- "1155\n",
1290
- "1160\n",
1291
- "1165\n",
1292
- "1170\n",
1293
- "1175\n",
1294
- "1180\n",
1295
- "1185\n",
1296
- "1190\n",
1297
- "1195\n",
1298
- "1200\n",
1299
- "1205\n",
1300
- "1210\n",
1301
- "1215\n",
1302
- "1220\n",
1303
- "1225\n",
1304
- "1230\n",
1305
- "1235\n",
1306
- "1240\n",
1307
- "1245\n",
1308
- "1250\n",
1309
- "1255\n",
1310
- "1260\n",
1311
- "1265\n",
1312
- "1270\n",
1313
- "1275\n",
1314
- "1280\n",
1315
- "1285\n",
1316
- "1290\n",
1317
- "1295\n",
1318
- "1300\n",
1319
- "1305\n",
1320
- "1310\n",
1321
- "1315\n",
1322
- "1320\n",
1323
- "1325\n",
1324
- "1330\n",
1325
- "1335\n",
1326
- "1340\n",
1327
- "1345\n",
1328
- "1350\n",
1329
- "1355\n",
1330
- "1360\n",
1331
- "1365\n",
1332
- "1370\n",
1333
- "1375\n",
1334
- "1380\n",
1335
- "1385\n",
1336
- "1390\n",
1337
- "1395\n",
1338
- "1400\n",
1339
- "1405\n",
1340
- "1410\n",
1341
- "1415\n",
1342
- "1420\n",
1343
- "1425\n",
1344
- "1430\n",
1345
- "1435\n",
1346
- "1440\n",
1347
- "1445\n",
1348
- "1450\n",
1349
- "1455\n",
1350
- "1460\n",
1351
- "1465\n",
1352
- "1470\n",
1353
- "1475\n",
1354
- "1480\n",
1355
- "1485\n",
1356
- "1490\n",
1357
- "1495\n",
1358
- "1500\n",
1359
- "1505\n",
1360
- "1510\n",
1361
- "1515\n",
1362
- "1520\n",
1363
- "1525\n",
1364
- "1530\n",
1365
- "1535\n",
1366
- "1540\n",
1367
- "1545\n",
1368
- "1550\n",
1369
- "1555\n",
1370
- "1560\n",
1371
- "1565\n",
1372
- "1570\n",
1373
- "1575\n",
1374
- "1580\n",
1375
- "1585\n",
1376
- "1590\n",
1377
- "1595\n",
1378
- "1600\n",
1379
- "1605\n",
1380
- "1610\n",
1381
- "1615\n",
1382
- "1620\n",
1383
- "1625\n",
1384
- "1630\n",
1385
- "1635\n",
1386
- "1640\n",
1387
- "1645\n",
1388
- "1650\n",
1389
- "1655\n",
1390
- "1660\n",
1391
- "1665\n",
1392
- "1670\n",
1393
- "1675\n",
1394
- "1680\n",
1395
- "1685\n",
1396
- "1690\n",
1397
- "1695\n",
1398
- "1700\n",
1399
- "1705\n",
1400
- "1710\n",
1401
- "1715\n",
1402
- "1720\n",
1403
- "1725\n",
1404
- "1730\n",
1405
- "1735\n",
1406
- "1740\n",
1407
- "1745\n",
1408
- "1750\n",
1409
- "1755\n",
1410
- "1760\n",
1411
- "1765\n",
1412
- "1770\n",
1413
- "1775\n",
1414
- "1780\n",
1415
- "1785\n",
1416
- "1790\n",
1417
- "1795\n",
1418
- "1800\n",
1419
- "1805\n",
1420
- "1810\n",
1421
- "1815\n",
1422
- "1820\n",
1423
- "1825\n",
1424
- "1830\n",
1425
- "1835\n",
1426
- "1840\n",
1427
- "1845\n",
1428
- "1850\n",
1429
- "1855\n",
1430
- "1860\n",
1431
- "1865\n",
1432
- "1870\n",
1433
- "1875\n",
1434
- "1880\n",
1435
- "1885\n",
1436
- "1890\n",
1437
- "1895\n",
1438
- "1900\n",
1439
- "1905\n",
1440
- "1910\n",
1441
- "1915\n",
1442
- "1920\n",
1443
- "1925\n",
1444
- "1930\n",
1445
- "1935\n",
1446
- "1940\n",
1447
- "1945\n",
1448
- "1950\n",
1449
- "1955\n",
1450
- "1960\n",
1451
- "1965\n",
1452
- "1970\n",
1453
- "1975\n",
1454
- "1980\n",
1455
- "1985\n",
1456
- "1990\n",
1457
- "1995\n",
1458
- "2000\n",
1459
- "2005\n",
1460
- "2010\n",
1461
- "2015\n",
1462
- "2020\n",
1463
- "2025\n",
1464
- "2030\n",
1465
- "2035\n",
1466
- "2040\n",
1467
- "2045\n",
1468
- "2050\n",
1469
- "2055\n",
1470
- "2060\n",
1471
- "2065\n",
1472
- "2070\n",
1473
- "2075\n",
1474
- "2080\n",
1475
- "2085\n",
1476
- "2090\n",
1477
- "2095\n",
1478
- "2100\n",
1479
- "2105\n",
1480
- "2110\n",
1481
- "2115\n",
1482
- "2120\n",
1483
- "2125\n",
1484
- "2130\n",
1485
- "2135\n",
1486
- "2140\n",
1487
- "2145\n",
1488
- "2150\n",
1489
- "2155\n",
1490
- "2160\n",
1491
- "2165\n",
1492
- "2170\n",
1493
- "2175\n",
1494
- "2180\n",
1495
- "2185\n",
1496
- "2190\n",
1497
- "2195\n",
1498
- "2200\n",
1499
- "2205\n",
1500
- "2210\n",
1501
- "2215\n",
1502
- "2220\n",
1503
- "2225\n",
1504
- "2230\n",
1505
- "2235\n",
1506
- "2240\n",
1507
- "2245\n",
1508
- "2250\n",
1509
- "2255\n",
1510
- "2260\n",
1511
- "2265\n",
1512
- "2270\n",
1513
- "2275\n",
1514
- "2280\n",
1515
- "2285\n",
1516
- "2290\n",
1517
- "2295\n",
1518
- "2300\n",
1519
- "2305\n",
1520
- "2310\n",
1521
- "2315\n",
1522
- "2320\n",
1523
- "2325\n",
1524
- "2330\n",
1525
- "2335\n",
1526
- "2340\n",
1527
- "2345\n",
1528
- "2350\n",
1529
- "2355\n",
1530
- "2360\n",
1531
- "2365\n",
1532
- "2370\n",
1533
- "2375\n",
1534
- "2380\n",
1535
- "2385\n",
1536
- "2390\n",
1537
- "2395\n",
1538
- "2400\n",
1539
- "2405\n",
1540
- "2410\n",
1541
- "2415\n",
1542
- "2420\n",
1543
- "2425\n",
1544
- "2430\n",
1545
- "2435\n",
1546
- "2440\n",
1547
- "2445\n",
1548
- "2450\n",
1549
- "2455\n",
1550
- "2460\n",
1551
- "2465\n",
1552
- "2470\n",
1553
- "2475\n",
1554
- "2480\n",
1555
- "2485\n",
1556
- "2490\n",
1557
- "2495\n",
1558
- "2500\n",
1559
- "2505\n",
1560
- "2510\n",
1561
- "2515\n",
1562
- "2520\n",
1563
- "2525\n",
1564
- "2530\n",
1565
- "2535\n",
1566
- "2540\n",
1567
- "2545\n",
1568
- "2550\n",
1569
- "2555\n",
1570
- "2560\n",
1571
- "2565\n",
1572
- "2570\n",
1573
- "2575\n",
1574
- "2580\n",
1575
- "2585\n",
1576
- "2590\n",
1577
- "2595\n",
1578
- "2600\n",
1579
- "2605\n",
1580
- "2610\n",
1581
- "2615\n",
1582
- "2620\n",
1583
- "2625\n",
1584
- "2630\n",
1585
- "2635\n",
1586
- "2640\n",
1587
- "2645\n",
1588
- "2650\n",
1589
- "2655\n",
1590
- "2660\n",
1591
- "2665\n",
1592
- "2670\n",
1593
- "2675\n",
1594
- "2680\n",
1595
- "2685\n",
1596
- "2690\n",
1597
- "2695\n",
1598
- "2700\n",
1599
- "2705\n",
1600
- "2710\n",
1601
- "2715\n",
1602
- "2720\n",
1603
- "2725\n",
1604
- "2730\n",
1605
- "2735\n",
1606
- "2740\n",
1607
- "2745\n",
1608
- "2750\n",
1609
- "2755\n",
1610
- "2760\n",
1611
- "2765\n",
1612
- "2770\n",
1613
- "2775\n",
1614
- "2780\n",
1615
- "2785\n",
1616
- "2790\n",
1617
- "2795\n",
1618
- "2800\n",
1619
- "2805\n",
1620
- "2810\n",
1621
- "2815\n",
1622
- "2820\n",
1623
- "2825\n",
1624
- "2830\n",
1625
- "2835\n",
1626
- "2840\n",
1627
- "2845\n",
1628
- "2850\n",
1629
- "2855\n",
1630
- "2860\n",
1631
- "2865\n",
1632
- "2870\n",
1633
- "2875\n",
1634
- "2880\n",
1635
- "2885\n",
1636
- "2890\n",
1637
- "2895\n",
1638
- "2900\n",
1639
- "2905\n",
1640
- "2910\n",
1641
- "2915\n",
1642
- "2920\n",
1643
- "2925\n",
1644
- "2930\n",
1645
- "2935\n",
1646
- "2940\n",
1647
- "2945\n",
1648
- "2950\n",
1649
- "2955\n",
1650
- "2960\n",
1651
- "2965\n",
1652
- "2970\n",
1653
- "2975\n",
1654
- "2980\n",
1655
- "2985\n",
1656
- "2990\n",
1657
- "2995\n",
1658
- "3000\n",
1659
- "3005\n",
1660
- "3010\n",
1661
- "3015\n",
1662
- "3020\n",
1663
- "3025\n",
1664
- "3030\n",
1665
- "3035\n",
1666
- "3040\n",
1667
- "3045\n",
1668
- "3050\n",
1669
- "3055\n",
1670
- "3060\n",
1671
- "3065\n",
1672
- "3070\n",
1673
- "3075\n",
1674
- "3080\n",
1675
- "3085\n",
1676
- "3090\n",
1677
- "3095\n",
1678
- "3100\n",
1679
- "3105\n",
1680
- "3110\n",
1681
- "3115\n",
1682
- "3120\n",
1683
- "3125\n",
1684
- "3130\n",
1685
- "3135\n",
1686
- "3140\n",
1687
- "3145\n",
1688
- "3150\n",
1689
- "3155\n",
1690
- "3160\n",
1691
- "3165\n",
1692
- "3170\n",
1693
- "3175\n",
1694
- "3180\n",
1695
- "3185\n",
1696
- "3190\n",
1697
- "3195\n",
1698
- "3200\n",
1699
- "3205\n",
1700
- "3210\n",
1701
- "3215\n",
1702
- "3220\n",
1703
- "3225\n",
1704
- "3230\n",
1705
- "3235\n",
1706
- "3240\n",
1707
- "3245\n",
1708
- "3250\n",
1709
- "3255\n",
1710
- "3260\n",
1711
- "3265\n",
1712
- "3270\n",
1713
- "3275\n",
1714
- "3280\n",
1715
- "3285\n",
1716
- "3290\n",
1717
- "3295\n",
1718
- "3300\n",
1719
- "3305\n",
1720
- "3310\n",
1721
- "3315\n",
1722
- "3320\n",
1723
- "3325\n",
1724
- "3330\n",
1725
- "3335\n",
1726
- "3340\n",
1727
- "3345\n",
1728
- "3350\n",
1729
- "3355\n",
1730
- "3360\n",
1731
- "3365\n",
1732
- "3370\n",
1733
- "3375\n",
1734
- "3380\n",
1735
- "3385\n",
1736
- "3390\n",
1737
- "3395\n",
1738
- "3400\n",
1739
- "3405\n",
1740
- "3410\n",
1741
- "3415\n",
1742
- "3420\n",
1743
- "3425\n",
1744
- "3430\n",
1745
- "3435\n",
1746
- "3440\n",
1747
- "3445\n",
1748
- "3450\n",
1749
- "3455\n",
1750
- "3460\n",
1751
- "3465\n",
1752
- "3470\n",
1753
- "3475\n",
1754
- "3480\n",
1755
- "3485\n",
1756
- "3490\n",
1757
- "3495\n",
1758
- "3500\n",
1759
- "3505\n",
1760
- "3510\n",
1761
- "3515\n",
1762
- "3520\n",
1763
- "3525\n",
1764
- "3530\n",
1765
- "3535\n",
1766
- "3540\n",
1767
- "3545\n",
1768
- "3550\n",
1769
- "3555\n",
1770
- "3560\n",
1771
- "3565\n",
1772
- "3570\n",
1773
- "3575\n",
1774
- "3580\n",
1775
- "3585\n",
1776
- "3590\n",
1777
- "3595\n",
1778
- "3600\n",
1779
- "3605\n",
1780
- "3610\n",
1781
- "3615\n",
1782
- "3620\n",
1783
- "3625\n",
1784
- "3630\n",
1785
- "3635\n",
1786
- "3640\n",
1787
- "3645\n",
1788
- "3650\n",
1789
- "3655\n",
1790
- "3660\n",
1791
- "3665\n",
1792
- "3670\n",
1793
- "3675\n",
1794
- "3680\n",
1795
- "3685\n",
1796
- "3690\n",
1797
- "3695\n",
1798
- "3700\n",
1799
- "3705\n",
1800
- "3710\n",
1801
- "3715\n",
1802
- "3720\n",
1803
- "3725\n",
1804
- "3730\n",
1805
- "3735\n",
1806
- "3740\n",
1807
- "3745\n",
1808
- "3750\n",
1809
- "3755\n",
1810
- "3760\n",
1811
- "3765\n",
1812
- "3770\n",
1813
- "3775\n",
1814
- "3780\n",
1815
- "3785\n",
1816
- "3790\n",
1817
- "3795\n",
1818
- "3800\n",
1819
- "3805\n",
1820
- "3810\n",
1821
- "3815\n",
1822
- "3820\n",
1823
- "3825\n",
1824
- "3830\n",
1825
- "3835\n",
1826
- "3840\n",
1827
- "3845\n",
1828
- "3850\n",
1829
- "3855\n",
1830
- "3860\n",
1831
- "3865\n",
1832
- "3870\n",
1833
- "3875\n",
1834
- "3880\n",
1835
- "3885\n",
1836
- "3890\n",
1837
- "3895\n",
1838
- "3900\n",
1839
- "3905\n",
1840
- "3910\n",
1841
- "3915\n",
1842
- "3920\n",
1843
- "3925\n",
1844
- "3930\n",
1845
- "3935\n",
1846
- "3940\n",
1847
- "3945\n",
1848
- "3950\n",
1849
- "3955\n",
1850
- "3960\n",
1851
- "3965\n",
1852
- "3970\n",
1853
- "3975\n",
1854
- "3980\n",
1855
- "3985\n",
1856
- "3990\n",
1857
- "3995\n",
1858
- "4000\n",
1859
- "4005\n",
1860
- "4010\n",
1861
- "4015\n",
1862
- "4020\n",
1863
- "4025\n",
1864
- "4030\n",
1865
- "4035\n",
1866
- "4040\n",
1867
- "4045\n",
1868
- "4050\n",
1869
- "4055\n",
1870
- "4060\n",
1871
- "4065\n",
1872
- "4070\n",
1873
- "4075\n",
1874
- "4080\n",
1875
- "4085\n",
1876
- "4090\n",
1877
- "4095\n",
1878
- "4100\n",
1879
- "4105\n",
1880
- "4110\n",
1881
- "4115\n",
1882
- "4120\n",
1883
- "4125\n",
1884
- "4130\n",
1885
- "4135\n",
1886
- "4140\n",
1887
- "4145\n",
1888
- "4150\n",
1889
- "4155\n",
1890
- "4160\n",
1891
- "4165\n",
1892
- "4170\n",
1893
- "4175\n",
1894
- "4180\n",
1895
- "4185\n",
1896
- "4190\n",
1897
- "4195\n",
1898
- "4200\n",
1899
- "4205\n",
1900
- "4210\n",
1901
- "4215\n",
1902
- "4220\n",
1903
- "4225\n",
1904
- "4230\n",
1905
- "4235\n",
1906
- "4240\n",
1907
- "4245\n",
1908
- "4250\n",
1909
- "4255\n",
1910
- "4260\n",
1911
- "4265\n",
1912
- "4270\n",
1913
- "4275\n",
1914
- "4280\n",
1915
- "4285\n",
1916
- "4290\n",
1917
- "4295\n",
1918
- "4300\n",
1919
- "4305\n",
1920
- "4310\n",
1921
- "4315\n",
1922
- "4320\n",
1923
- "4325\n",
1924
- "4330\n",
1925
- "4335\n",
1926
- "4340\n",
1927
- "4345\n",
1928
- "4350\n",
1929
- "4355\n",
1930
- "4360\n",
1931
- "4365\n",
1932
- "4370\n",
1933
- "4375\n",
1934
- "4380\n",
1935
- "4385\n",
1936
- "4390\n",
1937
- "4395\n",
1938
- "4400\n",
1939
- "4405\n",
1940
- "4410\n",
1941
- "4415\n",
1942
- "4420\n",
1943
- "4425\n",
1944
- "4430\n",
1945
- "4435\n",
1946
- "4440\n",
1947
- "4445\n",
1948
- "4450\n",
1949
- "4455\n",
1950
- "4460\n",
1951
- "4465\n",
1952
- "4470\n",
1953
- "4475\n",
1954
- "4480\n",
1955
- "4485\n",
1956
- "4490\n",
1957
- "4495\n",
1958
- "4500\n",
1959
- "4505\n",
1960
- "4510\n",
1961
- "4515\n",
1962
- "4520\n",
1963
- "4525\n",
1964
- "4530\n",
1965
- "4535\n",
1966
- "4540\n",
1967
- "4545\n",
1968
- "4550\n",
1969
- "4555\n",
1970
- "4560\n",
1971
- "4565\n",
1972
- "4570\n",
1973
- "4575\n",
1974
- "4580\n",
1975
- "4585\n",
1976
- "4590\n",
1977
- "4595\n",
1978
- "4600\n",
1979
- "4605\n",
1980
- "4610\n",
1981
- "4615\n",
1982
- "4620\n",
1983
- "4625\n",
1984
- "4630\n",
1985
- "4635\n",
1986
- "4640\n",
1987
- "4645\n",
1988
- "4650\n",
1989
- "4655\n",
1990
- "4660\n",
1991
- "4665\n",
1992
- "4670\n",
1993
- "4675\n",
1994
- "4680\n",
1995
- "4685\n",
1996
- "4690\n",
1997
- "4695\n",
1998
- "4700\n",
1999
- "4705\n",
2000
- "4710\n",
2001
- "4715\n",
2002
- "4720\n",
2003
- "4725\n",
2004
- "4730\n",
2005
- "4735\n",
2006
- "4740\n",
2007
- "4745\n",
2008
- "4750\n",
2009
- "4755\n",
2010
- "4760\n",
2011
- "4765\n",
2012
- "4770\n",
2013
- "4775\n",
2014
- "4780\n",
2015
- "4785\n",
2016
- "4790\n",
2017
- "4795\n",
2018
- "4800\n",
2019
- "4805\n",
2020
- "4810\n",
2021
- "4815\n",
2022
- "4820\n",
2023
- "4825\n",
2024
- "4830\n",
2025
- "4835\n",
2026
- "4840\n",
2027
- "4845\n",
2028
- "4850\n",
2029
- "4855\n",
2030
- "4860\n",
2031
- "4865\n",
2032
- "4870\n",
2033
- "4875\n",
2034
- "4880\n",
2035
- "4885\n",
2036
- "4890\n",
2037
- "4895\n",
2038
- "4900\n",
2039
- "4905\n",
2040
- "4910\n",
2041
- "4915\n",
2042
- "4920\n",
2043
- "4925\n",
2044
- "4930\n",
2045
- "4935\n",
2046
- "4940\n",
2047
- "4945\n",
2048
- "4950\n",
2049
- "4955\n",
2050
- "4960\n",
2051
- "4965\n",
2052
- "4970\n",
2053
- "4975\n",
2054
- "4980\n",
2055
- "4985\n",
2056
- "4990\n",
2057
- "4995\n",
2058
- "5000\n",
2059
- "5005\n",
2060
- "5010\n",
2061
- "5015\n",
2062
- "5020\n",
2063
- "5025\n",
2064
- "5030\n",
2065
- "5035\n",
2066
- "5040\n",
2067
- "5045\n",
2068
- "5050\n",
2069
- "5055\n",
2070
- "5060\n",
2071
- "5065\n",
2072
- "5070\n",
2073
- "5075\n",
2074
- "5080\n",
2075
- "5085\n",
2076
- "5090\n",
2077
- "5095\n",
2078
- "5100\n",
2079
- "5105\n",
2080
- "5110\n",
2081
- "5115\n",
2082
- "5120\n",
2083
- "5125\n",
2084
- "5130\n",
2085
- "5135\n",
2086
- "5140\n",
2087
- "5145\n",
2088
- "5150\n",
2089
- "5155\n",
2090
- "5160\n",
2091
- "5165\n",
2092
- "5170\n",
2093
- "5175\n",
2094
- "5180\n",
2095
- "5185\n",
2096
- "5190\n",
2097
- "5195\n",
2098
- "5200\n",
2099
- "5205\n",
2100
- "5210\n",
2101
- "5215\n",
2102
- "5220\n",
2103
- "5225\n",
2104
- "5230\n",
2105
- "5235\n",
2106
- "5240\n",
2107
- "5245\n",
2108
- "5250\n",
2109
- "5255\n",
2110
- "5260\n",
2111
- "5265\n",
2112
- "5270\n",
2113
- "5275\n",
2114
- "5280\n",
2115
- "5285\n",
2116
- "5290\n",
2117
- "5295\n",
2118
- "5300\n",
2119
- "5305\n",
2120
- "5310\n",
2121
- "5315\n",
2122
- "5320\n",
2123
- "5325\n",
2124
- "5330\n",
2125
- "5335\n",
2126
- "5340\n",
2127
- "5345\n",
2128
- "5350\n",
2129
- "5355\n",
2130
- "5360\n",
2131
- "5365\n",
2132
- "5370\n",
2133
- "5375\n",
2134
- "5380\n",
2135
- "5385\n",
2136
- "5390\n",
2137
- "5395\n",
2138
- "5400\n",
2139
- "5405\n",
2140
- "5410\n",
2141
- "5415\n",
2142
- "5420\n",
2143
- "5425\n",
2144
- "5430\n",
2145
- "5435\n",
2146
- "5440\n",
2147
- "5445\n",
2148
- "5450\n",
2149
- "5455\n",
2150
- "5460\n",
2151
- "5465\n",
2152
- "5470\n",
2153
- "5475\n",
2154
- "5480\n",
2155
- "5485\n",
2156
- "5490\n",
2157
- "5495\n",
2158
- "5500\n",
2159
- "5505\n",
2160
- "5510\n",
2161
- "5515\n",
2162
- "5520\n",
2163
- "5525\n",
2164
- "5530\n",
2165
- "5535\n",
2166
- "5540\n",
2167
- "5545\n",
2168
- "5550\n",
2169
- "5555\n",
2170
- "5560\n",
2171
- "5565\n",
2172
- "5570\n",
2173
- "5575\n",
2174
- "5580\n",
2175
- "5585\n",
2176
- "5590\n",
2177
- "5595\n",
2178
- "5600\n",
2179
- "5605\n",
2180
- "5610\n",
2181
- "5615\n",
2182
- "5620\n",
2183
- "5625\n",
2184
- "5630\n",
2185
- "5635\n",
2186
- "5640\n",
2187
- "5645\n",
2188
- "5650\n",
2189
- "5655\n",
2190
- "5660\n",
2191
- "5665\n",
2192
- "5670\n",
2193
- "5675\n",
2194
- "5680\n",
2195
- "5685\n",
2196
- "5690\n",
2197
- "5695\n",
2198
- "5700\n",
2199
- "5705\n",
2200
- "5710\n",
2201
- "5715\n",
2202
- "5720\n",
2203
- "5725\n",
2204
- "5730\n",
2205
- "5735\n",
2206
- "5740\n",
2207
- "5745\n",
2208
- "5750\n",
2209
- "5755\n",
2210
- "5760\n",
2211
- "5765\n",
2212
- "5770\n",
2213
- "5775\n",
2214
- "5780\n",
2215
- "5785\n",
2216
- "5790\n",
2217
- "5795\n",
2218
- "5800\n",
2219
- "5805\n",
2220
- "5810\n",
2221
- "5815\n",
2222
- "5820\n",
2223
- "5825\n",
2224
- "5830\n",
2225
- "5835\n",
2226
- "5840\n",
2227
- "5845\n",
2228
- "5850\n",
2229
- "5855\n",
2230
- "5860\n",
2231
- "5865\n",
2232
- "5870\n",
2233
- "5875\n",
2234
- "5880\n",
2235
- "5885\n",
2236
- "5890\n",
2237
- "5895\n",
2238
- "5900\n",
2239
- "5905\n",
2240
- "5910\n",
2241
- "5915\n",
2242
- "5920\n",
2243
- "5925\n",
2244
- "5930\n",
2245
- "5935\n",
2246
- "5940\n",
2247
- "5945\n",
2248
- "5950\n",
2249
- "5955\n",
2250
- "5960\n",
2251
- "5965\n",
2252
- "5970\n",
2253
- "5975\n",
2254
- "5980\n",
2255
- "5985\n",
2256
- "5990\n",
2257
- "5995\n",
2258
- "6000\n",
2259
- "6005\n",
2260
- "6010\n",
2261
- "6015\n",
2262
- "6020\n",
2263
- "6025\n",
2264
- "6030\n",
2265
- "6035\n",
2266
- "6040\n",
2267
- "6045\n",
2268
- "6050\n",
2269
- "6055\n",
2270
- "6060\n",
2271
- "6065\n",
2272
- "6070\n",
2273
- "6075\n",
2274
- "6080\n",
2275
- "6085\n",
2276
- "6090\n",
2277
- "6095\n",
2278
- "6100\n",
2279
- "6105\n",
2280
- "6110\n",
2281
- "6115\n",
2282
- "6120\n",
2283
- "6125\n",
2284
- "6130\n",
2285
- "6135\n",
2286
- "6140\n",
2287
- "6145\n",
2288
- "6150\n",
2289
- "6155\n",
2290
- "6160\n",
2291
- "6165\n",
2292
- "6170\n",
2293
- "6175\n",
2294
- "6180\n",
2295
- "6185\n",
2296
- "6190\n",
2297
- "6195\n",
2298
- "6200\n",
2299
- "6205\n",
2300
- "6210\n",
2301
- "6215\n",
2302
- "6220\n",
2303
- "6225\n",
2304
- "6230\n",
2305
- "6235\n",
2306
- "6240\n",
2307
- "6245\n",
2308
- "6250\n",
2309
- "6255\n",
2310
- "6260\n",
2311
- "6265\n",
2312
- "6270\n",
2313
- "6275\n",
2314
- "6280\n",
2315
- "6285\n",
2316
- "6290\n",
2317
- "6295\n",
2318
- "6300\n",
2319
- "6305\n",
2320
- "6310\n",
2321
- "6315\n",
2322
- "6320\n",
2323
- "6325\n",
2324
- "6330\n",
2325
- "6335\n",
2326
- "6340\n",
2327
- "6345\n",
2328
- "6350\n",
2329
- "6355\n",
2330
- "6360\n",
2331
- "6365\n",
2332
- "6370\n",
2333
- "6375\n",
2334
- "6380\n",
2335
- "6385\n",
2336
- "6390\n",
2337
- "6395\n",
2338
- "6400\n",
2339
- "6405\n",
2340
- "6410\n",
2341
- "6415\n",
2342
- "6420\n",
2343
- "6425\n",
2344
- "6430\n",
2345
- "6435\n",
2346
- "6440\n",
2347
- "6445\n",
2348
- "6450\n",
2349
- "6455\n",
2350
- "6460\n",
2351
- "6465\n",
2352
- "6470\n",
2353
- "6475\n",
2354
- "6480\n",
2355
- "6485\n",
2356
- "6490\n",
2357
- "6495\n",
2358
- "6500\n",
2359
- "6505\n",
2360
- "6510\n",
2361
- "6515\n",
2362
- "6520\n",
2363
- "6525\n",
2364
- "6530\n",
2365
- "6535\n",
2366
- "6540\n",
2367
- "6545\n",
2368
- "6550\n",
2369
- "6555\n",
2370
- "6560\n",
2371
- "6565\n",
2372
- "6570\n",
2373
- "6575\n",
2374
- "6580\n",
2375
- "6585\n",
2376
- "6590\n",
2377
- "6595\n",
2378
- "6600\n",
2379
- "6605\n",
2380
- "6610\n",
2381
- "6615\n",
2382
- "6620\n",
2383
- "6625\n",
2384
- "6630\n",
2385
- "6635\n",
2386
- "6640\n",
2387
- "6645\n",
2388
- "6650\n",
2389
- "6655\n",
2390
- "6660\n",
2391
- "6665\n",
2392
- "6670\n",
2393
- "6675\n",
2394
- "6680\n",
2395
- "6685\n",
2396
- "6690\n",
2397
- "6695\n",
2398
- "6700\n",
2399
- "6705\n",
2400
- "6710\n",
2401
- "6715\n",
2402
- "6720\n",
2403
- "6725\n",
2404
- "6730\n",
2405
- "6735\n",
2406
- "6740\n",
2407
- "6745\n",
2408
- "6750\n",
2409
- "6755\n",
2410
- "6760\n",
2411
- "6765\n",
2412
- "6770\n",
2413
- "6775\n",
2414
- "6780\n",
2415
- "6785\n",
2416
- "6790\n",
2417
- "6795\n",
2418
- "6800\n",
2419
- "6805\n",
2420
- "6810\n",
2421
- "6815\n",
2422
- "6820\n",
2423
- "6825\n",
2424
- "6830\n",
2425
- "6835\n",
2426
- "6840\n",
2427
- "6845\n",
2428
- "6850\n",
2429
- "6855\n",
2430
- "6860\n",
2431
- "6865\n",
2432
- "6870\n",
2433
- "6875\n",
2434
- "6880\n",
2435
- "6885\n",
2436
- "6890\n",
2437
- "6895\n",
2438
- "6900\n",
2439
- "6905\n",
2440
- "6910\n",
2441
- "6915\n",
2442
- "6920\n",
2443
- "6925\n",
2444
- "6930\n",
2445
- "6935\n",
2446
- "6940\n",
2447
- "6945\n",
2448
- "6950\n",
2449
- "6955\n",
2450
- "6960\n",
2451
- "6965\n",
2452
- "6970\n",
2453
- "6975\n",
2454
- "6980\n",
2455
- "6985\n",
2456
- "6990\n",
2457
- "6995\n",
2458
- "7000\n",
2459
- "7005\n",
2460
- "7010\n",
2461
- "7015\n",
2462
- "7020\n",
2463
- "7025\n",
2464
- "7030\n",
2465
- "7035\n",
2466
- "7040\n",
2467
- "7045\n",
2468
- "7050\n",
2469
- "7055\n",
2470
- "7060\n",
2471
- "7065\n",
2472
- "7070\n",
2473
- "7075\n",
2474
- "7080\n",
2475
- "7085\n",
2476
- "7090\n",
2477
- "7095\n",
2478
- "7100\n",
2479
- "7105\n",
2480
- "7110\n",
2481
- "7115\n",
2482
- "7120\n",
2483
- "7125\n",
2484
- "7130\n",
2485
- "7135\n",
2486
- "7140\n",
2487
- "7145\n",
2488
- "7150\n",
2489
- "7155\n",
2490
- "7160\n",
2491
- "7165\n",
2492
- "7170\n",
2493
- "7175\n",
2494
- "7180\n",
2495
- "7185\n",
2496
- "7190\n",
2497
- "7195\n",
2498
- "7200\n",
2499
- "7205\n",
2500
- "7210\n",
2501
- "7215\n",
2502
- "7220\n",
2503
- "7225\n",
2504
- "7230\n",
2505
- "7235\n",
2506
- "7240\n",
2507
- "7245\n",
2508
- "7250\n",
2509
- "7255\n",
2510
- "7260\n",
2511
- "7265\n",
2512
- "7270\n",
2513
- "7275\n",
2514
- "7280\n",
2515
- "7285\n",
2516
- "7290\n",
2517
- "7295\n",
2518
- "7300\n",
2519
- "7305\n",
2520
- "7310\n",
2521
- "7315\n",
2522
- "7320\n",
2523
- "7325\n",
2524
- "7330\n",
2525
- "7335\n",
2526
- "7340\n",
2527
- "7345\n",
2528
- "7350\n",
2529
- "7355\n",
2530
- "7360\n",
2531
- "7365\n",
2532
- "7370\n",
2533
- "7375\n",
2534
- "7380\n",
2535
- "7385\n",
2536
- "7390\n",
2537
- "7395\n",
2538
- "7400\n",
2539
- "7405\n",
2540
- "7410\n",
2541
- "7415\n",
2542
- "7420\n",
2543
- "7425\n",
2544
- "7430\n",
2545
- "7435\n",
2546
- "7440\n",
2547
- "7445\n",
2548
- "7450\n",
2549
- "7455\n",
2550
- "7460\n",
2551
- "7465\n",
2552
- "7470\n",
2553
- "7475\n",
2554
- "7480\n",
2555
- "7485\n",
2556
- "7490\n",
2557
- "7495\n",
2558
- "7500\n",
2559
- "7505\n",
2560
- "7510\n",
2561
- "7515\n",
2562
- "7520\n",
2563
- "7525\n",
2564
- "7530\n",
2565
- "7535\n",
2566
- "7540\n",
2567
- "7545\n",
2568
- "7550\n",
2569
- "7555\n",
2570
- "7560\n",
2571
- "7565\n",
2572
- "7570\n",
2573
- "7575\n",
2574
- "7580\n",
2575
- "7585\n",
2576
- "7590\n",
2577
- "7595\n",
2578
- "7600\n",
2579
- "7605\n",
2580
- "7610\n",
2581
- "7615\n",
2582
- "7620\n",
2583
- "7625\n",
2584
- "7630\n",
2585
- "7635\n",
2586
- "7640\n",
2587
- "7645\n",
2588
- "7650\n",
2589
- "7655\n",
2590
- "7660\n",
2591
- "7665\n",
2592
- "7670\n",
2593
- "7675\n",
2594
- "7680\n",
2595
- "7685\n",
2596
- "7690\n",
2597
- "7695\n",
2598
- "7700\n",
2599
- "7705\n",
2600
- "7710\n",
2601
- "7715\n",
2602
- "7720\n",
2603
- "7725\n",
2604
- "7730\n",
2605
- "7735\n",
2606
- "7740\n",
2607
- "7745\n",
2608
- "7750\n",
2609
- "7755\n",
2610
- "7760\n",
2611
- "7765\n",
2612
- "7770\n",
2613
- "7775\n",
2614
- "7780\n",
2615
- "7785\n",
2616
- "7790\n",
2617
- "7795\n",
2618
- "7800\n",
2619
- "7805\n",
2620
- "7810\n",
2621
- "7815\n",
2622
- "7820\n",
2623
- "7825\n",
2624
- "7830\n",
2625
- "7835\n",
2626
- "7840\n",
2627
- "7845\n",
2628
- "7850\n",
2629
- "7855\n",
2630
- "7860\n",
2631
- "7865\n",
2632
- "7870\n",
2633
- "7875\n",
2634
- "7880\n",
2635
- "7885\n",
2636
- "7890\n",
2637
- "7895\n",
2638
- "7900\n",
2639
- "7905\n",
2640
- "7910\n",
2641
- "7915\n",
2642
- "7920\n",
2643
- "7925\n",
2644
- "7930\n",
2645
- "7935\n",
2646
- "7940\n",
2647
- "7945\n",
2648
- "7950\n",
2649
- "7955\n",
2650
- "7960\n",
2651
- "7965\n",
2652
- "7970\n",
2653
- "7975\n",
2654
- "7980\n",
2655
- "7985\n",
2656
- "7990\n",
2657
- "7995\n",
2658
- "8000\n",
2659
- "8005\n",
2660
- "8010\n",
2661
- "8015\n",
2662
- "8020\n",
2663
- "8025\n",
2664
- "8030\n",
2665
- "8035\n",
2666
- "8040\n",
2667
- "8045\n",
2668
- "8050\n",
2669
- "8055\n",
2670
- "8060\n",
2671
- "8065\n",
2672
- "8070\n",
2673
- "8075\n",
2674
- "8080\n",
2675
- "8085\n",
2676
- "8090\n",
2677
- "8095\n",
2678
- "8100\n",
2679
- "8105\n",
2680
- "8110\n",
2681
- "8115\n",
2682
- "8120\n",
2683
- "8125\n",
2684
- "8130\n",
2685
- "8135\n",
2686
- "8140\n",
2687
- "8145\n",
2688
- "8150\n",
2689
- "8155\n",
2690
- "8160\n",
2691
- "8165\n",
2692
- "8170\n",
2693
- "8175\n",
2694
- "8180\n",
2695
- "8185\n",
2696
- "8190\n",
2697
- "8195\n",
2698
- "8200\n",
2699
- "8205\n",
2700
- "8210\n",
2701
- "8215\n",
2702
- "8220\n",
2703
- "8225\n",
2704
- "8230\n",
2705
- "8235\n",
2706
- "8240\n",
2707
- "8245\n",
2708
- "8250\n",
2709
- "8255\n",
2710
- "8260\n",
2711
- "8265\n",
2712
- "8270\n",
2713
- "8275\n",
2714
- "8280\n",
2715
- "8285\n",
2716
- "8290\n",
2717
- "8295\n",
2718
- "8300\n",
2719
- "8305\n",
2720
- "8310\n",
2721
- "8315\n",
2722
- "8320\n",
2723
- "8325\n",
2724
- "8330\n",
2725
- "8335\n",
2726
- "8340\n",
2727
- "8345\n",
2728
- "8350\n",
2729
- "8355\n",
2730
- "8360\n",
2731
- "8365\n",
2732
- "8370\n",
2733
- "8375\n",
2734
- "8380\n",
2735
- "8385\n",
2736
- "8390\n",
2737
- "8395\n",
2738
- "8400\n",
2739
- "8405\n",
2740
- "8410\n",
2741
- "8415\n",
2742
- "8420\n",
2743
- "8425\n",
2744
- "8430\n",
2745
- "8435\n",
2746
- "8440\n",
2747
- "8445\n",
2748
- "8450\n",
2749
- "8455\n",
2750
- "8460\n",
2751
- "8465\n",
2752
- "8470\n",
2753
- "8475\n",
2754
- "8480\n",
2755
- "8485\n",
2756
- "8490\n",
2757
- "8495\n",
2758
- "8500\n",
2759
- "8505\n",
2760
- "8510\n",
2761
- "8515\n",
2762
- "8520\n",
2763
- "8525\n",
2764
- "8530\n",
2765
- "8535\n",
2766
- "8540\n",
2767
- "8545\n",
2768
- "8550\n",
2769
- "8555\n",
2770
- "8560\n",
2771
- "8565\n",
2772
- "8570\n",
2773
- "8575\n",
2774
- "8580\n",
2775
- "8585\n",
2776
- "8590\n",
2777
- "8595\n",
2778
- "8600\n",
2779
- "8605\n",
2780
- "8610\n",
2781
- "8615\n",
2782
- "8620\n",
2783
- "8625\n",
2784
- "8630\n",
2785
- "8635\n",
2786
- "8640\n",
2787
- "8645\n",
2788
- "8650\n",
2789
- "8655\n",
2790
- "8660\n",
2791
- "8665\n",
2792
- "8670\n",
2793
- "8675\n",
2794
- "8680\n",
2795
- "8685\n",
2796
- "8690\n",
2797
- "8695\n",
2798
- "8700\n",
2799
- "8705\n",
2800
- "8710\n",
2801
- "8715\n",
2802
- "8720\n",
2803
- "8725\n",
2804
- "8730\n",
2805
- "8735\n",
2806
- "8740\n",
2807
- "8745\n",
2808
- "8750\n",
2809
- "8755\n",
2810
- "8760\n",
2811
- "8765\n",
2812
- "8770\n",
2813
- "8775\n",
2814
- "8780\n",
2815
- "8785\n",
2816
- "8790\n",
2817
- "8795\n",
2818
- "8800\n",
2819
- "8805\n",
2820
- "8810\n",
2821
- "8815\n",
2822
- "8820\n",
2823
- "8825\n",
2824
- "8830\n",
2825
- "8835\n",
2826
- "8840\n",
2827
- "8845\n",
2828
- "8850\n",
2829
- "8855\n",
2830
- "8860\n",
2831
- "8865\n",
2832
- "8870\n",
2833
- "8875\n",
2834
- "8880\n",
2835
- "8885\n",
2836
- "8890\n",
2837
- "8895\n",
2838
- "8900\n",
2839
- "8905\n",
2840
- "8910\n",
2841
- "8915\n",
2842
- "8920\n",
2843
- "8925\n",
2844
- "8930\n",
2845
- "8935\n",
2846
- "8940\n",
2847
- "8945\n",
2848
- "8950\n",
2849
- "8955\n",
2850
- "8960\n",
2851
- "8965\n",
2852
- "8970\n",
2853
- "8975\n",
2854
- "8980\n",
2855
- "8985\n",
2856
- "8990\n",
2857
- "8995\n",
2858
- "9000\n",
2859
- "9005\n",
2860
- "9010\n",
2861
- "9015\n",
2862
- "9020\n",
2863
- "9025\n",
2864
- "9030\n",
2865
- "9035\n",
2866
- "9040\n",
2867
- "9045\n",
2868
- "9050\n",
2869
- "9055\n",
2870
- "9060\n",
2871
- "9065\n",
2872
- "9070\n",
2873
- "9075\n",
2874
- "9080\n",
2875
- "9085\n",
2876
- "9090\n",
2877
- "9095\n",
2878
- "9100\n",
2879
- "9105\n",
2880
- "9110\n",
2881
- "9115\n",
2882
- "9120\n",
2883
- "9125\n",
2884
- "9130\n",
2885
- "9135\n",
2886
- "9140\n",
2887
- "9145\n",
2888
- "9150\n",
2889
- "9155\n",
2890
- "9160\n",
2891
- "9165\n",
2892
- "9170\n",
2893
- "9175\n",
2894
- "9180\n",
2895
- "9185\n",
2896
- "9190\n",
2897
- "9195\n",
2898
- "9200\n",
2899
- "9205\n",
2900
- "9210\n",
2901
- "9215\n",
2902
- "9220\n",
2903
- "9225\n",
2904
- "9230\n",
2905
- "9235\n",
2906
- "9240\n",
2907
- "9245\n",
2908
- "9250\n",
2909
- "9255\n",
2910
- "9260\n",
2911
- "9265\n",
2912
- "9270\n",
2913
- "9275\n",
2914
- "9280\n",
2915
- "9285\n",
2916
- "9290\n",
2917
- "9295\n",
2918
- "9300\n",
2919
- "9305\n",
2920
- "9310\n",
2921
- "9315\n",
2922
- "9320\n",
2923
- "9325\n",
2924
- "9330\n",
2925
- "9335\n",
2926
- "9340\n",
2927
- "9345\n",
2928
- "9350\n",
2929
- "9355\n",
2930
- "9360\n",
2931
- "9365\n",
2932
- "9370\n",
2933
- "9375\n",
2934
- "9380\n",
2935
- "9385\n",
2936
- "9390\n",
2937
- "9395\n",
2938
- "9400\n",
2939
- "9405\n",
2940
- "9410\n",
2941
- "9415\n",
2942
- "9420\n",
2943
- "9425\n",
2944
- "9430\n",
2945
- "9435\n",
2946
- "9440\n",
2947
- "9445\n",
2948
- "9450\n",
2949
- "9455\n",
2950
- "9460\n",
2951
- "9465\n",
2952
- "9470\n",
2953
- "9475\n",
2954
- "9480\n",
2955
- "9485\n",
2956
- "9490\n",
2957
- "9495\n",
2958
- "9500\n",
2959
- "9505\n",
2960
- "9510\n",
2961
- "9515\n",
2962
- "9520\n",
2963
- "9525\n",
2964
- "9530\n",
2965
- "9535\n",
2966
- "9540\n",
2967
- "9545\n",
2968
- "9550\n",
2969
- "9555\n",
2970
- "9560\n",
2971
- "9565\n",
2972
- "9570\n",
2973
- "9575\n",
2974
- "9580\n",
2975
- "9585\n",
2976
- "9590\n",
2977
- "9595\n",
2978
- "9600\n",
2979
- "9605\n",
2980
- "9610\n",
2981
- "9615\n",
2982
- "9620\n",
2983
- "9625\n",
2984
- "9630\n",
2985
- "9635\n",
2986
- "9640\n",
2987
- "9645\n",
2988
- "9650\n",
2989
- "9655\n",
2990
- "9660\n",
2991
- "9665\n",
2992
- "9670\n",
2993
- "9675\n",
2994
- "9680\n",
2995
- "9685\n",
2996
- "9690\n",
2997
- "9695\n",
2998
- "9700\n",
2999
- "9705\n",
3000
- "9710\n",
3001
- "9715\n",
3002
- "9720\n",
3003
- "9725\n",
3004
- "9730\n",
3005
- "9735\n",
3006
- "9740\n",
3007
- "9745\n",
3008
- "9750\n",
3009
- "9755\n",
3010
- "9760\n",
3011
- "9765\n",
3012
- "9770\n",
3013
- "9775\n",
3014
- "9780\n",
3015
- "9785\n",
3016
- "9790\n",
3017
- "9795\n",
3018
- "9800\n",
3019
- "9805\n",
3020
- "9810\n",
3021
- "9815\n",
3022
- "9820\n",
3023
- "9825\n",
3024
- "9830\n",
3025
- "9835\n",
3026
- "9840\n",
3027
- "9845\n",
3028
- "9850\n",
3029
- "9855\n",
3030
- "9860\n",
3031
- "9865\n",
3032
- "9870\n",
3033
- "9875\n",
3034
- "9880\n",
3035
- "9885\n",
3036
- "9890\n",
3037
- "9895\n",
3038
- "9900\n",
3039
- "9905\n",
3040
- "9910\n",
3041
- "9915\n",
3042
- "9920\n",
3043
- "9925\n",
3044
- "9930\n",
3045
- "9935\n",
3046
- "9940\n",
3047
- "9945\n",
3048
- "9950\n",
3049
- "9955\n",
3050
- "9960\n",
3051
- "9965\n",
3052
- "9970\n",
3053
- "9975\n",
3054
- "9980\n",
3055
- "9985\n",
3056
- "9990\n",
3057
- "9995\n",
3058
- "10000\n",
3059
- "10005\n",
3060
- "10010\n",
3061
- "10015\n",
3062
- "10020\n",
3063
- "10025\n",
3064
- "10030\n",
3065
- "10035\n",
3066
- "10040\n",
3067
- "10045\n",
3068
- "10050\n",
3069
- "10055\n",
3070
- "10060\n",
3071
- "10065\n",
3072
- "10070\n",
3073
- "10075\n",
3074
- "10080\n",
3075
- "10085\n",
3076
- "10090\n",
3077
- "10095\n",
3078
- "10100\n",
3079
- "10105\n",
3080
- "10110\n",
3081
- "10115\n",
3082
- "10120\n",
3083
- "10125\n",
3084
- "10130\n",
3085
- "10135\n",
3086
- "10140\n",
3087
- "10145\n",
3088
- "10150\n",
3089
- "10155\n",
3090
- "10160\n",
3091
- "10165\n",
3092
- "10170\n",
3093
- "10175\n",
3094
- "10180\n",
3095
- "10185\n",
3096
- "10190\n",
3097
- "10195\n",
3098
- "10200\n",
3099
- "10205\n",
3100
- "10210\n",
3101
- "10215\n",
3102
- "10220\n",
3103
- "10225\n",
3104
- "10230\n",
3105
- "10235\n",
3106
- "10240\n",
3107
- "10245\n",
3108
- "10250\n",
3109
- "10255\n",
3110
- "10260\n",
3111
- "10265\n",
3112
- "10270\n",
3113
- "10275\n",
3114
- "10280\n",
3115
- "10285\n",
3116
- "10290\n",
3117
- "10295\n",
3118
- "10300\n",
3119
- "10305\n",
3120
- "10310\n",
3121
- "10315\n",
3122
- "10320\n",
3123
- "10325\n",
3124
- "10330\n",
3125
- "10335\n",
3126
- "10340\n",
3127
- "10345\n",
3128
- "10350\n",
3129
- "10355\n",
3130
- "10360\n",
3131
- "10365\n",
3132
- "10370\n",
3133
- "10375\n",
3134
- "10380\n",
3135
- "10385\n",
3136
- "10390\n",
3137
- "10395\n",
3138
- "10400\n",
3139
- "10405\n",
3140
- "10410\n",
3141
- "10415\n",
3142
- "10420\n",
3143
- "10425\n",
3144
- "10430\n",
3145
- "10435\n",
3146
- "10440\n",
3147
- "10445\n",
3148
- "10450\n",
3149
- "10455\n",
3150
- "10460\n",
3151
- "10465\n",
3152
- "10470\n",
3153
- "10475\n",
3154
- "10480\n",
3155
- "10485\n",
3156
- "10490\n",
3157
- "10495\n",
3158
- "10500\n",
3159
- "10505\n",
3160
- "10510\n",
3161
- "10515\n",
3162
- "10520\n",
3163
- "10525\n",
3164
- "10530\n",
3165
- "10535\n",
3166
- "10540\n",
3167
- "10545\n",
3168
- "10550\n",
3169
- "10555\n",
3170
- "10560\n",
3171
- "10565\n",
3172
- "10570\n",
3173
- "10575\n",
3174
- "10580\n",
3175
- "10585\n",
3176
- "10590\n",
3177
- "10595\n",
3178
- "10600\n",
3179
- "10605\n",
3180
- "10610\n",
3181
- "10615\n",
3182
- "10620\n",
3183
- "10625\n",
3184
- "10630\n",
3185
- "10635\n",
3186
- "10640\n",
3187
- "10645\n",
3188
- "10650\n",
3189
- "10655\n",
3190
- "10660\n",
3191
- "10665\n",
3192
- "10670\n",
3193
- "10675\n",
3194
- "10680\n",
3195
- "10685\n",
3196
- "10690\n",
3197
- "10695\n",
3198
- "10700\n",
3199
- "10705\n",
3200
- "10710\n",
3201
- "10715\n",
3202
- "10720\n",
3203
- "10725\n",
3204
- "10730\n",
3205
- "10735\n",
3206
- "10740\n",
3207
- "10745\n",
3208
- "10750\n",
3209
- "10755\n",
3210
- "10760\n",
3211
- "10765\n",
3212
- "10770\n",
3213
- "10775\n",
3214
- "10780\n",
3215
- "10785\n",
3216
- "10790\n",
3217
- "10795\n",
3218
- "10800\n",
3219
- "10805\n",
3220
- "10810\n",
3221
- "10815\n",
3222
- "10820\n",
3223
- "10825\n",
3224
- "10830\n",
3225
- "10835\n",
3226
- "10840\n",
3227
- "10845\n",
3228
- "10850\n",
3229
- "10855\n",
3230
- "10860\n",
3231
- "10865\n",
3232
- "10870\n",
3233
- "10875\n",
3234
- "10880\n",
3235
- "10885\n",
3236
- "10890\n",
3237
- "10895\n",
3238
- "10900\n",
3239
- "10905\n",
3240
- "10910\n",
3241
- "10915\n",
3242
- "10920\n",
3243
- "10925\n",
3244
- "10930\n",
3245
- "10935\n",
3246
- "10940\n",
3247
- "10945\n",
3248
- "10950\n",
3249
- "10955\n",
3250
- "10960\n",
3251
- "10965\n",
3252
- "10970\n",
3253
- "10975\n",
3254
- "10980\n",
3255
- "10985\n",
3256
- "10990\n",
3257
- "10995\n",
3258
- "11000\n",
3259
- "11005\n",
3260
- "11010\n",
3261
- "11015\n",
3262
- "11020\n",
3263
- "11025\n",
3264
- "11030\n",
3265
- "11035\n",
3266
- "11040\n",
3267
- "11045\n",
3268
- "11050\n",
3269
- "11055\n",
3270
- "11060\n",
3271
- "11065\n",
3272
- "11070\n",
3273
- "11075\n",
3274
- "11080\n",
3275
- "11085\n",
3276
- "11090\n",
3277
- "11095\n",
3278
- "11100\n",
3279
- "11105\n",
3280
- "11110\n",
3281
- "11115\n",
3282
- "11120\n",
3283
- "11125\n",
3284
- "11130\n",
3285
- "11135\n",
3286
- "11140\n",
3287
- "11145\n",
3288
- "11150\n",
3289
- "11155\n",
3290
- "11160\n",
3291
- "11165\n",
3292
- "11170\n",
3293
- "11175\n",
3294
- "11180\n",
3295
- "11185\n",
3296
- "11190\n",
3297
- "11195\n",
3298
- "11200\n",
3299
- "11205\n",
3300
- "11210\n",
3301
- "11215\n",
3302
- "11220\n",
3303
- "11225\n",
3304
- "11230\n",
3305
- "11235\n",
3306
- "11240\n",
3307
- "11245\n",
3308
- "11250\n",
3309
- "11255\n",
3310
- "11260\n",
3311
- "11265\n",
3312
- "11270\n",
3313
- "11275\n",
3314
- "11280\n",
3315
- "11285\n",
3316
- "11290\n",
3317
- "11295\n",
3318
- "11300\n",
3319
- "11305\n",
3320
- "11310\n",
3321
- "11315\n",
3322
- "11320\n",
3323
- "11325\n",
3324
- "11330\n",
3325
- "11335\n",
3326
- "11340\n",
3327
- "11345\n",
3328
- "11350\n",
3329
- "11355\n",
3330
- "11360\n",
3331
- "11365\n",
3332
- "11370\n",
3333
- "11375\n",
3334
- "11380\n",
3335
- "11385\n",
3336
- "11390\n",
3337
- "11395\n",
3338
- "11400\n",
3339
- "11405\n",
3340
- "11410\n",
3341
- "11415\n",
3342
- "11420\n",
3343
- "11425\n",
3344
- "11430\n",
3345
- "11435\n",
3346
- "11440\n",
3347
- "11445\n",
3348
- "11450\n",
3349
- "11455\n",
3350
- "11460\n",
3351
- "11465\n",
3352
- "11470\n",
3353
- "11475\n",
3354
- "11480\n",
3355
- "11485\n",
3356
- "11490\n",
3357
- "11495\n",
3358
- "11500\n",
3359
- "11505\n",
3360
- "11510\n",
3361
- "11515\n",
3362
- "11520\n",
3363
- "11525\n",
3364
- "11530\n",
3365
- "11535\n",
3366
- "11540\n",
3367
- "11545\n",
3368
- "11550\n",
3369
- "11555\n",
3370
- "11560\n",
3371
- "11565\n",
3372
- "11570\n",
3373
- "11575\n",
3374
- "11580\n",
3375
- "11585\n",
3376
- "11590\n",
3377
- "11595\n",
3378
- "11600\n",
3379
- "11605\n",
3380
- "11610\n",
3381
- "11615\n",
3382
- "11620\n",
3383
- "11625\n",
3384
- "11630\n",
3385
- "11635\n",
3386
- "11640\n",
3387
- "11645\n",
3388
- "11650\n",
3389
- "11655\n",
3390
- "11660\n",
3391
- "11665\n",
3392
- "11670\n",
3393
- "11675\n",
3394
- "11680\n",
3395
- "11685\n",
3396
- "11690\n",
3397
- "11695\n",
3398
- "11700\n",
3399
- "11705\n",
3400
- "11710\n",
3401
- "11715\n",
3402
- "11720\n",
3403
- "11725\n",
3404
- "11730\n",
3405
- "11735\n",
3406
- "11740\n",
3407
- "11745\n",
3408
- "11750\n",
3409
- "11755\n",
3410
- "11760\n",
3411
- "11765\n",
3412
- "11770\n",
3413
- "11775\n",
3414
- "11780\n",
3415
- "11785\n",
3416
- "11790\n",
3417
- "11795\n",
3418
- "11800\n",
3419
- "11805\n",
3420
- "11810\n",
3421
- "11815\n",
3422
- "11820\n",
3423
- "11825\n",
3424
- "11830\n",
3425
- "11835\n",
3426
- "11840\n",
3427
- "11845\n",
3428
- "11850\n",
3429
- "11855\n",
3430
- "11860\n",
3431
- "11865\n",
3432
- "11870\n",
3433
- "11875\n",
3434
- "11880\n",
3435
- "11885\n",
3436
- "11890\n",
3437
- "11895\n",
3438
- "11900\n",
3439
- "11905\n",
3440
- "11910\n",
3441
- "11915\n",
3442
- "11920\n",
3443
- "11925\n",
3444
- "11930\n",
3445
- "11935\n",
3446
- "11940\n",
3447
- "11945\n",
3448
- "11950\n",
3449
- "11955\n",
3450
- "11960\n",
3451
- "11965\n",
3452
- "11970\n",
3453
- "11975\n",
3454
- "11980\n",
3455
- "11985\n",
3456
- "11990\n",
3457
- "11995\n",
3458
- "12000\n",
3459
- "12005\n",
3460
- "12010\n",
3461
- "12015\n",
3462
- "12020\n"
3463
- ]
3464
- }
3465
- ],
3466
- "source": [
3467
- "# test_ds = get_val_dataset()\n",
3468
- "# # Run evaluation\n",
3469
- "# print(test_ds)\n",
3470
- "generate(\n",
3471
- " model=generator,\n",
3472
- " dataset=train_ds,\n",
3473
- " epoch=150 # change if you want more rows\n",
3474
- " )"
3475
- ]
3476
- },
3477
- {
3478
- "cell_type": "code",
3479
- "execution_count": null,
3480
- "id": "a1bbabe5",
3481
- "metadata": {
3482
- "papermill": {
3483
- "duration": 0.191322,
3484
- "end_time": "2026-02-12T22:12:22.615266",
3485
- "exception": false,
3486
- "start_time": "2026-02-12T22:12:22.423944",
3487
- "status": "completed"
3488
- },
3489
- "tags": []
3490
- },
3491
- "outputs": [],
3492
- "source": []
3493
- },
3494
- {
3495
- "cell_type": "code",
3496
- "execution_count": null,
3497
- "id": "619ef3ab",
3498
- "metadata": {
3499
- "papermill": {
3500
- "duration": 0.201882,
3501
- "end_time": "2026-02-12T22:12:23.012230",
3502
- "exception": false,
3503
- "start_time": "2026-02-12T22:12:22.810348",
3504
- "status": "completed"
3505
- },
3506
- "tags": []
3507
- },
3508
- "outputs": [],
3509
- "source": []
3510
- }
3511
- ],
3512
- "metadata": {
3513
- "kaggle": {
3514
- "accelerator": "gpu",
3515
- "dataSources": [
3516
- {
3517
- "datasetId": 8436032,
3518
- "sourceId": 13308561,
3519
- "sourceType": "datasetVersion"
3520
- },
3521
- {
3522
- "isSourceIdPinned": false,
3523
- "modelId": 583820,
3524
- "modelInstanceId": 571510,
3525
- "sourceId": 748364,
3526
- "sourceType": "modelInstanceVersion"
3527
- },
3528
- {
3529
- "isSourceIdPinned": true,
3530
- "modelId": 584139,
3531
- "modelInstanceId": 571806,
3532
- "sourceId": 749667,
3533
- "sourceType": "modelInstanceVersion"
3534
- }
3535
- ],
3536
- "dockerImageVersionId": 31154,
3537
- "isGpuEnabled": true,
3538
- "isInternetEnabled": false,
3539
- "language": "python",
3540
- "sourceType": "notebook"
3541
- },
3542
- "kernelspec": {
3543
- "display_name": "Python 3",
3544
- "language": "python",
3545
- "name": "python3"
3546
- },
3547
- "language_info": {
3548
- "codemirror_mode": {
3549
- "name": "ipython",
3550
- "version": 3
3551
- },
3552
- "file_extension": ".py",
3553
- "mimetype": "text/x-python",
3554
- "name": "python",
3555
- "nbconvert_exporter": "python",
3556
- "pygments_lexer": "ipython3",
3557
- "version": "3.11.13"
3558
- },
3559
- "papermill": {
3560
- "default_parameters": {},
3561
- "duration": 828.406063,
3562
- "end_time": "2026-02-12T22:12:26.638920",
3563
- "environment_variables": {},
3564
- "exception": null,
3565
- "input_path": "__notebook__.ipynb",
3566
- "output_path": "__notebook__.ipynb",
3567
- "parameters": {},
3568
- "start_time": "2026-02-12T21:58:38.232857",
3569
- "version": "2.6.0"
3570
- }
3571
- },
3572
- "nbformat": 4,
3573
- "nbformat_minor": 5
3574
- }