oikakerublogの日記

知識ゼロから色々しらべてみた話し

Python ど基本

 

◆import

from モジュール名 import 属性1, 属性2…

(1)親ディレクトリにあるファイルをインポートする

import sys,os
sys.path.append(os.pardir)

#このあとに例えば。。

import abc #abc.pyをインポート

 

Memo:

・os.pardirは親ディレクトリを表す文字列定数

・sys.pathはファイルを検索するパスを示す文字列のリスト。

→ sys.pathにインポート対象のディレクトリを含めることで、適当なディレクトリのファイルでもインポート可となる。

 

◆print

・python3では「関数」(構文ではなく。。)

print('abc')    ※python2,3で互換性

print(***.shape)・・・形状を表示する

print(x_train[15].shape) #トレーニング用データの15番目のシェイプ

=>

(784,)

 

◆”for”文

(1) リスト、要素1つずつ表示

list = [ 'Nasu', 'Tomato', 'Kyuri' ]
for x in list :
         print(x)

=>

Nasu
Tomato
Kyuri

 

(2)1つ飛ばし

for x in list[1:] :

         print(x)

=>

Tomato
Kyuri

 

◆”range”

 

◆掛け算(九九)

[[x * y for y in range(1,10)] for x in range(1,10)]

 

◆return

・関数の戻り値

 

Python 2系と3系の切替え

(1)コマンド

source activate python2

source deactivate

 

 

 

Memo 用語&単語 etc

・broadcasting… 形状の違う配列どうしを計算。

・category表現…[0, 1, 2, 1, 0, 2]

・one-hot 表現[ 1., 0., 0.] 要素1つが1で他が全て0

 

・リスト…要素のシーケンス、挿入&削除ができる、ミュータブル

a=[1,2,3]
print(a)

=>

[1, 2, 3]

・タプル…イミュータブル、変更不可

a=(1,2,3)
print(a)

=>

(1, 2, 3)

 

パーセプトロン…重み設定の作業が人手。活性化関数がステップ関数。@魚本

ニューラルネットワークニューロンのつながり方はパーセプトロンと何ら変わりなし。多層で、シグモイド関数などの滑らかな活性化関数を使用するネットワーク。@魚本

 ・活性化関数…入力信号の総和がどのように活性化(発火)するかを決める役割りを果すもの。@魚本

・正規化(normalization)…データをある決まった範囲に変換する処理@魚本

 ・損失関数(loss function)…「ニューラルネットワークの学習では、最適なパラメータ(重みとバイアス)を探索する際に、損失関数の値ができるだけ小さくなるようなパラメータを探します。」2乗和誤差、交差エントロピー誤差などを用いる。「できるだけ小さな損失関数の場所を探すために、パラメータの微分(正確には勾配)を計算し、その微分の値を手がかりにパラメータの値を徐々に更新していきます。」@魚本

・2乗和誤差…「ニューラルネットワークの出力と正解となる教師データの各要素の差の2乗を計算し、その総和を求めます。」@魚本

偏微分…「…ある場所の傾きを求めます。ただし、…変数をひとつに絞り、他の変数はある値い固定します。」@魚本 

勾配…「すべての変数の偏微分をベクトルとしてまとめたもの」@魚本

勾配法…「勾配をうまく利用して関数の最小値(または、できるだけ小さな値)を探そう、というのが勾配法です。」@魚本

学習率(learning rate)…「1回の学習で、どれだけ学習すべきか、どれだけパラメータを更新するか、ということを決めるのが学習率です。」@魚本

ハイパーパラメータ…人の手によって設定されるパラメータ

誤差逆伝播…「局所的な微分」の伝達@魚本

Python Numpyに慣れる100エクササイズ

◆ベクトルを作る・いじる

☞ ”array” ・・・要素指定で配列を生成する

 print(np.array([[1, 2, 3], [4, 5, 6]]))

=>

[[1 2 3]
[4 5 6]]

 

☞ ”arange”・・・連番の配列を作る

print(np.arange(5))  # start = 0 (default), end = 5
print(np.arange(1,5))  # start = 1, end = 5
print(np.arange(1,5,0.5))  # start = 1, end = 5, slice = 0.5

=>

[0 1 2 3 4]
[1 2 3 4]
[ 1. 1.5 2. 2.5 3. 3.5 4. 4.5]

☞ ”flatten”・・・一次元化

W = np.array([[1, 2, 3], [4, 5, 6]])
print(W)
print(W.flatten())

=>

[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]

 

☞ ”reshape”・・・行列のかたちを変更

print(np.arange(48).reshape(8, 6))

=>

f:id:oikakerublog:20170425001509p:plain

A = np.arange(24).reshape(2,3,4) #2つの行列に分ける
print(A)

=>

[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]

 

☞ ”shape”・・・配列の値の数を得る

(1) 3x2行列.shape → (3,2)

(2)3x2行列.shape [0]→ 行の数 この例では3

ex:

X = np.arange(12).reshape(3,4)
print(X)

=>

[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

ex:

print(X.shape)
print(X.shape[0])

=>

(3, 4)
3

ex:

b = np.array([2,4,6,8])

print(b.shape) 

=>

(4,)

 

”zeros”・・・全部0の配列を作る (cf. 全部1なら”ones”)

Z1 = np.zeros(5) #一次元

Z2 = np.zeros*1 #2行3列のように形状指定もOK
print(Z1)

print(Z2)

=>

[ 0. 0. 0. 0. 0.]
[[ 0. 0. 0.]
[ 0. 0. 0.]]

 

・参考)4つ目が1

Z = np.zeros(10)
Z[4] = 1
print(Z)

=>

[ 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]

 

☞  ”np.random.choice()”・・・ランダム

・指定された数字の中からランダムに好きな数を取り出す

np.random.choice(100,3) #0〜99のうちランダムに3つ数字を抽出

=>

array([89, 41, 92])

◆ ”def”・・・関数を定義

def add(x, y):
print x + y

add(3, 5)

=> 8

 

◆ ”numpy.newaxis”・・・縦配置

(1)ヨコ→タテ

array = np.arange(5)
print (array[:, np.newaxis])

=>

 [[0]
[1]
[2]
[3]
[4]]

(2)九九表を作る

m = np.array([1,2,3,4,5,6,7,8,9])
n = np.array([1,2,3,4,5,6,7,8,9])
print(m[:, np.newaxis]) # m配列を縦に
print(m[:, np.newaxis]*n) # それにn配列を掛け算していく

f:id:oikakerublog:20170424233738p:plain

☞ その7・・・エレメントをリバースする

Z = np.arange(15)
Z = Z[::-1]
print(Z)

=>

[14 13 12 11 10 9 8 7 6 5 4 3 2 1 0]

 

☞ その8・・・3x3のマトリクス

Z = np.arange(9).reshape(3,3)
print(Z)

=>

[[0 1 2]
[3 4 5]
[6 7 8]]

 

☞ その9・・・ある行列からindexをさがす

nz = np.nonzero([1,2,0,0,4,0])
print(nz)

=>

(array([0, 1, 4], dtype=int64),)

 

☞ その10・・・identity matrix 単位行列

Z = np.eye(3)
print(Z)

=>

[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]

 

☞ その11・・・3x3x3のランダム行列の作成

Z = np.random.random*2
print(Z)

=>

[[[ 0.86816012 0.54928482 0.10620469]
[ 0.56253858 0.42498644 0.38111299]
[ 0.46583937 0.06876381 0.47205835]]

[[ 0.48659812 0.53796306 0.83180752]
[ 0.54321802 0.2645361 0.6461197 ]
[ 0.69551154 0.60727098 0.36739499]]

[[ 0.31582316 0.86979075 0.77204474]
[ 0.93540842 0.18592936 0.17472491]
[ 0.87547108 0.59652846 0.87853689]]]

 

☞ その12・・・3x3のランダム行列を作り、その中の要素の最大値/最小値を抽出

Z = np.random.random*3
Zmin, Zmax = Z.min(), Z.max()
print(Z)
print(Zmin, Zmax)

=>

[[ 0.92771297 0.99119487 0.33149293]
[ 0.48005022 0.61086498 0.19062979]
[ 0.05214626 0.61618909 0.08295882]]
0.0521462614894 0.991194872459

 

☞ その13・・・要素の平均値(mean value)を出す

Z = np.random.random(3)
m = Z.mean()
print(Z)
print(m)

=>

[ 0.43252845 0.86545314 0.8868291 ]
0.728270233139

 

☞ その16・・・対角の1つ下の行列を作る、1~4、diagonal

Z = np.diag(1+np.arange(4),k=-1)
print(Z)

=>

[[0 0 0 0 0]
[1 0 0 0 0]
[0 2 0 0 0]
[0 0 3 0 0]
[0 0 0 4 0]]

 

☞ その17・・・チェックボードパターンの行列

Z = np.zeros*4
print(Z)

=>

[[0 1 0 1]
[1 0 1 0]
[0 1 0 1]
[1 0 1 0]]

 

☞ その20・・・Normalize(最大が1&最小が0になる)

Z = np.random.random*5
Zmax, Zmin = Z.max(), Z.min()
Z = (Z - Zmin)/(Zmax - Zmin)
print(Z)

=>

[[ 0.91425657 0.07881159 1. ]
[ 0.63918169 0.58862944 0.43357481]
[ 0.4049732 0.1090024 0. ]]

 

☞ その21・・・Create a custom dtype that describes a color as four unisgned bytes

 

☞ その22・・・Multiply a 5x3 matrix by a 3x2 matrix (real matrix product)

 

☞ その23・・・1~10のうち3~8をnegateする

Z = np.arange(11)
Z[(3 < Z) & (Z <= 8)] *= -1
print(Z)

=>[ 0 1 2 3 -4 -5 -6 -7 -8 9 10]

 

☞ その24・・・Consider an integer vector Z, which of these expressions are legal

 

☞ その27・・・How to round away from zero a float array ?

Z = np.random.uniform(-10,+10,10)
print (np.trunc(Z + np.copysign(0.5, Z)))

=>

[ -8. 4. 6. -3. 1. 4. 10. 2. -7. -8.]

 

☞ その28・・・整数部の抽出、やり方イロイロ

# 1~5のランダムな数を5つ持つ行列
Z = np.random.uniform(1,5,5)
print (Z)


# 整数の抽出
print (Z - Z%1)
print (np.floor(Z))
print (np.ceil(Z)-1)
print (Z.astype(int))
print (np.trunc(Z))

=>

[ 3.5029238 4.47885352 1.91640941 1.43928684 4.46256647]
[ 3. 4. 1. 1. 4.]
[ 3. 4. 1. 1. 4.]
[ 3. 4. 1. 1. 4.]
[3 4 1 1 4]
[ 3. 4. 1. 1. 4.]

 

☞ その29・・・5x5 matrix with row values ranging from 0 to 4

Z = np.zeros*6
Z += np.arange(5)
print(Z)

=>

[[ 0. 1. 2. 3. 4.]
[ 0. 1. 2. 3. 4.]
[ 0. 1. 2. 3. 4.]
[ 0. 1. 2. 3. 4.]
[ 0. 1. 2. 3. 4.]]

 

☞ その30・・・Consider a generator function that generates 10 integers and use it to build an array 

 

◆行列&ベクトルに関する計算 

 ☞ スカラー演算

W = np.array([[1, 2, 3], [4, 5, 6]])
x = np.array([7, 8, 9])

print(W * 2) #要素を2倍
print(-x)   #要素にマイナス

=>

[[ 2 4 6]
[ 8 10 12]]
[-7 -8 -9]

 

☞ 行列を計算する際の方向 ”axis”

f:id:oikakerublog:20170422140552j:plain

 

W = np.array([[1, 2, 3], [4, 5, 6]])
print(W.sum())

print(W.sum(axis=0))

print(W.sum(axis=1))

=>

21
[5 7 9]
[ 6 15]

 

◆行列の積 ”matmul”

(1)行列とベクトル

A = np.array([[2,3,4], [3,4,5]]) #行列
y = np.array([1,2,3]) #ベクトル
print(A)
print(y)
print(np.matmul(A, y))
=>

[[2 3 4]
[3 4 5]]
[1 2 3]
[20 26]  #積の答え

 

(2)行列と行列

A = np.array([[2,3,4], [3,4,5]]) #行列
B = np.array([[2,3], [3,4],[4,5]]) #行列
print(A)
print(B)
print(np.matmul(A, B))

=>

[[2 3 4]
[3 4 5]]
[[2 3]
[3 4]
[4 5]]
[[29 38] #積の答え
[38 50]]

 

print(np.matmul(W, W.T))
print(np.matmul(W.T, W))

 

 ◆”dot”積

・行やベクトルしか関係しない計算であればmatmalとdotは差ナシ

A = np.array([[2,3,4], [3,4,5]])
B = np.array([[2,3], [3,4],[4,5]])
print(np.dot(A, B))

=> 

[[29 38] #積の答え
[38 50]]

 

 

 

 

 

 

 

 

 

 

*1:2,3

*2:3,3,3

*3:3,3

*4:4,4),dtype=int)
Z[1::2,::2] = 1
Z[::2,1::2] = 1
print(Z)

=>

[[0 1 0 1]
[1 0 1 0]
[0 1 0 1]
[1 0 1 0]]

 

☞ その18・・・Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element?

print(np.unravel_index(100,(6,7,8)))

=>

(1, 5, 4)

 

☞ その19・・・tileファンクションを使ってチェックボード

Z = np.tile( np.array([[0,1],[1,0]]), (2,2

*5:3,3

*6:5,5

TensorFlow(その1)

◆MNISTデータのダウンロード(jupyter)

☞ INTERFACE(2017年3月号の67ページ~写経)

・次のコードでデータダウンロード

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

 

f:id:oikakerublog:20170413125429j:plain

 

・4つのファイルがダウンロードされる。

 

◆画像データの中身 

 INTERFACE(2017年3月号の67ページ~)

(1)画像データの中身確認

mnist.train.images[0]

f:id:oikakerublog:20170414123629j:plain

 

(2)その他

・ラベルデータ

mnist.train.labels[0]

・データの数の確認

mnist.train.num_examples

 

◆ソフトマックス関数

f:id:oikakerublog:20170414125501j:plain

 

(2017.4.13.)

Matplotlibで画像を表示してみるetc(その1)

◆Python画像処理の写経

(1)画像を読み込んで表示する

import numpy as np
import matplotlib.pyplot as plt

img = plt.imread('***.jpeg')

plt.imshow(img)
plt.show()

 

(2)画像の保存

plt.imsave('***.jpeg', img)

 

(3-1)白黒の3x3ピクセル画像の作成&表示

f:id:oikakerublog:20170330131115j:plain

f:id:oikakerublog:20170330131150j:plain

◆Tips

・dtypeの指定 → 白黒では必要なし、カラーのとき使う)

・vmin/vmax → 白黒画像では必要。imshow()で勝手に正規化されないように。

・interpolation = 'none' → 勝手にかかるフィルターを外す

 

(3-2)RGB画像

f:id:oikakerublog:20170331124509j:plain

◆Tips

・arrayの中身を変えることでRGBA画像(要素4つ)なども表示可能。

・”RGBA”の”A”は、透明度を表すアルファのA。

 

◆画像を拡大する

・"repeat"を使う

・縦5倍&横3倍にした例

f:id:oikakerublog:20170331131731j:plain

f:id:oikakerublog:20170331131738j:plain

《参考》

Python画像処理の再発明家 ~行列による画像処理・基礎編&目次~ - Qiita

 

(2017-3-31)