深層学習ことはじめ その9

これから数回にわたって深層学習についての記事を書きます.ひとまとめに長文としたものを数回に分けて紹介していきます.初学者向けです,何かの参考になれば.前回の記事を読んでいない方は先にそちらを見てください.

******

TensorFlow

TensorFlowは、Googleが開発したTheanoよりも新しいライブラリです。それは、勾配を計算することのように、私達にとってTheanoのような多くの素晴らしいことをします。この最初のセクションでは、Theanoで行ったような基本的な機能、つまり変数、関数、および式について説明します。 TensorFlowのWebサイトには、ライブラリをインストールするために使用できるコマンドがあります。バージョン番号は変更される可能性があるので、ここには含めません。 TensorFlowをインストールしたら、Theanoと同じように単純な行列乗算の例を行います。いつものようにインポートする:
import tensorflow as tf

TensorFlowでは、タイプを指定する必要があります(Theanoのvariablesが TensorFlowのplaceholderに対応します):
A = tf.placeholder(tf.float32, shape=(5, 5), name=’A’)
ただし、shapeとnameはオプションです。
v = tf.placeholder(tf.float32)
TensorFlowでは ‘matmul’関数を使います。私はこの名前が ‘dot’よりも適切であると思います。
u = tf.matmul(A、v)
Theanoと同様に、変数の値を「フィード」する必要があります。 TensorFlowでは、「セッション」で「実際の作業」を行います。

output = session.run(w, feed_dict={A: np.random.randn(5, 5), v: np.random.randn(5, 1)}) print output, type(output)

Tensorflowにおける最適化

TensorFlowの2次式を最適化します。答えを手で計算する方法をすでに知っているはずなので、これはTensorFlowコーディングを強化し、ニューラルネットワークをより快適にコーディングするのに役立ちます。 TensorFlow変数を作成することから始めます(Theanoではこれは共有になります)。
u = tf.Variable(20.0)
次に、コスト関数/式を作成します。cost = u * u + u + 1.0オプティマイザを作成します。
train_op = tf.train.GradientDescentOptimizer(0.3).minimize(cost)
これはTheanoと大きく異なる部分です。 TensorFlowは勾配を計算するだけでなく、パラメータの更新を指定しなくても全体の最適化を行います。これのマイナス面は、あなたがグーグルが実行した最適化方法にこだわっていることです。 RMSProp(適応学習率法)やMomentumOptimizer(過去の体重変化の速度を使って極小値から抜け出すことができる)など、純粋な勾配降下法の他にもさまざまな種類があります。フォーラムの投稿でNesterovの勢いが現在進行中であることが示されているので、私はその全リストが近い将来更新されると思う。次に、変数を初期化するためのopを作成します(この問題では、単に「u」です)。

init = tf.initialize_all_variables()
with tf.Session() as session:
session.run(init)
for i in xrange(12):
session.run(train_op)
print “i = %d, cost = %.3f, u = %.3f” % (i, cost.eval(), u.eval())

TensorFlowにおけるニューラルネットワーク

入力変数、ターゲット変数、重み変数を作成しましょう。バイアス条件は省略しました。また、Theano shared = TensorFlow変数に注意してください。X = tf.placeholder(tf.float32、shape =(None、D)、name = ‘X’)T = tf.placeholder(tf.float32、shape =(None、K) )、name = ‘T’)W1 = tf.Variable(W1_init.astype(np.float32))W2 = tf.Variable(W2_init.astype(np.float32))混乱のようなので繰り返しましょう – A Theano variable!= TensorFlow変数。可変サイズ、つまりバッチサイズ、テストセットサイズなどを渡すことができるようにするために、シェイプに「None」を指定できます。では、出力を計算しましょう(隠れ層の非線形性としてReLUを使用しています。これはシグモイドやソフトマックスとは若干異なります。Z = tf.nn.relu(tf.matmul(X、W1))Yish = tf.matmul(Z、W2)最終ソフトマックスステップ。これを行わないのは、それがコスト関数の計算方法に含まれているからです(つまり、TensorFlow関数がどのように機能するのか)。この変数をsoftmaxにしたくないのは、事実上2回softmaxを実行することになるからです。次のようにコストを計算します。cost = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(Yish、T))
TensorFlowのドキュメンテーションを十分に参照することで、これらの関数はおそらくなじみがなく外来のものに見えるかもしれませんが、あなたはそれらに慣れていくでしょう。 Theanoの例と同様に、train関数とpredict関数も作成します。train_op = tf.train.RMSPropOptimizer(learning_rate、decay = 0.99、momentum = 0.9).minimize(cost)predict_op = tf.argmax(Yish、1) Theanoとは異なり、重み更新式を指定する必要すらありませんでした。あなたはほとんどいつもw + = learning_rate * gradientを使うつもりなので、それは一種の冗長であると言うかもしれません。ただし、適応学習率や運動量などのさまざまな手法が必要な場合は、Googleの責任になります。幸いなことに、彼らのエンジニアはすでにRMSProp(適応学習率用)と運動量を含んでいます。これらは私が上で使用したものです。それらの他の最適化機能について学ぶためには、それらのドキュメントを参照してください。 TensorFlowでは、すべての変数オブジェクトを初期化するために特別な関数を呼び出す必要があります。 init = tf.initialize_all_variables()そして、最後に、セッション内で、トレインを実行し、関数をループで予測します。tf.Session()をsession:session.run(init)として使用します。 xrange(max_iter):xrange(n_batches)内のjに対して:Xbatch = Xtrain [j * batch_sz:(j * batch_sz + batch_sz)、]

Ybatch = Ytrain_ind [j * batch_sz:(j * batch_sz + batch_sz)、] session.run(train_op、feed_dict = {X:Xbatch、T:Ybatch})、j%print_period == 0:test_cost = session.run(コスト) 、feed_dict = {X:Xtest、T:Ytest_ind})予測= session.run(predict_op、feed_dict = {X:Xtest})print error_rate(予測、Ytest)ここでもバッチグラジエントディセントを使用しています。 error_rate関数は次のように定義されています。def error_rate(p、t):return np.mean(p!= t)Ytrain_indとYtest_indは以前と同じように定義されています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です