目次

5. プログラムの実行法

5.1 プログラムのインストール

ファイル dlspa1.zip をダウンロードして、 適当なフォルダに展開してください。ファイル構成は以下の通りです。

  1. dl/ : 深層学習プログラム(Python)
  2. fdtd2d/ : 2次元FDTDプログラム(C)
  3. fdtd3d/ : 3次元FDTDプログラム(C)
  4. phantom/ : 数値ファントム

図5-1にシステム構成図を示します。

図5-1 システム構成図

[8]のサイトから数値ファントムをダウンロードして以下の3個のファイルをphantom/フォルダに置いてください。

  1. mediumLabelList_Reso1mm_Case1.txt
  2. mediumLabelList_Reso1mm_Case2.txt
  3. mediumLabelList_Reso1mm_Case3.txt

5.2 FDTDプログラムのデータ入力

ファイルMain.cを編集して計算条件を設定してください。単位はMKSAです。

5.2.1 2次元版

リスト5-1 2次元版のデータ入力(Main.cの一部)


	const int   Igeom  = 1;               // 0=汎用, 1=乳がん(通常1)
	const int   Itest  = 0;               // 0=学習, 1=テスト(通常0)
	const int   Ndata  = 1000;            // データ数
	const int   Nout   = 4;               // 外部領域セル数
	const int   Lant   = 2;               // アンテナ位置(対象領域境界からのセル数)
	const int   ABC    = 4;               // PML層数(0のときはMur一次)
	const int   Niter  = 600;             // タイムステップ数
	const int   Nant   = 2;               // アンテナ辺数(1/2)
	const int   Nsmot  = 1;               // 形状平滑化回数(0以上)
	const int   Mean[] = {1, 3};          // 形状平均個数(学習用:最小,最大,1/2/3/4)
	const int   Sdif   = 1;               // S行列差分(0/1)
	const int   Mprec  = 5;               // 分解能[mm]、全体=100x100[mm]
	const int   Mx     = 20;              // Xセル数(内部)
	const int   My     = 20;              // Yセル数(内部)
	const float Dx     = 0.005f;          // Xセルサイズ
	const float Dy     = 0.005f;          // Yセルサイズ
	const int   Pant[] = {0, 1, 21};      // アンテナ位置(開始,間隔,個数)
	const int   Nobj[] = {2, 10};         // 誘電体数(学習用:最小,最大)
	const int   Lobj[][3] = {{1, 6, 0}, {1, 6, 0}};  // 誘電体XYセル数(学習用:最小,最大,余白)
	const int   NFreq  = 1;               // 周波数数
	const float Freq0  = 2.0e9f;          // 開始周波数
	const float Freq1  = 2.0e9f;          // 終了周波数
	const float Eps0   = 6.5f;            // 背景媒質比誘電率
	const float Sig0   = 0.2f;            // 背景媒質導電率[S/m]
	const float Eps[]  = {6.5f, 6.5f, 40.0f, 6.5f, 54.0f, 40.0f};  // 比誘電率
	const float Sig[]  = {0.2f, 0.2f,  1.0f, 0.2f,  1.3f,  1.0f};  // 導電率[S/m]

5.2.2 3次元版

リスト5-2 3次元版のデータ入力(Main.cの一部)


	const int   Igeom  = 1;               // 0=汎用, 1=乳がん(通常1)
	const int   Itest  = 0;               // 0=学習, 1=テスト(通常0)
	const int   Ndata  = 1000;            // データ数
	const int   Nout   = 4;               // 外部領域セル数
	const int   Lant   = 2;               // アンテナ位置(対象領域境界からのセル数)
	const int   ABC    = 4;               // PML層数(0のときはMur一次)
	const int   Niter  = 300;             // タイムステップ数
	const int   Nsmot  = 1;               // 平滑化回数(0以上)
	const int   Mean[] = {1, 3};          // 形状平均個数(学習用:最小,最大,1/2/3/4)
	const int   Sdif   = 1;               // S行列差分(0/1)
	const int   Mx     = 20;              // Xセル数(内部)
	const int   My     = 20;              // Yセル数(内部)
	const int   Mz     = 10;              // Zセル数(内部)
	const float Dx     = 0.005f;          // Xセルサイズ
	const float Dy     = 0.005f;          // Yセルサイズ
	const float Dz     = 0.005f;          // Zセルサイズ
	const int   Pant[][3] = {{1, 3, 7}, {1, 3, 7}, {1, 3, 3}};  // XYZアンテナ位置(開始,間隔,個数)
	const int   Nobj[] = {8, 12};        // 誘電体数(学習用:最小,最大)
	const int   Lobj[][3] = {{1, 6, 0}, {1, 6, 0}, {1, 6, 0}}; // 誘電体XYZセル数(学習用,最小,最大,余白)
	const int   NFreq  = 1;               // 周波数数
	const float Freq0  = 2.0e9f;          // 開始周波数
	const float Freq1  = 2.0e9f;          // 終了周波数
	const float Eps0   = 6.5f;            // 背景媒質比誘電率
	const float Sig0   = 0.2f;            // 背景媒質導電率[S/m]
	const float Eps[]  = {6.5f, 6.5f, 40.0f, 6.5f, 54.0f, 40.0f};  // 比誘電率
	const float Sig[]  = {0.2f, 0.2f,  1.0f, 0.2f,  1.3f,  1.0f};  // 導電率[S/m]

5.3 FDTDプログラムのビルド法

FDTDプログラムをビルドするには、 2次元モデルはfdtd2d/で3次元モデルはfdtd3d/で以下のコマンドを実行してください。
いくつかのファイルはfdtd2dとfdtd3dで共通なので、 先にfdtd2dを後にfdtd3dを同じ方法でビルドしてください。

表5-1 FDTDプログラムのビルド法(2次元, 3次元)
ビルドコマンドOSコンパイラー実行プログラム
$ nmake.exe -f Makefile_cl Windows cl.exe fdtd2d.exe または fdtd3d.exe
$ nmake.exe -f Makefile_cl_mpi Windows cl.exe fdtd2d.exe または fdtd3d.exe (MPI対応)
$ make -f Makefile_gcc LinuxまたはWSL2gcc fdtd2d または fdtd3d
$ make -f Makefile_gcc_mpi LinuxまたはWSL2mpicc fdtd2d または fdtd3d (MPI対応)

5.4 FDTDプログラムの実行法

FDTDプログラムはデータに関して独立した計算なので、 OpenMP(共有メモリー環境、スレッド並列)またはMPI(分散メモリー環境、プロセス並列) で並列計算することができます。計算時間はスレッド数分の1、かつプロセス数分の1になります。
それぞれの環境で以下のコマンドを実行してください。

5.4.1 2次元版, Windows

$ fdtd2d.exe				1スレッド, fdtd.bin出力
$ fdtd2d.exe 8				8スレッド, fdtd.bin出力
$ fdtd2d.exe 8 foo.bin			8スレッド, foo.bin出力
$ mpiexec.exe -n 2 fdtd2d.exe 4 foo.bin		2プロセス, 4スレッド, foo.bin出力(MPIでビルドしたとき)

5.4.2 3次元版, Windows

$ fdtd3d.exe				1スレッド, fdtd.bin出力
$ fdtd3d.exe 8				8スレッド, fdtd.bin出力
$ fdtd3d.exe 8 foo.bin			8スレッド, foo.bin出力
$ mpiexec.exe -n 2 fdtd3d.exe 4 foo.bin		2プロセス, 4スレッド, foo.bin出力(MPIでビルドしたとき)

5.4.3 2次元版, LinuxまたはWSL2

$ ./fdtd2d				1スレッド, fdtd.bin出力
$ ./fdtd2d 8				8スレッド, fdtd.bin出力
$ ./fdtd2d 8 foo.bin			8スレッド, foo.bin出力
$ mpiexec -n 2 fdtd2d 4 foo.bin		2プロセス, 4スレッド, foo.bin出力(MPIでビルドしたとき)

5.4.4 3次元版, LinuxまたはWSL2

$ ./fdtd3d				1スレッド, fdtd.bin出力
$ ./fdtd3d 8				8スレッド, fdtd.bin出力
$ ./fdtd3d 8 foo.bin			8スレッド, foo.bin出力
$ mpiexec -n 2 fdtd3d 4 foo.bin		2プロセス, 4スレッド, foo.bin出力(MPIでビルドしたとき)

(注1)
MPI版は複数ノードで実行するときに使用し、その他の設定が必要ですが、ここでは説明は省略します。 通常は1ノードで非MPI版を使用してください。
(注2)
デバッグを行って図形出力するときは、 OpenFDTD等に付属している2次元図形表示プログラムev2d.exeを使用してください。

5.5 深層学習プログラムのデータ入力

ファイルdlspa.pyを編集して計算条件を設定してください。

リスト5-3 深層学習プログラムのデータ入力(dlspa.pyの一部)


    # 学習or推論
    Imode = 1  # 1=学習, 2=推論
    # 計算結果ファイル名(image=S行列, label=誘電率)
    datafile = '../fdtd2d/fdtd.bin'
    #datafile = '../fdtd3d/fdtd.bin'
    # モデルファイル
    modelfile = 'dlspa.pth'

    # 計算パラメーター
    if   Imode == 1:
        # 学習
        load_model = 0     # 通常0, 前回保存したmodelfileからrestartするときは1
        save_model = 1     # 通常1, 計算終了時にmodelfileを保存しないときは0
        ndata = -1         # データ数, -1のときはすべてのデータ
        batch_size = 60    # バッチサイズ(通常50-100程度)
        num_epochs = 100   # エポック数
        train_ratio = 0.8  # 訓練データの割合(通常0.8程度)
    elif Imode == 2:
        # 推論
        load_model = 1     # 通常1:modelfileを読み込む
        save_model = 0     # 通常0:modelfileは保存しない
        ndata = -1         # データ数, -1のときはすべてのデータ
        batch_size = 50    # バッチサイズ(=50:ダミー)
        num_epochs = 0     # エポック数(=0)
        train_ratio = 0    # 訓練データの割合(=0)

    # 学習・推論共通
    ecomp = 3  # label成分: 1=Re(Er), 2=Im(Er), 3=両方 (通常3)
    scomp = 2  # image成分: 1=S, 2=Re(S),Im(S), 3=Re(S),Im(S),S (通常2)

5.6 深層学習プログラムの実行法

深層学習プログラムはPythonで記述されているのでビルド作業は不要です。
実行する前に、numpy, matplotlib, torch, torchvision をインストールしてください。

深層学習を行うには下記のコマンドを実行してください。

$ python dlspa.py		学習
$ python dlspa.py 1		学習
$ python dlspa.py 2		推論

以下の書式により引数で制御することもできます。

$ python dlspa.py [1/2 [datafile [modelfile]]]

計算結果を図形出力するには下記のコマンドを実行してください。
必要なら実行前に post.py, plot.py を編集してください。

$ python post.py