Python でできること,Python での書き方をすばやく確認できるページ.
【目次】
Google Colaboratory はオンラインの Python 開発環境
【外部ページへのリンク(Python 関連)】
【サイト内の関連ページ】
別ページ »にまとめ
Google Colaboratory, Paiza.IO を使用
Python 入門(全14回,Python Tutor と CodeCombat を使用): 別ページ »で説明している.
Google Colaboratory を使用.
Python 入門(全14回,Python Tutor と CodeCombat を使用): 別ページ »で説明している.
Python Tutor, VisuAlgo を使用.
別ページ »で説明している.
Google Colaboratory はオンラインの Python 開発環境. 使用するには Google アカウントが必要
https://colab.research.google.com
!nvidia-smi --query-gpu=gpu_name,driver_version,memory.total --format=csv
try: from google.colab import drive USE_COLAB = True except: USE_COLAB = False
Google Colaboratory での実行結果
Windows では,複数のバージョンの Python を同時にインストールすることは簡単である.そのときは,環境変数 Path の設定を常に意識すること.Python ランチャーである「py」コマンドも利用すること.
すでに,Python がインストール済みのとき.
ここで示すインストール手順とは異なる設定ですでに Python をインストールしていた場合は,それをそのまま使うよりも, アンインストールしておいたほうがトラブルが少ない可能性がある.
Windows では,コマンドプロン プトを管理者として実行し, 次のコマンドを実行する.
この操作は,必ずPython をすべてアンインストールした後に行うこと.
rmdir /s /q %APPDATA%\Python cd "C:\Program Files" for /F %i in ('dir /ad /b /w Python3*') do rmdir /s /q %i
【Python のインストールでの注意点】
Windows で,ユーザ名が日本語のとき,あとでトラブルが発生するかもしれない. トラブルの回避のため, Python をシステム管理者の領域にインストール(パソコンの全ユーザの共有領域)する.
TensorFlow を使う予定がある場合は,https://pypi.org/project/tensorflow-gpu/#filesで,必要な Python のバージョンを確認しておく. 2022/9 時点では,TensorFlow バージョン 2.10 が動くのは,Python 3.10 または Python 3.9 または Python 3.8 または Python 3.7 (https://pypi.org/project/tensorflow/2.10/#files)
Python 3.9 のインストール(Windows 上)のページ: https://www.kkaneko.jp/tools/win/python.html
YouTube 動画: https://www.youtube.com/watch?v=2MlVmx-yLM8
インストール手順
Windows での Python 3.10 のインストール(あとのトラブルが起きにくいような手順を定めている)
ページの上の方にある「Downloads」をクリック. 「Downloads」の下にメニューが出るので,その中の「Windows」をクリック
ここでは,Python 3.10 系列の最新版を探して,選ぶ.
以下,Python 3.10.9 を選んだとして説明を続ける.他のバージョンでも以下の手順はほぼ同じである.
TensorFlow を使う予定がある場合は,https://pypi.org/project/tensorflow-gpu/#filesで,必要な Python のバージョンを確認しておく. 2022/9 時点では,TensorFlow バージョン 2.10 が動くのは,Python 3.10 または Python 3.9 または Python 3.8 または Python 3.7 (https://pypi.org/project/tensorflow/2.10/#files)
Windows の 64ビット版のインストーラをダウンロードしたいので、「Windows Installer (64-bit)」を選ぶ
※ すでに Python ランチャーをインストール済みのときは, 「Install launcher for all users (recommended)」がチェックできないようになっている場合がある.そのときは,チェックせずに進む.
「Install Python 3.10 for all users」を選ぶ理由.
ユーザ名が日本語のときのトラブルを防ぐため.
表示されない場合は問題ない.そのまま続行.
py とpip にパスが通っていることの確認である.
where py where pip
where py では「C:\Windows\py.exe」 が表示され, where pip では「C:\Program Files\Python310\Scripts\pip.exe」 が表示されることを確認. (「310」のところは使用する Python のバージョンに読み替えること).
表示されないときは, システムの環境変数Pathに,C:\Program Files\Python310 と C:\Program Files\Python310\Scripts が追加済みであることを確認(「310」のところは使用する Python のバージョンに読み替えること).無ければ追加し,再度コマンドプロンプトを開いて,再度「where py」,「where pip」を実行して確認.
それでもうまく行かない場合は,いろいろ原因が考えられる.対処としては,Python のアンインストールを行う.過去,アンインストールがうまく行かなかった可能性を疑う(Python の Scripts の中のファイルで,アンインストール操作により削除されるべきファイルが残っている可能性があるなど)
Python にトラブルがあった時に役に立つように,情報取得の手順をまとめている.
インストール時に,「Add Python ... to PATH」をチェックしたので、 Python についての設定が自動で行われる.
python --version
python
下の実行例では、バージョン番号として「1934」が表示されている
下の実行例では、バージョン番号として「14.3」が表示されている
from distutils.msvc9compiler import * get_build_version()
Python のパッケージも同時にインストールされることが分かる.
※ エラーメッセージが出ないことを確認.
pip list
JupyterLab, Jupyter ノートブック (Jupyter Notebook), Jupyter Qt Console は Python プログラム作成に関する種々の機能を持ったソフトウェア
Python プログラムを動かして,結果をビジュアルに見たいときは, 開発環境や Python コンソール(Jupyter Qt Console, Spyder,PyCharm,PyScripter など)が便利.
複数の Python バージョンを共存しているときは, Python ランチャーを使う. 次のようにバージョン指定する.
Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), JupyterLab のインストールは, Windows でコマンドプロンプトを管理者として開き 次のコマンドを実行する.
python -m pip install -U pip setuptools jupyterlab jupyter jupyter-console jupytext PyQt5 nteract_on_jupyter spyder
複数の Python バージョンを共存しているときは, pyenvを使う. 次のようにバージョン指定する.
JupyterLab の起動は,「pyenv shell <バージョン>; jupyter lab」. Jupyter Qt Console の起動は,「pyenv shell <バージョン>; jupyter qtconsole」.
Python には,さまざまなパッケージをインストールすることができる. venv の利用により,Python の仮想環境を作成し,パッケージが違う複数の Python 環境を共存させることができる.
venv は Python 3 の標準機能になった.
詳しい説明は,venv の公式の説明ページ: https://docs.python.org/ja/3/library/venv.html
venv を用いて,新しいPython の仮想環境の生成 Python の隔離された環境の新規作成,有効化,無効化を行う.
python --version
ここでは,venv のためのディレクトリ名「%HOMEPATH%\.venv」を指定して,新しいPython の仮想環境を生成する.
python -m venv %HOMEPATH%\.venv dir /w %HOMEPATH%\.venv
%HOMEPATH%\.venv\Scripts\activate.bat
python -m pip list
deactivate
複数のバージョンの Python をインストールしているときは, 「python」の代わりに, Python ランチャー の「py」を使うのが便利である.
py -0
「-3.9-64」,「-3.8-32」,「-3.8-64」が表示されたする. この場合,これら 3つのバージョンがインストール済みであり, 「py -3.9-64」や「py -3.8-32」や「py -3.8-64」で python を使うことができる.
新しい別バージョンの Python を使うときは,Python のインストール: 別ページ »で説明を行う. Windows でのインストール手順は,別ページ »で説明 Windows で,ふつうにインストールを行うと,py で扱えるように自動設定される.
Windows では,Python 3 の複数バージョンの同時インストールは,特別に設定を行うことなくできる.
「py -X」のように,バージョン指定の中の「-32」,「-64」を省略することもできる. そのときは,Python バージョン X が実行されるが, Python のバージョン X 32ビット版と64ビット版をインストールしている場合は, 64ビット版の方が実行される. (公式マニュアルに,そのように記載されている)
「py」のようにバージョン指定を省略したときは, インストールされている Python の最新バージョンが実行される. (公式マニュアルに,そのように記載されている)
ここでは,venv のためのディレクトリ名「%HOMEPATH%\.venv」を指定して,新しいPython の仮想環境を生成する.
-3.9 は,使用したい Python のバージョンの指定である.
py -3.9 -m venv %HOMEPATH%\.venv dir /w %HOMEPATH%\.venv
%HOMEPATH%\.venv\Scripts\activate.bat
python --version
python -m pip list
deactivate
venv を用いて,新しいPython の仮想環境の生成 Python の隔離された環境の新規作成,有効化,無効化を行う.
sudo apt -y update sudo apt -y install python3-venv
python3 --version
ここでは,venv のためのディレクトリ名「~/.venv」を指定して,新しいPython の仮想環境を生成する.
※システム Python と違うバージョンの Python を使いたいときは, pyenv の利用が便利である.pyenv の詳細は,別ページ »で説明
※ 「python3 -m venv」は,システム Python を用いての venv モジュールの実行
source ~/.venv/bin/activate
python -m pip list
deactivate
プログラミングでのオブジェクトは,コンピュータでの操作や処理の対象となるもののこと.
キーワード: =, del, ==, is
a = 123 b = 123 print(a == b)
x = True y = None print(x is True) print(y is None)
c = 123 print(c) del a print(c)
dic = {} dic.update( {"kaneko": 30} ) print(dic)
import collections Point3d = collections.namedtuple('Point3d', 'x y z') p = Point3d(10, 20, 30) print(p)
print( type(100) ) print( type(1.23) ) print( type(True) ) print( type(False) ) print( type("Hello") ) print( type([1, 2, 3]) ) dic = {} dic.update( {"kaneko": 30} ) print( type(dic) ) Point3d = collections.namedtuple('Point3d', 'x y z') p = Point3d(10, 20, 30) print( type(p) ) import numpy as np print( type(np.zeros(10)) )
キーワード: if, elif, else, while, break, for
変数の値によって,実行の流れが変わる.
age = 15 if (age <= 12): print(500) else: print(1800)
age = 15 if age <= 12: print(500) elif age <= 15: print(1000) else: print(1800)
b = 8 s = 0 while s < 100: s = s + b print(s)
for i in range(10): print(i)
月の日数についてのデータを作る.うるう年のことは考えないことにする
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("*")
キーワード: +, in, %, split, join, replace, strip, match, sprintf
Pandas を用いたデータの扱い (CVSファイル読み込み、散布図、要約統計量、ヒストグラム)を示す.
説明のために,次のようなデータ(CSV ファイル)を使う.ファイル名は enquete.csv
このデータ(CSV ファイル)のダウンロードは, Windows でコマンドプロンプトを管理者として開き 次のコマンドを実行する.
cd C:\ curl -O https://www.kkaneko.jp/sample/csv/enquete.csv
上のコマンドが実行できないときは,次のリンクからダウンロードする.ダウンロードしたファイルは、C:\ の直下に置く https://www.kkaneko.jp/sample/csv/enquete.csv
※ Python でグラフや図を表示したい. Windows では,スタートメニューの「IDLE (Python ...)」,spyder3コマンド,PyCharmが便利である.
import pandas as pd import seaborn as sns x = pd.read_csv('C:/enquete.csv', encoding='SHIFT-JIS')
先頭行にデータ本体がある(先頭行が属性名でない)ときは、「pd.read_csv('hoge.csv',
※ オブジェクト x には 0列目と 1列目と 2列目がある.
「plt.style.use('ggplot')」はグラフの書式の設定.「ro」は「赤い丸」という意味.
print(x.iloc[:,1])
print(x.iloc[:,2])
%matplotlib inline
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore') # Suppress Matplotlib warnings
plt.style.use('ggplot')
plt.plot(x.iloc[:,1], x.iloc[:,2], 'ro')
plt.show()
print(x.head())
print(x.info())
print(x.shape)
print(x.ndim)
print(x.columns)
x.to_csv('hoge.csv', header=True, index=False, encoding='SHIFT-JIS')
print(x.describe())
import numpy as np pd.to_json('hoge.json') a = pd.read_json('hoge.json')
pd.DataFrame([1, 2, 3])
import numpy as np import pandas as pd pd.DataFrame( np.array([1,2,3]) )
import numpy as np import pandas as pd pd.DataFrame( np.array([[1,2,3], [10,20,30], [100,200,300]]) )
import pandas as pd pd.DataFrame( {'x' : [1, 2, 3], 'y' : [4, 5, 6]} )
plt.hist(x.iloc[:,1]) plt.show() plt.hist(x.iloc[:,2]) plt.show()
2次元ヒストグラム
plt.hist2d(x.iloc[:,1], x.iloc[:,2]) plt.show()
numpy の1次元の配列の次元数は 1.(ndimで得る)
1次元の配列の形は (<要素数>,)のように表示される(shapeで得る)
import numpy as np x = np.zeros(10) print( x.ndim ) print( x.shape )
numpy の2次元の配列の次元数は 2.(ndimで得る)
2次元の配列の形は ((<要素数>,<要素数>))のように表示される(shapeで得る)
import numpy as np x = np.zeros((2, 3)) print( x.ndim ) print( x.shape )
1次元の配列のデータ型は numpy.darray.(typeで得る)
配列の要素のデータ型は dtypes を使って表示… 「float64」は浮動小数点数
import numpy as np x = np.zeros(10) print( type( x ) ) print( x.dtype )
2次元の配列のデータ型は numpy.darray.(typeで得る)
配列の要素のデータ型は dtypes を使って表示… 「float64」は浮動小数点数
import numpy as np x = np.zeros((2, 3)) print( type( x ) ) print( x.dtype )
配列は,データの並びで,それぞれのデータに,0 から始まる番号(添字)が付いている.
type はオブジェクトのタイプの取得.shape は配列(アレイ)のサイズの取得.
import numpy as np x = np.zeros(10) print(x) print(type(x)) print(x.shape)
表示の「0.」は「0」のこと
import numpy as np x = np.ones(10) print(x) print(type(x)) print(x.shape)
表示の「1.」は「1」のこと
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)
-5 から開始して、2 ずつ増やし、4 まで
import numpy as np x = np.arange(-5, 4, 2) print(x) print(type(x)) print(x.shape)
-2 から、2 まで、全部で、9 個
import numpy as np x = np.linspace(-2, 2, 9) print(x) print(type(x)) print(x.shape)
8, 6, 4, 3, 2 というデータについて,合計を求める
import numpy as np x = np.array([8, 6, 4, 2, 3]) print(sum(x))
import numpy as np x = np.zeros((2, 3)) print(x) print(type(x)) print(x.shape)
表示の「0.」は「0」のこと
import numpy as np x = np.ones((2, 3)) print(x) print(type(x)) print(x.shape)
表示の「1.」は「1」のこと
import numpy as np x = np.random.randn(2,3) print(x) print(type(x)) print(x.shape)
import numpy as np x = np.random.randn(2,3) print(x)
時間計測も行う.
import numpy as np import time x = np.random.randn(5000, 5000) y = np.random.randn(5000, 5000) s = time.time() z = np.dot(x, y) print("%1.3f [sec.]" % float(time.time() - s))
時間計測も行う.
!pip3 install cupy import numpy as np use_gpu=False if use_gpu: import cupy npcp = cupy else: npcp = np x = npcp.random.random((5000, 5000)) y = npcp.random.random((5000, 5000)) import datetime a = datetime.datetime.now() npcp.dot(x, y) print( (a - datetime.datetime.now()).microseconds )
上のプログラムと同じ. 「use_gpu=False」を 「use_gpu=True」に変えただけ
!pip3 install cupy import numpy as np use_gpu=True if use_gpu: import cupy npcp = cupy else: npcp = np x = npcp.random.random((5000, 5000)) y = npcp.random.random((5000, 5000)) import datetime a = datetime.datetime.now() npcp.dot(x, y) print( (a - datetime.datetime.now()).microseconds )
import time import numpy import numpy.linalg import sklearn.decomposition import sklearn.cluster X = numpy.random.rand(2000, 2000) Y = numpy.random.rand(2000, 2000) # 行列の積 a = time.time(); Z = numpy.dot(X, Y); print(time.time() - a) # 主成分分析 pca = sklearn.decomposition.PCA(n_components = 2) a = time.time(); pca.fit(X); X_pca = pca.transform(X); print(time.time() - a) # SVD a = time.time(); U, S, V = numpy.linalg.svd(X); print(time.time() - a) # k-means a = time.time(); kmeans_model = sklearn.cluster.KMeans(n_clusters=10, random_state=10).fit(X) labels = kmeans_model.labels_ print(time.time() - a)
import numpy as np np.savez('hoge.npz',a = np.array([1, 2, 3]), b = np.array([1, 2, 3])) m = np.load('hoge.npz') print( m['a'] ) print( m['b'] )
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)
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)
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)
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) )
画像ファイルを読み込んで表示
from PIL import Image Image.open("126.png").show()
matplotlib は,オープンソースの Python のプロットライブラリ.
%matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings import numpy as n x = [1, 2, 3, 4, 5] y = [2, 4, 1, 3, 5] plt.style.use('ggplot') plt.scatter(x, y)
import numpy as np import pandas as pd %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings a = pd.DataFrame( {'x' : [1, 2, 3, 4, 5], 'y' : [2, 4, 1, 3, 5]} ) plt.style.use('ggplot') plt.plot(a['x'], a['y'], 'ro') plt.show()
%matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings import numpy as np from mpl_toolkits.mplot3d import axes3d plt.style.use('ggplot') 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')
matplotlib を用いて,OpenCV のカラー画像を表示する例は次の通り.
import cv2 import matplotlib.pyplot as plt bgr = cv2.imread("126.png") plt.style.use('default') plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show()
matplotlib を用いて,OpenCV の濃淡画像を表示する例は次の通り.
import cv2 import matplotlib.pyplot as plt bgr = cv2.imread("126.png") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) plt.style.use('default') plt.imshow(mono, cmap='gray') plt.show()
普通に Matplotlib を用いてOpenCV 画像の表示を表示すると,小さく表示される.
「plt.style.use('default') 」の実行により,Matplotlib での OpenCV 画像の表示が大きくなる.
matplotlib を用いたグラフ描画の例は次の通り.
import numpy as np %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings x = np.linspace(0, 6, 100) plt.style.use('ggplot') plt.plot(x, np.sin(x))
%matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings import numpy as np from mpl_toolkits.mplot3d import axes3d plt.style.use('ggplot') 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 のソフトマックス関数
%matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings import numpy as np from mpl_toolkits.mplot3d import axes3d plt.style.use('ggplot') 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 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings 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.style.use('default') 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='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='relu')) m.add(tf.keras.layers.Dropout(rate=0.2)) m.add(tf.keras.layers.Dense(units=10, activation='softmax')) m.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), 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)と,それぞれの 確率が表示される.
変数は,変化するデータのこと. 「x = 100」のように書くと x の値が 100 に変化する
式の実行結果として値が得られる.式の中に,変数名を書くことができる.
x = 100 y = 200 print(x + y) print( (x + 10) * y)
teihen = 2.5 takasa = 5 print(teihen * takasa / 2)
関数定義は def, 帰り値は return
def a(m, n): if m == 0: return n + 1 elif n == 0: return a(m-1, 1) else: return a(m-1, a(m, n-1)) print(a(3, 2)) print(a(m = 3, n = 2)) print(a(n = 2, m = 3))
def a(m, n = 1): if m == 0: return n + 1 elif n == 0: return a(m-1, 1) else: return a(m-1, a(m, n-1)) print(a(3, 1)) print(a(3)) print(a(m = 3))
f = lambda x: x + 1 print(f(100))
式の抽象化は,類似した複数の式(下に書いた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))
メソッド内では,self + 「.」で,属性にアクセスする
クラス名: 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') y = C(3, 40.97, 'orange') print(vars(x)) print(vars(y)) print(x.name) print(y.name)
vars はオブジェクトの属性名と値を取得する. 「x.name」,「y.name」は属性アクセスである.
クラス名: 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') y = C(3, 40.97, 'orange') print(getattr(x, 'qty')) print(getattr(y, 'weight'))
getattr はオブジェクトと,属性名(文字列)を指定して,値を取得する.
クラス名: 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') y = C(3, 40.97, 'orange') setattr(x, 'color', 'red') print(vars(x)) print(vars(y))
setattr では,オブジェクトと,属性名(文字列)と値を指定する.
既定値(デフォルト値)を設定している場合には,引数を省略できる.コンストラクタ以外のメソッドでも同様.
クラス名: 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) z2 = D(16, 15) print(vars(z)) print(vars(z2))
メソッド内では,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.total()) help(x)
help は,メソッドの説明を表示する.
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') setattr(C, 'hoge', lambda self: int(self.weight)) print(x.hoge()) help(x)
クラス名: 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())