天天看點

【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch

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

【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch

論文位址: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%. 從下圖的訓練進度和損失圖的趨勢來看,這一識别率可以被進一步的提高 。

【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch

采用了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 

【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch
【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch

test acc

【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch
【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch
【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch

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開始。

【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch

損失和準确度:

【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch

一次正常疊代後的結果

【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch

測試結果每個 epoch 在單卡GTX 1070 GPU上大概需要<code>110s</code> 注釋: 訓練任然是欠拟合的,歡迎在你自己的機器上驗證。學習率decay還沒有經過調試, 我隻是試了一次,你可以接續微調。

模型結構:

【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch
【前沿】TensorFlow Pytorch Keras代碼實作深度學習大神Hinton NIPS2017 Capsule論文CapsNet-PyTorch

其他實作代碼

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”微信公衆号