Tôi đã tập hợp một số mã tenorflow ví dụ để giúp giải thích (mã đầy đủ, hoạt động nằm trong ý chính này ). Mã này thực hiện mạng viên nang từ phần đầu tiên của phần 2 trong bài báo mà bạn đã liên kết:
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)
Có ai biết cách ánh xạ giữa các pixel đầu vào thành các viên nang nên hoạt động không?
Điều này phụ thuộc vào cấu trúc mạng. Đối với thử nghiệm đầu tiên trong bài báo đó (và mã ở trên), mỗi viên nang có một trường tiếp nhận bao gồm toàn bộ hình ảnh đầu vào. Đó là sự sắp xếp đơn giản nhất. Trong trường hợp đó, đó là lớp được kết nối đầy đủ giữa hình ảnh đầu vào và lớp ẩn đầu tiên trong mỗi viên nang.
Ngoài ra, các lĩnh vực tiếp nhận viên nang có thể được sắp xếp giống như hạt nhân CNN với các bước tiến, như trong các thí nghiệm sau này trong bài báo đó.
Chính xác những gì sẽ xảy ra trong các đơn vị công nhận?
Các đơn vị công nhận là một đại diện nội bộ mà mỗi viên nang có. Mỗi viên nang sử dụng biểu diễn bên trong này để tính toán p
, xác suất xuất hiện tính năng của viên nang và xy
, các giá trị dịch được suy ra. Hình 2 trong bài báo đó là một kiểm tra để đảm bảo mạng đang học cách sử dụng xy
chính xác (đó là).
Làm thế nào nó nên được đào tạo? Có phải chỉ là prop trở lại tiêu chuẩn giữa mọi kết nối?
Cụ thể, bạn nên đào tạo nó như một bộ mã hóa tự động, sử dụng một mất mát để thực thi sự tương tự giữa đầu ra được tạo ra và bản gốc. Có nghĩa là lỗi vuông hoạt động tốt ở đây. Ngoài ra, có, bạn sẽ cần truyền bá độ dốc với backprop.
loss = tf.losses.mean_squared_error(img_input_flat, gen_img)
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)