目次

2. 計算手法

2.1 処理の流れ

図2-1に処理の流れを示します。
以下の三つの部分から成ります。

  1. 教師データ作成: 多数の誘電率分布を作成し、FDTD法により地中レーダー画像を計算します。
  2. 学習: 深層学習により教師データを学習し、最適化されたパラメーターファイルファイルを得ます。
  3. 推論: パラメーターファイルファイルを用いて地中レーダー画像測定値から誘電率分布を推定します。


図2-1 処理の流れ

2.2 FDTD法

2.2.1 FDTD法の計算モデル

図2-2に2次元のFDTD法の計算モデルを示します。
地下に誘電体を含む領域をとり、地上に送信アンテナと受信アンテナを置きます。
FDTD法の計算領域は地下と地上から成ります。計算領域の外部にPML層を置きます。
送信アンテナからパルスを放射し、近くにある受信アンテナの電界の時間波形を計算します。
送信アンテナと受信アンテナを水平方向に平行移動させて同様の計算を繰り返し行います。
3次元モデルも同様に考え、垂直方向をZ方向、水平方向をXY方向とします。


図2-2 FDTD法の計算モデル(2次元モデル)

2.2.2 送信波形

図2-3に送信アンテナの時間波形を示します。
ガウスパルスと微分ガウスパルスの2通りを考えます。
微分ガウスパルスは直流成分を持たない特長があります。


図2-3 給電電圧の時間波形

2.2.3 受信波形

図2-4に地下の誘電体分布を適当にとったときの受信アンテナの受信波形を示します。 (b)は縦軸を拡大した図です。
最初に送信アンテナからの大きな直接波が観測されますが、 これは地下の情報を含まないために利用しません。
微分ガウスパルスは送信波形に二つのピークを持つために受信波形の変動も大きい傾向があります。


(a) 受信波形

(b) 同上拡大図
図2-4 受信波形

2.2.4 電界分布

図2-5に電界分布の一例を示します。 各点における時間波形を指定した周波数でフーリエ変換したものです。
電界分布は地中レーダーでは直接使用しませんが、計算結果の確認に使用することができます。
図から計算領域の境界で不自然な反射波は見られず、 吸収境界条件(PML)が正しく機能していることもわかります。


図2-5 電界分布(600MHz)

2.2.5 順問題と逆問題の関係

図2-6に順問題と逆問題の関係を示します。
上で述べた方法により誘電率分布から地中レーダー画像を求めることが順問題です。
逆に地中レーダー画像から誘電率分布を求めることが逆問題であり、本プログラムの目的です。


図2-6 順問題と逆問題の関係

2.3 深層学習

前項の方法で誘電体分布をランダムに変えて計算し、 多数の誘電体分布と地中レーダー画像の組(教師データ)を求めます。
そのデータを用いて深層学習を行い、地中レーダー画像から誘電率分布を推定することを考えます。
深層学習にはCNN(畳み込みニューラルネットワーク)を用います。

2.3.1 損失

深層学習の損失は次式で計算されるMSELossとします。
ここで、Nはデータ数、(Nx, Ny, Lz)は地下(誘電率推定領域)のセル数、 εrtrue, σtrueは正解(教師データ)の比誘電率または導電率、 εrpred, σpredは比誘電率または導電率の予測値です。
以下では、"損失(loss)"は式(2-2)とします。これは比誘電率または導電率の予測誤差の平均値を表します。

 (2-1)
 (2-2)

2.3.2 学習部

リスト2-1に学習部のソースコードを示します。
ユーザーの行う作業は以下の2点です。

  1. 地中レーダー画像と誘電率分布の教師データをdatasetに代入する
  2. モデル(ニューラルネットワーク)を定義する
その他は深層学習共通のコードです。

リスト2-1 学習部のソースコード(PyTorch)


dataset設定      ※1
dataloader設定
model設定        ※2
criterion = nn.MSELoss()                      # 損失関数: MSE
optimizer = optim.Adam(model.parameters())    # 最適化関数: Adam
for epoch in range(num_epochs):               # エポックに関するループ
    for data, target in train_loader:         # ミニバッチに関するループ
        optimizer.zero_grad()                 # 勾配初期化
        output = model(data)                  # 順伝搬
        loss = criterion(output, target)      # 損失計算
        loss.backward()                       # 逆伝搬
        optimizer.step()                      # 最適化関数更新

2.3.3 ResNet

ニューラルネットワークモデルにはResNet[6][7]を使用します。
ResNet18,ResNet34,ResNet50を考えます。
モデルを定義する方法は以下の通りです。
ゼロから(ランダムな初期値から)学習するには以下のいずれかになります。

model = models.resnet18(weights=None)
model = models.resnet34(weights=None)
model = models.resnet50(weights=None)
最適化されたパラメーターからファインチューニングするには以下のいずれかになります。
model = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
model = models.resnet34(weights=models.ResNet34_Weights.DEFAULT)
model = models.resnet50(weights=models.ResNet50_Weights.DEFAULT)
ここでは前者を「重みなし」、後者を「重みあり」と呼びます。
その後、以下のように入力サイズと出力サイズを変更します。
model.conv1 = nn.Conv2d(入力サイズ, 64, kernel_size=7, stride=2, padding=3, bias=False)
model.fc = nn.Linear(model.fc.in_features, 出力サイズ)
入力サイズ = 受信アンテナ数 = 1(2D), 1以上(3D)
出力サイズ = 誘電率推定領域セル数 = Nx * Ly (2D), Nx * Ny * Lz (3D)