10月26日,深度學習元老Hinton的NIPS2017 Capsule論文《Dynamic Routing Between Capsules》終于在arxiv上發表。今天相關關于這篇論文的TensorFlow\Pytorch\Keras實作相繼開源出來,讓我們來看下。

論文位址:https://arxiv.org/pdf/1710.09829.pdf
Capsule 是一組神經元,其活動向量(activity vector)表示特定實體類型的執行個體化參數,如對象或對象部分。我們使用活動向量的長度表征實體存在的機率,向量方向表示執行個體化參數。同一水準的活躍 capsule 通過變換矩陣對更進階别的 capsule 的執行個體化參數進行預測。當多個預測相同時,更進階别的 capsule 變得活躍。我們展示了判别式訓練的多層 capsule 系統在 MNIST 資料集上達到了最好的性能效果,比識别高度重疊數字的卷積網絡的性能優越很多。為了達到這些結果,我們使用疊代的路由協定機制:較低級别的 capsule 偏向于将輸出發送至進階别的 capsule,有了來自低級别 capsule 的預測,進階别 capsule 的活動向量具備較大的标量積。
Python 3
PyTorch
TorchVision
TorchNet
TQDM
Visdom
第一步 在<code>capsule_network.py</code>檔案中設定訓練epochs,batch size等
<code></code>
Step 2 開始訓練. 如果本地檔案夾中沒有MNIST資料集,将運作腳本自動下載下傳到本地. 確定 PyTorch可視化工具Visdom正在運作。
經過30個epoche的訓練手寫體數字的識别率達到99.48%. 從下圖的訓練進度和損失圖的趨勢來看,這一識别率可以被進一步的提高 。
采用了PyTorch中預設的Adam梯度優化參數并沒有用到動态學習率的調整。 batch size 使用100個樣本的時候,在雷蛇GTX 1050 GPU上每個Epochs 用時3分鐘。
擴充到除MNIST以外的其他資料集。
主要借鑒了以下兩個 TensorFlow 和 Keras 的實作:
Keras implementation by @XifengGuo
TensorFlow implementation by @naturomics
Many thanks to @InnerPeace-Wu for a discussion on the dynamic routing procedure outlined in the paper.
CapsNet-Tensorflow
Python
NumPy
Tensorflow (I'm using 1.3.0, not yet tested for older version)
tqdm (for displaying training progress info)
scipy (for saving image)
<b>第一步 </b>用git指令下載下傳代碼到本地.
第二步 下載下傳MNIST資料集(http://yann.lecun.com/exdb/mnist/), 移動并解壓到<code>data/mnist</code> 檔案夾(當你用複制<code>wget</code> 指令到你的終端是注意管道花括号裡的反斜杠)
第三步 開始訓練:
tqdm包并不是必須的,隻是為了可視化訓練過程。如果你不想要在<code>train.py</code>中将循環<code>for in step ...</code> 改成 ``for step in range(num_batch)就行了。
錯誤的運作結果(Details in Issues #8):
training loss
test acc
Results after fixing Issues #8:
關于capsule的一點見解
一種新的神經單元(輸入向量輸出向量,而不是标量)
正常算法類似于Attention機制
總之是一項很有潛力的工作,有很多工作可以在之上開展
完成MNIST的實作Finish the MNIST version of capsNet (progress:90%)
在其他資料集上驗證capsNet
調整模型結構
一篇新的投稿在ICLR2018上的後續論文(https://openreview.net/pdf?id=HJWLfGWRb) about capsules(submitted to ICLR 2018)
CapsNet-Keras
Keras
matplotlib
第一步 安裝 Keras:
<code>$ pip install keras</code>
第二步 用 <code>git</code>指令下載下傳代碼到本地.
第三步 訓練:
一次疊代訓練(default 3).
<code>$ python capsulenet.py --num_routing 1</code>
其他參數包括想 <code>batch_size, epochs, lam_recon, shift_fraction, save_dir</code> 可以以同樣的方式使用。 具體可以參考 <code>capsulenet.py</code>
假設你已經有了用上面指令訓練好的模型,訓練模型将被儲存在 <code>result/trained_model.h5</code>. 現在隻需要使用下面的指令來得到測試結果。
将會輸出測試結果并顯示出重構後的圖檔。測試資料使用的和驗證集一樣 ,同樣也可以很友善的在新資料上驗證,至于要按照你的需要修改下代碼就行了。
如果你的電腦沒有GPU來訓練模型,你可以從https://pan.baidu.com/s/1hsF2bvY下載下傳預先訓練好的訓練模型
主要結果
運作 <code>python capsulenet.py</code>: epoch=1 代表訓練一個epoch 後的結果 在儲存的日志檔案中,epoch從0開始。
損失和準确度:
一次正常疊代後的結果
測試結果每個 epoch 在單卡GTX 1070 GPU上大概需要<code>110s</code> 注釋: 訓練任然是欠拟合的,歡迎在你自己的機器上驗證。學習率decay還沒有經過調試, 我隻是試了一次,你可以接續微調。
模型結構:
其他實作代碼
Kaggle (this version as self-contained notebook):
MNIST Dataset running on the standard MNIST and predicting for test data
MNIST Fashion running on the more challenging Fashion images.
<b>TensorFlow:</b>
naturomics/CapsNet-Tensorflow
Very good implementation. I referred to this repository in my code.
InnerPeace-Wu/CapsNet-tensorflow
I referred to the use of tf.scan when optimizing my CapsuleLayer.
LaoDar/tf_CapsNet_simple
<b>PyTorch:</b>
nishnik/CapsNet-PyTorch
timomernick/pytorch-capsule
gram-ai/capsule-networks
andreaazzini/capsnet.pytorch
leftthomas/CapsNet
<b>MXNet:</b>
AaronLeong/CapsNet_Mxnet
Lasagne (Theano):
DeniskaMazur/CapsNet-Lasagne
Chainer:
soskek/dynamic_routing_between_capsules
參考網址連結:
https://github.com/gram-ai/capsule-networks
https://github.com/naturomics/CapsNet-Tensorflow
https://github.com/XifengGuo/CapsNet-Keras
原文釋出時間為:2017-11-5
本文來自雲栖社群合作夥伴新智元,了解相關資訊可以關注“AI_era”微信公衆号