Mengubah AutoEncoders

10

Saya baru saja membaca makalah Geoff Hinton tentang mentransformasikan autoencoder

Hinton, Krizhevsky dan Wang: Transforming Auto-encoders . Dalam Jaringan Saraf Tiruan dan Pembelajaran Mesin, 2011.

dan ingin bermain-main dengan sesuatu seperti ini. Tetapi setelah membacanya saya tidak bisa mendapatkan cukup detail dari koran tentang bagaimana saya benar-benar menerapkannya.

  • Apakah ada yang tahu bagaimana pemetaan antara piksel input ke kapsul harus berfungsi?
  • Apa sebenarnya yang seharusnya terjadi di unit pengakuan?
  • Bagaimana seharusnya dilatih? Apakah ini hanya penyangga standar di antara setiap koneksi?

Yang lebih baik lagi adalah tautan ke beberapa kode sumber untuk ini atau yang serupa.

Daniel Slater
sumber
Sudahkah Anda mencoba menghubungi penulis? Mungkin mereka memiliki sesuatu yang tersedia online.
Ricardo Cruz

Jawaban:

4

Saya telah mengumpulkan beberapa contoh kode tensorflow untuk membantu menjelaskan (kode yang lengkap dan berfungsi ada di intisari ini ). Kode ini mengimplementasikan jaringan kapsul dari bagian pertama bagian 2 di kertas yang Anda tautkan:

N_REC_UNITS = 10
N_GEN_UNITS = 20
N_CAPSULES = 30

# input placeholders
img_input_flat = tf.placeholder(tf.float32, shape=(None, 784))
d_xy = tf.placeholder(tf.float32, shape=(None, 2))

# translate the image according to d_xy
img_input = tf.reshape(img_input_flat, (-1, 28, 28, 1))
trans_img = image.translate(img_input, d_xy)
flat_img = tf.layers.flatten(trans_img)

capsule_img_list = []

# build several capsules and store the generated output in a list
for i in range(N_CAPSULES):
    # hidden recognition layer
    h_rec = tf.layers.dense(flat_img, N_REC_UNITS, activation=tf.nn.relu)
    # inferred xy values
    xy = tf.layers.dense(h_rec, 2) + d_xy
    # inferred probability of feature
    p = tf.layers.dense(h_rec, 1, activation=tf.nn.sigmoid)
    # hidden generative layer
    h_gen = tf.layers.dense(xy, N_GEN_UNITS, activation=tf.nn.relu)
    # the flattened generated image
    cap_img = p*tf.layers.dense(h_gen, 784, activation=tf.nn.relu)

    capsule_img_list.append(cap_img)

# combine the generated images
gen_img_stack = tf.stack(capsule_img_list, axis=1)
gen_img = tf.reduce_sum(gen_img_stack, axis=1)

Apakah ada yang tahu bagaimana pemetaan antara piksel input ke kapsul harus berfungsi?

Ini tergantung pada struktur jaringan. Untuk percobaan pertama dalam makalah itu (dan kode di atas), setiap kapsul memiliki bidang reseptif yang mencakup seluruh gambar input. Itu pengaturan yang paling sederhana. Dalam hal ini, itu adalah lapisan yang sepenuhnya terhubung antara gambar input dan lapisan tersembunyi pertama di setiap kapsul.

Atau, bidang reseptor kapsul dapat diatur lebih seperti kernel CNN dengan langkah, seperti pada percobaan selanjutnya dalam makalah itu.

Apa sebenarnya yang seharusnya terjadi di unit pengakuan?

Unit pengakuan adalah representasi internal yang dimiliki setiap kapsul. Setiap kapsul menggunakan representasi internal ini untuk menghitung p, probabilitas bahwa fitur kapsul hadir, dan xy, nilai terjemahan yang disimpulkan. Gambar 2 dalam makalah itu adalah tanda centang untuk memastikan jaringan belajar menggunakan xydengan benar (benar).

Bagaimana seharusnya dilatih? Apakah ini hanya penyangga standar di antara setiap koneksi?

Khususnya, Anda harus melatihnya sebagai autoencoder, menggunakan kerugian yang memberlakukan kesamaan antara output yang dihasilkan dan aslinya. Mean square error bekerja dengan baik di sini. Selain itu, ya, Anda harus menyebarkan gradient descent dengan backprop.

loss = tf.losses.mean_squared_error(img_input_flat, gen_img)
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
Sophie Searcy - Metis
sumber