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ページです.サイトマップは,サイトマップのページをご覧下さい. 本サイト内の検索は,サイト内検索のページをご利用下さい.
問い合わせ先: 金子邦彦(かねこ くにひこ) ![]()