Fitur laten Variational Autoencoder (VAE)
Saya baru mengenal DL dan saya sedang mengerjakan VAE untuk gambar biomedis. Saya perlu mengekstrak fitur yang relevan dari ct scan. Jadi saya membuat autoencoder pertama dan setelah VAE. Keraguan saya adalah bahwa saya tidak tahu dari lapisan mana saya dapat mengekstrak fitur. Ide pribadi saya adalah menggunakan fitur yang diekstrak oleh lapisan yang menghitung mean dan varians (sebelum trik reparameterisasi), tetapi saya pikir juga lapisan sebelumnya cocok untuk tujuan tersebut. Saya meninggalkan di sini kode bagian encoder:
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
```
Jawaban
Lapisan sebelumnya dari jaringan neural mempelajari lebih banyak fitur tingkat rendah, sementara lapisan yang lebih dalam mempelajari fitur abstrak yang lebih rumit (lihat gambar dari Albawi et al, 2017 ).

Autoencoder dibangun dari dua encoder jaringan yang mengkodekan data dalam beberapa variabel laten (biasanya berdimensi lebih rendah, oleh karena itu mereka dapat digunakan untuk pengurangan dimensi ) dan decoder yang mengubah representasi laten kembali menjadi representasi awal dari data.
Anda dapat menggunakan lapisan apa pun dari autoencoder, tergantung pada kebutuhan Anda. Karena autoencoder biasanya simetris, biasanya untuk pembuatan fitur Anda akan mengambil lapisan dari encoder, atau keluarannya. Jika Anda ingin menggunakan autoencoder untuk reduksi dimensionalitas, maka Anda lebih baik mengambil keluaran encoder yang berdimensi lebih kecil (lihat gambar di bawah dari makalah oleh Windrim dkk, 2019 ).

Di sisi lain, Anda dapat menggunakan autoencoder dengan cara yang sama seperti jaringan neural lainnya untuk pembelajaran transfer . Dalam kasus seperti itu, Anda akan melatih autoencoder lalu mengekstrak beberapa lapisannya sebagai fitur untuk algoritme lain. Dalam kasus seperti itu, jika Anda menginginkan fitur tingkat yang lebih rendah, Anda akan mengambil lapisan sebelumnya. Jika Anda menginginkan fitur yang lebih abstrak, Anda akan mengambil lapisan yang lebih tinggi.
Menggunakan contoh dari gambar pertama, Anda akan mengambil lapisan pertama jaringan yang dilatih pada wajah manusia dan menggunakannya untuk mengekstrak beberapa bentuk dan tepi dasar dari gambar selain wajah manusia. Di sisi lain, jika Anda perlu mendeteksi wajah, Anda akan mengambil lapisan jaringan yang lebih dalam.
Menambah jawaban rumit dari @Tim:
VAE z laten adalah stokastik z, artinya sampel akan berbeda untuk hal yang sama $x_i$Sampel. Dalam kasus ideal Anda representasi laten ($\mu$ atau z) akan berisi informasi yang berarti, inilah yang akan saya ekstrak (btw di tensorflow Anda dapat mengekstrak beberapa lapisan;)). $\sigma$ ditetapkan untuk bertindak sebagai komponen kebisingan.
Untuk memastikan bahwa apa yang Anda ekstrak bermanfaat, apa yang dapat Anda lakukan adalah tes interpretabilitas.
Fitur input Ct-scan adalah piksel yang Anda miliki, TAPI apakah ada informasi lain yang tidak Anda gunakan? Misalnya karena Anda tidak memberikan label eksplisit, apakah Anda memiliki beberapa gambar pindaian pasien yang sakit? Atau dapatkah Anda memilih 10 gambar dengan tangan dengan beberapa fitur khusus untuk menafsirkan sedikit neuron apa yang dipicu di ruang laten? Jika demikian yang dapat Anda lakukan adalah uji korelasi. Ini bisa sesederhana neyman pearson atau histogram 2d yang menunjukkan bagaimana fitur berkorelasi. Apa yang ingin Anda capai dalam kasus ini adalah pemahaman tentang apa yang digunakan dari model untuk memutuskan.
Sayangnya ini mudah untuk kucing / dokumen dan lebih sulit untuk kumpulan data yang lebih kompleks, tetapi itu adalah sesuatu yang perlu Anda lakukan untuk tidak memiliki mesin kotak hitam. Semoga berhasil!