คุณสมบัติแฝงตัวเข้ารหัสอัตโนมัติแบบแปรผัน (VAE)

Aug 20 2020

ฉันเพิ่งเริ่มใช้ DL และกำลังทำงานกับ VAE สำหรับภาพชีวการแพทย์ ฉันต้องการดึงคุณสมบัติที่เกี่ยวข้องออกจากการสแกน ct ดังนั้นฉันจึงสร้างตัวเข้ารหัสอัตโนมัติเป็นครั้งแรกและหลังจากนั้น VAE ข้อสงสัยของฉันคือฉันไม่รู้ว่าฉันสามารถดึง feautures จากเลเยอร์ไหนได้ ความคิดส่วนตัวของฉันคือการใช้คุณสมบัติที่แยกโดยเลเยอร์ที่คำนวณค่าเฉลี่ยและความแปรปรวน (ก่อนที่จะใช้กลเม็ดการกำหนดพารามิเตอร์ใหม่) แต่ฉันคิดว่าเลเยอร์ก่อนหน้าเหล่านี้เหมาะสมกับวัตถุประสงค์ ฉันทิ้งรหัสของส่วนเข้ารหัสไว้ที่นี่:

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 )

บนมืออื่นคุณสามารถใช้ autoencoder ในทางเดียวกับคนอื่น ๆเครือข่ายประสาทเทียมสำหรับการเรียนรู้การถ่ายโอน ในกรณีนี้คุณต้องฝึกตัวเข้ารหัสอัตโนมัติแล้วแยกเลเยอร์บางส่วนออกมาเป็นคุณสมบัติสำหรับอัลกอริทึมอื่น ๆ ในกรณีนี้หากคุณต้องการคุณสมบัติระดับล่างคุณจะต้องใช้เลเยอร์ก่อนหน้านี้ หากคุณต้องการคุณสมบัติที่เป็นนามธรรมมากขึ้นคุณจะต้องใช้เลเยอร์ที่สูงขึ้น

เมื่อใช้ตัวอย่างจากภาพแรกคุณจะต้องฝึกเลเยอร์แรกของเครือข่ายบนใบหน้าของมนุษย์และใช้เพื่อดึงรูปร่างและขอบพื้นฐานบางส่วนออกจากรูปภาพอื่นที่ไม่ใช่ใบหน้าของมนุษย์ ในทางกลับกันหากคุณต้องการตรวจจับใบหน้าคุณจะต้องใช้เครือข่ายในระดับที่ลึกกว่า

1 partizanos Dec 17 2020 at 12:27

การเพิ่มคำตอบอย่างละเอียดของ @Tim:

VAE z แฝงคือ stochastic z ซึ่งหมายความว่าตัวอย่างจะแตกต่างกันสำหรับสิ่งเดียวกัน $x_i$ตัวอย่าง. ในกรณีที่ดีคุณเป็นตัวแทนแฝง ($\mu$ หรือ z) จะมีข้อมูลที่มีความหมายซึ่งเป็นข้อมูลที่ฉันจะดึงออกมา (btw ในเทนเซอร์โฟลว์คุณสามารถแยกหลายชั้น;)) $\sigma$ ก่อตั้งขึ้นเพื่อทำหน้าที่เป็นส่วนประกอบของเสียงรบกวน

เพื่อให้แน่ใจว่าสิ่งที่คุณแยกออกมามีประโยชน์ในสิ่งที่คุณทำได้คือการทดสอบความสามารถในการตีความ

คุณสมบัติการป้อนข้อมูล Ct-scan เป็นพิกเซลที่คุณมี แต่มีข้อมูลอื่นที่คุณไม่ได้ใช้หรือไม่? ตัวอย่างเช่นเนื่องจากคุณไม่ได้ระบุฉลากที่ชัดเจนคุณมีภาพสแกนของผู้ป่วยหรือไม่? หรือคุณสามารถเลือก 10 ภาพด้วยมือพร้อมคุณสมบัติเฉพาะบางอย่างเพื่อตีความว่าเซลล์ประสาทถูกกระตุ้นในช่องว่างแฝงหรือไม่? ถ้าเป็นเช่นนั้นสิ่งที่คุณทำได้คือการทดสอบความสัมพันธ์ สิ่งนี้สามารถทำได้ง่าย ๆ เช่นเดียวกับ neyman pearson หรือฮิสโตแกรม 2 มิติที่แสดงให้เห็นว่าคุณลักษณะที่สัมพันธ์กัน สิ่งที่คุณต้องการบรรลุในกรณีนี้คือความรู้สึกบางอย่างเกี่ยวกับสิ่งที่ใช้จากแบบจำลองเพื่อตัดสินใจ

น่าเสียดายที่นี่เป็นเรื่องง่ายสำหรับแมว / เอกสารและยากกว่าสำหรับชุดข้อมูลที่ซับซ้อนมากขึ้น แต่เป็นสิ่งที่คุณต้องทำเพื่อไม่มีเครื่องกล่องดำ โชคดี!