トップページ -> 実践知識 -> Python を活用する -> Python の主な機能(オンライン開発環境 Google Colab で演習)
[サイトマップへ], [サイト内検索へ],

Python の主な機能(オンライン開発環境 Google Colab で演習)

サイト構成 連絡先,業績など 実践知識 データの扱い コンピュータ 教材 サポートページ
Google Colab はオンラインの Python 開発環境

  1. Google Colab
  2. 式と変数
  3. 式の抽象化と関数
  4. 式の評価のタイミング
  5. クラス定義とオブジェクト生成
  6. コンストラクタでの既定値(デフォルト値)
  7. 属性アクセスとメソッド
  8. 親クラスからの継承
  9. オブジェクトのタイプ
  10. Pythonのモジュール
  11. 条件分岐
  12. 配列と繰り返し
  13. 1次元配列
  14. 2次元配列
  15. メッシュグリッド
  16. 2次元配列データのCSV ファイル読み書き
  17. 配列の次元を増やす
  18. リスト
  19. 散布図

  20. TensorFlow

Google Colab

Google Colab はオンラインの Python 開発環境. 使用するには Google アカウントが必要

  1. Google Colab のWebページを開く

    https://colab.research.google.com

  2. ファイル」で、「PYTHON 3 の新しいノートブックの新規作成」を選ぶ

  3. Google アカウントでログインする

  4. コードセルの中に Python プログラムを書き、「再生ボタン」をクリック

  5. コードセルを追加したいときは、「挿入」で、「コードセル」をクリック


式と変数

変数は,変化するデータのこと. 「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))


クラス定義とオブジェクト生成

クラス定義と,コンストラクタを用いたオブジェクト生成のプログラム例

クラス名: 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のモジュール

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)

最大公約数

2418 の最大公約数を求めたい.結果 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辺の長さが,46で,その間の角度が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 )

10倍

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)

「*」の表示を 18 回繰り返す(* を 18 個並べて表示)

for による繰り返し

import sys
for i in range(18):
    sys.stdout.write("*")


1次元の配列(アレイ)

0要素

type はオブジェクトのタイプの取得.share は配列(アレイ)のサイズの取得.

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)


2次元の配列(アレイ)

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)


2次元配列データのCSV ファイル読み書き

CSV ファイル書き出し.pandas 経由で行う

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 経由で行う

pd.read_csv("XX.csv", header=None)

pd.read_csv("YY.csv", header=None)


配列の次元を増やす

1次元を2次元に

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)

添え字は 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

TensorFlow は,機械学習のアプリケーションを簡単に作成するのに役立つソフトウエア. Python, C/C++ 言語から利用可能. プロセッサ(CPU), GPU, Google TPU で動く Google 社のディープラーニング研究プロジェクトから出発し, 2015年11月に最初のリリースが行われた.ソースコード等は公開されている.

TensorFlow のプログラム例 - 行列の足し算

import tensorflow as tf
import numpy as np
with tf.Session():
  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)
  result = c.eval()

print(result)

Keras は,TensorFlow を用いてのディープラーニング(深層学習)でのモデルの構築と,その訓練(構築)を簡単に行えるようにするソフトウエア

用語集

ニューラルネットワークのデモサイト: http://playground.tensorflow.org

Python の配列(アレイ)と画像データセット

パッケージのインポートなど

from __future__ import absolute_import, division, print_function, unicode_literals

# TensorFlow と tf.keras のインポート
import tensorflow as tf
from tensorflow import keras

# ヘルパーライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)

(1) 画像データセット MNIST を準備するプログラム

変数 X_train: サイズ 28 × 28 の 60000枚の濃淡画像

変数 y_train: 60000枚の濃淡画像それぞれの,種類番号(0 から 9 のどれか) 変数 X_test: サイズ 28 × 28 の 10000枚の濃淡画像

変数 y_test: 10000枚の濃淡画像それぞれの,種類番号(0 から 9 のどれか)

from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

(2) 「サイズ 28 × 28 の 60000枚の濃淡画像」の形と次元を確認するプログラム

配列(アレイ)の形: 60000×28×28

次元: 3

print( X_train.shape )
print( X_train.ndim )

(3) データの確認

plt.figure()
plt.imshow(X_train[0])
plt.colorbar()
plt.gca().grid(False)
plt.show()

(4) ニューラルネットワークを使うために,データを調整

X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255.0
X_test /= 255.0
print( X_train.shape )
print( X_train.ndim )

  • データの確認表示
    class_names = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    plt.figure(figsize=(10,10))
    for i in range(25):
        plt.subplot(5,5,i+1)
        plt.xticks([])
        plt.yticks([])
        plt.grid(False)
        plt.imshow(X_train[i], cmap=plt.cm.binary)
        plt.xlabel(class_names[y_train[i]])
    plt.show()
    

  • (5) ニューラルネットワークを作るプログラム(ニューラルネットワークの層の設定とコンパイル)

    2層のニューラルネットワークを作成

    1層目:ユニット数は 128

    2層目:ユニット数は 10

    m = keras.Sequential()
    m.add(keras.layers.Flatten(input_shape=(28, 28)))
    m.add(keras.layers.Dense(units=128, activation=tf.nn.relu))
    m.add(keras.layers.Dropout(rate=0.2))
    m.add(keras.layers.Dense(units=10, activation=tf.nn.softmax))
    m.compile(loss='sparse_categorical_crossentropy',
              optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True))
    

    (6) ニューラルネットワークの確認表示

    print(m.summary())
    

    (7) ニューラルネットワークの訓練(学習)を行うプログラム

    histroy = m.fit(X_train, keras.utils.to_categorical(y_train, 10), epochs=50)
    

  • テスト用データセットで評価する
    print( m.evaluate(X_test, y_test) )
    

    (9) ニューラルネットワークを使ってみる

    テスト画像を,ニューラルネットワークに与えて,予測させる

    predictions = m.predict( X_test )
    print( predictions[0] )
    

    (10) 正解表示

    テスト画像 0 番の正解を表示

    print( y_test[0] )
    

    1. この Web ページでは、次の画像を使うことにする

      2071.png のようなファイル名で保存しておく

    2. 画像のアップロード操作
      1. 展開する

      2. ファイル」を選ぶ

      3. アップロード」を選ぶ

      4. アップロードしたいファイルを選ぶ

    3. VGG を使うプログラム。Kerasのサイトで公開されているものを少し書き換えて使用。
      import h5py
      from keras.preprocessing import image
      from keras.applications.vgg16 import VGG16
      from keras.applications.vgg16 import preprocess_input
      import numpy as np
      
      m = VGG16(weights='imagenet', include_top=False)
      
      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)
      
      features = m.predict(x)
      print(features) 
      

    4. InceptionV3 を使うプログラム。Kerasのサイトで公開されているものを少し書き換えて使用。
      import h5py
      from 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]))