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 xy
dengan 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)