Funciones latentes del codificador automático variacional (VAE)
Soy nuevo en DL y estoy trabajando en VAE para imágenes biomédicas. Necesito extraer características relevantes de la tomografía computarizada. Entonces creé primero un autocodificador y después un VAE. Mi duda es que no se de que capa puedo extraer características. Mi idea personal es usar características extraídas por capas que calculan la media y la varianza (antes del truco de reparametrización), pero creo que también la capa anterior a estas es adecuada para el propósito. Dejé aquí el código de la parte del codificador:
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
```
Respuestas
Las primeras capas de la red neuronal aprenden más características de bajo nivel, mientras que las capas más profundas aprenden características más complejas y abstractas (consulte la figura de Albawi et al, 2017 ).

Los codificadores automáticos se componen de un codificador de dos redes que codifica los datos en términos de algunas variables latentes (generalmente de menor dimensionalidad, por lo que se pueden usar para la reducción de la dimensionalidad ) y un decodificador que transforma la representación latente nuevamente en la representación inicial de los datos.
Puede usar cualquier capa de autoencoder, según sus necesidades. Dado que los codificadores automáticos suelen ser simétricos, por lo general, para la generación de características, estaría tomando capas del codificador o su salida. Si desea utilizar el codificador automático para la reducción de la dimensionalidad, preferiría tomar la salida del codificador que tiene una dimensión más pequeña (consulte la figura a continuación del artículo de Windrim et al, 2019 ).

Por otro lado, podría usar autoencoder de la misma manera que cualquier otra red neuronal para el aprendizaje por transferencia . En tal caso, entrenaría el codificador automático y luego extraería alguna capa como características para otro algoritmo. En tal caso, si quisiera funciones de nivel inferior, tomaría capas anteriores. Si quisiera características más abstractas, tomaría capas más altas.
Usando el ejemplo de la primera imagen, tomaría la primera capa de red entrenada en rostros humanos y la usaría para extraer algunas formas y bordes básicos de imágenes que no sean rostros humanos. Por otro lado, si necesitara detectar rostros, tomaría capas más profundas de la red.
Agregando a la elaborada respuesta de @Tim:
VAE z latente es estocástico z, lo que significa que las muestras serán diferentes para un mismo$x_i$muestra. En el caso ideal tu representación latente ($\mu$o z) contendrá información significativa, estos son los que extraería (por cierto, en tensorflow puede extraer varias capas;)).$\sigma$se establece para actuar como componente del ruido.
Para asegurarse de que lo que extrae es útil, lo que puede hacer es una prueba de interpretabilidad.
Las características de entrada de las tomografías computarizadas son los píxeles que tiene, PERO, ¿hay alguna otra información que no esté usando? Por ejemplo, dado que no da etiquetas explícitas, ¿tiene alguna imagen escaneada de un paciente enfermo? ¿O podrías seleccionar 10 imágenes a mano con alguna característica específica para interpretar un poco qué neuronas se disparan en el espacio latente? Si es así, lo que puede hacer es una prueba de correlación. Esto puede ser tan simple como neyman pearson o un histograma 2D que muestre qué tan correlacionadas están las características. Lo que desea lograr en este caso es una idea de lo que se está utilizando del modelo para decidir.
Desafortunadamente, esto es fácil para gatos/docs y más difícil para conjuntos de datos más complejos, pero es algo que debe hacer para no tener una máquina de caja negra. ¡Buena suerte!