TIM Labs

Chainer:学習結果(脳)をsave/loadする前に

| コメント(0) | トラックバック(0)
Deep Learningを色々いじってきて、なんとなく学習出来ているのは分かったのだが、学習には結構時間が掛かる。そのため、一度学習した結果をファイルに出力しておき、必要になったときにファイルを読み込むことで学習することなく賢くして、使いたいものである。

ということで、学習結果(脳)のファイルへのsave/loadについて検討してみよう。

そのために、いままで利用してきたプログラムを使おう。

いままでのプログラムは、学習部分も、学習結果の判定のためのテスト部分も1つのファイルになっていたので、まずは2つの部分に分けようと思う。

このとき、学習結果が入っているオブジェクト(脳)は同じでなければならず、プログラムではそれを表すクラスが使われていた。
手書きデータの場合には、次のクラスがそれだ。

class DigitsChain(Chain):
    def __init__(self):
        super(DigitsChain, self).__init__(	
            l1=L.Linear(64,32),		# 1-2層
            l2=L.Linear(32,10),		# 2-3層
        )
        
    def __call__(self,x,y):
        return F.mean_squared_error(self.fwd(x), y)

    def fwd(self,x):
         h1 = F.sigmoid(self.l1(x))
         h2 = self.l2(h1)
         return h2
今までのファイルは、「学習&セーブ」と「ロード&テスト」の2つのファイルに別れる。
このとき、上記クラスは共通だから、これを"digitschain.py"という名前のファイルにする。

Pythonのモジュールは異常に簡単だ。 上のように、何でも良いから、.pyがついたファイルにしてしまえば、それだけでモジュールになってしまう。 他の言語のように、モジュールにするにはあれこれ宣言しないとダメとか全然ない。 そして、そのモジュールをインポートすれば使えるようになる。 記述フォーマットはいくつか種類があるが、モジュール名(=ファイル名)と、インポートする物を記述するのが次である。
from digitschain import DigitsChain
ということで、実際にimportしてみた。
>>> from digitschain import DigitsChain
Traceback (most recent call last):
  File "", line 1, in 
  File "/home/fuji/Study/Python/Chainer/digitschain.py", line 11, in 
    class DigitsChain(Chain):
NameError: name 'Chain' is not defined
>>> 
クラスだけのファイルはダメだった。
Chainというのは親クラスなので、
from chainer import Chain
の1行だけを加えたら、一応エラーは出なくなった。
L.やF.が使われているのにエラーにならないということは、メソッドを定義だけでは中身は検査されず、エラーにならないようだ。
でも、一応、おまじないを最初に全部加えておいた。
 
"digitschain.py"
# Define model

import numpy as np
import chainer
from chainer import cuda, Function, gradient_check, Variable 
from chainer import optimizers, serializers, utils
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L

class DigitsChain(Chain):
    def __init__(self):
        super(DigitsChain, self).__init__(	
            l1=L.Linear(64,32),		# 1-2層
            l2=L.Linear(32,10),		# 2-3層
        )
        
    def __call__(self,x,y):
        return F.mean_squared_error(self.fwd(x), y)

    def fwd(self,x):
         h1 = F.sigmoid(self.l1(x))
         h2 = self.l2(h1)
         return h2
さて、次回は、これをimport して、学習内容をファイルに書き出すことをやってみよう。

トラックバック(0)

トラックバックURL: http://labs.timedia.co.jp/mt/mt-tb.cgi/566

コメントする

このブログ記事について

このページは、fujiが2017年2月21日 00:00に書いたブログ記事です。

ひとつ前のブログ記事は「Chainer:学習進行状況をグラフ化しよう」です。

次のブログ記事は「データ解析のための統計モデリング入門 一般化線形モデル(GLM) 読書メモ3」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ