ユーザ用ツール

サイト用ツール


ai:cntk

CNTK

Platform API NPU
Windows C++, Python, C# CUDA
Linux C++, Python CUDA

CNTK は TensorFlow 同様 Keras の backend として利用できます。

CNTK 自体は channels_first ですが、Keras 上の互換性のために channels_last でも動作するように作られています。 keras.json が channels_last の場合は内部で必要に応じて TransposeAxes が挿入されています。 TransposeAxes の分だけ、パフォーマンス的には channels_first の方が速いようです。

Windows

Binary SDK が用意されているので、source から build しなくても C++ から利用できます。

Python

  1. pip3 install cntk-gpu
  2. pip3 install keras

keras と channels_last

CNTK は channels_first の方が高速に実行できるようです。

keras image_data_format 実行時間
channles_first 494.15 sec
channels_last 771.04 sec

channels_last の場合の例。 ところどころ TransposeAxes が挿入されており、5 Layer 余計にかかっていることがわかります。

Composite(conv2d_1_input: Tensor[28,28,1]) -> Tensor[10]
  Combine              a                              (b:[b*](10,)) -> (b:[b*](10,))
  Softmax              c                              (d:[b*](10,)) -> (b:[b*](10,))
  Plus                 e                              (f:[b*](10,), g:(10,)) -> (d:[b*](10,))
  Times                h                              (i:[b*](128,), dense_2/kernel:(128, 10)) -> (f:[b*](10,))
  Select               j                              (_keras_learning_phase:(), k:[b*](128,), l:[b*](128,)) -> (i:[b*](128,))
  Constant             _keras_learning_phase           ()
  Dropout              m                              (l:[b*](128,)) -> (k:[b*](128,))
  ReLU                 n                              (o:[b*](128,)) -> (l:[b*](128,))
  Plus                 p                              (q:[b*](128,), r:(128,)) -> (o:[b*](128,))
  Times                s                              (t:[b*](10816,), dense_1/kernel:(10816, 128)) -> (q:[b*](128,))
  Reshape              u                              (v:[b*](13, 13, 64)) -> (t:[b*](10816,))
  Select               w                              (_keras_learning_phase:(), x:[b*](13, 13, 64), y:[b*](13, 13, 64)) -> (v:[b*](13, 13, 64))
  Dropout              z                              (y:[b*](13, 13, 64)) -> (x:[b*](13, 13, 64))
  TransposeAxes        ba                             (bb:[b*](64, 13, 13)) -> (y:[b*](13, 13, 64))
  Pooling              bc                             (bd:[b*](64, 26, 26)) -> (bb:[b*](64, 13, 13))
  TransposeAxes        be                             (bf:[b*](26, 26, 64)) -> (bd:[b*](64, 26, 26))
  ReLU                 bg                             (bh:[b*](26, 26, 64)) -> (bf:[b*](26, 26, 64))
  Plus                 bi                             (bj:[b*](26, 26, 64), bk:(1, 1, 64)) -> (bh:[b*](26, 26, 64))
  TransposeAxes        bl                             (bm:[b*](64, 26, 26)) -> (bj:[b*](26, 26, 64))
  Convolution          bn                             (bo:(64, 32, 3, 3), bp:[b*](32, 28, 28)) -> (bm:[b*](64, 26, 26))
  TransposeAxes        bq                             (conv2d_2/kernel:(3, 3, 32, 64)) -> (bo:(64, 32, 3, 3))
  Parameter            conv2d_2/kernel                 (3, 3, 32, 64)
  TransposeAxes        br                             (bs:[b*](28, 28, 32)) -> (bp:[b*](32, 28, 28))
  ReLU                 bt                             (bu:[b*](28, 28, 32)) -> (bs:[b*](28, 28, 32))
  Plus                 bv                             (bw:[b*](28, 28, 32), bx:(1, 1, 32)) -> (bu:[b*](28, 28, 32))
  TransposeAxes        by                             (bz:[b*](32, 28, 28)) -> (bw:[b*](28, 28, 32))
  Convolution          ca                             (cb:(32, 1, 3, 3), cc:[b*](1, 28, 28)) -> (bz:[b*](32, 28, 28))
  TransposeAxes        cd                             (conv2d_1/kernel:(3, 3, 1, 32)) -> (cb:(32, 1, 3, 3))
  Parameter            conv2d_1/kernel                 (3, 3, 1, 32)
  TransposeAxes        ce                             (conv2d_1_input:[b*](28, 28, 1)) -> (cc:[b*](1, 28, 28))
  Input                conv2d_1_input Input4           [b*](28, 28, 1)
  Reshape              cf                             (conv2d_1/bias:(32,)) -> (bx:(1, 1, 32))
  Parameter            conv2d_1/bias                   (32,)
  Reshape              cg                             (conv2d_2/bias:(64,)) -> (bk:(1, 1, 64))
  Parameter            conv2d_2/bias                   (64,)
  Parameter            dense_1/kernel                  (10816, 128)
  Reshape              ch                             (dense_1/bias:(128,)) -> (r:(128,))
  Parameter            dense_1/bias                    (128,)
  Parameter            dense_2/kernel                  (128, 10)
  Reshape              ci                             (dense_2/bias:(10,)) -> (g:(10,))
  Parameter            dense_2/bias                    (10,)

channels_first の場合

Composite(conv2d_1_input: Tensor[1,28,28]) -> Tensor[10]
  Combine              a                              (b:[b*](10,)) -> (b:[b*](10,))
  Softmax              c                              (d:[b*](10,)) -> (b:[b*](10,))
  Plus                 e                              (f:[b*](10,), g:(10,)) -> (d:[b*](10,))
  Times                h                              (i:[b*](128,), dense_2/kernel:(128, 10)) -> (f:[b*](10,))
  Select               j                              (_keras_learning_phase:(), k:[b*](128,), l:[b*](128,)) -> (i:[b*](128,))
  Constant             _keras_learning_phase           ()
  Dropout              m                              (l:[b*](128,)) -> (k:[b*](128,))
  ReLU                 n                              (o:[b*](128,)) -> (l:[b*](128,))
  Plus                 p                              (q:[b*](128,), r:(128,)) -> (o:[b*](128,))
  Times                s                              (t:[b*](10816,), dense_1/kernel:(10816, 128)) -> (q:[b*](128,))
  Reshape              u                              (v:[b*](13, 13, 64)) -> (t:[b*](10816,))
  TransposeAxes        w                              (x:[b*](64, 13, 13)) -> (v:[b*](13, 13, 64))
  Select               y                              (_keras_learning_phase:(), z:[b*](64, 13, 13), ba:[b*](64, 13, 13)) -> (x:[b*](64, 13, 13))
  Dropout              bb                             (ba:[b*](64, 13, 13)) -> (z:[b*](64, 13, 13))
  Pooling              bc                             (bd:[b*](64, 26, 26)) -> (ba:[b*](64, 13, 13))
  ReLU                 be                             (bf:[b*](64, 26, 26)) -> (bd:[b*](64, 26, 26))
  Plus                 bg                             (bh:[b*](64, 26, 26), bi:(64, 1, 1)) -> (bf:[b*](64, 26, 26))
  Convolution          bj                             (bk:(64, 32, 3, 3), bl:[b*](32, 28, 28)) -> (bh:[b*](64, 26, 26))
  TransposeAxes        bm                             (conv2d_2/kernel:(3, 3, 32, 64)) -> (bk:(64, 32, 3, 3))
  Parameter            conv2d_2/kernel                 (3, 3, 32, 64)
  ReLU                 bn                             (bo:[b*](32, 28, 28)) -> (bl:[b*](32, 28, 28))
  Plus                 bp                             (bq:[b*](32, 28, 28), br:(32, 1, 1)) -> (bo:[b*](32, 28, 28))
  Convolution          bs                             (bt:(32, 1, 3, 3), conv2d_1_input:[b*](1, 28, 28)) -> (bq:[b*](32, 28, 28))
  TransposeAxes        bu                             (conv2d_1/kernel:(3, 3, 1, 32)) -> (bt:(32, 1, 3, 3))
  Parameter            conv2d_1/kernel                 (3, 3, 1, 32)
  Input                conv2d_1_input Input4           [b*](1, 28, 28)
  Reshape              bv                             (conv2d_1/bias:(32,)) -> (br:(32, 1, 1))
  Parameter            conv2d_1/bias                   (32,)
  Reshape              bw                             (conv2d_2/bias:(64,)) -> (bi:(64, 1, 1))
  Parameter            conv2d_2/bias                   (64,)
  Parameter            dense_1/kernel                  (10816, 128)
  Reshape              bx                             (dense_1/bias:(128,)) -> (r:(128,))
  Parameter            dense_1/bias                    (128,)
  Parameter            dense_2/kernel                  (128, 10)
  Reshape              by                             (dense_2/bias:(10,)) -> (g:(10,))
  Parameter            dense_2/bias                    (10,)
ai/cntk.txt · 最終更新: 2018/11/03 22:29 by oga