{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"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":"nvidiaTeslaT4","dataSources":[{"sourceId":39763,"databundleVersionId":11756775,"sourceType":"competition"},{"sourceId":11334027,"sourceType":"datasetVersion","datasetId":7089850},{"sourceId":11367935,"sourceType":"datasetVersion","datasetId":7116013},{"sourceId":11368083,"sourceType":"datasetVersion","datasetId":7116134},{"sourceId":11368169,"sourceType":"datasetVersion","datasetId":7116196},{"sourceId":11368268,"sourceType":"datasetVersion","datasetId":7116272},{"sourceId":11368499,"sourceType":"datasetVersion","datasetId":7116445},{"sourceId":11368545,"sourceType":"datasetVersion","datasetId":7116479},{"sourceId":11368547,"sourceType":"datasetVersion","datasetId":7116481},{"sourceId":11376433,"sourceType":"datasetVersion","datasetId":7122462},{"sourceId":11376448,"sourceType":"datasetVersion","datasetId":7122476},{"sourceId":11376464,"sourceType":"datasetVersion","datasetId":7122489},{"sourceId":11376742,"sourceType":"datasetVersion","datasetId":7122712},{"sourceId":11376868,"sourceType":"datasetVersion","datasetId":7122812},{"sourceId":11376871,"sourceType":"datasetVersion","datasetId":7122814},{"sourceId":11376872,"sourceType":"datasetVersion","datasetId":7122815},{"sourceId":11376935,"sourceType":"datasetVersion","datasetId":7122866},{"sourceId":11377083,"sourceType":"datasetVersion","datasetId":7122981},{"sourceId":11377231,"sourceType":"datasetVersion","datasetId":7123090},{"sourceId":11377291,"sourceType":"datasetVersion","datasetId":7123138},{"sourceId":11377325,"sourceType":"datasetVersion","datasetId":7123163},{"sourceId":11377334,"sourceType":"datasetVersion","datasetId":7123172},{"sourceId":11377594,"sourceType":"datasetVersion","datasetId":7123380},{"sourceId":11377614,"sourceType":"datasetVersion","datasetId":7123394},{"sourceId":11377741,"sourceType":"datasetVersion","datasetId":7123490},{"sourceId":11377752,"sourceType":"datasetVersion","datasetId":7123499},{"sourceId":11377756,"sourceType":"datasetVersion","datasetId":7123503},{"sourceId":11377935,"sourceType":"datasetVersion","datasetId":7123649},{"sourceId":11377970,"sourceType":"datasetVersion","datasetId":7123675},{"sourceId":11378141,"sourceType":"datasetVersion","datasetId":7123813},{"sourceId":11378162,"sourceType":"datasetVersion","datasetId":7123831},{"sourceId":11378178,"sourceType":"datasetVersion","datasetId":7123842},{"sourceId":11380909,"sourceType":"datasetVersion","datasetId":7125380}],"dockerImageVersionId":31011,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport matplotlib.pyplot as plt\nfrom pathlib import Path\nfrom tqdm.auto import tqdm\nfrom colorama import init, Fore, Style\nfrom torch.utils.data import Dataset, DataLoader\nfrom matplotlib.gridspec import GridSpec\n\ninit(autoreset=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T15:59:59.063871Z","iopub.execute_input":"2025-06-18T15:59:59.064217Z","iopub.status.idle":"2025-06-18T15:59:59.069986Z","shell.execute_reply.started":"2025-06-18T15:59:59.064189Z","shell.execute_reply":"2025-06-18T15:59:59.068688Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_parts = range(1,31)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T15:59:59.071268Z","iopub.execute_input":"2025-06-18T15:59:59.071517Z","iopub.status.idle":"2025-06-18T15:59:59.110531Z","shell.execute_reply.started":"2025-06-18T15:59:59.071498Z","shell.execute_reply":"2025-06-18T15:59:59.109795Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_inputs = []\nfor i in train_parts:\n    train_inputs.extend([f\n    for f in\n    Path(f'/kaggle/input/waveform-inversion-{i}').rglob('*.npy')\n    if ('seis' in f.stem) or ('data' in f.stem)\n])\n\nvalid_inputs = [\n    f\n    for f in\n    Path('/kaggle/input/waveform-inversion/train_samples').rglob('*.npy')\n    if ('seis' in f.stem) or ('data' in f.stem)\n]\nlen(train_inputs), len(valid_inputs)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T15:59:59.111866Z","iopub.execute_input":"2025-06-18T15:59:59.112502Z","iopub.status.idle":"2025-06-18T16:00:00.968718Z","shell.execute_reply.started":"2025-06-18T15:59:59.112473Z","shell.execute_reply":"2025-06-18T16:00:00.967847Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def inputs_files_to_output_files(input_files):\n    return [\n        Path(str(f).replace('seis', 'vel').replace('data', 'model'))\n        for f in input_files\n    ]\n\ntrain_outputs = inputs_files_to_output_files(train_inputs)\nvalid_outputs = inputs_files_to_output_files(valid_inputs)\nlen(train_outputs), len(valid_outputs)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T16:00:00.969656Z","iopub.execute_input":"2025-06-18T16:00:00.970547Z","iopub.status.idle":"2025-06-18T16:00:00.983715Z","shell.execute_reply.started":"2025-06-18T16:00:00.970517Z","shell.execute_reply":"2025-06-18T16:00:00.983042Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"trainはVelが60件×4,Faultが108×4,Styleが134×2　合計940の.npyファイルがある。  \nvalidは各2件ずつ合計20の.npyファイルがある。  \nただし、各.npyファイルにつき地震データが500件格納されている。  \n全ての波形ファイルは(5,1000,70)・(波の発生パターン,時間,観測地点)  \n全ての地面ファイルは(1,70,70)の2dマップになっている。","metadata":{}},{"cell_type":"code","source":"class SeismicDataset(Dataset):\n    def __init__(self, inputs_files, output_files, n_examples_per_file=500):\n        assert len(inputs_files) == len(output_files)\n        self.inputs_files = inputs_files\n        self.output_files = output_files\n        self.n_examples_per_file = n_examples_per_file\n\n    def __len__(self):\n        return len(self.inputs_files) * self.n_examples_per_file\n\n    def __getitem__(self, idx):\n        # Calculate file offset and sample offset within file\n        file_idx = idx // self.n_examples_per_file\n        sample_idx = idx % self.n_examples_per_file\n\n        X = np.load(self.inputs_files[file_idx], mmap_mode='r')\n        y = np.load(self.output_files[file_idx], mmap_mode='r')\n\n        try:\n            return X[sample_idx].copy(), y[sample_idx].copy()\n        finally:\n            del X, y\n\n    def data_name(self, idx):\n        #どのタイプのデータかを返す\n        file_idx = idx // self.n_examples_per_file\n        path = self.inputs_files[file_idx]\n        data_type_list = [\"CurveFault_A\", \"CurveFault_B\", \"CurveVel_A\", \"CurveVel_B\", \"FlatFault_A\", \"FlatFault_B\", \"FlatVel_A\", \"FlatVel_B\", \"Style_A\", \"Style_B\"]\n        for data_type in data_type_list:\n            if data_type in str(path):\n                return data_type\n        return \"error\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T16:00:00.985257Z","iopub.execute_input":"2025-06-18T16:00:00.985469Z","iopub.status.idle":"2025-06-18T16:00:01.000707Z","shell.execute_reply.started":"2025-06-18T16:00:00.985452Z","shell.execute_reply":"2025-06-18T16:00:00.999843Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dstrain = SeismicDataset(train_inputs, train_outputs)\ndltrain = DataLoader(dstrain, batch_size=500, shuffle=True, pin_memory=True, drop_last=True, num_workers=4, persistent_workers=True)\n\ndsvalid = SeismicDataset(valid_inputs, valid_outputs)\ndlvalid = DataLoader(dsvalid, batch_size=500, shuffle=False, pin_memory=True, drop_last=False, num_workers=4, persistent_workers=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T16:00:01.001535Z","iopub.execute_input":"2025-06-18T16:00:01.001894Z","iopub.status.idle":"2025-06-18T16:00:01.026475Z","shell.execute_reply.started":"2025-06-18T16:00:01.001871Z","shell.execute_reply":"2025-06-18T16:00:01.025638Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(dstrain)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T16:00:01.027358Z","iopub.execute_input":"2025-06-18T16:00:01.027647Z","iopub.status.idle":"2025-06-18T16:00:01.042169Z","shell.execute_reply.started":"2025-06-18T16:00:01.027621Z","shell.execute_reply":"2025-06-18T16:00:01.041349Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig, axes = plt.subplots(2, 5, figsize=(20,6))\naxes = axes.flatten()\nfor i in range(10):\n    idx = i*1000+5 #+以降を色々変えると色々見れる\n    file_idx = idx // dsvalid.n_examples_per_file\n    sample_idx = idx % dsvalid.n_examples_per_file\n    ax = axes[i]\n    im = ax.imshow(dsvalid.__getitem__(idx)[1].squeeze(), cmap='viridis')\n    ax.set_title(dsvalid.data_name(idx))\n    ax.axis('off') # 軸を非表示にする\nfig.colorbar(im, ax=axes.ravel().tolist(), orientation='vertical', shrink=0.75, label='Value')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T16:08:19.120407Z","iopub.execute_input":"2025-06-18T16:08:19.121017Z","iopub.status.idle":"2025-06-18T16:08:20.039235Z","shell.execute_reply.started":"2025-06-18T16:08:19.120992Z","shell.execute_reply":"2025-06-18T16:08:20.038366Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"idx = 5045 #idxを色々変えて見てみたい\nX, y = dstrain.__getitem__(idx) # Xは(5, 70, 70), yは(1, 70, 70)\n\nfig = plt.figure(figsize=(30, 6)) # 全体のFigureサイズを横長に調整\ngs = GridSpec(nrows=5, ncols=100, figure=fig, hspace=0.4, wspace=0.2)\n\n# 左側の大きな2Dマップ (y.squeeze()) を配置\nax_map = fig.add_subplot(gs[:, 0:32])\nim_map = ax_map.imshow(y.squeeze(), cmap='viridis')\nfig.colorbar(im_map, ax=ax_map, orientation='vertical', shrink=0.7)\nax_map.set_title(f'Output Map: {dstrain.data_name(idx)}', fontsize=16)\nax_map.axis('off') # 軸を非表示に\n\n# 右側の5つの時系列プロット (X[i].T) を配置\nfor i in range(5):\n    ax_ts = fig.add_subplot(gs[i, 32:96])\n    im_ts = ax_ts.imshow(X[i].T, cmap='viridis', aspect='auto')\n    if i == 0:\n        cbar_ax = fig.add_subplot(gs[:, 90:])\n        fig.colorbar(im_ts, ax=cbar_ax, orientation='vertical', shrink=0.8)\n        cbar_ax.axis('off') \n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T16:37:14.993838Z","iopub.execute_input":"2025-06-18T16:37:14.994444Z","iopub.status.idle":"2025-06-18T16:37:15.877279Z","shell.execute_reply.started":"2025-06-18T16:37:14.994414Z","shell.execute_reply":"2025-06-18T16:37:15.876411Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"idx = 1000\nX, y = dstrain.__getitem__(idx)[0], dstrain.__getitem__(idx)[1]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T16:11:36.878661Z","iopub.execute_input":"2025-06-18T16:11:36.879426Z","iopub.status.idle":"2025-06-18T16:11:36.966858Z","shell.execute_reply.started":"2025-06-18T16:11:36.879400Z","shell.execute_reply":"2025-06-18T16:11:36.965917Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(6, 6)) # グラフのサイズを設定\nplt.imshow(y.squeeze(), cmap='viridis') # 'viridis'はカラーマップの一例。他にも'gray', 'hot'など\nplt.colorbar(label='Value') # カラーバーを表示して値の対応を示す\nplt.title(dstrain.data_name(idx))\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T16:11:37.281699Z","iopub.execute_input":"2025-06-18T16:11:37.282502Z","iopub.status.idle":"2025-06-18T16:11:37.531582Z","shell.execute_reply.started":"2025-06-18T16:11:37.282473Z","shell.execute_reply":"2025-06-18T16:11:37.530748Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig, axes = plt.subplots(5, 1, figsize=(50,6))\naxes = axes.flatten()\naxes[0].set_title(dstrain.data_name(idx))\nfor i in range(5):\n    ax = axes[i]\n    im = ax.imshow(X[i].T, cmap='viridis')\n    ax.axis('off')\nfig.colorbar(im, ax=axes.ravel().tolist(), orientation='vertical', shrink=0.75, label='Value')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T16:11:38.449030Z","iopub.execute_input":"2025-06-18T16:11:38.449342Z","iopub.status.idle":"2025-06-18T16:11:38.985182Z","shell.execute_reply.started":"2025-06-18T16:11:38.449316Z","shell.execute_reply":"2025-06-18T16:11:38.984299Z"}},"outputs":[],"execution_count":null}]}