FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

TensorFlowとChainerのDeep MNISTのサンプルコード比較

f:id:msyksphinz:20160520003556j:plain

あまり機械学習に詳しくないのだが、とりあえずChainerを動かしてMNISTのサンプルコードを動かすことはできた。

一方でTensorFlowでもMNISTを動作させたことがある。コード的に両方ともPythonを使っており似通っているが、どのように違うのか比較してみると、アルゴリズムの詳細が見えてくるかもしれない。

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

ChainerのDeep MNISTのソースコード

github.com

TensorFlowのDeep MNISTのソースコード

Deep MNIST for Experts

domkade.hatenablog.jp

Chainerの方が比較的短めに見えるが、Optimizerに最初からMnistMLP()など存在しており、TensorFlowは自分でモデルを作り上げている印象だ。 TensorFlowはSoftmax()や最適化の方式などをプログラム中に記述してモデルを作り上げているが、Chainerの場合はそこが隠蔽されている。

  • Chainer
# Prepare multi-layer perceptron model, defined in net.py
if args.net == 'simple':
    model = L.Classifier(net.MnistMLP(784, n_units, 10))
    if args.gpu >= 0:
        cuda.get_device(args.gpu).use()
        model.to_gpu()
    xp = np if args.gpu < 0 else cuda.cupy
elif args.net == 'parallel':
    cuda.check_cuda_available()
    model = L.Classifier(net.MnistMLPParallel(784, n_units, 10))
    xp = cuda.cupy
  • TensorFlow
...
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])

y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)

cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

Optimizer Adamとは何か

有名な最適化更新式およびアルゴリズムのことを指すらしい。下記のページがあるが数式は正直良く分からない。

ja.scribd.com

ただ、ChainerのAdamの実装を見ると、

chainer.optimizers.adam — Chainer 1.16.0 documentation

    def update_one_cpu(self, param, state):
        m, v = state['m'], state['v']
        grad = param.grad

        m += (1 - self.beta1) * (grad - m)
        v += (1 - self.beta2) * (grad * grad - v)
        param.data -= self.lr * m / (numpy.sqrt(v) + self.eps)

Wikipediaの方の式に似ている。

確率的勾配降下法 - Wikipedia