Converg.

ものづくり関係の備忘録

深層学習 Day 1

やっとディープラーニング(深層学習)について取り組めます。
小学生の頃に完全なる人工知能を夢見て,色々想像してたのが懐かしいです。

実行環境構築

OS X上かつMacportsが慣れているのでその条件で構築します。
以下,Macportsがインストールされていることを前提に始めます。
インストールするもののパッケージ名は次の通りです。

 ・python34 @3.4.3_5
 ・py34-chainer @1.1.1_0
   ... A flexible framework of neural networks
 ・py34-six @1.9.0_0
   ... A Python 2 and 3 compatibility library
 ・py34-pip @7.1.2_0
   ... A tool for installing and managing Python packages

まずは,python34のインストールから。

$ sudo -E port install python34 

インストール後,python34を使えるようにします。
念のため,バージョンがpython34のものになっているかも確認しておきましょう。

$ sudo -E port select --set python python34 
$ python --version

次は,残り3つをインストールしていきます。

$ sudo -E port install py34-chainer
$ sudo -E port install py34-six
$ sudo -E port install py34-pip

最後に,
先ほどインストールしたchainerのバージョン@1.1.1_0ですが,
Macportsのツリーでは最新版ではないので,
pipコマンドを使用して最新版にしちゃいましょう。

$ pip-3.4 install --upgrade chainer

これにて,環境設定は完了です。




簡単なサンプル

Day 1 ということで私もディープラーニングに興味を持ち,勉強を開始したばかりです。
高度なことは全くまだできませんので,ご了承ください。短いサンプルを示します。

このサンプルは,階層型ニューラルネット(Hierarchical Neural Network)ですが,深層化しているわけではないため,深層学習とは呼べないと理解しています。(間違ってたらコメントで教えてください)

#!/usr/bin/env python
import numpy as np
import chainer.functions as F
from chainer import Variable, FunctionSet, optimizers, gradient_check

# 入力の設定
x = Variable(np.array([[1, 2, 3]], dtype=np.float32))

# 入力に対する結合の重みの設定
w = F.Linear(3, 3)
# 確率的勾配降下法(Stochastic Gradient Descent Method)
# を用いた誤差逆伝播学習を使用する
optimizer = optimizers.SGD()
optimizer.setup(w)

# 正解出力の設定
t = Variable(np.array([[4, 13, 3.4]], dtype=np.float32))

# 学習回数(反復回数)の設定
itrstep = 100

# 学習開始
for i in range(0, itrstep):
    optimizer.zero_grads()

    # 入力及び結合重みから出力を計算する
    y = w(x)
    # 出力をコマンドラインに表示
    print(y.data)
    # 平均二乗誤差の算出
    loss = F.mean_squared_error(y, t)
    # 結合重みの修正
    loss.backward()
    optimizer.update()

    # 次の反復ステップへ

続いて実行結果。

[[-0.26077998  1.17885709  0.33666974]]
[[ 0.16529801  2.36097169  0.64300281]]
[[ 0.54876822  3.42487407  0.91870254]]
[[ 0.89389133  4.38238668  1.16683233]]
[[ 1.20450222  5.24414778  1.39014888]]
[[ 1.48405206  6.01973343  1.59113419]]
[[ 1.73564684  6.71775961  1.77202058]]
[[ 1.96208215  7.34598398  1.93481874]]
[[ 2.165874    7.91138554  2.08133674]]
[[ 2.34928656  8.42024708  2.21320319]]
[[ 2.51435804  8.87822247  2.33188272]]
[[ 2.66292191  9.29039955  2.43869448]]
[[ 2.79662991  9.66135979  2.53482509]]
[[ 2.91696692  9.995224    2.62134266]]
[[  3.02527046  10.29570198   2.69920826]]
[[  3.12274337  10.56613159   2.76928735]]
[[  3.21046925  10.80951881   2.8323586 ]]
[[  3.28942204  11.02856731   2.88912296]]
[[  3.36047983  11.22570992   2.94021058]]
[[  3.4244318   11.40314007   2.98618984]]
[[  3.48198867  11.5628252    3.02757072]]
[[  3.53378987  11.70654297   3.06481361]]
[[  3.58041096  11.83588791   3.09833217]]
[[  3.62236977  11.95229912   3.12849903]]
[[  3.66013288  12.05706978   3.15564919]]
[[  3.69411945  12.15136337   3.18008423]]
[[  3.72470737  12.23622704   3.20207596]]
[[  3.75223708  12.31260395   3.22186828]]
[[  3.77701306  12.3813448    3.23968124]]
[[  3.79931164  12.44320965   3.25571346]]
[[  3.81938052  12.49888802   3.2701416 ]]
[[  3.8374424   12.54899979   3.28312778]]
[[  3.85369825  12.5941       3.29481506]]
[[  3.86832833  12.63469028   3.30533338]]
[[  3.88149571  12.67122078   3.31480026]]
[[  3.89334631  12.7040987    3.32332015]]
[[  3.90401125  12.7336874    3.33098793]]
[[  3.91361022  12.76031971   3.33788943]]
[[  3.92224932  12.78428841   3.34410071]]
[[  3.93002462  12.80585861   3.34969044]]
[[  3.93702173  12.82527256   3.35472131]]
[[  3.94331956  12.84274578   3.35924935]]
[[  3.94898772  12.85847092   3.36332417]]
[[  3.95408916  12.87262535   3.366992  ]]
[[  3.95867991  12.88536167   3.37029266]]
[[  3.96281195  12.89682484   3.37326336]]
[[  3.9665308   12.90714359   3.37593699]]
[[  3.96987748  12.91642952   3.37834311]]
[[  3.9728899   12.92478561   3.38050914]]
[[  3.97560096  12.93230629   3.38245821]]
[[  3.97804117  12.93907642   3.38421226]]
[[  3.98023701  12.94516945   3.38579082]]
[[  3.98221302  12.95065308   3.38721204]]
[[  3.98399162  12.95558739   3.38849092]]
[[  3.98559284  12.96002769   3.389642  ]]
[[  3.98703313  12.96402645   3.39067769]]
[[  3.98832989  12.96762276   3.39161015]]
[[  3.98949695  12.97086239   3.3924489 ]]
[[  3.99054718  12.97377396   3.39320397]]
[[  3.99149251  12.97639656   3.39388347]]
[[  3.99234343  12.97875881   3.39449525]]
[[  3.99310899  12.98088169   3.39504552]]
[[  3.99379826  12.98279381   3.39554119]]
[[  3.99441791  12.98451328   3.39598703]]
[[  3.99497652  12.98606205   3.39638829]]
[[  3.99547887  12.98745632   3.3967495 ]]
[[  3.99593067  12.9887104    3.3970747 ]]
[[  3.99633789  12.98983955   3.39736676]]
[[  3.9967041   12.99085426   3.39763045]]
[[  3.9970336   12.99176979   3.3978672 ]]
[[  3.99733019  12.99259186   3.39808059]]
[[  3.99759698  12.99333382   3.39827251]]
[[  3.99783754  12.99399948   3.39844513]]
[[  3.99805379  12.9946003    3.39860058]]
[[  3.9982481   12.99513912   3.39874077]]
[[  3.99842334  12.9956255    3.39886642]]
[[  3.99858141  12.99606323   3.3989799 ]]
[[  3.99872303  12.99645615   3.39908195]]
[[  3.99885058  12.99681091   3.39917397]]
[[  3.9989655   12.99713039   3.39925623]]
[[  3.99906921  12.9974165    3.39933085]]
[[  3.9991622   12.9976759    3.39939761]]
[[  3.99924588  12.99790955   3.39945793]]
[[  3.99932098  12.99811745   3.39951205]]
[[  3.99938893  12.99830532   3.39956093]]
[[  3.99945021  12.99847507   3.3996048 ]]
[[  3.99950504  12.99862862   3.39964414]]
[[  3.99955463  12.99876404   3.3996799 ]]
[[  3.99959898  12.99888802   3.39971185]]
[[  3.99963951  12.9989996    3.3997407 ]]
[[  3.99967527  12.99909973   3.39976645]]
[[  3.99970794  12.99919033   3.39979005]]
[[  3.99973702  12.99927139   3.39981103]]
[[  3.99976349  12.99934387   3.39982986]]
[[  3.99978709  12.99940872   3.39984679]]
[[  3.99980807  12.9994688    3.39986205]]
[[  3.99982715  12.99952126   3.39987588]]
[[  3.99984479  12.99956989   3.39988852]]
[[  3.99985981  12.99961281   3.39989972]]
[[  3.99987388  12.99965      3.39990973]]

以上のように,学習を繰り返す(結合重みをあるアルゴリズムに従って反復して修正する)ことで,設定した正解出力に近づいていることがわかりました。
にしてもChainerは非常に使いやすいですね,こういったフレームワークの良さを実感しました。

誤差逆伝播法の詳細については後日まとめて,次からは深層学習に入りたいと思います。