変分オートエンコーダー(VAE)の潜在機能
私はDLを初めて使用し、生物医学画像のVAEに取り組んでいます。CTスキャンから関連する特徴を抽出する必要があります。そこで、最初にオートエンコーダーを作成し、VAEの後に作成しました。私の疑問は、どのレイヤーから機能を抽出できるかわからないことです。私の個人的な考えは、平均と分散を計算するレイヤーによって抽出された特徴を使用することです(再パラメーター化のトリックの前)が、これらの前のレイヤーも目的に適していると思います。エンコーダー部分のコードをここに残しました:
class Sampling(tf.keras.layers.Layer):
"""Uses (z_mean, z_log_var) to sample z, the vector encoding a digit."""
def call(self, inputs):
z_mean, z_log_var = inputs
batch = tf.shape(z_mean)[0]
dim = tf.shape(z_mean)[1]
epsilon = tf.keras.backend.random_normal(shape=(batch, dim))
return z_mean + tf.exp(0.5 * z_log_var) * epsilon
def Encoder():
inp = tf.keras.Input(shape=(32,256,256,1)) # prima era 64
#enc = tf.keras.layers.Conv3D(8, (2,2,2), activation = 'relu', padding = 'same')(inp)
#enc = tf.keras.layers.MaxPooling3D((2,2,2), padding = 'same')(enc)
enc = tf.keras.layers.Conv3D(16, (2,2,2), activation = 'relu', padding = 'same')(inp)
enc = tf.keras.layers.MaxPooling3D((2,2,2), padding = 'same')(enc)
enc = tf.keras.layers.Conv3D(32, (2,2,2), activation = 'relu', padding = 'same')(enc)
enc = tf.keras.layers.MaxPooling3D((2,2,2), padding = 'same')(enc)
enc = tf.keras.layers.Conv3D(64, (2,2,2), activation = 'relu', padding = 'same')(enc)
enc = tf.keras.layers.MaxPooling3D((2,2,2), padding = 'same') (enc)
enc = tf.keras.layers.Conv3D(32, (2,2,2), activation = 'relu', padding = 'same')(enc)
enc = tf.keras.layers.MaxPooling3D((2,2,2), padding = 'same') (enc)
#enc = tf.keras.layers.Flatten()(enc)
enc = tf.keras.layers.Conv3D(16, (2,2,2), activation = 'relu', padding = 'same')(enc)
enc = tf.keras.layers.MaxPooling3D((2,2,2), padding = 'same') (enc)
'''
# conv 2D
code = tf.keras.layers.Reshape((8,8,96)) (enc)
code = tf.keras.layers.Conv2D(96,(2,2), activation = 'relu', padding = 'same')(code)
code = tf.keras.layers.MaxPooling2D((2,2), padding = 'same') (code)
'''
# latentent code vae
latent_code = tf.keras.layers.Flatten()(enc)
latent_code = tf.keras.layers.Dense(256, activation='relu')(latent_code)
latent_mu = tf.keras.layers.Dense(32, activation='relu')(latent_code) # èprima era 10
latent_sigma = tf.keras.layers.Dense(32, activation='relu')(latent_code) # prima era 10
# Reparameterization trick
#z = tf.keras.layers.Lambda(sample_z, output_shape=(128,), name='z')([latent_mu, latent_sigma])
z = Sampling()([latent_mu, latent_sigma])
encoder = tf.keras.Model(inp, [latent_mu, latent_sigma, z ], name = 'encoder')
#encoder = tf.keras.Model(inp, enc)#[latent_mu, latent_sigma, z ], name = 'encoder')
return encoder
```
回答
ニューラルネットワークの初期の層はより低レベルの機能を学習し、より深い層はより複雑で抽象的な機能を学習します(Albawi et al、2017の図を参照)。

オートエンコーダーは、いくつかの潜在変数(通常は低次元であるため、次元削減に使用できます)の観点からデータをエンコードする2つのネットワークエンコーダーと、潜在表現をデータの初期表現に変換するデコーダーで構成されています。
必要に応じて、オートエンコーダーの任意のレイヤーを使用できます。オートエンコーダーは通常対称であるため、通常、機能の生成では、エンコーダーまたはその出力からレイヤーを取得します。次元削減にオートエンコーダーを使用する場合は、より小さな次元のエンコーダーの出力を取得することをお勧めします(Windrim et al、2019の論文から下の図を参照)。

一方、転送学習のための他のニューラルネットワークと同じ方法でオートエンコーダを使用することができます。このような場合、オートエンコーダーをトレーニングしてから、他のアルゴリズムの機能としてそのレイヤーを抽出します。このような場合、低レベルの機能が必要な場合は、以前のレイヤーを使用します。より抽象的な機能が必要な場合は、より高いレイヤーを使用します。
最初の画像の例を使用すると、人間の顔でトレーニングされたネットワークの最初のレイヤーを取得し、それを使用して、人間の顔以外の画像からいくつかの基本的な形状とエッジを抽出します。一方、顔を検出する必要がある場合は、ネットワークのより深い層を取得します。
@Timの精巧な答えに追加:
VAE z潜在的は確率的zであり、サンプルが同じものに対して異なることを意味します $x_i$サンプル。理想的なケースでは、潜在表現($\mu$ またはz)意味のある情報が含まれます。これらは私が抽出する情報です(テンソルフローでは複数のレイヤーを抽出できます;))。 $\sigma$ ノイズ成分として機能するように確立されています。
抽出したものが有用であることを確認するためにできることは、解釈可能性テストです。
Ctスキャン入力機能はあなたが持っているピクセルですが、あなたが使用していない他の情報はありますか?たとえば、明示的なラベルを付けていないので、病気の患者のスキャン画像がありますか?または、潜在空間でトリガーされるニューロンを少し解釈するために、特定の機能を備えた10枚の画像を手動で選択できますか?もしそうなら、あなたができることは相関テストです。これは、ネイマンピアソン、または相関する特徴がどのように相関しているかを示す2Dヒストグラムのように単純な場合があります。この場合に達成したいのは、モデルから決定に使用されているものの感覚です。
残念ながら、これはcats / docsにとっては簡単で、より複雑なデータセットにとっては困難ですが、ブラックボックスマシンを持たないために行う必要があることです。がんばろう!