Caractéristiques latentes de l'autoencodeur variationnel (VAE)
Je suis nouveau sur DL et je travaille sur la VAE pour les images biomédicales. J'ai besoin d'extraire les caractéristiques pertinentes du scanner. J'ai donc créé d'abord un auto-encodeur et ensuite un VAE. Mon doute est que je ne sais pas de quelle couche je peux extraire les fonctionnalités. Mon idée personnelle est d'utiliser des caractéristiques extraites par des couches qui calculent la moyenne et la variance (avant l'astuce de reparamétrisation), mais je pense que la couche avant celles-ci convient également à cet effet. J'ai laissé ici le code de la partie codeur :
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
```
Réponses
Les couches antérieures du réseau de neurones apprennent davantage de fonctionnalités de bas niveau, tandis que les couches plus profondes apprennent des fonctionnalités plus complexes et abstraites (voir la figure d'Albawi et al, 2017 ).

Les encodeurs automatiques sont constitués de deux encodeurs de réseaux qui encodent les données en termes de certaines variables latentes (généralement de dimensionnalité inférieure, ils peuvent donc être utilisés pour la réduction de la dimensionnalité ) et un décodeur qui transforme la représentation latente en représentation initiale des données.
Vous pouvez utiliser n'importe quelle couche d'autoencoder, selon vos besoins. Étant donné que les encodeurs automatiques sont généralement symétriques, généralement pour la génération de fonctionnalités, vous prenez des couches de l'encodeur ou de sa sortie. Si vous souhaitez utiliser l'auto-encodeur pour la réduction de la dimensionnalité, vous préférez prendre la sortie de l'encodeur qui a une dimension plus petite (voir la figure ci-dessous tirée de l'article de Windrim et al, 2019 ).

D'un autre côté, vous pouvez utiliser l'auto-encodeur de la même manière que tout autre réseau de neurones pour l'apprentissage par transfert . Dans ce cas, vous entraînez l'auto-encodeur, puis en extrayez une couche en tant que fonctionnalités pour un autre algorithme. Dans ce cas, si vous vouliez des fonctionnalités de niveau inférieur, vous prendriez des couches antérieures. Si vous vouliez des fonctionnalités plus abstraites, vous prendriez des couches supérieures.
En utilisant l'exemple de la première image, vous prendriez la première couche de réseau formée sur des visages humains et l'utiliseriez pour extraire des formes et des bords de base à partir d'images autres que des visages humains. D'un autre côté, si vous aviez besoin de détecter des visages, vous prendriez des couches plus profondes du réseau.
Ajoutant à la réponse élaborée de @Tim :
VAE z latent est stochastique z, ce qui signifie que les échantillons seront différents pour un même$x_i$goûter. Dans le cas idéal vous représentation latente ($\mu$ou z) contiendra des informations significatives, ce sont celles que j'extraire (d'ailleurs dans tensorflow, vous pouvez extraire plusieurs couches ;) ).$\sigma$est établi pour agir comme une composante de bruit.
Pour vous assurer que ce que vous extrayez est utile, vous pouvez faire un test d'interprétabilité.
Les caractéristiques d'entrée des Ct-scans sont les pixels que vous avez, MAIS y a-t-il d'autres informations que vous n'utilisez pas ? Par exemple, puisque vous ne donnez pas d'étiquettes explicites, avez-vous une image numérisée d'un patient malade ? Ou pourriez-vous sélectionner 10 images à la main avec une caractéristique spécifique pour interpréter un peu quels neurones sont déclenchés dans l'espace latent ? Si c'est le cas, vous pouvez faire un test de corrélation. Cela peut être aussi simple que Neyman Pearson ou un histogramme 2D montrant à quel point les caractéristiques sont corrélées. Ce que vous voulez obtenir dans ce cas, c'est une idée de ce qui est utilisé à partir du modèle pour décider.
Malheureusement, c'est facile pour les chats/docs et plus difficile pour les ensembles de données plus complexes, mais c'est quelque chose que vous devez faire pour ne pas avoir une machine à boîte noire. Bonne chance!