VAE (Variational Autoencoder) 잠재 기능

Aug 20 2020

저는 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
```

답변

4 Tim Aug 20 2020 at 02:47

신경망의 초기 계층은 더 낮은 수준의 기능을 배우고, 더 깊은 계층은 더 복잡하고 추상적 인 기능을 학습합니다 ( Albawi et al, 2017의 그림 참조 ).

오토 인코더 는 일부 잠재 변수 (일반적으로 더 낮은 차원 성, 따라서 차원 감소에 사용될 수 있음) 측면에서 데이터를 인코딩하는 두 개의 네트워크 인코더 와 잠재 표현을 데이터의 초기 표현으로 다시 변환하는 디코더 로 구성됩니다.

필요에 따라 오토 인코더의 모든 레이어를 사용할 수 있습니다 . 오토 인코더는 일반적으로 대칭이므로 일반적으로 피쳐 생성을 위해 인코더에서 레이어를 가져 오거나 출력됩니다. 치수 감소를 위해 오토 인코더를 사용하려면 치수가 더 작은 인코더의 출력을 사용하는 것이 좋습니다 ( Windrim et al, 2019 의 논문에서 아래 그림 참조 ).

다른 한편으로, 전이 학습을 위해 다른 신경망 과 동일한 방식으로 오토 인코더를 사용할 수 있습니다 . 이 경우 오토 인코더를 훈련 한 다음 다른 알고리즘의 기능으로 일부 계층을 추출합니다. 이 경우 낮은 수준의 기능을 원하면 이전 레이어를 사용합니다. 더 추상적 인 기능을 원하면 더 높은 레이어를 사용합니다.

첫 번째 사진의 예를 사용하여 사람의 얼굴에 대해 훈련 된 네트워크의 첫 번째 레이어를 가져와 사람의 얼굴이 아닌 이미지에서 기본 모양과 가장자리를 추출하는 데 사용합니다. 반면에 얼굴을 감지해야하는 경우 네트워크의 더 깊은 계층을 사용합니다.

1 partizanos Dec 17 2020 at 12:27

@Tim의 정교한 답변에 추가 :

VAE z latent는 확률 적 z입니다. 즉, 동일한 샘플에 대해 샘플이 다를 수 있습니다. $x_i$견본. 이상적인 경우에는 잠재 표현 ($\mu$ 또는 z) 의미있는 정보를 포함합니다. 이들은 제가 추출 할 정보입니다 (텐서 플로우에서 btw는 여러 레이어를 추출 할 수 있습니다;)). $\sigma$ 소음 성분으로 작동하도록 설정되었습니다.

추출한 것이 유용한 지 확인하기 위해 할 수있는 것은 해석 가능성 테스트입니다.

Ct-scans 입력 기능은 가지고있는 픽셀이지만 사용하지 않는 다른 정보가 있습니까? 예를 들어 명시적인 라벨을 제공하지 않았기 때문에 아픈 환자의 스캔 이미지가 있습니까? 아니면 잠재 공간에서 어떤 뉴런이 트리거되는지 조금 해석하기 위해 특정 기능이있는 10 개의 이미지를 손으로 선택할 수 있습니까? 그렇다면 상관 관계 테스트를 할 수 있습니다. 이것은 neyman pearson 또는 상관 기능이 어떻게 연관되어 있는지 보여주는 2d 히스토그램처럼 간단 할 수 있습니다. 이 경우에 달성하고자하는 것은 결정하기 위해 모델에서 사용되는 것이 무엇인지에 대한 감각입니다.

안타깝게도 고양이 / 문서에서는 쉽고 복잡한 데이터 세트에서는 더 어렵지만 블랙 박스 머신을 사용하지 않으려면해야 할 일입니다. 행운을 빕니다!