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

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

******

Theano

Theanoは、ディープラーニングで非常に人気のあるPythonライブラリです。これまで見てきたように、勾配降下はかなり時間がかかることがあるので、それはあなたがより速い浮動小数点計算のためにGPUを利用することを可能にします。この記事では、Theanoコードの書き方を説明しますが、GPU機能を備えたマシンを入手する方法、およびそれらを使用するためにTheanoコードとコマンドを調整する方法について詳しく知りたい場合は、私のWebサイトを参照してください。 https://udemy.com/data-science-deep-learning-in-theano-tensorflow .それを設定するのは自明ではなく、AWSのユーザーインターフェースは初めての人にとっては非常に困難です。小さな画面上の単純なスクリーンショットではうまくいきませんので、ここでは説明しません。

Theanoの基本

あなたがすでにPythonを知っているときにNumpyを学ぶのは簡単ですね。特別な種類の配列を操作するための新しい関数がいくつかあります。 NumpyからTheanoへの移動は他のまったくの獣です。通常のPythonのようには見えない、新しい概念がたくさんあります。それでは、まずTheano変数について説明しましょう。 Theanoには、オブジェクトの次元数に基づいてさまざまなタイプの可変オブジェクトがあります。たとえば、0次元のオブジェクトはスカラ、1次元のオブジェクトはベクトル、2次元のオブジェクトは行列、3次元のオブジェクトはテンソルです。それらはすべてtheano.tensorモジュール内にあります。それで、あなたのインポートセクションで:theano.tensorをTとしてインポートすることができる以下のようなスカラ変数を作成することができます。c = T.scalar( ‘c’)渡される文字列は変数の名前です。ベクトルは、このように作成することができます。v = T.vector( ‘v’)そして、このような行列:A = T.matrix( ‘A’)この記事ではテンソルを使って作業していないので、そうではありません。それらを見に行きます。カラー画像を使い始めるとき、これはもう一つの次元を加えるでしょう、それであなたはテンソルが必要です。 (例:28×28の画像は、3×28×28の寸法になります。なぜなら、赤、緑、青のチャンネルに別々の行列が必要だからです)。通常のPython対Theanoの奇妙な点は、作成したばかりの変数に値がないことです。 Theano変数は、グラフ内のノードに似ています。
フィードフォワードやバックプロパゲーションなどの計算を実行したいときにグラフに値を「渡す」だけです。まだ定義されています。 TensorFlowも同じように機能します。それにもかかわらず、変数に対する操作を定義できます。たとえば、行列の乗算を実行したい場合、それはNumpyに似ています。u = A.dot(v)これは、uと呼ばれるグラフに新しいノードを作成することと考えることができます。行列を掛けます。実際の値で実際に乗算するには、Theano関数を作成する必要があります。 theanoをインポートするmatrix_times_vector = theano.function(入力= [A、v]、出力= [u])numpyをnpとインポートするA_val = np.array([[1,2]、[3,4]])v_val = np。 array([5,6])u_val = matrix_times_vector(A_val、v_val)これを使って、ニューラルネットワークの「フィードフォワード」アクションをどのように実装するかを考えてみてください。 Theanoの最大の利点の1つは、これらすべての変数を1つのグラフにリンクし、前に説明した連鎖規則を使用してその構造を使用して勾配を計算できることです。 Theanoでは、通常の変数は「更新可能」ではありません。そして、更新可能な変数を作るために、シェア変数と呼ばれるものを作ります。 x = theano.shared(20.0、 ‘x’)自分自身で解くことができ、それが大域的最小値を持つことがわかっている単純な費用関数も作成しましょう。そして、Theanoに伝えましょう。更新式を与えてxを更新する方法x_update = x – 0.3 * T.grad(cost、x)grad関数は2つのパラメーターを取ります。勾配を取りたい関数と、必要な変数です。に対する勾配後でニューラルネットワークの各重みに対して行うように、複数の変数をリストとして2番目のパラメータに渡すことができます。それでは、Theanoトレイン関数を作成しましょう。 updates引数と呼ばれる新しい引数を追加します。それはタプルのリストを取り、そして各タプルはその中に2つのものを持っています。最初のものは更新する共有変数で、2番目のものは使用する更新式です。 train = theano.function(入力= []、出力=コスト、更新= [(x、x_update)])「x」は入力ではないので、更新します。後の例では、入力はデータとラベルになります。そのため、入力パラメータはデータとラベルを取り込み、更新パラメータはモデルパラメータとそれらの更新を取り込みます。今度は単純に何度も何度もtrain関数を呼び出すためのループを書いています。xrange(25)のiのために:cost_val = train()print cost_valそしてxの最適値を出力します。print x.get_value() Theanoで概念を作成し、ニューラルネットワークを構築します。

Theanoのニューラルネットワーク

まず、入力、出力、および重みを定義します(重みは共有変数になります)。thX = T.matrix( ‘X’)thT = T.matrix( ‘T’)W1 = theano.shared( np.random.randn(D、M)、 ‘W1’)W2 = theano.shared(np.random.randn(M、K)、 ‘W2’)Theano変数に「th」という接頭辞を追加したことに注意してください。実際のデータはNumpy配列のXとTです。Mは隠れ層の単位数です。次に、フィードフォワードアクションを定義します。 thZ = T.tanh(thX.dot(W1))thY = T.nnet.softmax(thZ.dot(W2))T.tanhはシグモイドに似た非線形関数ですが、範囲は-1から+です。 1。次に、コスト関数と予測関数を定義します(これは後で分類誤差を計算するために使用されます)。 cost = – (thT * T.log(thY))。sum()予測= T.argmax(thY、axis = 1)そして私は自分の更新式を定義します。 (Theanoに勾配を計算する関数があることに注意してください。)update_W1 = W1 – lr * T.grad(cost、W1)update_W2 = W2 – lr * T.grad(cost、W2)簡単な例に似たトレイン関数を作成します。
train = theano.function(入力= [thX、thT]、updates = [(W1、update_W1)、(W2、update_W2)]、)
そしてテストセットのコストと予測を通知する予測関数を作成します。エラー率と分類率は後で計算できます。 get_prediction = theano.function(入力= [thX、thT]、出力= [コスト、予測]、)そして最後のセクションと同じように、収束するまでtrain()を何度も何度も呼び出すfor-loopを行います。 (最小の微分は0になるので、その時点では重みはそれ以上変化しません)。このコードは、「バッチ勾配降下」と呼ばれる方法を使用します。これは、トレーニングセット全体ではなく、一度に1つずつトレーニングセットのバッチを反復する方法です。これは「確率論的」な方法です。つまり、同じ分布に由来する多数のサンプルにわたって、それらすべてに最適な値に収束することを願っています。
for i in xrange(max_iter):
for j in xrange(n_batches):
Xbatch = Xtrain[j*batch_sz:(j*batch_sz + batch_sz),]
Ybatch = Ytrain_ind[j*batch_sz:(j*batch_sz + batch_sz),]
train(Xbatch, Ybatch)
if j % print_period == 0:
cost_val, prediction_val = get_prediction(Xtest, Ytest_ind)

コメント

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