Google Colab はオンラインの Python 開発環境. 使用するには Google アカウントが必要
https://colab.research.google.com
変数は,変化するデータのこと. 「x = 100」のように書くと x の値が 100 に変化する
式の実行結果として値が得られる.式の中に,変数名を書くことができる.
x = 100 y = 200 print(x + y) print( (x + 10) * y)
teihen = 2.5 takasa = 5 print(teihen * takasa / 2)
式の抽象化は,類似した複数の式(下に書いた3つの式のようなもの)を, 変数を使って1つにまとめること.
print(100 * 1.08) print(150 * 1.08) print(400 * 1.08)
上の 3つの式を抽象化すると「a * 1.08」のような式になる.
式「a * 1.08」を本体式とするような関数 (関数名は foo)の定義とその使用例は次の通り. 関数の利用により,繰り返し同じことを書く(例えば「* 1.08」)ことを防ぐことができ,ミスを減らすこともできる.プログラムの変更も簡単になる.
def foo(a): return a * 1.08 print(foo(100)) print(foo(150)) print(foo(400))
関数の中の式の評価では, 最新の変数値が用いられる
x = 30 def foo(a): return(a * x) x = 300 print(foo(100)) x = 3000 print(foo(100))
例: person,walk() person オブジェクト, walk メソッド,間を「.」で区切っている
クラス定義と,コンストラクタを用いたオブジェクト生成のプログラム例
クラス名: C
その属性名: qty, weight, name
class C(object): def __init__(self, qty, weight, name): self.qty = qty self.weight = weight self.name = name x = C(5, 170.51, 'apple') print(vars(x)) y = C(3, 40.97, 'orange') print(vars(y))
既定値(デフォルト値)を設定している場合には,引数を省略できる.コンストラクタ以外のメソッドでも同様.
クラス名: D
属性名: s_hour, s_minute, e_hour, e_minute
class D(object): def __init__(self, s_hour, s_minute): self.s_hour = s_hour self.s_minute = s_minute self.e_hour = None self.e_minute = None z = D(15, 30) print(vars(z)) z2 = D(16, 15) print(vars(z2))
vars(): 属性表示
「.」+属性名: 属性アクセス
「.」+メソッド名: メソッドアクセス
メソッド内では,self + 「.」で,属性やメソッドにアクセスする
class C(object): def __init__(self, qty, weight, name): self.qty = qty self.weight = weight self.name = name def total(self): return self.qty * self.weight x = C(5, 170.51, 'apple') print(vars(x)) print(x.name) print(x.total())
クラス名: C
その属性名: qty, weight, name
クラス名: E
その属性名: qty, weight, name, price
クラス E は,スーパークラスであるクラス C の属性とメソッドを継承する
class C(object): def __init__(self, qty, weight, name): self.qty = qty self.weight = weight self.name = name def total(self): return self.qty * self.weight class E(C): def __init__(self, qty, weight, name, price): super(E, self).__init__(qty, weight, name) self.price = price def payment(self): return self.qty * self.price x2 = E(2, 875.34, 'melon', 500) print(vars(x2)) print(x2.total()) print(x2.payment())
print( type(100) ) print( type(1.23) ) print( type("Hello") ) print( type(True) ) print( type(False) ) print( type([1, 2, 3]) ) import numpy as np print( type(np.zeros(10)) )
Python のモジュールは,1つ以上の関数を集めて,1つのファイルに集めたもの.下の Python モジュールには関数 tax が入っている. p> Python のモジュールは,単体でも実行できるように作ることができる.これは,モジュールのテストを行いたいときに便利(下の例では,「if __name__ == "__main__"」から始まる部分が,単体でも実行できるようにするためのもの)
def tax(x): return x * 1.08 if __name__ == "__main__": print(tax(100))
上に書いたモジュールを,他のプログラムでインポートして使いたいときは, まず,モジュールを,「hoge.py」のようなファイル名で保存すする.そして,プログラムを 次のように書く.
import hoge print(hoge.tax(10))
ここでの例 現在の日時, 最大公約数, 方程式を解く, 平方根, 円周率, 三角関数, など
オペレーティングシステム(コンピュータ)のタイマーを利用 いまの日時が表示されることを確認.
import datetime now = datetime.datetime.now() print(now)
24 と 18 の最大公約数を求めたい.結果 6 を確認.
import math print( math.gcd(24, 18) )
4x + 1 = 0 を解きたい
from scipy import optimize def foo(x): return 4 * x + 1 print( optimize.fsolve(foo, 10) )
面積が 7 の正方形の一辺の長さは?
次のプログラムを実行.結果 2.6457513110645907 を確認(結果は近似値)
import math print( math.sqrt(7) )
半径 3 の円の面積は? 円周率は, Pythonのモジュールの math.pi を使用 結果は,近似値で求まる.
import math print( 3 * 3 * math.pi )
三角形の2辺の長さが,4と6で,その間の角度が60度のとき.
import math print( (1/2) * 4 * 6 * math.sin(60 * math.pi / 180) )
変数の値によって,実行の流れが変わる.
age = 18 if (age <= 12): print(500) else: print(1800)
配列とは,データの並びで,それぞれのデータに,0 から始まる番号()が付いている.
8, 6, 4, 3, 2 というデータについて,合計を求めたい
import numpy as np x = np.array([8, 6, 4, 2, 3]) print(sum(x))
月の日数についてのデータを作る.うるう年のことは考えないことにする
import numpy as np days = np.array([0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]) print( days[7] ) print( days[9] )
for による繰り返し
import numpy as np x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) for t in x: print( (9.8 / 2) * t * t )
for による繰り返し
import numpy as np x = np.array([8, 6, 4, 2, 3]) y = np.array([0, 0, 0, 0, 0]) for i in range(0,5): y[i] = x[i] * 10 print(x) print(y)
for による繰り返し
import sys for i in range(18): sys.stdout.write("*")
0要素
type はオブジェクトのタイプの取得.shape は配列(アレイ)のサイズの取得.
import numpy as np x = np.zeros(10) print(x) print(type(x)) print(x.shape)
1要素
import numpy as np x = np.ones(10) print(x) print(type(x)) print(x.shape)
乱数. 正規分布.平均が0.
import numpy as np x = np.random.randn(10) print(x) print(type(x)) print(x.shape)
要素指定(要素を並べて書いて配列を作る)
import numpy as np x = np.array([3, 1, 2, 5, 4]) print(x) print(type(x)) print(x.shape)
arange.−5から,2ずつ増やす.4は超えないようにする.
import numpy as np x = np.arange(-5, 4, 2) print(x) print(type(x)) print(x.shape)
linespace.−2から2まで.9個.
import numpy as np x = np.linspace(-2, 2, 9) print(x) print(type(x)) print(x.shape)
import numpy as np x = np.zeros((2, 3)) print(x) print(type(x)) print(x.shape)
import numpy as np x = np.ones((2, 3)) print(x) print(type(x)) print(x.shape)
import numpy as np x = np.random.randn(2,3) print(x) print(type(x)) print(x.shape)
3次元のグラフを作るとき.あるいは,計算を繰り返すときに便利
import numpy as np X, Y = np.meshgrid( np.array([2, 3, 4]), np.array([10, 20]) ) print(X) print(type(X)) print(X.shape) print(Y) print(type(Y)) print(Y.shape)
CSV ファイル書き出し.pandas の機能で行う.次のプログラム実行により, ファイル XX.csv とYY.csv ができる.
import numpy as np import pandas as pd X, Y = np.meshgrid( np.array([2, 3, 4]), np.array([10, 20]) ) XX = pd.DataFrame(X) print(XX) XX.to_csv("XX.csv", header=False, index=False) YY = pd.DataFrame(Y) print(YY) YY.to_csv("YY.csv", header=False, index=False)
CSV ファイル読み込み.pandas の機能で行う. これは,いま作成したファイル XX.csv を読み込むもの.
pd.read_csv("XX.csv", header=None)
今度は,ファイル YY.csv を読み込む.
pd.read_csv("YY.csv", header=None)
1次元を2次元に.
次のプログラムは,1次元の配列 x を,2次元の配列 A, B に変換する.
import numpy as np x = np.array([3, 1, 2, 5, 4]) A = x[:, np.newaxis] B = x[np.newaxis, :] print(A) print(type(A)) print(A.shape) print(B) print(type(B)) print(B.shape)
a = [1, 2, 3, 4] print(a) type(a)
Python のリストの添字は 0 から開始する
a = [10, 20, 30] print(a[1]) a[2] = 200 print(a)
散布図
import matplotlib.pyplot as plt import numpy as n x = [1, 2, 3, 4, 5] y = [2, 4, 1, 3, 5] plt.scatter(x, y)
3次元散布図
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import axes3d fig = plt.figure() ax = fig.add_subplot(111, projection = '3d') x = [1, 2, 3, 4, 5] y = [2, 4, 1, 3, 5] z = [1, 1, 2, 2, 3] ax.scatter(x, y, z, c='b')
メッシュグリッドと関数の3次元プロット
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import axes3d fig = plt.figure() ax = fig.add_subplot(111, projection = '3d') X, Y = np.meshgrid( np.array([-2, -1, 0, 1, 2]), np.array([-3, -2, -1, 0, 1, 2, 3]) ) def f(x,y): return x * y Z = f(X, Y) ax.scatter(X, Y, Z, c='b')
メッシュグリッドと関数の3次元プロット. 今度は x1, x2 のソフトマックス関数
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import axes3d fig = plt.figure() ax = fig.add_subplot(111, projection = '3d') X1, X2 = np.meshgrid( np.array([-2, -1, 0, 1, 2]), np.array([-3, -2, -1, 0, 1, 2, 3]) ) def softmax(x): A = np.exp(x - np.max(x)) return A / A.sum() def f(x1, x2): return softmax( np.array([x1, x2]) ) Z = f(X1, X2) ax.scatter(X1, X2, Z[0], c='b')
fig = plt.figure() ax = fig.add_subplot(111, projection = '3d') ax.scatter(X1, X2, Z[1], c='b')
TensorFlow は,機械学習のアプリケーションを簡単に作成するのに役立つソフトウエア. Python, C/C++ 言語から利用可能. プロセッサ(CPU), GPU, Google TPU で動く Google 社のディープラーニング研究プロジェクトから出発し, 2015年11月に最初のリリースが行われた.ソースコード等は公開されている.
TensorFlow のプログラム例 - 行列の足し算
import tensorflow as tf import numpy as np a = tf.constant( np.reshape([1, 1, 1, 1, 1, 1], (2, 3) ) ) b = tf.constant( np.reshape( [1, 2, 3, 4, 5, 6], (2, 3) ) ) c = tf.add(a, b) print(c)
Keras は,TensorFlow を用いてのディープラーニング(深層学習)でのモデルの構築と,その訓練(構築)を簡単に行えるようにするソフトウエア
用語集
ニューラルネットワークのデモサイト: http://playground.tensorflow.org
手順
from __future__ import absolute_import, division, print_function, unicode_literals # TensorFlow と tf.keras のインポート import tensorflow as tf import tensorflow_datasets as tfds from tensorflow import keras # ヘルパーライブラリのインポート import numpy as np import matplotlib.pyplot as plt print(tf.__version__)
変数 x_train: サイズ 28 × 28 の 60000枚の濃淡画像
変数 y_train: 60000枚の濃淡画像それぞれの,種類番号(0 から 9 のどれか) 変数 x_test: サイズ 28 × 28 の 10000枚の濃淡画像
変数 y_test: 10000枚の濃淡画像それぞれの,種類番号(0 から 9 のどれか)
「+ コード」で,コードセルを追加し,次を実行.
mnist, metadata = tfds.load( name="mnist", as_supervised=False, with_info=True, batch_size = -1) train, test = mnist['train'], mnist['test'] print(metadata) x_train, y_train = train["image"].numpy().astype("float32") / 255.0, train["label"] x_test, y_test = test["image"].numpy().astype("float32") / 255.0, test["label"]
「+ コード」で,コードセルを追加し,次を実行.
plt.figure(figsize=(10,10)) for i in range(25): plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) image, label = train["image"][i], train["label"][i] plt.imshow(image.numpy()[:, :, 0].astype(np.float32), cmap=plt.get_cmap("gray")) plt.xlabel(label.numpy()) plt.show()
配列(アレイ)の形: 60000×28×28
次元: 3
「+ コード」で,コードセルを追加し,次を実行.
print( x_train.shape ) print( x_train.ndim )
2層のニューラルネットワークを作成
1層目:ユニット数は 28 かける28
2層目:ユニット数は 10
「+ コード」で,コードセルを追加し,次を実行.
「実行」をクリックして結果が何も出ないのは正常動作.
m = tf.keras.Sequential() m.add(tf.keras.layers.Flatten(input_shape=(28, 28, 1))) m.add(tf.keras.layers.Dense(units=128, activation=tf.nn.relu)) m.add(tf.keras.layers.Dropout(rate=0.2)) m.add(tf.keras.layers.Dense(units=10, activation=tf.nn.softmax)) m.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
「+ コード」で,コードセルを追加し,次を実行.
print(m.summary())
「+ コード」で,コードセルを追加し,次を実行.
history = m.fit(x_train, y_train, epochs=50)
「+ コード」で,コードセルを追加し,次を実行.
print( m.evaluate(x_test, y_test, verbose=2) )
※ 訓練(学習)などで乱数が使われるので,下図と違う値になる.
テスト画像を,ニューラルネットワークに与えて,予測させる
テスト画像は 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 が書かれた画像である. 画像を読み取って,数字を予測する.
「+ コード」で,コードセルを追加し,次を実行.
predictions = m.predict( x_test ) print( predictions[0] )
結果の見方. 0である確率,1である確率,2である確率,・・・9である確率と,10 個の 数字が,結果として得られる. 先ほど作成したニューラルネットワークの2層目は 10個のユニットがあった.各ユニットから1個の数字が得られている.
※ 訓練(学習)などで乱数が使われるので,下図と違う値になる.
テスト画像 0 番の正解を表示
「+ コード」で,コードセルを追加し,次を実行.
print( y_test[0] )
※ 訓練(学習)などで乱数が使われるので,下図と違う値になる.
2071.png のようなファイル名で保存しておく
import h5py from tensorflow.keras.preprocessing import image from keras.applications.inception_v3 import preprocess_input, decode_predictions, InceptionV3 import numpy as np m = InceptionV3(weights='imagenet') img_path = '2071.png' img = image.load_img(img_path, target_size=(299, 299)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) x = preprocess_input(x) preds = m.predict(x) print('Predicted:') for p in decode_predictions(preds, top=5)[0]: print("Score {}, Label {}".format(p[2], p[1]))
画像分類の結果(lab_coat, syringe, beaker, stethoscope, plate)と,それぞれの 確率が表示される.
本サイトは金子邦彦研究室のWebページです.サイトマップは,サイトマップのページをご覧下さい. 本サイト内の検索は,サイト内検索のページをご利用下さい.
問い合わせ先: 金子邦彦(かねこ くにひこ)