AnoGAN実施

2779 ワード

今日は前回発表で実施したDCGANで反放射線検出を行います.DCGANを利用して理想値を検索する部分はコードを理解するのは難しいですが、面白そうな部分です.いずれにしても、現場ではラベルが難しい環境で行うことが多く、このような場合は異常検出を行う良いモデルです.私が実施している目標データはMNISTですが、将来的には複数のデータで実施したいと思います.同時に,実装中に複数のパラメータを変更する必要があることも分かった.私は今简単に実现していますが、他のオプティカルドライブやloss functionも性能をよく実现できるかどうか试してみます.
異常検出コード
https://github.com/mullue/anogan-mnist/blob/master/dcgan%2Banogan.ipynb
に表示されます.
私が実装したすべてのコード
https://github.com/soomin9106/Deep-Learning/blob/main/AnoGAN/DCGAN_AnoGAN.ipynb=>これです!!
説明を始めましょう.
まず、DCGANのモデルを回転させ、weightsをckptファイルに保存する必要があります.異常検出はDCGANにより最適パラメータが見つかったと仮定した.
次に、判別器モデルを作成する関数を作成します.DCGANが見つけた最適重み付け値をロードしてモデルを作成します.
#Discriminator 로부터 feature 를 도출하는 함수
from tensorflow.keras.models import Model

def feature_extractor(img_shape=(28,28,1)):
    d = make_discriminator_model()
    d.load_weights('/content/d-50.ckpt') #discriminator model weigth 저장된 파일
    intermidiate_model = Model(inputs=d.layers[0].input, outputs=d.layers[-6].output)
    intermidiate_model.compile(loss='binary_crossentropy', optimizer='adam')
    return intermidiate_model
次に、任意のサイズ100のzに潜ベクトルを作成し、以前に訓練されたジェネレータ重み付けをロードモデルに入れ、生成された画像を直接上の中間モデルに入れます.これにより、損失することなく、最適なz値を学ぶことができます.
#임의의 z로부터 latent vector를 생성하고 Generator와 앞서 feature_extractor를 호출합니다.
from tensorflow.keras.layers import Layer, Input, Dense, Flatten

def gne_anogan(loss, latent_dim = 100, channels = 1, img_shape=(28,28,1)):
  g = make_generator_model()
  g.load_weights('/content/g-50.ckpt')
  g.trainable = False
  intermidiate_model = feature_extractor(img_shape)
  intermidiate_model.trainable = False

  z = Input(shape=(100,))
  gInput = Dense((100))(z)
  G_out = g(gInput)
  D_out = intermidiate_model(G_out)    
  model = Model(inputs=z, outputs=[G_out, D_out])
  model.compile(loss=sum_of_residual, loss_weights= [0.9, 0.1], optimizer='adam')

  return model
これらのモデルに基づいて、正常データと非正常データをテストした結果、次のようになります.
<通常データ>

<異常データ>

これまでDCGANが学んだデータはデジタルデータだった.すなわち、モデルの場合、デジタルデータは正常データであり、デジタルデータは正常データではない.次の写真では、通常のデータ(すなわち、数値0で残差をテストし、可視化する)は、アルファベットでテストし、可視化するよりも小さい非正常なデータです.(写真が暗ければ暗いほど余剰値が大きくなります)
最後に、100個のデータを検証し、次の図のように「ロス」(Loss)を印刷します.

異常な場合は、損失値が高くなる可能性があります.