tensorflowとKerasとpytorchの比較

機械学習技術 自然言語技術 人工知能技術 デジタルトランスフォーメーション技術 画像処理技術 強化学習技術 確率的生成モデル 深層学習技術 Python 本ブログのナビ
tensorflowとKerasとpytorchの比較

深層学習のフレームワークとしては様々ものがある。例えばarXivに寄せられた機械学習に関する論文で使われたフレームワークの数の変遷をみると以下の様になる。

これをみると、現在最も使われているものがtensorflowで次にKeras、PyTorchの順番となる。tensorflowはgoogleによって開発されたもので長らく利用されているので学会で最も人気があるフレームワークとなる。tensorflowは、様々なスケーラブルなプロダクトやデプロイのオプションも提供されており、また、モデルの抽象度(レイヤーの名前を呼ぶだけでモデルを組むか、より深いアルゴリズムを変更するかなどの高さ)も色々あるので、非常に便利なフレームワークとなる。

Kerasは、TensorflowやCNTK、Theanoなどをバックエンドとして動作する高レベルのAPIで、構造もシンプルであり、可読性が高く、開発の際にドキュメントを調べる時間が短縮できる特徴がある。

それに対してPyTorchは、配列を直接操作する低レベルAPIで、学術研究や、最適化を必要とする深層学習のアプリケーションに望ましいソリューションになりつつあり、最近多く注目されているものとなる。

それぞれのフレームワークでの可読性を比較するため、深層学習のネットワークを記述した例を以下に示す。

まずはtensorflowでの記述が以下となる。

def conv2d(x, W, b, strides=1):
    x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')
    x = tf.nn.bias_add(x, b)
    return tf.nn.relu(x)
 
def maxpool2d(x, k=2):
    return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1],padding='SAME')
 
 
def conv_net(x, weights, biases):  
    conv1 = conv2d(x, weights[0], biases[0])
    conv1 = maxpool2d(conv1, k=2)
    conv2 = conv2d(conv1, weights[1], biases[1])
    conv2 = maxpool2d(conv2, k=2)
    fc1 = tf.reshape(conv2, [-1, weights[2].get_shape().as_list()[0]])
    fc1 = tf.add(tf.matmul(fc1, weights[2]), biases[2])
    fc1 = tf.nn.relu(fc1)
    out = tf.add(tf.matmul(fc1, weights[3]), biases[3])
    return out
 
 
pred = conv_net(x, weights, biases)
 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))

次にKerasの記述を示す。tensrflowと比較すると非常にシンプルな形で表現できることがわかる。

model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPool2D())
model.add(Conv2D(16, (3, 3), activation='relu'))
model.add(MaxPool2D())
model.add(Flatten())
model.add(Dense(10, activation='softmax')) 

最後にpythorchの記述を示す。kerasと比較すると、少しコードが複雑になることがわかる。

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, 3)
        self.conv2 = nn.Conv2d(32, 16, 3)
        self.fc1 = nn.Linear(16 * 6 * 6, 10)
        self.pool = nn.MaxPool2d(2, 2)
    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 6 * 6)
        x = F.log_softmax(self.fc1(x), dim=-1)
        return x
model = Net()

またそれぞれのフレームワークの処理速度を比較したデータを以下に示す。

tensorflowとpytorchの速度はほとんど変わらないが、Keraの速度が遅いことがわかる。

以上まとめると、タスク初期の小規模データでの仮説検証では、容易に構築でき、可読性も高い(ほとんどデバッグが必要ない)Kerasを利用することが最も効率的で、課題が明確になり、複雑なネットワークが必要になった時点で、tensorflow、pytorchを利用するのが最良のアプローチであることがわかる。

それらの実装に関しては、環境立ち上げとしてmacでのpython開発環境とtensflowパッケージ導入にて述べている。またkerasに関してはpythonとKerasによるディープラーニング以下で述べており、pytorchに関してはPyTorchによる発展ディープラーニングにて述べている。

コメント

  1. […] tensorflowとKerasとpytorchの比較 […]

  2. […] tensorflowとKerasとpytorchの比較 […]

タイトルとURLをコピーしました