Chainer備忘録1

このあたりを参照してPythonの環境を整える qiita.com

qiita.com

3章 Chainerの使い方 3.4 optimizers 損失関数に入力している(x,y) についてshapeの記載がないが、 ここは In [42]: x.shape Out[42]: (3, 4) In [43]: y.shape Out[43]: (3, 3)

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


class MyChain(Chain):
    def __init__(self):
        super(MyChain, self).__init__(
            l1 = L.Linear(4,3),
            l2 = L.Linear(3,3),
        )

    def __call__(self, x, y):
        fv = self.fwd(x, y)
        loss = F.mean_squared_error(fv, y)
        return loss

    def fwd(self, x, y):
        return F.sigmoid(self.l1(x))

x = Variable(np.array(range(12)).astype(np.float32).reshape(3,4))
y = Variable(np.array(range(9)).astype(np.float32).reshape(3,3)) 

mymodel = MyChain()
optimizer = optimizers.SGD()
optimizer.setup(model)
model.zerograds()
loss = model(x,y)
loss.backward()
optimizer.update()

ITストラテジストを受けることにした(?かも)

ITストラテジストを受けることにした。 IPAのサイトでは、ITストラテジストは以下のように紹介されている。

経営戦略に基づいてIT戦略を策定し、ITを高度に活用した事業革新、業務改革、及び競争優位を獲得する製品・サービスの創出を企画・推進して、ビジネスを成功に導くCIOやCTO、ITコンサルタントを目指す方に最適です。

私は複合機業界で組み込みエンジニアをしてきたので、数年前までであれば、システムアーキテクトが最適であったと思う。 *1 その後異動があり、純粋な製品開発から、先進技術調査・プロトタイプ開発や企画業務等に携わるようになった。 そういう背景もあり、システムアーキテクトに再チャレンジするのはどうしても今更感が漂ってしまう。

ITストラテジストを受ける理由は、企画業務もしくは応用研究を行う際に必要となるであろう、市場動向等を見極めたうえで企画もしくは研究の市場性を第三者に説明できる能力があることを示す、ひとつの具体例となるのではないかと期待してのことである。 XXXスペシャリストやシステムアーキテクトのような、既に決められた枠組みの中で最適なシステムを模索する業務に関する資格、ではこの目的は果たせない。

もちろん、この資格さえ持っていれば何かができるというわけでもないのだが、 対外的に示せる、経営とITが分かっている風の資格が一つくらいあってもいいという打算や、 資格試験に向けて勉強する中で、それなりに周辺知識が付くであろうという期待がある。

セキュリティに関する目が厳しくなる一方の世の中なので、 情報セキュリティスペシャリストを持っていてもいい気はするが、持っていなくてもいい気もする。(まぁみんな持ってるし、という意味で。) 私の場合は、勉強になるからという視点で受験して、受かったとしてもひけらかさないというのは有りな気はする。 あっても良いという程度のものは、無くても構わない視点で見るなら、不要ということかな。とりあえずそれくらいに優先度は低いということだろう。

さて、立ち戻ってITストラテジストはどうなのだろうか。 自分の中の意識としては、数年後の独立を見据えて、なのかな。 今すぐには必要ない気もしてきた。 いざ独立を考える1年程度前に取得するというのでも、十分ではないのか。

資格試験の一つの役割は履歴書における見栄えである。 最近、履歴書を書く機会があったが、応用情報技術者を5年以上前に取得している関係で、何とも見栄えが悪かった。 過去の栄光というか、その後の自己研鑽はないのか?という印象を持つ。 そういう視点からすれば、一定の方向に向けて着実にステップアップしており、直近に最も良い成果が出ているのが見栄えが良い。

うーん、悩ましい。 所詮資格、他に身のあることでも探すかなぁ。

www.jitec.ipa.go.jp

*1:紙搬送や感光体を扱うような制御ソフトは担当していないのでエンベデッドシステムスペシャリストはやや外れる。数年前に受けたことがあるが、介護ベッドの角度調整問題に妙に苦戦して落としてしまったことがある。原因は明らかに試験対策不足であった。

Softmax regresssion その1 (Pylearn2 IPython Notebook Turtorialsのチュートリアル)

はじめに

Pylearn2のサイトに“IPython Notebook Turtorialsに目を通すように"と書かれていたので読んでいたころ、 Softmax regressionのPart2:How to use pylearn2 to do softmax regressionで詰まった部分があったので書き留めておく。 (Softmax regression自体については触れていないので、他を参照してください。)

ここではIPython notebookで実行せず、静的なチュートリアルサイト[1]を参照する形で行った。

まず動かしてみる

頭から読んでいたらよくわからなくなってきたので、まずは動かしてみる。

MNISTをダウンロードしていない場合はダウンロードする

学習データがない場合、エラーが出るのでダウンロードしておく。 Pylearn2ではダウンロードするためのスクリプトが用意されている。

python ~/pylearn2/pylearn2/scripts/datasets/download_mnist.py 

実行

チュートリアルでは細かく分割して書いているが、表面的には以下のようなことをしている。

1.4つのYAMLファイル(データセット、モデル、アルゴリズム、学習)を読み込む

2.パラメータを設定する

3.学習を実行する

以下に、細かく分割されていたスクリプトをまとめたものを置いた。 これを適当な名前で保存し、python xxx.pyとすれば実行できる。

import os
import pylearn2
dirname = os.path.abspath(os.path.dirname('softmax_regression.ipynb'))
# sr_dataset.yamlをdatasetへ読み込み、
# 文字列中の %(train_stop)i を hyper_params で置き換える。
# stop: %(train_stop)i -> stop: 50000
# % は開始、iは型指定(符号付き10進数)       参照[2]
with open(os.path.join(dirname, 'sr_dataset.yaml'), 'r') as f:
    dataset = f.read()
hyper_params = {'train_stop' : 50000}
dataset = dataset % (hyper_params)

with open(os.path.join(dirname, 'sr_model.yaml'), 'r') as f:
    model = f.read()

with open(os.path.join(dirname, 'sr_algorithm.yaml'), 'r') as f:
    algorithm = f.read()
hyper_params = {'batch_size' : 10000,
                'valid_stop' : 60000}
algorithm = algorithm % (hyper_params)

with open(os.path.join(dirname, 'sr_train.yaml'), 'r') as f:
    train = f.read()
save_path = '.'
#ローカルスコープにある変数で置き換え
train = train %locals()

#実行
from pylearn2.config import yaml_parse
train = yaml_parse.load(train)
train.main_loop()

最終的なYAML

Train

0から50000まで学習に使う

dataset: &train !obj:pylearn2.datasets.mnist.MNIST {
        which_set: 'train',
        start: 0,
        stop: 50000
}

Model

n_classes: クラス分けしたい数。MNISTは0-9の数字なので10

irange: W(重さの行列)をランダムに初期化するレンジ。0から0の間で初期化

nvis: MNISTが28*28の画像なので、784個の入力層を用意する

model: !obj:pylearn2.models.softmax_regression.SoftmaxRegression {
    n_classes: 10,
    irange: 0.,
    nvis: 784,
}

Algorithm

要調査。。

BGD: batch gradient descent 共役勾配法

batch_size: 大きいほうが良いらしい

line_search_mode: 'exhaustive' : 徹底的に探索する

    algorithm: !obj:pylearn2.training_algorithms.bgd.BGD {
        batch_size: 10000,
        line_search_mode: 'exhaustive',
        conjugate: 1,
        monitoring_dataset:
            {
                'train' : *train,
                'valid' : !obj:pylearn2.datasets.mnist.MNIST {
                              which_set: 'train',
                              start: 50000,
                              stop:  60000
                          },
                'test'  : !obj:pylearn2.datasets.mnist.MNIST {
                              which_set: 'test',
                          }
            },
        termination_criterion: !obj:pylearn2.termination_criteria.MonitorBased {
            channel_name: "valid_y_misclass"
        }
    }

Extensions

    extensions: [
        !obj:pylearn2.train_extensions.best_params.MonitorBasedSaveBest {
             channel_name: 'valid_y_misclass',
             save_path: "./softmax_regression_best.pkl"
        },
    ],
    save_path: "./softmax_regression.pkl",
    save_freq: 1
}

検証

Weightsを見る

Quick-start exampleと同じ要領で確認してみる。[3]

show_weights.py softmax_regression.pkl

なんとなく、左上から0,1,2...と確認できる。

f:id:w_endo:20151106125710p:plain

学習の過程を見る

plot_monitor.py softmax_regression.pkl

b,L,Mとするとこのような感じ。

f:id:w_endo:20151106131438p:plain

参考

  1. pylearn2 tutorial: Softmax regression
  2. Pythonライブラリリファレンス 3.6.2 文字列フォーマット操作
  3. Quick-start example