スポンサーリンク

Chainer用の画像処理メモ(5)初めてのNumPy”import numpy as np”

機械学習で、Chainer用の画像→ndarray変換を行うために、pythonの勉強をしている。

http://twosquirrel.mints.ne.jp/?p=20135

前回までは、以下の本で、Pythonのタプル、リスト、for文、ファイルの読み書き、PIL(pillow)について学んできた。pythonを用いて機械学習をやる目的として、以下の本の「第4章 リスト」、「第8章 ファイルの読み書き」、「第17章 画像の操作」を繰り返し読むことが非常におすすめです!

今回は、何回やっても、いまいち、さっぱり分からないnumpyについて、腰を据えて勉強してみたい。

2つの本を順番に写経していきます。特に左側の本は、Deep Learningプログラミングに興味を持った人には絶対お勧めです。

右側の本も、Chainerをやってみようと思う方にはぜひおすすめです。

 

「ゼロから作るDeep Learning」 1章 Python入門 1.5 NumPy

「Cainer v2による実践深層学習」 第1章 NumPyで最低限知っておくこと

(環境)
Panasonic CF-RZ4
Windows 8.1 Pro
Anaconda 4.4.0
Python 3.5
Chainer 2.0
OpenCV3

まず、「ゼロから作るDeep Learning」 1章 Python入門 1.5 NumPy の一部を写経する。

NumPyの配列クラス(numpy.array)には、便利なメソッドが多数用意されている。

(1)NumPy配列の生成:np.array()メソッド

# ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

# NumPy配列の生成
import numpy as np
x = np.array([1.0, 2.0, 3.0])
print(x)

image

(2)

# NumPyの算術計算
import numpy as np
x = np.array([1.0, 2.0, 3.0])
y = np.array([2.0, 4.0, 6.0])
x + y

print(x + y)

x * y    # element-wise product

要素ごとに、掛け算、割り算が実行される。

数学の行列の積のを計算したいときは、dot()メソッドを用いる。(後述)

image

(3)

# NumPyのN次元配列
import numpy as np
A = np.array([[1, 2], [3, 4]])
print(A)

image

Chainerのデータセットは、(array([0,0,…,0,0], dtype=float32), 5) という形をしており、
訓練データの方はfloat32型、ラベルはint32型とのこと。。。
(参考:https://qiita.com/tommyfms2/items/c3fa0cb258c17468cb30

import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[3, 0], [0, 6]])
A + B

image

# ブロードキャスト

image

(4)要素へのアクセス

image

NumPy配列は、flatten()メソッドにより、1次元の配列へ変換したのち、各要素へアクセスすることも可能。

image

 

これだけでも十分につまらなくて疲れてしまうのだが、引き続き、

「Cainer v2による実践深層学習」 第1章 NumPyで最低限知っておくこと

を写経していく。上記と重複する部分もあるが、復習ということで。。。

「1」配列の生成

image

# 配列の形をかえるときは、reshape()メソッド
np.arange(6).reshape(2, 3)

image

import numpy as np
a = np.arange(60).reshape(10, 6)
# 配列の形
a.shape

# 要素数
a.size

# 行数、列数の取り出し
nrow, ncol = a.shape
print(nrow)
print(ncol)

image

# 0.0(実数)が5個ある配列
import numpy as np
np.zeros(5)

image

「2」配列の加工

reshape()

配列のコピーは通常はポインターのコピーなので、コピー先の配列を変更すると、元の配列も変更されてしまう。それを避けるためには、copy()を用いる。

import numpy as np
a = np.arange(6).reshape(2, 3)
print(a)
print(‘\n’)
b1 = a.copy()    # 実体をコピー
b2 = np.copy(a)  #  これも実体のコピー
b1[0, 1] = 6     # コピー先を変更(aは変化しない)
b2[0, 1] = 6     # コピー先を変更(aは変化しない)
print(b1)
print(b2)
print(a)

image

「3」配列に対する演算

# 配列に対する演算
import numpy as np
# numpy.arange([start, ]stop, [step, ]dtype = None)
# https://deepage.net/features/numpy-arange.html
a = np.arange(1, 7).reshape(2, 3)
a

image

np.sum(a, axis=0) # 列ごとの和

image

サイズが同じ行列の演算は、要素ごとに行われる

(省略)

行列の積は、dot()を用いる。ベクトルに対しては内積となる。

import numpy as np
A = np.arange(6).reshape(2, 3)
B = np.arange(6).reshape(3, 2)
print(A)
print(B)
print(A.dot(B))

image

「4」配列の保存と読み出し

pickle を用いる。

image

TypeError: write() argument must be str, not bytes

というエラーが出て困っ。ググッたところ、

2015年06月04日
python; pickle にて TypeError: must be str, not bytes が出る場合
http://blog.livedoor.jp/kmiwa_project/archives/1029767509.html

に解決法の記載があった!素晴らしい!

image

ちゃんと、a.pkl というファイルが出来上がっている。

image

保存した配列の読み出し

image

# 「Cainer v2による実践深層学習」 第1章 NumPyで最低限知っておくこと

# 保存した配列の読み出し
import numpy as np
import pickle

# f = open(‘a.pkl’, ‘r’) だと、UnicodeDecodeError
f = open(‘a.pkl’, ‘rb’)
a = pickle.load(f)
f.close()
a

image

pickleは汎用的に使用可能であるが、NumPy配列用には、saveとload、あるいは、savetxtとloadtxtがある。

# NumPy配列をバイナリで保存と読み出し

np.save(‘a.npy’, a)  # NumPy配列をバイナリで保存

b = np.load(‘a.npy’) # 上記で保存したNumPy配列の読み出し


import numpy as np
import pickle

a = np.random.randn(10000).reshape(100, 100)
a

np.save(‘a.npy’, a)

image

image

 

# NumPy配列をテキストで保存と読み出し

np.savetxt(‘a.data’, a)  # NumPy配列をテキストで保存

b = np.loadtxt(‘a.data’) # 上記で保存したNumPy配列の読み出し


import numpy as np
import pickle

a = np.random.randn(10000).reshape(100, 100)
print(a)
np.save(‘a.data’, a)     # テキストで保存

image

a.data の中身は、数字がスペースで区と改行で切られて保存されていた。

image

b = np.loadtxt(‘a.data’) # テキストで保存したものを読み出し
b

image

ちなみに、今回は、バイナリで保存した場合(a.pkl, a.npy)は79KBであったのに対し、テキストで保存した場合(a.data)は249KBと、テキストで保存した方が容量が3倍ほどになっていた。バイナリで保存した方が容量が少ないなんて個人的には意外だった。文字コードとかの関係かな???

image

ふう。なんか、最初はつまらないかと思っていましたが、写経してみて、実際に動いているのを見たり、本の通りにコードを入力してもうまくいかなくてググったら解決したりと、最後は少し面白くなっていました。

でも疲れた。。。まだこれからなのに。。。

次は、以下のサイトを写経してみたい。

これこそ求めていたものであったのだが、このサイトにたどり着くのに1週間くらいかかった気がする。

Python – NumPyで画像を配列として取得する
投稿者: edo1z 投稿日: 09/27/2015
https://endoyuta.com/2015/09/27/python-numpy%E3%81%A7%E7%94%BB%E5%83%8F%E3%82%92%E9%85%8D%E5%88%97%E3%81%A8%E3%81%97%E3%81%A6%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/

(参考)

chainerのデータセットの作り方 LinearやCNN
tommyfms2
2017年10月07日に更新
https://qiita.com/tommyfms2/items/c3fa0cb258c17468cb30

(57) numpyで内積
投稿日: 2014年9月4日
https://python.dogrow.net/blog57/

機械学習の Python との出会い
NumPy 配列の基礎
http://www.kamishima.net/mlmpyja/nbayes1/ndarray.html

 

2017-06-9
連番や等差数列を生成するnumpy.arange関数の使い方
https://deepage.net/features/numpy-arange.html

2015年06月04日
python; pickle にて TypeError: must be str, not bytes が出る場合
http://blog.livedoor.jp/kmiwa_project/archives/1029767509.html

スポンサーリンク