ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

【Python】kerasで保存したweightsをh5pyを使って取得する

難しかった。(というかこのファイル構造よくわからん)

$ ls
model_weights.h5 # kerasで保存したファイル
$ python
# ...
>>> import h5py

>>> model_weights = h5py.File('./model_weights.h5', 'r')
>>> model_weights.keys()
KeysView(<Attributes of HDF5 object at 4383104920>) # (´・ω・`)?

>>> model_weights.attrs.keys()
KeysView(<Attributes of HDF5 object at 4383104920>) # (´;ω;`)?

>>> list(model_weights.attrs.keys())
['layer_names', 'backend', 'keras_version'] # (`・ω・’)!

>>> list(model_weights.attrs.get('layer_names'))
[b'dense_1', b'activation_1', b'dropout_1', b'dense_2', b'activation_2', b'dropout_2', b'dense_3', b'activation_3'] # (`・ω・’)

>>> list(model_weights.attrs.get('layer_names'))[0]
b'dense_1' # (´・ω・`)?

>>> # .....悩み中

>>> # !? そういえばattrs無しで試していない!

>>> list(model_weights)
['activation_1', 'activation_2', 'activation_3', 'dense_1', 'dense_2', 'dense_3', 'dropout_1', 'dropout_2'] # うぉおおお!!!

>>> list(model_weights)['dense']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not str # (´・ω・`)

>>> list(model_weights.get('dense_1'))
['dense_1'] # !? なにこれ・・・?

>>> model_weights['dense_1'].keys()
KeysView(<HDF5 group "/dense_1" (1 members)>) # わけわかめ

>>> model_weights['dense_1'].get('dense_1')
<HDF5 group "/dense_1/dense_1" (2 members)> # !? なるほど...

>>> list(array.get('dense_1').keys())
['bias:0', 'kernel:0']

>>> array.get('dense_1').get('bias:0')
<HDF5 dataset "bias:0": shape (512,), type "<f4">

>>> array.get('dense_1').get('bias:0')[()]
array([ -5.14987158e-04,  -1.05651123e-02,  -6.37231674e-03,
# ...
         1.46674449e-02,  -1.39807556e-02], dtype=float32) # ヾ(*´∀`*)ノキャッキャ

>>> np_array = array.get('dense_1').get('bias:0')[()]
>>> np_array.shape
(512,)

ちなみにpipでインストールすることができます。

$ pip install h5py

【Python】Cython試してみた

Jupyterではマジックコマンド?を書けばすぐ実行できるけど、コマンドラインから実行するやりかたがわからなかったのでメモ。

  • setup.py
# -*- coding:utf-8 -*-

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
from Cython.Compiler import Options
import numpy

Options.annotate = True

ext_modules = [Extension('example_cython', ['example.py'], language='c++')]

setup(cmdclass={'build_ext': build_ext}, ext_modules=ext_modules, include_dirs = [numpy.get_include()])

これで実行する。

$ python setup.py build_ext --inplace

いろいろできている。

$ ls -lt
-rw-r--r--  1 user staff       141  5 22 18:42 example.py
-rwxr-xr-x  1 user staff    159116  5 22 18:39 example_cython.cpython-36m-darwin.so
drwxr-xr-x  3 user staff       102  5 22 18:39 build
-rw-r--r--  1 user staff    376329  5 22 18:39 example.html
-rw-r--r--  1 user staff    414963  5 22 18:39 example.cpp
-rw-r--r--  1 user staff       403  5 22 18:39 setup.py

soファイルをリネームする

$ mv example.cpython-36m-darwin.so example_cython

pythonで読み込んでみる

$ python
>>> import example_cython

これでおk.あとは普通にpythonから使えるようになる(はず)

ちなみに、速度はそんなにかわりませんでした・・・なぜ?

うん。やっぱり適度な刺激は必要だと思います。

最近、でぃーぷな学習や強化してくれる学習を仕事で使うとか使わないとかで自習中ですが、周りを見ていると勉強のスピード速すぎと、飲み込み速すぎ、そしてブログまで書いている!!(もっといえばホットエントリしてる!!)と、すごすぎてワロタ。

比較してしまうと落ち込むだけで、そうするだけ無駄と知っているので、ただひたすら勉強するだけなんですが、でもやっぱりこういう環境っていいですね。なんというか、刺激になるなーと。

沖縄にいたときは、社内では結構できるほうだと思っていたので、天狗にならないように日々謙遜と自己学習をしていましたが、ここきたら自分を測る目盛りがあるかどうかもわからん。1mmもあるかどうか。それぐらい周りはすごいし、尊敬できる。

というわけで、爆走とは言わないですが、ちょっと早歩きで学習中です。今日始めて微分の意味を知りました。あと、ちょっとずつ勉強してきたおかげなのか、機械学習の数式をぱっと見ただけで、「ああ、これは・・・誤差関数かな?」みたいな変換ができるようになりました。

明日も頑張りまーす。おやすみ。

【Python】numpy.nditer()という関数

色々できそうだが、基本的な使い方だけメモ。

numpy.nditer — NumPy v1.12 Manual

何するの、これ? と思ったけど、使ってみた。まずはコードから。

np_array = np.random.randn(2, 3)
print(np_array)

nditer = np.nditer(np_array, flags=['multi_index'])
while not nditer.finished:
    print(nditer.multi_index)
    print(np_array[nditer.multi_index])
    nditer.iternext()

結果

# 最初のprint()
[[-1.74892591 -0.59628881  0.05522772]
 [ 1.31665726  1.22965398 -0.41140946]]

# whileループ
(0, 0)
-1.7489259098
(0, 1)
-0.596288812217
(0, 2)
0.0552277235215
(1, 0)
1.31665726393
(1, 1)
1.229653983
(1, 2)
-0.411409464808

なるほどー。何が便利かわからん。。。と思ったけど、numpyの次元が増えた時、2〜重ループとかしなくてもいいのね。納得。

5行1列(2次元)

np_array = np.random.randn(5, 1)
print(np_array)

nditer = np.nditer(np_array, flags=['multi_index'])
while not nditer.finished:
    print(nditer.multi_index)
    print(np_array[nditer.multi_index])
    nditer.iternext()
[[-0.12610291]
 [-1.69087957]
 [ 0.03920609]
 [ 0.19390889]
 [ 0.05827795]]
(0, 0)
-0.126102914336
(1, 0)
-1.69087956683
(2, 0)
0.0392060881481
(3, 0)
0.193908885096
(4, 0)
0.0582779462146

画像っぽい値で。2行2列3の値(3次元)

np_array = np.random.randn(2, 2, 3)
print(np_array)

nditer = np.nditer(np_array, flags=['multi_index'])
while not nditer.finished:
    print(nditer.multi_index)
    print(np_array[nditer.multi_index])
    nditer.iternext()
[[[ 0.40570373  0.29383617  0.19770627]
  [-0.35118724  0.64944819 -0.85610483]]

 [[-0.99811347 -0.3842173  -0.40674939]
  [-0.28392354  1.00559893 -0.36640248]]]
(0, 0, 0)
0.405703731115
(0, 0, 1)
0.293836169251
(0, 0, 2)
0.197706273648
(0, 1, 0)
-0.351187235594
(0, 1, 1)
0.649448185325
(0, 1, 2)
-0.856104830751
(1, 0, 0)
-0.998113470526
(1, 0, 1)
-0.384217298371
(1, 0, 2)
-0.406749392256
(1, 1, 0)
-0.283923537977
(1, 1, 1)
1.0055989324
(1, 1, 2)
-0.366402477684

すばらしい!!!