{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"dockerImageVersionId":31193,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-11-13T08:01:13.312449Z","iopub.execute_input":"2025-11-13T08:01:13.312759Z","iopub.status.idle":"2025-11-13T08:01:15.08779Z","shell.execute_reply.started":"2025-11-13T08:01:13.312731Z","shell.execute_reply":"2025-11-13T08:01:15.086925Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 1: Import libraries\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\nimport time\n\nprint(\"TensorFlow version:\", tf.__version__)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T08:07:18.16628Z","iopub.execute_input":"2025-11-13T08:07:18.166623Z","iopub.status.idle":"2025-11-13T08:07:18.17146Z","shell.execute_reply.started":"2025-11-13T08:07:18.1666Z","shell.execute_reply":"2025-11-13T08:07:18.170697Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 2: Configuration and setup\nBUFFER_SIZE = 60000\nBATCH_SIZE = 128\nEPOCHS = 200\nNOISE_DIM = 100\nNUM_EXAMPLES_TO_GENERATE = 16\nIMAGE_SIZE = 32\nCHANNELS = 3\n\n# Set random seed for reproducibility\ntf.random.set_seed(42)\nnp.random.seed(42)\n\n# Check GPU availability\nprint(\"GPU Available:\", tf.config.list_physical_devices('GPU'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T08:07:28.121125Z","iopub.execute_input":"2025-11-13T08:07:28.121883Z","iopub.status.idle":"2025-11-13T08:07:28.14097Z","shell.execute_reply.started":"2025-11-13T08:07:28.121858Z","shell.execute_reply":"2025-11-13T08:07:28.140298Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 3: Load and preprocess CIFAR-10 dataset\n(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()\n\n# Use all training data\nx_train = np.concatenate([x_train, x_test])\ny_train = np.concatenate([y_train, y_test])\n\n# Normalize images to [-1, 1]\nx_train = x_train.astype('float32')\nx_train = (x_train - 127.5) / 127.5\n\nprint(f\"Training data shape: {x_train.shape}\")\nprint(f\"Data range: [{x_train.min()}, {x_train.max()}]\")\n\n# Create TensorFlow dataset\ntrain_dataset = tf.data.Dataset.from_tensor_slices(x_train)\ntrain_dataset = train_dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T08:07:35.423827Z","iopub.execute_input":"2025-11-13T08:07:35.424411Z","iopub.status.idle":"2025-11-13T08:07:40.709725Z","shell.execute_reply.started":"2025-11-13T08:07:35.42439Z","shell.execute_reply":"2025-11-13T08:07:40.708907Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 4: Generator model (Improved for high quality)\ndef make_generator_model():\n    model = tf.keras.Sequential()\n    \n    # Foundation layer\n    model.add(layers.Dense(8*8*256, use_bias=False, input_shape=(NOISE_DIM,)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU(alpha=0.2))\n    model.add(layers.Reshape((8, 8, 256)))\n    \n    # Upsampling block 1\n    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(2, 2), padding='same', use_bias=False))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU(alpha=0.2))\n    \n    # Upsampling block 2\n    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU(alpha=0.2))\n    \n    # Output layer\n    model.add(layers.Conv2DTranspose(CHANNELS, (5, 5), strides=(1, 1), padding='same', use_bias=False, \n                                    activation='tanh'))\n    \n    return model\n\ngenerator = make_generator_model()\ngenerator.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T08:07:43.162266Z","iopub.execute_input":"2025-11-13T08:07:43.162583Z","iopub.status.idle":"2025-11-13T08:07:43.267606Z","shell.execute_reply.started":"2025-11-13T08:07:43.162533Z","shell.execute_reply":"2025-11-13T08:07:43.267004Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 5: Discriminator model (Improved for high quality)\ndef make_discriminator_model():\n    model = tf.keras.Sequential()\n    \n    # Input layer\n    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same', \n                           input_shape=[IMAGE_SIZE, IMAGE_SIZE, CHANNELS]))\n    model.add(layers.LeakyReLU(alpha=0.2))\n    model.add(layers.Dropout(0.3))\n    \n    # Convolutional block 1\n    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.LeakyReLU(alpha=0.2))\n    model.add(layers.Dropout(0.3))\n    \n    # Convolutional block 2\n    model.add(layers.Conv2D(256, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.LeakyReLU(alpha=0.2))\n    model.add(layers.Dropout(0.3))\n    \n    # Output layer\n    model.add(layers.Flatten())\n    model.add(layers.Dense(1, activation='sigmoid'))\n    \n    return model\n\ndiscriminator = make_discriminator_model()\ndiscriminator.summary()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T08:07:56.903472Z","iopub.execute_input":"2025-11-13T08:07:56.903787Z","iopub.status.idle":"2025-11-13T08:07:56.993469Z","shell.execute_reply.started":"2025-11-13T08:07:56.903764Z","shell.execute_reply":"2025-11-13T08:07:56.992937Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 6: Loss functions and optimizers\ncross_entropy = tf.keras.losses.BinaryCrossentropy()\n\ndef discriminator_loss(real_output, fake_output):\n    real_loss = cross_entropy(tf.ones_like(real_output), real_output)\n    fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)\n    total_loss = real_loss + fake_loss\n    return total_loss\n\ndef generator_loss(fake_output):\n    return cross_entropy(tf.ones_like(fake_output), fake_output)\n\ngenerator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\ndiscriminator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T08:08:10.515973Z","iopub.execute_input":"2025-11-13T08:08:10.516252Z","iopub.status.idle":"2025-11-13T08:08:10.528745Z","shell.execute_reply.started":"2025-11-13T08:08:10.516232Z","shell.execute_reply":"2025-11-13T08:08:10.528099Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 7: Training setup\n# Seed for consistent image generation\nseed = tf.random.normal([NUM_EXAMPLES_TO_GENERATE, NOISE_DIM])\n\n# Checkpoint setup\ncheckpoint_dir = './training_checkpoints'\ncheckpoint_prefix = os.path.join(checkpoint_dir, \"ckpt\")\ncheckpoint = tf.train.Checkpoint(generator_optimizer=generator_optimizer,\n                                 discriminator_optimizer=discriminator_optimizer,\n                                 generator=generator,\n                                 discriminator=discriminator)\n\n# Lists to store losses for plotting\ng_losses = []\nd_losses = []","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T08:09:28.973337Z","iopub.execute_input":"2025-11-13T08:09:28.974152Z","iopub.status.idle":"2025-11-13T08:09:28.981405Z","shell.execute_reply.started":"2025-11-13T08:09:28.974126Z","shell.execute_reply":"2025-11-13T08:09:28.980778Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 8: Training step\n@tf.function\ndef train_step(images):\n    noise = tf.random.normal([BATCH_SIZE, NOISE_DIM])\n    \n    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:\n        generated_images = generator(noise, training=True)\n        \n        real_output = discriminator(images, training=True)\n        fake_output = discriminator(generated_images, training=True)\n        \n        gen_loss = generator_loss(fake_output)\n        disc_loss = discriminator_loss(real_output, fake_output)\n    \n    gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)\n    gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)\n    \n    generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))\n    discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))\n    \n    return gen_loss, disc_loss","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T08:09:36.836163Z","iopub.execute_input":"2025-11-13T08:09:36.836446Z","iopub.status.idle":"2025-11-13T08:09:36.847814Z","shell.execute_reply.started":"2025-11-13T08:09:36.836426Z","shell.execute_reply":"2025-11-13T08:09:36.847016Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 9: FIXED Generate and save images function\ndef generate_and_save_images(model, epoch, test_input):\n    predictions = model(test_input, training=False)\n    \n    # Convert tensor to numpy properly\n    predictions = predictions.numpy()\n    \n    fig = plt.figure(figsize=(4, 4))\n    \n    for i in range(predictions.shape[0]):\n        plt.subplot(4, 4, i+1)\n        plt.imshow((predictions[i] * 127.5 + 127.5).astype(np.uint8))\n        plt.axis('off')\n    \n    plt.tight_layout()\n    plt.savefig('image_at_epoch_{:04d}.png'.format(epoch))\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T08:09:44.876774Z","iopub.execute_input":"2025-11-13T08:09:44.877518Z","iopub.status.idle":"2025-11-13T08:09:44.882475Z","shell.execute_reply.started":"2025-11-13T08:09:44.877492Z","shell.execute_reply":"2025-11-13T08:09:44.881688Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 10: FIXED Training loop\ndef train(dataset, epochs):\n    for epoch in range(epochs):\n        start = time.time()\n        \n        epoch_g_loss = []\n        epoch_d_loss = []\n        \n        for image_batch in dataset:\n            g_loss, d_loss = train_step(image_batch)\n            epoch_g_loss.append(g_loss)\n            epoch_d_loss.append(d_loss)\n        \n        # Save losses (convert tensors to numpy)\n        g_losses.append(tf.reduce_mean(epoch_g_loss).numpy())\n        d_losses.append(tf.reduce_mean(epoch_d_loss).numpy())\n        \n        # Produce images for the GIF as we go\n        if epoch % 10 == 0:\n            generate_and_save_images(generator, epoch + 1, seed)\n        \n        # Save the model every 50 epochs\n        if (epoch + 1) % 50 == 0:\n            checkpoint.save(file_prefix=checkpoint_prefix)\n        \n        print('Time for epoch {} is {} sec'.format(epoch + 1, time.time()-start))\n        print('Generator Loss: {:.4f}, Discriminator Loss: {:.4f}'.format(\n            g_losses[-1], d_losses[-1]))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T08:09:55.357316Z","iopub.execute_input":"2025-11-13T08:09:55.358071Z","iopub.status.idle":"2025-11-13T08:09:55.363772Z","shell.execute_reply.started":"2025-11-13T08:09:55.358048Z","shell.execute_reply":"2025-11-13T08:09:55.363072Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 11: Start training (with fewer epochs for testing)\nprint(\"Starting training...\")\n# Train for fewer epochs first to test\ntrain(train_dataset, 70)  # Start with 5 epochs to test","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T08:55:53.677067Z","iopub.execute_input":"2025-11-13T08:55:53.677597Z","iopub.status.idle":"2025-11-13T09:38:02.964164Z","shell.execute_reply.started":"2025-11-13T08:55:53.677571Z","shell.execute_reply":"2025-11-13T09:38:02.963472Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 12: Plot training losses\nplt.figure(figsize=(15, 5))\n\nplt.subplot(1, 3, 1)\nplt.plot(g_losses, label='Generator Loss', color='blue', linewidth=2)\nplt.plot(d_losses, label='Discriminator Loss', color='red', linewidth=2)\nplt.xlabel('Epoch')\nplt.ylabel('Loss')\nplt.title('Training Losses')\nplt.legend()\nplt.grid(True)\n\nplt.subplot(1, 3, 2)\nplt.plot(g_losses, label='Generator Loss', color='blue', alpha=0.7, linewidth=2)\nplt.plot(d_losses, label='Discriminator Loss', color='red', alpha=0.7, linewidth=2)\nplt.yscale('log')\nplt.xlabel('Epoch')\nplt.ylabel('Loss (log scale)')\nplt.title('Training Losses (Log Scale)')\nplt.legend()\nplt.grid(True)\n\n# Loss ratio plot\nplt.subplot(1, 3, 3)\nloss_ratio = [g/d for g, d in zip(g_losses, d_losses)]\nplt.plot(loss_ratio, color='green', linewidth=2)\nplt.xlabel('Epoch')\nplt.ylabel('G/D Loss Ratio')\nplt.title('Generator/Discriminator Loss Ratio')\nplt.grid(True)\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T09:44:26.199734Z","iopub.execute_input":"2025-11-13T09:44:26.200025Z","iopub.status.idle":"2025-11-13T09:44:26.835417Z","shell.execute_reply.started":"2025-11-13T09:44:26.200005Z","shell.execute_reply":"2025-11-13T09:44:26.834686Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 13: FIXED Generate custom image function\ndef generate_custom_image(name_seed=None):\n    if name_seed is None:\n        # Use current time as seed\n        name_seed = str(time.time())\n    \n    # Create deterministic noise from the name\n    seed_hash = hash(name_seed) % (2**32)\n    tf.random.set_seed(seed_hash)\n    custom_noise = tf.random.normal([1, NOISE_DIM])\n    \n    generated_image = generator(custom_noise, training=False)\n    \n    # Convert to numpy for plotting\n    generated_image_np = generated_image.numpy()[0]\n    \n    plt.figure(figsize=(6, 6))\n    plt.imshow((generated_image_np * 127.5 + 127.5).astype(np.uint8))\n    plt.axis('off')\n    plt.title(f'Generated Image for: \"{name_seed}\"', fontsize=14, pad=20)\n    plt.show()\n    \n    return generated_image\n\n# Generate image for your name\nyour_name = \"Car\"  # Change this to your desired name\ngenerate_custom_image(your_name)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T09:44:27.638026Z","iopub.execute_input":"2025-11-13T09:44:27.638301Z","iopub.status.idle":"2025-11-13T09:44:27.746516Z","shell.execute_reply.started":"2025-11-13T09:44:27.638282Z","shell.execute_reply":"2025-11-13T09:44:27.745982Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 14: FIXED Generate multiple custom images\ndef generate_multiple_images(names):\n    num_images = len(names)\n    fig, axes = plt.subplots(1, num_images, figsize=(4*num_images, 4))\n    \n    if num_images == 1:\n        axes = [axes]\n    \n    for i, name in enumerate(names):\n        seed_hash = hash(name) % (2**32)\n        tf.random.set_seed(seed_hash)\n        custom_noise = tf.random.normal([1, NOISE_DIM])\n        generated_image = generator(custom_noise, training=False)\n        \n        # Convert to numpy\n        generated_image_np = generated_image.numpy()[0]\n        \n        axes[i].imshow((generated_image_np * 127.5 + 127.5).astype(np.uint8))\n        axes[i].set_title(f'\"{name}\"', fontsize=12)\n        axes[i].axis('off')\n    \n    plt.tight_layout()\n    plt.show()\n\n# Generate images for multiple names\nnames_to_generate = [\"HSOULD\", \"GAN\", \"CIFAR10\", \"AI\", \"T4GPU\"]\ngenerate_multiple_images(names_to_generate)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T09:45:16.853372Z","iopub.execute_input":"2025-11-13T09:45:16.853772Z","iopub.status.idle":"2025-11-13T09:45:17.310176Z","shell.execute_reply.started":"2025-11-13T09:45:16.853746Z","shell.execute_reply":"2025-11-13T09:45:17.309493Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 15: Continue training for more epochs\nprint(\"Continuing training for better quality...\")\n# Continue from where we left off\ntrain(train_dataset, EPOCHS - 120)  # Adjust based on how many epochs you already trained","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T09:57:09.987339Z","iopub.execute_input":"2025-11-13T09:57:09.987931Z","iopub.status.idle":"2025-11-13T09:57:11.951952Z","shell.execute_reply.started":"2025-11-13T09:57:09.987903Z","shell.execute_reply":"2025-11-13T09:57:11.950914Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 16: Generate high-quality final images\nprint(\"Generating final high-quality images...\")\n\n# Generate grid of images\nfinal_noise = tf.random.normal([25, NOISE_DIM])\nfinal_images = generator(final_noise, training=False)\nfinal_images_np = final_images.numpy()\n\nplt.figure(figsize=(10, 10))\nfor i in range(25):\n    plt.subplot(5, 5, i+1)\n    plt.imshow((final_images_np[i] * 127.5 + 127.5).astype(np.uint8))\n    plt.axis('off')\nplt.suptitle('Final Generated Images - CIFAR-10 GAN', fontsize=16)\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T09:57:55.738265Z","iopub.execute_input":"2025-11-13T09:57:55.738578Z","iopub.status.idle":"2025-11-13T09:57:56.24896Z","shell.execute_reply.started":"2025-11-13T09:57:55.738526Z","shell.execute_reply":"2025-11-13T09:57:56.248193Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 17: FIXED Image quality analysis\ndef analyze_image_quality():\n    # Generate a batch of images\n    test_noise = tf.random.normal([100, NOISE_DIM])\n    generated_images = generator(test_noise, training=False)\n    generated_images_np = generated_images.numpy()\n    \n    # Calculate basic statistics\n    mean_values = np.mean(generated_images_np, axis=(0, 1, 2))\n    std_values = np.std(generated_images_np, axis=(0, 1, 2))\n    \n    print(\"Image Quality Analysis:\")\n    print(f\"Mean pixel values (RGB): {mean_values}\")\n    print(f\"Std pixel values (RGB): {std_values}\")\n    print(f\"Overall image range: [{generated_images_np.min():.3f}, {generated_images_np.max():.3f}]\")\n    \n    # Plot histogram of pixel values\n    plt.figure(figsize=(12, 4))\n    \n    plt.subplot(1, 3, 1)\n    plt.hist(generated_images_np.flatten(), bins=50, alpha=0.7, color='blue')\n    plt.title('Pixel Value Distribution')\n    plt.xlabel('Pixel Value')\n    plt.ylabel('Frequency')\n    \n    plt.subplot(1, 3, 2)\n    plt.plot(g_losses, label='G Loss')\n    plt.plot(d_losses, label='D Loss')\n    plt.title('Training History')\n    plt.xlabel('Epoch')\n    plt.ylabel('Loss')\n    plt.legend()\n    \n    plt.subplot(1, 3, 3)\n    # Show one sample image\n    sample_img = (generated_images_np[0] * 127.5 + 127.5).astype(np.uint8)\n    plt.imshow(sample_img)\n    plt.title('Sample Generated Image')\n    plt.axis('off')\n    \n    plt.tight_layout()\n    plt.show()\n\nanalyze_image_quality()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T10:12:54.716341Z","iopub.execute_input":"2025-11-13T10:12:54.716951Z","iopub.status.idle":"2025-11-13T10:12:55.489495Z","shell.execute_reply.started":"2025-11-13T10:12:54.716927Z","shell.execute_reply":"2025-11-13T10:12:55.488815Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cell 18: Save the final model\n# Save generator model\ngenerator.save('cifar10_gan_generator.h5')\n\n# Save weights\ngenerator.save_weights('cifar10_gan_generator_weights.h5')\n\nprint(\"Model saved successfully!\")\nprint(\"You can now generate images for any name/text using generate_custom_image() function!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T10:13:01.278122Z","iopub.execute_input":"2025-11-13T10:13:01.278914Z","iopub.status.idle":"2025-11-13T10:13:01.341903Z","shell.execute_reply.started":"2025-11-13T10:13:01.278888Z","shell.execute_reply":"2025-11-13T10:13:01.34093Z"}},"outputs":[],"execution_count":null}]}