説明を助けるためにいくつかのテンソルフローコードの例をまとめました(完全で機能するコードはこの要点にあります)。このコードは、リンクした論文のセクション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
正しく使用することを学習していることを確認するためのチェックです(そうです)。
どのように訓練する必要がありますか?すべての接続間の標準のバックプロップですか?
具体的には、生成された出力と元の出力の類似性を強制する損失を使用して、自動エンコーダーとしてトレーニングする必要があります。ここでは、平均二乗誤差がうまく機能します。それとは別に、はい、backpropで勾配降下法を伝播する必要があります。
loss = tf.losses.mean_squared_error(img_input_flat, gen_img)
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)