{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":87230,"databundleVersionId":9911932,"sourceType":"competition"}],"dockerImageVersionId":31040,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Part2 Neural network model","metadata":{}},{"cell_type":"markdown","source":"<p style=\"background-color:#fff6ff; padding:15px; border-width:3px; border-color:#efe6ef; border-style:solid; border-radius:6px\"> 🚨 &nbsp; <b>This file cannot be run on Kaggle Colab.</b><br> I created it on local PC, combined multiple files, and edited them.</p>","metadata":{}},{"cell_type":"markdown","source":"The neural networks for interpolating data (Model 1) and for modeling permittivity distribution (Model 2) were developed on different PCs.","metadata":{}},{"cell_type":"markdown","source":"# 1. Model1 The neural networks for interpolating data","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\nimport tensorflow as tf\nfrom tensorflow.keras.optimizers import Adam","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nprint(tf.__version__)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\n\nsys_details = tf.sysconfig.get_build_info()\ncuda_version = sys_details[\"cuda_version\"]\nprint('cuda_version: ', cuda_version)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport os\nimport tensorflow as tf\nfrom tensorflow.keras.models import Model, load_model\nfrom tensorflow.keras.layers import (\n    Input,\n    Conv2D,\n    MaxPooling2D,\n    UpSampling2D,\n    Concatenate,\n    ZeroPadding2D,\n)\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\nfrom sklearn.model_selection import train_test_split\n\n# Define the paths to your data\ntrain_data_path = r\"F:\\gpr-max-deep-learning-challenge-1-gdlc-1\\Training_Bscan\\Training_Bscan\"\ntest_data_path = r\"F:\\gpr-max-deep-learning-challenge-1-gdlc-1\\Evaluation_Dataset\"\n\n# Number of training samples\nnum_train_samples = 4400\n# Number of test samples\nnum_test_samples = 100\n\n# Load the training data\nlabels_list = []\nfor i in range(num_train_samples):\n    filename = os.path.join(train_data_path, f\"Bscan_{i}.npy\")\n    data = np.load(filename)\n    labels_list.append(data)\n\nlabels = np.array(labels_list)  # Shape: (4400, H, W)\n\n# Initialize the training data with zeros\ntrain = np.zeros_like(labels)\n\n# Process each label to create the corresponding training data\nfor i, c in enumerate(labels):\n    # Normalize the Bscans from -1 to 1\n    c = c / np.max(np.abs(c))\n    labels[i] = c\n    # Fill the training data with the values of the A-scans for every 10 traces\n    train[i, :, 0:-1:10] = c[:, 0:-1:10]\n\n# Define U-net architecture\ndef unet_model(input_size=(None, None, 1)):\n    inputs = Input(input_size)\n    # Encoder\n    c1 = Conv2D(64, (3, 3), activation=\"relu\", padding=\"same\")(inputs)\n    c1 = Conv2D(64, (3, 3), activation=\"relu\", padding=\"same\")(c1)\n    p1 = MaxPooling2D((2, 2))(c1)\n\n    c2 = Conv2D(128, (3, 3), activation=\"relu\", padding=\"same\")(p1)\n    c2 = Conv2D(128, (3, 3), activation=\"relu\", padding=\"same\")(c2)\n    p2 = MaxPooling2D((2, 2))(c2)\n\n    c3 = Conv2D(256, (3, 3), activation=\"relu\", padding=\"same\")(p2)\n    c3 = Conv2D(256, (3, 3), activation=\"relu\", padding=\"same\")(c3)\n    p3 = MaxPooling2D((2, 2))(c3)\n\n    c4 = Conv2D(512, (3, 3), activation=\"relu\", padding=\"same\")(p3)\n    c4 = Conv2D(512, (3, 3), activation=\"relu\", padding=\"same\")(c4)\n    p4 = MaxPooling2D((2, 2))(c4)\n\n    c5 = Conv2D(1024, (3, 3), activation=\"relu\", padding=\"same\")(p4)\n    c5 = Conv2D(1024, (3, 3), activation=\"relu\", padding=\"same\")(c5)\n\n    # Decoder\n    u6 = UpSampling2D((2, 2))(c5)\n    u6 = Concatenate()([u6, c4])\n    c6 = Conv2D(512, (3, 3), activation=\"relu\", padding=\"same\")(u6)\n    c6 = Conv2D(512, (3, 3), activation=\"relu\", padding=\"same\")(c6)\n\n    u7 = UpSampling2D((2, 2))(c6)\n    u7 = ZeroPadding2D(padding=((1, 0), (1, 0)))(u7)\n    u7 = Concatenate()([u7, c3])\n    c7 = Conv2D(256, (3, 3), activation=\"relu\", padding=\"same\")(u7)\n    c7 = Conv2D(256, (3, 3), activation=\"relu\", padding=\"same\")(c7)\n\n    u8 = UpSampling2D((2, 2))(c7)\n    u8 = ZeroPadding2D(padding=((1, 0), (1, 0)))(u8)\n    u8 = Concatenate()([u8, c2])\n    c8 = Conv2D(128, (3, 3), activation=\"relu\", padding=\"same\")(u8)\n    c8 = Conv2D(128, (3, 3), activation=\"relu\", padding=\"same\")(c8)\n\n    u9 = UpSampling2D((2, 2))(c8)\n    u9 = Concatenate()([u9, c1])\n    c9 = Conv2D(64, (3, 3), activation=\"relu\", padding=\"same\")(u9)\n    c9 = Conv2D(64, (3, 3), activation=\"relu\", padding=\"same\")(c9)\n\n    outputs = Conv2D(1, (1, 1), activation=\"linear\")(c9)\n    model = Model(inputs=[inputs], outputs=[outputs])\n    return model\n\n# Initiate the model\nmodel = unet_model(input_size=(labels.shape[1], labels.shape[2], 1))\nmodel.summary()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Add an extra dimension to train and labels\nTrain = train[..., np.newaxis]  # Shape: (4400, H, W, 1)\nLabels = labels[..., np.newaxis]  # Shape: (4400, H, W, 1)\n\n# Split data into training and validation sets\nx_train, x_val, y_train, y_val = train_test_split(Train, Labels, test_size=0.1, random_state=42)\n\n# Compile the model\nmodel.compile(optimizer=\"adam\", loss=\"mean_squared_error\", metrics=[\"mae\"])\n\n# Define callbacks\nearly_stopping = EarlyStopping(monitor=\"val_loss\", mode=\"min\", verbose=1, patience=30)\nmodel_checkpoint = ModelCheckpoint(\n    \"Fill_Missing.h5\", monitor=\"val_loss\", mode=\"min\", save_best_only=True\n)\n\n# Adjust learning rate\nmodel.optimizer.learning_rate = 1e-4\n\n# Train the model\nhistory = model.fit(\n    x_train,\n    y_train,\n    validation_data=(x_val, y_val),\n    epochs=100,\n    batch_size=16,\n    callbacks=[early_stopping, model_checkpoint],\n)\n\n","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load the best model\nsaved_model = load_model(\"Fill_Missing.h5\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# (Optional) Evaluate on validation set\nval_predictions = saved_model.predict(x_val)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from matplotlib import pyplot as plt","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Adopt this","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport os\n\n# Load test data and prepare for prediction\ntest_list = []\nfor i in range(num_test_samples):\n    filename = os.path.join(test_data_path, f\"Testing_Bscan_{i}.npy\")\n    data = np.load(filename)\n    \n    # Replace NaN with 0\n    data = np.nan_to_num(data, nan=0.0)\n    \n    # Normalize considering only non-NaN values\n    max_val = np.max(np.abs(data)) \n    if max_val > 0:  # Avoid division by zero\n        data = data / max_val\n    \n    # Append the normalized data to the list\n    test_list.append(data)\n\n# Convert to numpy array and add extra dimension\nif test_list:\n    test_data = np.array(test_list)[..., np.newaxis]  # Shape: (N, H, W, 1)\nelse:\n    print(\"No valid test data found.\")\n    test_data = np.empty((0, 0, 0, 0))  # Empty array in case of no valid data\n\n# Generate predictions on test data\ntest_predictions = saved_model.predict(test_data)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Check the data interpolation by making it visible.","metadata":{}},{"cell_type":"code","source":"# Plot some results\nfor i in range(min(5, len(test_predictions))):\n    plt.figure(figsize=(12, 4))\n    plt.subplot(1, 3, 1)\n    plt.imshow(test_data[i, ..., 0], cmap=\"bone\")\n    plt.axis(\"off\")\n    plt.title(\"Corrupted Input\")\n\n    plt.subplot(1, 3, 2)\n    plt.imshow(test_predictions[i, ..., 0], cmap=\"bone\")\n    plt.axis(\"off\")\n    plt.title(\"Model Output\")\n\n    # If ground truth is available for test data, plot it\n    # Otherwise, this section can be commented out\n    # plt.subplot(1, 3, 3)\n    # plt.imshow(ground_truth[i, ..., 0], cmap=\"bone\")\n    # plt.axis(\"off\")\n    # plt.title(\"Ground Truth\")\n\n    plt.show()","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data[i, ..., 0].shape","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data.shape","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_predictions.shape","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Simply specifying a file name to load a model will result in an error.  \nhttps://www.tensorflow.org/guide/keras/save_and_serialize#registering_the_custom_object for details.","metadata":{}},{"cell_type":"markdown","source":"# 2. Model2 The neural networks for modeling permittivity distribution","metadata":{}},{"cell_type":"code","source":"!pip install mlflow","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install \"flaml[blendsearch]\"","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\ninfo = tf.sysconfig.get_build_info()\nprint(\"CUDA Version:\", info[\"cuda_version\"])\nprint(\"cuDNN Version:\", info[\"cudnn_version\"])\n","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\ntf.config.list_physical_devices('GPU')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nprint(tf.__version__)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport datetime\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate, Dropout, Cropping2D\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.initializers import he_normal\nfrom tensorflow.keras.optimizers import Adam\nfrom flaml import tune\nfrom sklearn.model_selection import train_test_split\n\nimport mlflow\nimport mlflow.tensorflow","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"tf.config.list_physical_devices('GPU')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport datetime\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.layers import (\n    Input, Conv2D, MaxPooling2D, UpSampling2D,\n    concatenate, Dropout, Cropping2D, BatchNormalization\n)\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.initializers import he_normal\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import TensorBoard, EarlyStopping, ModelCheckpoint\nfrom flaml import tune\nimport mlflow\nimport mlflow.tensorflow\nfrom sklearn.model_selection import train_test_split\n\n# --- 入力とラベルのサイズ ---\nINPUT_HEIGHT = 230\nINPUT_WIDTH  = 230\nLABEL_HEIGHT = 224\nLABEL_WIDTH  = 224\nCHANNELS     = 1\n\n# --- TFRecord ファイルのパス ---\nTRAIN_TFRECORD = \"/mnt/f/gpr-max-deep-learning-challenge-1-gdlc-1/tfrecords/train.tfrecord\"\nVAL_TFRECORD   = \"/mnt/f/gpr-max-deep-learning-challenge-1-gdlc-1/tfrecords/val.tfrecord\"\n\n# --- データセット情報 ---\ndataset_info = {\n    \"Training_Bscan\": {\n        \"input_dir\": r\"/mnt/f/gpr-max-deep-learning-challenge-1-gdlc-1/Training_Bscan/Training_Bscan\",\n        \"label_dir\": r\"/mnt/f/gpr-max-deep-learning-challenge-1-gdlc-1/Training_Labels/Training_Labels\",\n        \"count\": 4400\n    },\n    \"add_simu\": {\n        \"input_dir\": r\"/mnt/f/gpr-max-deep-learning-challenge-1-gdlc-1/add_simu\",\n        \"label_dir\": r\"/mnt/f/gpr-max-deep-learning-challenge-1-gdlc-1/add_simu_model\",\n        \"count\": 15000\n    }\n}\n\n# --- TFRecord 用 Feature ヘルパー ---\ndef _float_feature(values):\n    return tf.train.Feature(float_list=tf.train.FloatList(value=values))\n\n# --- TFRecord 作成関数 ---\ndef create_tfrecord(pairs, tfrecord_path):\n    os.makedirs(os.path.dirname(tfrecord_path), exist_ok=True)\n    with tf.io.TFRecordWriter(tfrecord_path) as writer:\n        for input_path, label_path in pairs:\n            # .npy ファイル読み込み\n            input_arr = np.load(input_path)    # shape (230, 230)\n            label_arr = np.load(label_path)    # shape (224, 224)\n\n            # 入力データ正規化 [-1, 1]\n            input_norm = input_arr / np.max(np.abs(input_arr), axis=(0,1), keepdims=True)\n            # ラベルデータ正規化 [-0.5, 0.5]\n            label_norm = label_arr / 10.0 - 0.5\n\n            # float32 型に変換\n            input_norm = input_norm.astype(np.float32)\n            label_norm = label_norm.astype(np.float32)\n\n            # フラット化\n            input_flat = input_norm.flatten()  # length 230*230\n            label_flat = label_norm.flatten()  # length 224*224\n\n            # Example 作成\n            example = tf.train.Example(features=tf.train.Features(feature={\n                'input': _float_feature(input_flat.tolist()),\n                'label': _float_feature(label_flat.tolist()),\n            }))\n            writer.write(example.SerializeToString())\n    print(f\"Wrote {len(pairs)} records to {tfrecord_path}\")\n\n# --- TFRecord 前処理実行 ---\ndef prepare_tfrecords(test_size=0.02578, seed=42):\n    # データペアリスト作成（入力ファイル名のプレフィックスを dataset 名で切り替え）\n    all_pairs = []\n    for name, info in dataset_info.items():\n        inp_dir = info['input_dir']\n        lbl_dir = info['label_dir']\n        count   = info['count']\n        # add_simu ディレクトリのみ \"add_simu_Bscan_\" プレフィックス\n        prefix = 'add_simu_Bscan_' if name == 'add_simu' else 'Bscan_'\n        for i in range(count):\n            inp = os.path.join(inp_dir, f\"{prefix}{i}.npy\")\n            lbl = os.path.join(lbl_dir, f\"Model_{i}.npy\")\n            all_pairs.append((inp, lbl))\n\n    # 訓練/検証 分割\n    train_pairs, val_pairs = train_test_split(\n        all_pairs, test_size=test_size, random_state=seed\n    )\n\n    # TFRecord 作成\n    create_tfrecord(train_pairs, TRAIN_TFRECORD)\n    create_tfrecord(val_pairs,   VAL_TFRECORD)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# TFRecord 作成を実行\nprepare_tfrecords()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# --- MLflow セットアップ ---\nmlflow.set_tracking_uri(\"file:///mnt/f/ml_log\")\nmlflow.set_experiment(\"gpr_unet_experiment2\")\n\n# --- TFRecord をパースする関数 ---\ndef _parse_function(example_proto):\n    feature_description = {\n        'input': tf.io.FixedLenFeature([INPUT_HEIGHT * INPUT_WIDTH], tf.float32),\n        'label': tf.io.FixedLenFeature([LABEL_HEIGHT * LABEL_WIDTH], tf.float32),\n    }\n    parsed = tf.io.parse_single_example(example_proto, feature_description)\n    image = tf.reshape(parsed['input'], [INPUT_HEIGHT, INPUT_WIDTH, 1])\n    label = tf.reshape(parsed['label'], [LABEL_HEIGHT, LABEL_WIDTH, 1])\n    return image, label\n\n# --- U-Net モデル構築 ---\ndef build_unet_model_ver2(params, input_size=(INPUT_HEIGHT, INPUT_WIDTH, CHANNELS)):\n    base_filters = params.get(\"filters\", 32)\n    kernel_size   = params.get(\"kernel_size\", 6)\n    d1 = params.get(\"dropout1\", 0.1)\n    d2 = params.get(\"dropout2\", 0.2)\n    d3 = params.get(\"dropout3\", 0.3)\n\n    inputs_layer = Input(input_size)\n    # --- Encoder ---\n    c1 = Conv2D(base_filters, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(inputs_layer)\n    c1 = BatchNormalization()(c1)\n    c1 = Dropout(d1)(c1)\n    c1 = Conv2D(base_filters, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(c1)\n    p1 = MaxPooling2D((2, 2))(c1)\n\n    c2 = Conv2D(base_filters*2, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(p1)\n    c2 = BatchNormalization()(c2)\n    c2 = Dropout(d1)(c2)\n    c2 = Conv2D(base_filters*2, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(c2)\n    p2 = MaxPooling2D((2, 2))(c2)\n\n    c3 = Conv2D(base_filters*4, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(p2)\n    c3 = BatchNormalization()(c3)\n    c3 = Dropout(d2)(c3)\n    c3 = Conv2D(base_filters*4, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(c3)\n    p3 = MaxPooling2D((2, 2))(c3)\n\n    c4 = Conv2D(base_filters*8, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(p3)\n    c4 = BatchNormalization()(c4)\n    c4 = Dropout(d2)(c4)\n    c4 = Conv2D(base_filters*8, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(c4)\n    p4 = MaxPooling2D((2, 2))(c4)\n\n    # --- Bottleneck ---\n    c5 = Conv2D(base_filters*16, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(p4)\n    c5 = BatchNormalization()(c5)\n    c5 = Dropout(d3)(c5)\n    c5 = Conv2D(base_filters*16, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(c5)\n\n    # --- Decoder ---\n    u6 = UpSampling2D((2, 2))(c5)\n    u6 = concatenate([u6, c4])\n    c6 = Conv2D(base_filters*8, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(u6)\n    c6 = BatchNormalization()(c6)\n    c6 = Dropout(d2)(c6)\n    c6 = Conv2D(base_filters*8, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(c6)\n\n    u7 = UpSampling2D((2, 2))(c6)\n    c3_cropped = Cropping2D(cropping=((0,1),(0,1)))(c3)\n    u7 = concatenate([u7, c3_cropped])\n    c7 = Conv2D(base_filters*4, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(u7)\n    c7 = BatchNormalization()(c7)\n    c7 = Dropout(d2)(c7)\n    c7 = Conv2D(base_filters*4, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(c7)\n\n    u8 = UpSampling2D((2, 2))(c7)\n    c2_cropped = Cropping2D(cropping=((1,2),(1,2)))(c2)\n    u8 = concatenate([u8, c2_cropped])\n    c8 = Conv2D(base_filters*2, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(u8)\n    c8 = BatchNormalization()(c8)\n    c8 = Dropout(d1)(c8)\n    c8 = Conv2D(base_filters*2, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(c8)\n\n    u9 = UpSampling2D((2, 2))(c8)\n    c1_cropped = Cropping2D(cropping=((3,3),(3,3)))(c1)\n    u9 = concatenate([u9, c1_cropped])\n    c9 = Conv2D(base_filters, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(u9)\n    c9 = BatchNormalization()(c9)\n    c9 = Dropout(d1)(c9)\n    c9 = Conv2D(base_filters, (kernel_size, kernel_size), activation='relu', padding='same', kernel_initializer=he_normal())(c9)\n\n    outputs = Conv2D(1, (1, 1), activation='linear')(c9)\n    return Model(inputs=[inputs_layer], outputs=[outputs])\n\n# --- トレーニング関数 ---\ndef train_unet(config):\n    with mlflow.start_run():\n        mlflow.log_params(config)\n        for name, info in dataset_info.items():\n            mlflow.log_param(f\"dataset.{name}.input_dir\", info['input_dir'])\n            mlflow.log_param(f\"dataset.{name}.label_dir\", info['label_dir'])\n            mlflow.log_param(f\"dataset.{name}.count\",     info['count'])\n        ts = datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n        mlflow.log_param(\"timestamp\", ts)\n\n        # データセット構築\n        train_ds = (\n            tf.data.TFRecordDataset([TRAIN_TFRECORD],buffer_size=4*1024*1024)\n            .map(_parse_function, num_parallel_calls=tf.data.AUTOTUNE)\n            .shuffle(buffer_size=1024)\n            .batch(config.get(\"batch_size\", 16))\n            .prefetch(buffer_size=tf.data.AUTOTUNE)\n        )\n        val_ds = (\n            tf.data.TFRecordDataset([VAL_TFRECORD])\n            .map(_parse_function, num_parallel_calls=tf.data.AUTOTUNE)\n            .batch(config.get(\"batch_size\", 16))\n            .prefetch(tf.data.AUTOTUNE)\n        )\n\n        # モデル構築・コンパイル\n        model = build_unet_model_ver2(config)\n        optimizer = Adam(learning_rate=config.get(\"lr\", 5e-4))\n        model.compile(\n            optimizer=optimizer,\n            loss=lambda y_true, y_pred: tf.reduce_mean(tf.abs(y_true - y_pred)),\n            metrics=['mae']\n        )\n\n        # コールバック定義\n        base_dir = '/mnt/f/gpr-max-deep-learning-challenge-1-gdlc-1/tf_run8'\n        log_dir = os.path.join(base_dir, ts)\n        best_model_path = os.path.join(base_dir, f\"{ts}_flaml_best_model.h5\")\n        callbacks = [\n            TensorBoard(log_dir=log_dir, histogram_freq=0, write_images=False, update_freq='epoch' ),\n            EarlyStopping(monitor=\"val_loss\", mode=\"min\", patience=10, verbose=1),\n            ModelCheckpoint(best_model_path, monitor=\"val_loss\", mode=\"min\", save_best_only=True)\n        ]\n\n        # モデル学習\n        history = model.fit(\n            train_ds,\n            validation_data=val_ds,\n            epochs=100,\n            verbose=0,\n            callbacks=callbacks\n        )\n\n        final_loss = history.history['val_loss'][-1]\n        mlflow.log_metric(\"final_val_loss\", final_loss)\n        mlflow.log_artifact(best_model_path, artifact_path=\"models\")\n        tune.report(loss=final_loss)\n","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# --- ハイパーパラメータ探索設定 ---\nsearch_space = {\n    \"filters\": tune.choice([72]),\n    \"kernel_size\": tune.choice([7]),\n    \"dropout1\": tune.uniform(0.1, 0.2),\n    \"dropout2\": tune.uniform(0.2, 0.3),\n    \"dropout3\": tune.uniform(0.25, 0.4),\n    \"lr\": tune.loguniform(1e-5, 1e-3),\n    \"batch_size\": tune.choice([16])\n}","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from flaml import BlendSearch\n\nblend = BlendSearch(\n    metric=\"loss\",     # 最適化する指標\n    mode=\"min\",        # minimize (val_loss を小さく)\n)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for num_run in range(100):\n\n    analysis3 = tune.run(\n        train_unet,\n        config=search_space,\n        metric=\"loss\", mode=\"min\",\n        num_samples=1,\n        search_alg=blend\n    )\n    blend.save(r\"/mnt/f/gpr-max-deep-learning-challenge-1-gdlc-1/blend_search_obj_LD.pkl\")","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"cell_type":"raw","source":"laml.tune.tune: 05-07 11:16:41] {891} INFO - trial 1 config: {'filters': 72, 'kernel_size': 7, 'dropout1': 0.10974320728789493, 'dropout2': 0.2647266081332192, 'dropout3': 0.3044213842717114, 'lr': 5.461587558683645e-05, 'batch_size': 16} \nEpoch 94: early stopping","metadata":{}},{"cell_type":"markdown","source":"# 4. Model1 result","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport os\nfrom matplotlib import pyplot as plt\nimport tensorflow as tf\nfrom tensorflow.keras.models import Model, load_model\nfrom tensorflow.keras.layers import (\n    Input,\n    Conv2D,\n    MaxPooling2D,\n    UpSampling2D,\n    Concatenate,\n    ZeroPadding2D,\n)\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\nfrom sklearn.model_selection import train_test_split\n\n# Load the best model\nsaved_model = load_model(\"Fill_Missing.h5\")","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data_path = r\"F:\\gpr-max-deep-learning-challenge-1-gdlc-1\\Evaluation_Dataset\"\nnum_test_samples = 100\n\n# Load test data and prepare for prediction\ntest_list = []\nnan_data_list = []\nfor i in range(num_test_samples):\n    filename = os.path.join(test_data_path, f\"Testing_Bscan_{i}.npy\")\n    data = np.load(filename)\n\n    ######################\n    data_nan_mask = np.isnan(data)\n    \n    # Replace NaN with 0\n    data = np.nan_to_num(data, nan=0.0)\n    \n    # Normalize considering only non-NaN values\n    max_val = np.max(np.abs(data))  # NaNはすでに0に変換されている\n    if max_val > 0:  # Avoid division by zero\n        data = data / max_val\n    \n    # Append the normalized data to the list\n    test_list.append(data)\n    nan_data_list.append(data_nan_mask)\n\n# Convert to numpy array and add extra dimension\nif test_list:\n    test_data = np.array(test_list)[..., np.newaxis]  # Shape: (N, H, W, 1)\n    nan_mask = np.array(nan_data_list)[..., np.newaxis]  # Shape: (N, H, W, 1)\nelse:\n    print(\"No valid test data found.\")\n    test_data = np.empty((0, 0, 0, 0))  # Empty array in case of no valid data","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Generate predictions on test data\ntest_predictions = saved_model.predict(test_data)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"scale_test_predictions = np.zeros_like(test_predictions)\n\nfor i in range(len(test_predictions)):\n    tmp_scale = np.mean(np.abs(test_predictions[i, ..., 0]))/np.mean(np.abs(test_data[i, ..., 0]))\n    scale_test_predictions[i, ..., 0] = test_predictions[i, ..., 0] / tmp_scale\n\nscale_test_predictions[~nan_mask] = test_data[~nan_mask]","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_predictions.shape","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from matplotlib import pyplot as plt\n\nfor i in range(min(5, len(test_predictions))):\n#for i in range(len(test_predictions)):\n    plt.figure(figsize=(12, 4))\n    plt.subplot(1, 3, 1)\n    tmp_vmax = np.max(np.abs(test_data[i, ..., 0]))\n    img = plt.imshow(test_data[i, ..., 0], cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    plt.axis(\"off\")\n    #plt.title(\"Corrupted Input\")\n    plt.title('Test Input {:04d}'.format(i))\n    cbar = plt.colorbar(img)\n\n    plt.subplot(1, 3, 2)\n    img2 = plt.imshow(np.squeeze(scale_test_predictions[i, ...], axis=-1), cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    plt.axis(\"off\")\n    #plt.title(\"Model Output\")\n    plt.title('Output {:04d}'.format(i))\n    cbar2 = plt.colorbar(img2)\n\n\n    plt.subplot(1, 3, 3)\n    img3 = plt.imshow(test_data[i, ..., 0] - np.squeeze(scale_test_predictions[i, ...], axis=-1), cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    #plt.imshow(ground_truth[i, ..., 0], cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    cbar3 = plt.colorbar(img3)\n    \n    plt.axis(\"off\")\n    plt.title(\"Diff\")\n\n    plt.show()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Generate predictions on test data\ntest_predictions2 = saved_model.predict(scale_test_predictions)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"scale_test_predictions2 = np.zeros_like(test_predictions2)\n\nfor i in range(len(test_predictions)):\n    tmp_scale = np.mean(np.abs(test_predictions2[i, ..., 0]))/np.mean(np.abs(test_data[i, ..., 0]))\n    scale_test_predictions2[i, ..., 0] = test_predictions2[i, ..., 0] / tmp_scale\n\nscale_test_predictions2[~nan_mask] = test_data[~nan_mask]","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from matplotlib import pyplot as plt\n\nfor i in range(min(5, len(test_predictions))):\n#for i in range(len(test_predictions)):\n    plt.figure(figsize=(12, 4))\n    plt.subplot(1, 3, 1)\n    tmp_vmax = np.max(np.abs(test_data[i, ..., 0]))\n    img = plt.imshow(test_data[i, ..., 0], cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    plt.axis(\"off\")\n    #plt.title(\"Corrupted Input\")\n    plt.title('Test Input {:04d}'.format(i))\n    cbar = plt.colorbar(img)\n\n    plt.subplot(1, 3, 2)\n    img2 = plt.imshow(np.squeeze(scale_test_predictions2[i, ...], axis=-1), cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    plt.axis(\"off\")\n    #plt.title(\"Model Output\")\n    plt.title('Output {:04d}'.format(i))\n    cbar2 = plt.colorbar(img2)\n\n\n    plt.subplot(1, 3, 3)\n    img3 = plt.imshow(test_data[i, ..., 0] - np.squeeze(scale_test_predictions2[i, ...], axis=-1), cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    #plt.imshow(ground_truth[i, ..., 0], cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    cbar3 = plt.colorbar(img3)\n    \n    plt.axis(\"off\")\n    plt.title(\"Diff\")\n\n    plt.show()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Generate predictions on test data\ntest_predictions3 = saved_model.predict(scale_test_predictions2)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"scale_test_predictions3 = np.zeros_like(test_predictions3)\n\nfor i in range(len(test_predictions)):\n    tmp_scale = np.mean(np.abs(test_predictions3[i, ..., 0]))/np.mean(np.abs(test_data[i, ..., 0]))\n    scale_test_predictions3[i, ..., 0] = test_predictions3[i, ..., 0] / tmp_scale\n\nscale_test_predictions3[~nan_mask] = test_data[~nan_mask]","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from matplotlib import pyplot as plt\n\nfor i in range(min(5, len(test_predictions))):\n#for i in range(len(test_predictions)):\n    plt.figure(figsize=(12, 4))\n    plt.subplot(1, 3, 1)\n    tmp_vmax = np.max(np.abs(test_data[i, ..., 0]))\n    img = plt.imshow(test_data[i, ..., 0], cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    plt.axis(\"off\")\n    #plt.title(\"Corrupted Input\")\n    plt.title('Test Input {:04d}'.format(i))\n    cbar = plt.colorbar(img)\n\n    plt.subplot(1, 3, 2)\n    img2 = plt.imshow(np.squeeze(scale_test_predictions3[i, ...], axis=-1), cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    plt.axis(\"off\")\n    #plt.title(\"Model Output\")\n    plt.title('Output {:04d}'.format(i))\n    cbar2 = plt.colorbar(img2)\n\n\n    plt.subplot(1, 3, 3)\n    img3 = plt.imshow(test_data[i, ..., 0] - np.squeeze(scale_test_predictions3[i, ...], axis=-1), cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    #plt.imshow(ground_truth[i, ..., 0], cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    cbar3 = plt.colorbar(img3)\n    \n    plt.axis(\"off\")\n    plt.title(\"Diff\")\n\n    plt.show()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Generate predictions on test data\ntest_predictions4 = saved_model.predict(scale_test_predictions3)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"scale_test_predictions4 = np.zeros_like(test_predictions4)\n\nfor i in range(len(test_predictions)):\n    tmp_scale = np.mean(np.abs(test_predictions4[i, ..., 0]))/np.mean(np.abs(test_data[i, ..., 0]))\n    scale_test_predictions4[i, ..., 0] = test_predictions4[i, ..., 0] / tmp_scale\n\nscale_test_predictions4[~nan_mask] = test_data[~nan_mask]","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from matplotlib import pyplot as plt\n\nfor i in range(min(5, len(test_predictions))):\n#for i in range(len(test_predictions)):\n    plt.figure(figsize=(12, 4))\n    plt.subplot(1, 3, 1)\n    tmp_vmax = np.max(np.abs(test_data[i, ..., 0]))\n    img = plt.imshow(test_data[i, ..., 0], cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    plt.axis(\"off\")\n    #plt.title(\"Corrupted Input\")\n    plt.title('Test Input {:04d}'.format(i))\n    cbar = plt.colorbar(img)\n\n    plt.subplot(1, 3, 2)\n    img2 = plt.imshow(np.squeeze(scale_test_predictions4[i, ...], axis=-1), cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    plt.axis(\"off\")\n    #plt.title(\"Model Output\")\n    plt.title('Output {:04d}'.format(i))\n    cbar2 = plt.colorbar(img2)\n\n\n    plt.subplot(1, 3, 3)\n    img3 = plt.imshow(test_data[i, ..., 0] - np.squeeze(scale_test_predictions4[i, ...], axis=-1), cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    #plt.imshow(ground_truth[i, ..., 0], cmap=\"bone\", vmin = -tmp_vmax/20, vmax = tmp_vmax/20)\n    cbar3 = plt.colorbar(img3)\n    \n    plt.axis(\"off\")\n    plt.title(\"Diff\")\n\n    plt.show()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"np.save(r'F:\\gpr-max-deep-learning-challenge-1-gdlc-1\\scale_test_predictions4.npy', scale_test_predictions4)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 5. Preparation for Notebook Part3 visualization and Finetune","metadata":{}},{"cell_type":"markdown","source":"<p style=\"background-color:#fff6ff; padding:15px; border-width:3px; border-color:#efe6ef; border-style:solid; border-radius:6px\"> 🚨 &nbsp; <b>The following method is an approximate model.</b><br>Strictly speaking, one must be careful to set variables based on the Yee lattice variable position and account for the slope of the layer structure. The following model approximates the location of the variable as being on the center of the lattice.</p>","metadata":{}},{"cell_type":"markdown","source":"https://docs.gprmax.com/en/latest/gprmodelling.html","metadata":{}},{"cell_type":"markdown","source":"<img src=\"https://docs.gprmax.com/en/latest/_images/yeecell3d.png\"\n     alt=\"YeeCell3D\"\n     width=\"600\">","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport h5py\nfrom scipy.ndimage import zoom\n\ndef make_materials_txt_and_h5_lowres(Id2, src_h5_file_name ,h5_file_name, txt_file_name, is_rescale = True):\n    \n    #Id2.shape (224, 224)\n    #domain: 50.02 26 0.02 \n    # #dx_dy_dz: 0.02 0.02 0.02 \n\n    #transpose and upside down\n    Id2 = np.flipud(Id2).T\n\n    # rescale data\n    if(is_rescale):\n        Id2 = (Id2 + 0.5) * 10\n\n    # Id2 (224 x 224) ->  data(2500 x 1100)\n    zoom_factors = (2500 / 224, 1100 / 224)\n    data = zoom(Id2, zoom_factors, order=0)  # order=0 for nearest-neighbor\n\n    # trim data range(1, 10)\n    data = np.clip(data, 1, 10)\n\n    # round data 0.001\n    data = np.round(data, 3)\n\n    # data to Id, apply 1.0 -> 2, 1.01 -> 3 , ..., 10.0 -> 902\n    Id = (np.round((data - 1) * 100 + 2)).astype(int)\n\n    #geometry_objects_read: 0 0 0 ../src_model/file_geo.h5 ../src_model/file_geo_materials.txt\n    # 'file_geo_materials.txt'\n\n    #material: 1 inf 1 0 pec\n    #material: 1 0 1 0 free_space\n    #material: 8.76539 0.000876539 1 0 |geo_1_01|\n    #material: 8.88942 0.000888942 1 0 |geo_1_02|\n    #material: 9.01346 0.000901346 1 0 |geo_1_03|\n\n    #file_geo.h5\n    #ID\n    #32-bit unsigned integer\n    #6 x 2500 x 1100 x 1\n    # index 0 and 1 is 0\n    # index 2-5 fill data\n\n    #data\n    #64-bit integer\n    #2500 x 1100 x 1\n\n    #rigidE\n    #8-bit integer\n    #12 x 2500 x 1100 x 1\n    # all data is 1\n\n    #rigidH\n    #6 x 2500 x 1100 x 1\n    #8-bit integer\n    # all data is 1\n\n    # Id2 round at 0.01\n    # And apply number\n    # Id 0 pec\n    # Id 1 air\n    # Id 2 = 1 \n    # Id 9002 = 10\n\n    # write file_geo_materials.txt\n    with open(txt_file_name, 'w') as file:\n        # ヘッダー部分の書き込み\n        file.write('#material: 1 inf 1 0 pec\\n')\n        file.write('#material: 1 0 1 0 free_space\\n')\n    \n        # 1.00から10.000までを0.001ごとに処理\n        for i, v in enumerate(np.arange(1.00, 10.01, 0.01)):\n            file.write('#material: {} {} 1 0 |geo_{:04d}|\\n'.format(round(v, 3), round(v / 10000, 7), i + 1))\n\n    # write h5\n    # Copy and update the HDF5 file\n    # Copy and update the HDF5 file\n    with h5py.File(src_h5_file_name, \"r\") as src_file, h5py.File(h5_file_name, \"w\") as dest_file:\n        def copy_attrs(src_obj, dest_obj):\n            for key, value in src_obj.attrs.items():\n                dest_obj.attrs[key] = value\n\n        # Copy groups, datasets, and attributes\n        for name, obj in src_file.items():\n            if isinstance(obj, h5py.Group):\n                # Copy group\n                dest_group = dest_file.create_group(name)\n                copy_attrs(obj, dest_group)\n            elif isinstance(obj, h5py.Dataset):\n                # Copy dataset\n                dest_dataset = dest_file.create_dataset(name, data=obj[...])\n                copy_attrs(obj, dest_dataset)\n\n        # Copy root attributes\n        copy_attrs(src_file, dest_file)\n\n        # Update 'ID' dataset\n        if 'ID' in dest_file:\n            for i in range(2, 6):\n                dest_file['ID'][i, :, :, 0] = Id\n\n        # Update 'data' dataset\n        if 'data' in dest_file:\n            dest_file['data'][:, :, 0] = Id\n\n    return","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictions = np.maximum(predictions, 1.5)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in range(100):\n    make_materials_txt_and_h5_lowres(predictions[i], r\"F:\\file_geo.h5\" , r\"F:gpr-max-deep-learning-challenge-1-gdlc-1\\sub9_h5txt\\lowres_test_file_geo_result_{:04d}.h5\".format(i), r\"F:gpr-max-deep-learning-challenge-1-gdlc-1\\sub9_h5txt\\lowres_test_file_geo_materials_result_{:04d}.txt\".format(i), is_rescale = False)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"VTI形式で出力する。","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport vtk\nfrom vtk.util.numpy_support import numpy_to_vtk\n\nfor i in range(100):\n\n    # NumPy配列を作成または読み込み\n    data = predictions[i]\n    data = np.flipud(data)\n\n    # ParaViewのスケールに合わせて軸範囲を指定\n    x_min, x_max = 0, 50\n    y_min, y_max = 0, 22\n\n    # VTK配列に変換\n    vtk_data = numpy_to_vtk(data.ravel(), deep=True, array_type=vtk.VTK_FLOAT)\n    vtk_data.SetName(\"Epsilon_r\")\n\n    # VTK ImageDataオブジェクトを作成\n    image_data = vtk.vtkImageData()\n\n    image_data.SetDimensions(data.shape[1], data.shape[0], 1)\n    image_data.SetOrigin(x_min, y_min, 0)\n    image_data.SetSpacing((x_max - x_min) / (data.shape[1] - 1), (y_max - y_min) / (data.shape[0] - 1), 1)\n    image_data.GetPointData().SetScalars(vtk_data)\n\n    # ファイルに保存\n    writer = vtk.vtkXMLImageDataWriter()\n    writer.SetFileName(r\"F:\\gpr-max-deep-learning-challenge-1-gdlc-1\\sub9vti\\sub9_{:04d}_output_ud.vti\".format(i))\n    writer.SetInputData(image_data)\n    writer.Write()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from matplotlib import pyplot as plt\nimport os\n\nimg_folder = os.path.join(OUT_DIR, \"sub9_model_image\")\n\nfor i in range(100):\n    # 画像の表示\n    plt.figure(figsize=(6, 6))\n    img = plt.imshow(predictions[i], cmap='viridis_r', vmin=1.5, vmax=10, extent=[0, 50, 22, 0], aspect = 'auto')  # カラーマップを指定可能 (例: 'viridis')\n    #img = plt.imshow(B2, cmap='gray_r')  # カラーマップを指定可能 (例: 'viridis')\n\n    # カラーバーを追加\n    cbar = plt.colorbar(img)\n    cbar.set_label(r'$\\varepsilon_r$')\n    #cbar.set_label('Amplitude')\n\n    # 表示\n    plt.title('Model {:04d}'.format(i))\n    plt.xlabel(\"X [m]\")\n    plt.ylabel(\"Depth [m]\")\n    #plt.show()\n\n    filename = os.path.join(img_folder, f\"Test_model{i}.jpg\")\n    \n    plt.savefig(filename)\n    plt.close()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 6. Best Model","metadata":{}},{"cell_type":"code","source":"import numpy as np\nscale_test_predictions4 = np.load(r'/mnt/f/gpr-max-deep-learning-challenge-1-gdlc-1/scale_test_predictions4.npy')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.models import load_model\nimport tensorflow as tf\n\n# 名前付き関数としてカスタム損失を定義\ndef custom_loss(y_true, y_pred):\n    return tf.reduce_mean(tf.abs(y_true - y_pred))\n\nmodel_path = r\"/mnt/f/gpr-max-deep-learning-challenge-1-gdlc-1/bestmodel/20250507-111642_flaml_best_model.h5\"\n# custom_objectsに {'<lambda>': custom_loss} を渡す\nmodel = load_model(model_path, custom_objects={'<lambda>': custom_loss})\n\n# モデルの予測\nresult = model.predict(scale_test_predictions4)\n\n# 結果の形状を表示\nprint(\"Predicted result shape:\", result.shape)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"result = (result + 0.5) * 10\nresult_tmp = result","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from matplotlib import pyplot as plt\n\nfor i in range(10):\n    plt.figure(figsize=(6, 6))\n    img = plt.imshow(result[i], cmap='viridis_r', vmin=1.5, vmax=10, extent=[0, 50, 22, 0], aspect = 'auto')  # カラーマップを指定可能 (例: 'viridis')\n\n    cbar = plt.colorbar(img)\n    cbar.set_label(r'$\\varepsilon_r$')\n\n\n    # 表示\n    plt.title('Model {:04d}'.format(i))\n    plt.xlabel(\"X [m]\")\n    plt.ylabel(\"Depth [m]\")\n    plt.show()","metadata":{"scrolled":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictions = np.squeeze(result, axis=-1)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def around_plot(num):\n    plt.plot(predictions[num,:,0],label='0')\n    plt.plot(predictions[num,:,1],label='1')\n    plt.plot(predictions[num,:,2],label='2')\n    plt.plot(predictions[num,:,3],label='3')\n    plt.plot(predictions[num,:,4],label='4')\n    plt.legend()\n    plt.title('Left')\n    plt.show()\n\n    plt.plot(predictions[num,:,-1],label='-1')\n    plt.plot(predictions[num,:,-2],label='-2')\n    plt.plot(predictions[num,:,-3],label='-3')\n    plt.plot(predictions[num,:,-4],label='-4')\n    plt.plot(predictions[num,:,-5],label='-5')\n    plt.legend()\n    plt.title('Right')\n    plt.show()\n\n    plt.plot(predictions[num,0,:],label='0')\n    plt.plot(predictions[num,1,:],label='1')\n    plt.plot(predictions[num,2,:],label='2')\n    plt.plot(predictions[num,3,:],label='3')\n    plt.plot(predictions[num,4,:],label='4')\n    plt.legend()\n    plt.title('Top')\n    plt.show()\n\n    plt.plot(predictions[num,-1,:],label='-1')\n    plt.plot(predictions[num,-2,:],label='-2')\n    plt.plot(predictions[num,-3,:],label='-3')\n    plt.plot(predictions[num,-4,:],label='-4')\n    plt.plot(predictions[num,-5,:],label='-5')\n    plt.legend()\n    plt.title('Bottom')\n    plt.show()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"around_plot(7)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictions[:,:,-1] = predictions[:,:,-3]\npredictions[:,:,-2] = predictions[:,:,-3]\n\npredictions[:,0,:] = predictions[:,2,:]\npredictions[:,1,:] = predictions[:,2,:]\n\npredictions[:,-1,:] = predictions[:,-3,:]\npredictions[:,-2,:] = predictions[:,-3,:]","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"np.max(predictions)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"np.min(predictions)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\narray_2d = predictions.reshape(100, -1)\narray_2d = np.maximum(array_2d, 1.5)\narray_2d = np.minimum(array_2d, 10)\ndf = pd.DataFrame(array_2d)\ndf[\"Id\"] = range(len(df))\ndf.set_index('Id', inplace=True)\ndf.to_csv(r'/mnt/f/sub12.csv')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for idx, layer in enumerate(model.layers):\n    print(idx, layer.name)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Score 0.528970002","metadata":{}}]}