トップページデータベース研究用語集

用語集

データ処理」,「ディープラーニング」を行うときのための基礎用語をまとめている.

項目を a-z, あーん順に並べている.

サイト内の関連ページ:

参考 Web ページ:

 

AdaDelata 法

M.Zeiler の AdaDelta 法は,学習率をダイナミックに変化させる技術

from keras.optimizers import Adadelta
optimier = Adadelta(rh=0.95)

M. Zeiler, Adadelta An adaptive learning rate method, 2012.

確率的勾配降下法 (SGD 法 をベースとしているが、 確率的勾配降下法が良いのか、Adadelta 法が良いのかは、一概には言えない.

その他 Adam 法なども知られる.Adam 法を使うプログラム例は次の通り.

m.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
    loss='sparse_categorical_crossentropy',
    metrics=['sparse_categorical_crossentropy', 'accuracy']
)

Diederik Kingma and Jimmy Ba, Adam: A Method for Stochastic Optimization, 2014, http://arxiv.org/abs/1412.6980  

Batch Normaliation

Batch Normaliation とは、 ミニバッチ学習を行うとき、ミニバッチごとに正規化を行うこと.この結果として、バイアスはなくなる.

Keras で Batch Normalization を行うときは、次のように Dense と Activation の間に、「model.add(BatchNormalization)」を入れる。

import tensorflow.compat.v2 as tf
tf.enable_v2_behavior()
model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(units=128, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dropout(0.05),
    tf.keras.layers.Dense(units=10, activation='softmax')
])

ソフトマックス関数 (softmax function)を活性化関数とするような層(レイヤ)では、BatchNormalization は行わないようです.

 

Boston housing price 回帰データセット

Boston housing price 回帰データセットは,Keras に付属のデータセットから,次のプログラムでロードできる.

from keras.datasets import boston_housing
(x_train, y_train), (x_test, y_test) = boston_housing.load_data()

Caffe

参考 Web ページ

Caffe2

インストール

参考 Web ページ

CIFAR 10 データセット

CIFAR 10 データセットは,カラー画像 60000枚. サイズは 32 かける 32. 各画像にラベル付けがなされている.ラベルは 10種類.

CIFAR 10 データセットの画像分類は, 所定の 10種類に画像分類を行うものである. その 10種類は,airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck である.

CIFAR 10 データセットは,Keras に付属のデータセットから,次のプログラムでロードできる.

from keras.datasets import cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()

TensorFlow データセットカタログの cifar10 のページ: https://www.tensorflow.org/datasets/catalog/cifar10

CIFAR 100 データセット

CIFAR 100 データセットは,カラー画像 60000枚. サイズは 32 かける 32. 各画像にラベル付けがなされている.ラベルは 100種類.

CIFAR 100 データセットは,Keras に付属のデータセットから,次のプログラムでロードできる.

from keras.datasets import cifar100
(x_train, y_train), (x_test, y_test) = cifar100.load_data(label_mode='fine')

TensorFlow データセットカタログの cifar100 のページ: https://www.tensorflow.org/datasets/catalog/cifar100

CNN

Convolutional Neural Network

CNTK

 

COCO データセット

URL: https://cocodataset.org/

物体検出,セグメンテーション,キーポイント,パノラマ,ポーズのデータセット

pycocotools については別項目で説明.  

csvkit のインストール

csvkit のインストールは次のような手順になる.

 

csvkit に同封されているデータファイル

次の URL で公開されている.

URL: https://github.com/wireservice/csvkit/tree/master/examples/realdata

上の URL をWebブラウザで開くか,次のコマンドでダウンロードできる.

curl -L -O https://raw.githubusercontent.com/wireservice/csvkit/master/examples/realdata/ne_1033_data.xlsx
 

DenseNet

Keras の DenseNet121 を用いて DenseNet 121 を作成するプログラムは次のようになる. 「weights=None」を指定することにより,最初,重みをランダムに設定する.

model = tf.keras.applications.densenet.DenseNet121(input_shape=INPUT_SHAPE, weights=None, classes=NUM_CLASSES)

Keras の DenseNet169 を用いて DenseNet 169 を作成するプログラムは次のようになる. 「weights=None」を指定することにより,最初,重みをランダムに設定する.

model = tf.keras.applications.densenet.DenseNet169(input_shape=INPUT_SHAPE, weights=None, classes=NUM_CLASSES)

arxiv: https://arxiv.org/abs/1608.06993

Keras の応用のページ: https://keras.io/ja/applications/  

Early Stopping

Keras で Early Stopping を行うとき、次のようにコールバックを書く.

from kernel.callbacks import EarlyStopping
cb = EarlyStopping(monitor='var_loss', patience = 10)

コールバックは,次のようにして使用する.

history = m.fit(x_train, y_train, batch_size=32, epochs=50, validation_data=(x_test, y_test), callbacks=[cb])

Fashion MNIST

Fashion MNIST は,濃淡画像 70000枚, 各画像のサイズは 28 かける 28.各画像にラベル付けがなされている.

URL: https://github.com/zalandoresearch/fashion-mnist"

Fashion MNIST データセットは,Keras に付属のデータセットから,次のプログラムでロードできる.

from keras.datasets import fashion_mnist
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()

FordA データセット

URL: http://www.j-wichard.de/publications/FordPaper.pdf

学習データ数:3601

テストデータ数: 1320

モーターセンサーにより計測されたエンジンノイズの計測値.

Google アカウント

Google アカウントは,Google のオンラインサービス等の利用のときに使うアカウント. Google オンラインサービスの利用条件などは,利用者で確認すること.

Google Colab

Google Colab はオンラインの Python 開発環境. 使用するには Google アカウントが必要. Google Colab で PYTHON 3 の新しいノートブックを新規作成する手順は次の通り.

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

    https://colab.research.google.com

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

    [image]
  3. Google アカウントでのログインが求められたときはログインする

    [image]

    [image]
 

He の初期値

He らの方法 (2015年) では、前層のユニット数(ニューロン数)を n とするとき、 sqrt( 2 / n ) を標準偏差とする正規分布に初期化する. ただし、この方法は ReL U に特化した手法であるとされている. この方法を使うとき、層の入力は、正規化済みであること.

Kaiming He, Xiangyu hang, Shaoqing Ren and Jian Sun, Delving Deep into Rectifiers: Surpassing Human-Level, Performance on ImageNet Classification, pp. 1026^1-34.  

IMDB データセット

IMDb での映画の批評は,批評文とスコア(10点満点)である.

IMDb の URL: https://www.imdb.com/

IMDB での映画の批評は,批評文とスコア(10点満点)である. IMDB データセットでは,7点以上の批評は positive,4点以下の批評は negative としている.つまり,2種類ある. そして,IMDB データセットには,positive か negative の批評のみが含まれている(中間の点数である 5点,6点のものは含まれていない).そして, positive,negative の批評が同数である. 学習用として,positive,negative がそれぞれ 25000. テスト用として,positive,negative がそれぞれ 25000.

IMDB データセットは,Keras に付属のデータセットから,次のプログラムでロードできる.

from keras.datasets import imdb
(x_train, y_train), (x_test, y_test) = imdb.load_data()

IMDB データセットのURL: https://ai.stanford.edu/%7Eamaas/data/sentiment/  

Iris データセット

Iris データセットの先頭部分

[image]

Iris データセットについての資料は iris.pdf [PDF ファイル]

Iris データセットは,次のようなプログラムでロードできる.Python の seaborn を使用している.ロードの結果,Python のデータフレームができる.

import seaborn as sns
iris = sns.load_dataset('iris')
print(iris)

[image]

Iris データセットは,次のようなプログラムでもロードできる.Python の scikit-learn を使用している.

import sklearn.datasets
iris = sklearn.datasets.load_iris()
X = iris.data
y = iris.target
print(X)
print(y)

seaborn のデータのページ: https://github.com/mwaskom/seaborn-data

TensorFlow データセットカタログの iris のページ: https://www.tensorflow.org/datasets/catalog/iris

Juypter Qt Console

Jupyter Qt Console は,次のように「jupyter qtconsole」で起動する.

jupyter qtconsole

[image]

Python プログラムを動かして,結果をビジュアルに見たいときは, 開発環境や Python コンソール(Jupyter Qt ConsolespyderPyCharmPyScripter など)が便利.

Keras

Keras はディープラーニングのフレームワーク.TensorFlow, CNTK, Theano 上で動く.

インストール

参考 Web ページ

Keras の概要

次のプログラムでは,損失関数を,categorical crossentropy, 最適化法を 確率的勾配降下法 (SGD), 尺度を accuracy に設定している.

m.compile(optimizer=tf.keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True),
          loss='sparse_categorical_crossentropy',
          metrics=['accuracy'])

※ 目的関数については: https://keras.io/ja/objectives/  

Keras でのカーネルの初期化

次のプログラムの中の kernel_initializer の部分. 標準偏差を 0.01 になるように重みを設定している.

m.add(Dense(units=100, input_dim=len(768[0])), kernel.iniializer.TruncatedNormal(stddev=0.01))  
 

Keras での学習

学習データ x_trainy_train (x_train は入力データの numpy 配列もしくは numpy 配列のリスト、y_train はクラス番号の numpy 配列)を用いて、 バッチサイズが 32,エポック数を 10 として学習したいときには、次のコマンドを用いる.

history = m.fit(x_train, y_train, batch_size=32, epochs=50, validation_data=(x_test, y_test))
 

Keras での検証(バリデーション)

Keras での学習において,「validation_data」を付けることとで、検証(バリデーション)が行われる.

このとき、検証(バリデーション)に使うデータ(x_test, y_test)をいろいろ変えながら、Kerasでの検証(バリデーション)を行う.

history = m.fit(x_train, y_train, batch_size=32, epochs=50, validation_data=(x_test, y_test))

結果(上のプログラムでは history)を見て、過学習や学習不足を判断する.history は次のようなプログラムで表示できる.

import pandas as pd
h = pd.DataFrame(history.history)
h['epoch'] = history.epoch
print(h)
 

Keras でのコンパイル

Keras のモデルのコンパイルにおいては, オプティマイザ(最適化器)と と損失関数メトリクスの指定を行う必要がある.

Keras でのモデル m のコンパイルは,m.compile を用いて行う.  

Keras に付属のデータセット

データセットは,データの集まりのこと. Python の keras には,次のデータセットを簡単にダウンロードできる機能がある.

keras に付属のデータセットを取得するときのオプションについては, https://keras.io/ja/datasets/(日本語版), https://keras.io/datasets/(英語版) に説明されている.  

Keras の応用

Keras の応用としては, MobileNetV2, Inception Resnet, ResNet-50DenseNet 121, DenseNet 169NASNetなどの画像分類のモデルがある.

Keras では,これらモデルについて,ImageNet で事前学習済みのものを,次のようなプログラムで,簡単に使えるようにすることができる.

from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2
m = MobileNetV2(weights='imagenet')

ResNet-50, Inception-ResNet, DenseNet, NASNet, MobileNetV2  

Keras で利用可能な画像分類のモデルは,https://keras.io/api/applications/ で説明されている.

LReLU

LReLU (Leaky rectified linear unit) は,次の関数である.

f(x) = x (x>=0), alpha * x (x<0)

必ずしも、ReLU、LReLU のどちらかが優れているとうことはない.

Keras で LReLU を使うときは、次のように書く.

m.add(LeakyReLU(alpha=0.01)
 

matplotlib のインストール

Windows での matplotlib, seaborn のインストールは, コマンドプロンプトを管理者として実行し, 次のコマンドで行う.

python -m pip install -U matplotlib seaborn

Ubuntu での matplotlib, seaborn のインストールは, 次のコマンドで行う.

sudo apt -y install python3-matplotlib python3-seaborn
 

MNIST データセット

MNIST は,濃淡画像 70000枚, 各画像のサイズは 28 かける 28.各画像にラベル付けがなされている.

MNIST データセットは,Keras に付属のデータセットから,次のプログラムでロードできる.

from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

TensorFlow データセットカタログの MNIST のページ: https://www.tensorflow.org/datasets/catalog/mnist  

MobileNetV2

Keras の MobileNet を用いて MobileNetV2 を作成するプログラムは次のようになる. 「weights=None」を指定することにより,最初,重みをランダムに設定する.

model = tf.keras.applications.mobilenet.MobileNet(input_shape=INPUT_SHAPE, weights=None, classes=NUM_CLASSES)

arxiv: https://arxiv.org/pdf/1704.04861.pdf

Keras の応用のページ: https://keras.io/ja/applications/  

NASNet

Keras の NASNet を用いて NASNet を作成するプログラムは次のようになる. 「weights=None」を指定することにより,最初,重みをランダムに設定する.

model = tf.keras.applications.nasnet.NASNetMobile(input_shape=INPUT_SHAPE, weights=None, classes=NUM_CLASSES)

arxiv: https://arxiv.org/abs/1707.07012

Keras の応用のページ: https://keras.io/ja/applications/  

Nesterov モメンタム

参考文献: http://www.cs.toronto.edu/~fritz/absps/momentum.pdf  

protobuf のコンパイラ

Windows で protobuf のコンパイラである protoc を使うには, protobuf のリリースのページ https://github.com/protocolbuffers/protobuf/releases/"から,protoc-3.15.8-win64.zip のようなファイル名のファイルをダウンロードし,展開(解凍)する.  

numpy のインストール

Windows での numpy のインストールは, コマンドプロンプトを管理者として実行し, 次のコマンドで行う.

python -m pip install -U numpy

Ubuntu での numpy のインストールは, 次のコマンドで行う.

sudo apt -y install python3-numpy
 

pycocotools

pycocotools は,COCO データセットを Python から扱う機能を持ったソフトウエア.

Windows で pycocotools をインストールするときは, コマンドプロンプトを管理者として実行し,次のコマンドを実行. (前準備として,Python のインストールを終えていること)

python -m pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI
 

Python の numpy ベクトル

ベクトルは,要素の並び.各要素の添字は 0, 1, 2... のようになる. 下に,Python の numpy ベクトルのコンストラクタの例を示す.

import numpy as np
v = np.array([1, 2, 3])
print(v, v[0], v[1], v[2])

[image]

reshape の例は次の通り

X = X.reshape(len(X), 1)
 

Python の起動

python, pip は,次のコマンドで起動できる.Python のインストールは別の項目jで説明している.

 

Python のインストール

Python の URL: http://www.python.org/

Windows でのインストール手順の詳細は: 別ページで説明している.  

Python 開発環境

Python 開発環境 JupyterLab, spyder, nteract は,次のコマンドで起動できる.

 

Python 開発環境のインストール

Python 開発環境 JupyterLab, spyder, nteract は,次の手順でインストールできる.

 

one-hot エンコーディング

one-hot エンコーディング (one-hot encodinng は、クラス番号を,長さがクラス数であるような数値ベクトルで、うち、1つだけが 1、残りが全て 0 になっているようなベクトルで表すこと. 1-of-k representation ともいう. クラス番号が 0, 1, 2, 3 の 4通りであるとき,one hot 表現では [1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1] のように表す. Keras では,クラス番号を one hot 表現に変換するとき to_categorical 関数を用いる.

from keras.utils.np_utils import to_categorical
print( to_categorical(0, 4) )
print( to_categorical(1, 4) )
print( to_categorical(2, 4) )
print( to_categorical(3, 4) )

Iris データセットのロードと,one-hot コーディングへの変換プログラムの例

import sklearn.datasets
import sklearn.model_selection
import numpy as np

iris = sklearn.datasets.load_iris()
x = iris.data
y = iris.target

# 2次元の配列. 要素は float64, 最大値と最小値を用いて正規化
def normalizer(A):
    M = np.reshape(A, (len(A), -1))
    M = M.astype('float32')
    max = M.max(axis=0)
    min = M.min(axis=0)
    return (M - min)/(max - min)

x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(normalizer(x), y, train_size=0.5) 

y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)
 

Python の numpy 配列

配列では,添え字が複数になる. 下に,Python の numpy 配列のコンストラクタの例を示す.

import numpy as np
M = np.array([[1, 2, 3], [4, 5, 6]])
print(M)
print(M[0,], M[1,])
print(M[1,0], M[1,1], M[1,2])

[image]

numpy 配列のは shape 属性である. numpy 配列の次元は ndim 属性である.

[image]
import numpy as np
a = np.array([8,5,4,1,3])
print( a.shape )
print( a.ndim )
print(a)
x = np.array([[1,2,3,4], [10,20,30,40], [100,200,300,400]])
print( x.shape )
print( x.ndim )
print(x)
[image]

PyTorch

インストール

参考 Web ページ

 

ReLU

ReLU (rectified linear unit) は,次の関数である.

f(x) = x (x>=0), 0 (x<0)

必ずしも、ReLU、LReLU のどちらかが優れているとうことはない.  

ResNet-50

Keras の ResNet50 を用いて ResNet-50 を作成するプログラムは次のようになる. 「weights=None」を指定することにより,最初,重みをランダムに設定する.

model = tf.keras.applications.resnet50.ResNet50(input_shape=INPUT_SHAPE, weights=None, classes=NUM_CLASSES)

arxiv: https://arxiv.org/abs/1512.03385

Keras の応用のページ: https://keras.io/ja/applications/  

Reuters newswire topics データセット

Reuters newswire topics データセットは,Keras に付属のデータセットから,次のプログラムでロードできる.

from keras.datasets import reuters
(x_train, y_train), (x_test, y_test) = reuters.load_data()
 

SQLite 3

SQLite 3は,パブリックドメインの組み込み型リレーショナルデータベース管理システム

SQLite 3 の URL: http://www.sqlite.org

SQLite 3 のコピーライト: http://www.sqlite.org/copyright.html

SQLite 3は次の特徴を持つ.

リレーショナルデータベースの学習用にも適する. 但し,マルチユーザ,オンラインで使うことは難しいので注意. SQL92 の全機能はない

サイト内の関連ページ

参考 Web ページ

SQLite 3 コマンドラインシェル

SQLite 3 コマンドラインシェルは,Windows のコマンドプロンプトや Linux のシェルなどで動作するツールである.主な機能は次の通りである.

サイト内の関連ページ

TensorFlow

TendowFlow (https://www.tensorflow.org/) は, 機械学習のフレームワーク. 節が数値演算,枝が多次元の配列(テンソル)であるような「データフローグラフ (data flow graph)」を特色とする.

インストール

参考 Web ページ

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

Tensorflow の Play Ground のサイト

TensorFlow のニューロン(ユニット),結合,学習,重みの変化,学習率,活性化関数(ReLU など),正則化(L2 など),バッチサイズ,データの分類,回帰についてさまざま試すことができるデモサイト

http://playground.tensorflow.org  

Tensorflow のデータセット

データセットのカタログのページ: https://www.tensorflow.org/datasets/catalog/overview

「tfds.list_builders()」により,現在インストールされている TensorFlow データセットの データセットビルダーを確認できる.

TensorFlow データセットのロード時に分割を行うには,次のように書く.

「0%:50%」は先頭から 50 %, 「50%:100%」は末尾の 50% 部分.

import tensorflow.compat.v2 as tf
import tensorflow_datasets as tfds
tf.enable_v2_behavior()
iris, iris_info = tfds.load('iris', split=['train[0%:50%]', 'train[50%:100%]'], with_info = True, shuffle_files=True, as_supervised=True)
iris = {'train': iris[0], 'test': iris[1]}
 

Tensorflow のベクトル

ベクトルは,要素の並び.各要素の添字は 0, 1, 2... のようになる. 下に,Tensorflow のベクトルのコンストラクタの例を示す.

import tensorflow as tf
v1 = tf.constant([1, 2, 3])
print(v1)

import numpy as np
np.array([1, 2, 3])
v2 = tf.constant( np.array([1, 2, 3]) )
print(v2)

[image]
 

Tensorflow の配列

配列では,添え字が複数になる. 下に,Tensorflow の配列のコンストラクタの例を示す.

import tensorflow as tf
M1 = tf.constant([[1, 2, 3], [4, 5, 6]])
print(M1)

import numpy as np
np.array([1, 2, 3])
M2 = tf.constant( np.array([[1, 2, 3], [4, 5, 6]]) )
print(M2)

[image]

Theano

( 2017.9 に開発の停止がアナウンス)

Titanic データセット

Titanic データセットは,次のようなプログラムでロードできる.Python の seaborn を使用している.ロードの結果,Python のデータフレームができる.

import seaborn as sns
iris = sns.load_dataset('titanic')
print(iris)

[image]

seaborn のデータのページ: https://github.com/mwaskom/seaborn-data

TensorFlow データセットカタログの titanic のページ: https://www.tensorflow.org/datasets/catalog/titanic

Torch 7

 

エポック

学習データを全て使い終わったら1エポックである. 確率的勾配効果法などでミニバッチ学習を行うとき、バッチサイズが100,学習データ数が800であるとすると、 ミニバッチ学習を8回行うと1エポックである.80回行うと10エポックである.  

クラス

クラスはオブジェクトの種類,もしくは,同一種類のオブジェクトの集まりの意味である.  

シグモイド関数 (sigmoid function)

シグモイド関数 (sigmoid function) は,f(x) = 1 / (1 + exp(-x))  

ソフトマックス関数 (softmax function)

次元数 n のベクトル x に対するソフトマックス関数 (softmax function) は,f(x[k]) = exp(x[k]) / (exp(x[1]) + exp(x[2]) + ... exp(x[n]))

ニューラルネットワークの,ある層(レイヤ)の出力が one-hot 表現の出力であるときに使用される.  

ステップ関数

ステップ関数は,f(x) = x (x < 0 のとき), 1 (x > = 0 のとき)  

データの前処理

TensorFlowでは,入力の値が 0 から 1 の範囲の浮動小数点数にスケールする必要がある.

ディープラーニング

ディープラーニングは,ジェフ・ヒントンが 2006年に見出した,層の浅いニューラルネットワークの組み合わせによる多層性の実現により勃興した分野.  

ドロップアウト

学習の途中で, ニューラルネットワークを構成するニューロン(ユニット)を無作為(ランダム)に除去すること. 過学習の防止に効果がある場合があるとされる.

参考文献: Improving neural networks by preventing co-adaptation of feature detectors, http://arxiv.org/abs/1207.0580  

ニューラルネットワーク

ニューラルネットワークは、人間の脳細胞を、信号が流れるネットワークと見立てたうえで、 個々の脳細胞を、 次の簡単な数理で組み立てるもの.

ニューラルネットワークでは「2+3」の答えは「5」である、「3+4」の答えは「7」であるというような学習を多数繰り返すことによって、 コンピュータが、「2+4 の答えは、0 から 99 のうちいくつですか」という質問に答えることができるようになる. 画像の分析、音声の分析、コンピュータと人間の対話、翻訳などに広く用いられるようになってきた.、 コンピュータは、プログラムで動く.プログラムを人間が修正したり、調整しなくても、自動で賢くなるというのがニューラルネットワークの良さである. ニューラルネットワークは、自動の学習により、改善されていく(一般のプログラムではそのようなことがない).

ニューラルネットワークの働きは、入力を与えると、答えが出てくるというものです. 質問が与えられたときに、多数の選択肢の中から 1つを選ぶことが得意です. 質問は、文章でも、画像でも、音声でも、それらの混合でも大丈夫です. 例えば、コンピュータに画像を見せて「男か女か」の答えを出す、年齢を「0から120の中から」答えるということができる. このとき、人間の介在は必要ありません。

ニューラルネットワークは 1980年d内に登場しました. ニューラルネットワークの技術革新として、 ドロップアウト法による過学習防止、ReLU法により、ニューラルネットワークの本質的課題であった勾配消失問題の解決、GPUプロセッサや EarlyStopping 法など、軽快動作の手法登場し、 「ディープラーニング」と呼ばれる、ニューラルネットワークが誕生しました. 用途によっては、プログラムを組み立てた場合よりも、高精度を示す場合があります.  

ニューロン(ユニット)

ニューロン(ユニット)は, 複数の入力の総和に,バイアスを足したのち,当ニューロン(ユニット)に設定された活性化関数を適用して得られた値を出力する. ニューロン(ユニット)の入力と出力の間には 重みがある. ニューロン(ユニット)の出力には,重みが掛け合わされたのちに,次のニューロン(ユニット)の入力になる.

1つのニューロン(ユニット)は,複数の入力を取ることができる.出力は1つである.これら入力と出力は,次のいずれかの条件を満たす

層構造のニューラルワークでは, バイアスは,ニューロン(ユニット)ごとに違い, 活性化関数は,同じ層(レイヤ)のニューロン(ユニット)では同じものとするのが通例.  

ニューロン(ユニット)の発火

ニューロン(ユニット)の発火は、 所定のバイアスを超えたときに、1を出力すること.  

バイアス

バイアスは個々のニューロン(ユニット)が持つ値.ニューロン(ユニット)の発火のしやすさを表す値とされる.  

ハイパーパラメータ

ハイパーパラメータは,次の 2つである.

 

ハイパーパラメータチューニング

最適なハイパーパラメータを探索すること.  

ハイパーパラメータチューニングを行うモデルの定義

ハイパーパラメータチューニングを行うモデルの定義では, ハイパーパラメータの探索を行う探索空間を定義する.

Iris データセット を,3種類に分類する Keras プログラムの例は次の通り.

import sklearn.datasets
import sklearn.model_selection
import tensorflow.compat.v2 as tf
tf.enable_v2_behavior()
import kerastuner as kt
import numpy as np

iris = sklearn.datasets.load_iris()
x = iris.data
y = iris.target

# 2次元の配列. 要素は float64, 最大値と最小値を用いて正規化
def normalizer(A):
    M = np.reshape(A, (len(A), -1))
    M = M.astype('float32')
    max = M.max(axis=0)
    min = M.min(axis=0)
    return (M - min)/(max - min)

x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(normalizer(x), y, train_size=0.5) 

NUM_CLASSES = 3

def model_builder(hp):
    hp_units = hp.Int('units', min_value = 32, max_value = 512, step = 32)
    hp_learning_rate = hp.Choice('learning_rate', values = [1e-2, 1e-3, 1e-4]) 
    m = tf.keras.Sequential([
        tf.keras.layers.Dense(units=hp_units, input_dim=len(x_train[0]), activation='relu'),
        tf.keras.layers.Dropout(0.05),
        tf.keras.layers.Dense(units=NUM_CLASSES, activation='softmax')
    ])
    m.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=hp_learning_rate),
        loss='sparse_categorical_crossentropy',
        metrics=['sparse_categorical_crossentropy', 'accuracy'])
    return m

EPOCHS = 100
tuner = kt.Hyperband(model_builder,
                     objective = 'val_accuracy', 
                     max_epochs = EPOCHS,
                     factor = 30,
                     directory = 'mydir',
                     project_name = 'iris')

tuner.search(x_train, y_train, epochs = EPOCHS, validation_data = (x_test, y_test))
best_hps = tuner.get_best_hyperparameters(num_trials = 1)[0]
print(best_hps.get('units'))
print(best_hps.get('learning_rate'))

m = tuner.hypermodel.build(best_hps)
print(m.summary())
history = m.fit(x_train, y_train, batch_size=32, epochs = EPOCHS, validation_data = (x_test, y_test))

# 分類
predictions = m.predict(x_test)
print(predictions.argmax(axis=1))
# 正解の表示
print(y_test)

import pandas as pd
h = pd.DataFrame(history.history)
h['epoch'] = history.epoch
print(h)
 

ミニバッチ学習

ミニバッチ学習は,学習データの中から、「バッチ」あるいは「ミニバッチ」と呼ばれる少数を無作為に(ランダムに)選び出し,それを使って学習を行うこと.  

メトリクス(metrics)

メモリクスは,モデルの性能を判定するための関数である. メトリクスは,損失関数とは違い,学習時には使用されない.

Keras では,メトリクスは,関数のリストである.そして,Keras では,任意の損失関数メトリクスとして使うことができる.

Keras のメトリクスのページ: https://keras.io/api/losses/  

モデル

この資料で「モデル」というときは,コンピュータの中に作られたニューラルネットワークのこと.  

ラベル (label)

ラベルは,クラスの番号やクラス名など,クラスを識別できる番号や文字列などのこと.

リレーショナルデータベース管理システム

リレーショナルデータベースシステムは,リレーショナルデータベースとリレーショナルデータベース管理システムから構成される.  

ロジット

分類の結果として得られる数値ベクトルで,正規化されていないもの. ロジットに対しては,正規化が行われるのが普通である.

多クラス分類では,ロジット正規化するために ソフトマックス関数 (softmax function)を用いるのが普通である. ソフトマックス関数 (softmax function)により,数値ベクトルが生成されるが,そのそれぞれの値が1クラスに対応する.

ロジットの別の意味として,ロジットという言葉を,ロジット関数(シグモイド関数 (sigmoid function))という意味で使うことがある.  

重み

ニューラルネットワークで,あるニューロン(ユニット)とニューロン(ユニット)が結合しているとき, 個々の結合には重みがある. 重みが大きいほど,当ニューロン(ユニット)の出力が強く,次のニューロン(ユニット)に渡される. 例えば、 あるニューロン(ユニット)が、別の2つのニューロン(ユニット)と結合していて、それら2つの出力を受け取るとき、 そのニューロン(ユニット)の入力は、w[1] * x[1] + w[2] * x[2] のよになる. w[1], w[2] は重み、 x[1], x[2] は2つのニューロン(ユニット)の出力である.  

重みの初期化

重みの初期化 (weights initialization)  

重みの方向ベクトル

重みが複数あるとき,それらは重みベクトルをなす. 重みが複数あり,それら重みをそれぞれ増やしたり減らしたりする量は,重みの方向ベクトルをなす.  

重みに関する損失関数の勾配

重みに関する損失関数の勾配は,損失関数の値を最も減らすような重みの方向ベクトルである.  

学習 (learning)

学習は, ニューラルネットワークの重みとバイアスを修正することにより、より正しい出力が得られるように調整すること、 あるいは最適な出力が得られるように重みとバイアスを修正すること.

学習データのうち、入力を使い、 ニューラルネットワークを動かす. そして、正解の出力を使い、 損失関数の値ができるだけ小さくなるように、 オプティマイザ(最適化器)を用いて, ニューラルネットワークを構成するニューロン(ユニット)の重みとバイアスなど, ニューラルネットワークのパラメータをを最適化すること  

学習データ

学習データは、ニューラルネットワークの入力と、正解の出力.

「訓練データ」などともいう.  

学習不足 (underfitting)

学習データに対して,モデルの学習の余地が残っていること.エポック数が小さすぎる,正則化が過剰である,モデルが十分に強力ではないなどの理由により発生する.  

確率的勾配降下法

確率的勾配降下法 (SGD) は,次の方法で行う勾配降下法である.

m.compile(
    optimizer=tf.keras.optimizers.SGD(lr=0.0001, momentum=0.9, nesterov=True), 
    loss='sparse_categorical_crossentropy',
    metrics=['sparse_categorical_crossentropy', 'accuracy']
)
 

画素

MNIST データセットは,濃淡画像 70000枚である.その画素は 0 から 255 の値になっている.

[image]

画像全体は配列として扱うことが多い.

[image]
 

画像データの増強 (augmentation)

import tensorflow.compat.v2 as tf
import tensorflow_datasets as tfds
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings

# cifar10 データセットのロード
cifar10, cifar10_info = tfds.load('cifar10', with_info = True, shuffle_files=True, as_supervised=True, batch_size = -1)
ds_train = (ds_train[0].numpy().astype("float32") / 255., ds_train[1])
ds_test = (ds_test[0].numpy().astype("float32") / 255., ds_test[1])
# 増量
INPUT_SHAPE = [32, 32, 3]
data_augmentation = tf.keras.Sequential(
    [
        tf.keras.layers.experimental.preprocessing.RandomFlip("horizontal", input_shape=INPUT_SHAPE,
        tf.keras.layers.experimental.preprocessing.RandomRotation(0.1),
    ]
)
augmented_ds_train = [*map(lambda x: np.array(data_augmentation(x.reshape(1, INPUT_SHAPE[0], INPUT_SHAPE[1], INPUT_SHAPE[2]), training=True).reshape(32,32,3), ds_train[0])]
 

画像分類 (image classification)

画像分類は,画像からそのクラス名を求めるもの.  

活性化関数

活性化関数 (Activation) は,ReLU (rectified linear unit), LReLU (Leaky rectified linear unit), シグモイド関数 (sigmoid function), ソフトマックス関数 (softmax function) などがある.

 

訓練

「訓練」は,「学習」などともいう.  

交差エントロピー

多クラスの交差エントロピーは、

のとき、次の通り.

-sigma_i( t[i] * log( y[i] ) )

2クラスの交差エントロピーは、

のとき、次の通り.

-sigma_i( t[i] * log( y[i] + (1 - t[i]) * (1 - log( y[i]) )  

オプティマイザ(最適化器)

オプティマイザ(最適化器)としては, 確率的勾配降下法 などが知られる.

参考文献: An overview of gradient descent optimization algorithms, arxiv: https://arxiv.org/abs/1609.04747, http://sebastianruder.com/optimizing-gradient-descent/

Keras のオプティマイザのページ: https://keras.io/api/optimizers/  

時系列 (time series)

 

散布図

次のプログラムは M の最初の2列を横軸と縦軸の値として散布図を書く. b を使って色を付ける.seaborn の scatterplot を使用

def scatter_plot(M, b, alpha):
    a12 = pd.DataFrame( M[:,0:2], columns=['a1', 'a2'] )
    a12['target'] = b
    sns.scatterplot(x='a1', y='a2', hue='target', data=a12, palette=sns.color_palette("hls", np.max(b) + 1), legend="full", alpha=alpha)

次のプログラムも M の最初の2列を横軸と縦軸の値として散布図を書く. b を使って色を付ける.今度は,seaborn の lmplot を使用

def scatter_plot(M, b, alpha):
    a12 = pd.DataFrame( M[:,0:2], columns=['a1', 'a2'] )
    a12['target'] = b
    sns.lmplot(x='a1', y='a2', data=a12, hue='target', scatter_kws={'alpha': alpha}, fit_reg=False)
 

事前学習

 

正規化

正規化は,次の 2つの意味がある.

  1. 「データの範囲を0から1の間に収める」ためのデータ変換操作. Python のプログラムは次の通り.
    x_train = x_train / / X.train.max()
    

  2. 平均 0、標準偏差1になるようにするためのデータ変換操作のことを「正規化」ということもある.
 

正則化

参考文献: http://research.microsoft.com/en-us/um/people/jingdw/pubs/cvpr16-disturblabel.pdf  

全結合層

「Fully-connected Layer」のこと.「Dense Layer」や「Affine レイヤ」ともいう.  

層(レイヤ)

ニューラルネットワークは層の付き重ねで構成されると考えることができる.

ニューラルネットワークの1つの層(レイヤ)は, コンピュータの中に作るとき,全結合層 (fully-connected layer), 活性化関数層 (activation layer) いう複数の層(レイヤ)に分かれることが普通である. さらに Dropout のような,新しい層(レイヤ)が加わることもある.

もちろん、プログラム次第で、モデルはどのようにでも作ることができる。 入力の次元数が 784、ニューロン(ユニット)数 100, 100, 100の3層、クラス数 10、ドロップアウト 0.05 のとき、  

層構造のニューラルネットワーク

この資料で, 「層構造のニューラルネットワーク」というときは, ニューラルネットワークが層構造をなしていて,さらに,ある層(レイヤ)ニューロン(ユニット)は, 次の層(レイヤ)のみにつながる(つながりでは,飛び越しや後戻りがない)という場合のことをいう. Keras では,「Sequential」という.

例えば、次のような 10層からなる層構造のニューラルネットワークを考えることができる.

m.add(Dense(units=100, input_dim=len(768[0])))
m.add(Activation('relu'))
m.add(Dropout('0.05'))
m.add(Dense(units=100))
m.add(Activation('relu'))
m.add(Dropout('0.05'))
m.add(Dense(units=100))
m.add(Activation('relu'))
m.add(Dropout('0.05'))
m.add(Dense(units=クラス数))
m.add(Activation('softmax'))
 

損失関数

ニューラルネットワークの出力と正解との誤差を評価する尺度である関数のこと. 「目的関数」,「誤差関数」ともいうこともある.

ニューラルネットワークの学習においては,損失関数の値が最小になるように探索が行われる.

Keras の損失関数のページ: https://keras.io/api/losses/

 

多クラス

「多クラス」は、クラス数が3以上であること.クラス数が2の場合には「2クラス」という.  

多クラスの分類 (multi-class classification)

2つ以上のクラス分類すること. 2クラスに分類するときは binary classication という.  

畳み込みニューラルネットワーク

畳み込みニューラルネットワーク (Convolutional Neural Network) は,

の組み合わせで構成される層構造のニューラルネットワークのこと.

例えば、次のような 13層からなる層構造のニューラルネットワークを考えることができる.

AlexNet の場合

input 3@224x224
conv 11x11
  96@55x55
pooling
conv 5x5
  256@27x27
pooling
  16@5x5
conv 3x3
  384@13x13
conv 3x3
  384@13xx13
conv 3x3 
  256@13x13
affine
  4096
affine
  4096
  1000

参考文献: ch08/deep=cnvnet.py  

転移学習 (transfer learning)

事前学習済みの分類のためのモデルなどを使い,新しい分類を行う.新しい分類のための学習データを十分に準備できないときに効果を期待できる.転移学習では,事前学習済みのモデルについて,重みを凍結(フリーズ)する.そして,事前学習済みのモデルに新しい層(レイヤ)を追加して,新しい分類を行えるようにする.このとき事前学習済みのモデルは,新しい分類のための特徴抽出のために使うと考えることができる  

入力の次元数

ニューロン(ユニット)の入力が数のベクトルであるとき,そのベクトルの次元数を「入力の次元数」という.  

白色化

白色化 (whitening) とは,ニューラルネットワークの入力である数値ベクトルについて, 次のことを行う処理のこと.

 

微調整 (fine tuning)

転移学習において,モデル全体もしくはモデルの一部の凍結(フリーズ)を解除し,新しいデータで学習を行う.このとき,十分な量のデータを準備すること,そして,学習率を低く設定するなので,モデルの改善を行う.  

分類 (classification)

分類は,ベクトルデータから,そのクラス名(カテゴリ名)を求めるもの. 分類のために,学習データを用いて事前学習を行う.

Iris データセット を,3種類に分類する Keras プログラムの例は次の通り.

import sklearn.datasets
import sklearn.model_selection
import tensorflow.compat.v2 as tf
tf.enable_v2_behavior()
import numpy as np

iris = sklearn.datasets.load_iris()
x = iris.data
y = iris.target

# 2次元の配列. 要素は float64, 最大値と最小値を用いて正規化
def normalizer(A):
    M = np.reshape(A, (len(A), -1))
    M = M.astype('float32')
    max = M.max(axis=0)
    min = M.min(axis=0)
    return (M - min)/(max - min)

x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(normalizer(x), y, train_size=0.5) 

NUM_CLASSES = 3

m = tf.keras.Sequential([
    tf.keras.layers.Dense(units=64, input_dim=len(x_train[0]), activation='relu'),
    tf.keras.layers.Dropout(0.05),
    tf.keras.layers.Dense(units=NUM_CLASSES, activation='softmax')
])

print(m.summary())

m.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
    loss='sparse_categorical_crossentropy',
    metrics=['sparse_categorical_crossentropy', 'accuracy']
)

EPOCHS = 300
history = m.fit(x_train, y_train, batch_size=32, epochs=EPOCHS, validation_data=(x_test, y_test))

# 分類
predictions = m.predict(x_test)
print(predictions.argmax(axis=1))
# 正解の表示
print(y_test)

import pandas as pd
h = pd.DataFrame(history.history)
h['epoch'] = history.epoch
print(h)

# 学習曲線
# https://www.tensorflow.org/tutorials/keras/overfit_and_underfit?hl=ja で公開されているプログラムを使用
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings

def plot_history(histories, key='binary_crossentropy'):
  plt.figure(figsize=(16,10))

  for name, history in histories:
    val = plt.plot(history.epoch, history.history['val_'+key],
                   '--', label=name.title()+' Val')
    plt.plot(history.epoch, history.history[key], color=val[0].get_color(),
             label=name.title()+' Train')

  plt.xlabel('Epochs')
  plt.ylabel(key.replace('_',' ').title())
  plt.legend()

  plt.xlim([0,max(history.epoch)])


plot_history([('history', history)], key='sparse_categorical_crossentropy')

上のプログラムの実行結果は下の図の通り。

[image]

上のプログラムで作成されるモデルは、次の通り。

[image]

学習に追加に使うデータ: x_testy_test のペア

print(x_train)
print(y_train) 

[image]

[image]

学習のあと、別のデータを使って「予測」をさせてみる

まず予測に使いたいデータの確認

print(x_test)

[image]

予測結果の確認

m.predict(x_test)

[image]

公開している資料等のご利用について.

原則,クリエイティブコモンズ BY NC SAとしている. PDFファイル,パワーポイントファイルなどには, 「クリエイティブコモンズ BY NC SA」を明記するとともに,ロゴを記載するようにしている(作業が間に合っていない分もあるのでご容赦ください).

公開している資料をご利用になる場合の,再配布の条件剽窃の防止などについて,別ページで説明している. 再配布や資料改変の際には,そのページをご確認ください.