설명을 돕기 위해 텐서 흐름 코드 예제를 모았습니다 (전체 작동 코드는이 요지에 있습니다 ). 이 코드는 링크 한 논문의 섹션 2의 첫 부분에서 캡슐 네트워크를 구현합니다.
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)
입력 픽셀과 캡슐 간의 매핑이 어떻게 작동하는지 아는 사람이 있습니까?
이것은 네트워크 구조에 따라 다릅니다. 이 논문의 첫 번째 실험 (및 위의 코드)에서 각 캡슐에는 전체 입력 이미지를 포함하는 수용 필드가 있습니다. 이것이 가장 간단한 배열입니다. 이 경우 입력 이미지와 각 캡슐의 첫 번째 숨겨진 레이어 사이에 완전히 연결된 레이어입니다.
대안 적으로, 캡슐 수용 필드는 그 논문의 후반 실험에서와 같이 보폭을 갖는 CNN 커널과 유사하게 배열 될 수있다.
인식 장치에서 정확히 무슨 일이 일어나야합니까?
인식 장치는 각 캡슐의 내부 표현입니다. 각 캡슐은이 내부 표현을 사용하여 p
, 캡슐의 특징이 존재할 확률 및 xy
추정 된 번역 값을 계산합니다. 이 백서의 그림 2는 네트워크가 xy
올바르게 사용하고 있는지 확인하기위한 점검 입니다.
어떻게 훈련해야합니까? 모든 연결 사이의 표준 백 프롭입니까?
특히 생성 된 출력과 원본 간의 유사성을 강제하는 손실을 사용하여 자동 인코더로 학습해야합니다. 평균 제곱 오류는 여기서 잘 작동합니다. 그 외에도, 백프로 프를 사용하여 그라디언트 디센트를 전파해야합니다.
loss = tf.losses.mean_squared_error(img_input_flat, gen_img)
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)