「ディープラーニング」を使うときに必要な基礎用語をまとめている.
項目を a-z, あーん順に並べている.
参考 Web ページ: https://developers.google.com/machine-learning/glossary
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 とは、 ミニバッチ学習を行うとき、ミニバッチごとに正規化を行うこと.この結果として、バイアスはなくなる.
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 回帰データセットは,Keras に付属のデータセットから,次のプログラムでロードできる.
from keras.datasets import boston_housing (x_train, y_train), (x_test, y_test) = boston_housing.load_data()
参考 Web ページ
インストール
参考 Web ページ
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 データセットは,カラー画像 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
Convolutional Neural Network
物体検出,セグメンテーション,キーポイント,パノラマ,ポーズのデータセット
pycocotools については別項目で説明.  
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/  
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 は,濃淡画像 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()
URL: http://www.j-wichard.de/publications/FordPaper.pdf
学習データ数:3601
テストデータ数: 1320
モーターセンサーにより計測されたエンジンノイズの計測値.
Google アカウントは,Google のオンラインサービス等の利用のときに使うアカウント. Google オンラインサービスの利用条件などは,利用者で確認すること.
Google Colab はオンラインの Python 開発環境. 使用するには Google アカウントが必要. Google Colab で PYTHON 3 の新しいノートブックを新規作成する手順は次の通り.
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 での映画の批評は,批評文とスコア(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 データセットについての資料は iris.pdf [PDF ファイル]
Iris データセットは,次のようなプログラムでロードできる.
import sklearn.datasets iris = sklearn.datasets.load_iris() x = iris.data y = iris.target
TensorFlow データセットカタログの iris のページ: https://www.tensorflow.org/datasets/catalog/iris
Jupyter Qt Console は,次のように「jupyter qtconsole」で起動する.
jupyter qtconsole
Python プログラムを動かして,結果をビジュアルに見たいときは, 開発環境や Python コンソール(Jupyter Qt Console,spyder,PyCharm,PyScripter など)が便利.
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/  
次のプログラムの中の kernel_initializer の部分. 標準偏差を 0.01 になるように重みを設定している.
m.add(Dense(units=100, input_dim=len(768[0])), kernel.iniializer.TruncatedNormal(stddev=0.01))
学習データ x_train と y_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 での学習において,「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 でのモデル m のコンパイルは,m.compile を用いて行う.  
データセットは,データの集まりのこと. Python の keras には,次のデータセットを簡単にダウンロードできる機能がある.
keras に付属のデータセットを取得するときのオプションについては, https://keras.io/ja/datasets/(日本語版), https://keras.io/datasets/(英語版) に説明されている.  
Keras の応用としては, MobileNetV2, Inception Resnet, ResNet-50, DenseNet 121, DenseNet 169, NASNetなどの画像分類のモデルがある.
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 (Leaky rectified linear unit) は,次の関数である.
f(x) = x (x>=0), alpha * x (x<0)
必ずしも、ReLU、LReLU のどちらかが優れているとうことはない.
Keras で LReLU を使うときは、次のように書く.
m.add(LeakyReLU(alpha=0.01)
Windows での matplotlib, seaborn のインストールは, コマンドプロンプトを管理者として実行し, 次のコマンドで行う.
python -m pip install -U matplotlib seaborn
Ubuntu での matplotlib, seaborn のインストールは, 次のコマンドで行う.
sudo apt -y install python3-matplotlib python3-seaborn
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  
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/  
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/  
参考文献: http://www.cs.toronto.edu/~fritz/absps/momentum.pdf  
Windows で protobuf のコンパイラである protoc を使うには, protobuf のリリースのページ https://github.com/protocolbuffers/protobuf/releases/"から,protoc-3.15.8-win64.zip のようなファイル名のファイルをダウンロードし,展開(解凍)する.  
Windows での numpy のインストールは, コマンドプロンプトを管理者として実行し, 次のコマンドで行う.
python -m pip install -U numpy
Ubuntu での numpy のインストールは, 次のコマンドで行う.
sudo apt -y install python3-numpy
pycocotools は,COCO データセットを Python から扱う機能を持ったソフトウエア.
Windows で pycocotools をインストールするときは, コマンドプロンプトを管理者として実行し,次のコマンドを実行. (前準備として,Python のインストールを終えていること)
python -m pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI
ベクトルは,要素の並び.各要素の添字は 0, 1, 2... のようになる. 下に,Python の numpy ベクトルのコンストラクタの例を示す.
import numpy as np v = np.array([1, 2, 3]) print(v, v[0], v[1], v[2])
reshape の例は次の通り
X = X.reshape(len(X), 1)
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 配列のコンストラクタの例を示す.
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])
numpy 配列の形は shape 属性である. numpy 配列の次元は ndim 属性である.
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)
インストール
参考 Web ページ
ReLU (rectified linear unit) は,次の関数である.
f(x) = x (x>=0), 0 (x<0)
必ずしも、ReLU、LReLU のどちらかが優れているとうことはない.
TendowFlow (https://www.tensorflow.org/) は, 機械学習のフレームワーク. 節が数値演算,枝が多次元の配列(テンソル)であるような「データフローグラフ (data flow graph)」を特色とする.
インストール
参考 Web ページ
※ ニューラルネットワークのデモサイト: http://playground.tensorflow.org  
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 データセットは,Keras に付属のデータセットから,次のプログラムでロードできる.
from keras.datasets import reuters (x_train, y_train), (x_test, y_test) = reuters.load_data()
TensorFlow のニューロン(ユニット),結合,学習,重みの変化,学習率,活性化関数(ReLU など),正則化(L2 など),バッチサイズ,データの分類,回帰についてさまざま試すことができるデモサイト
http://playground.tensorflow.org  
データセットのカタログのページ: 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]}
ベクトルは,要素の並び.各要素の添字は 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)
配列では,添え字が複数になる. 下に,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)
( 2017.9 に開発の停止がアナウンス)
TensorFlow データセットカタログの titanic のページ: https://www.tensorflow.org/datasets/catalog/titanic
学習データを全て使い終わったら1エポックである. 確率的勾配効果法などでミニバッチ学習を行うとき、バッチサイズが100,学習データ数が800であるとすると、 ミニバッチ学習を8回行うと1エポックである.80回行うと10エポックである.  
クラスはオブジェクトの種類,もしくは,同一種類のオブジェクトの集まりの意味である.  
シグモイド関数 (sigmoid function) は,f(x) = 1 / (1 + exp(-x))  
次元数 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 法など、軽快動作の手法登場し、 「ディープラーニング」と呼ばれる、ニューラルネットワークが誕生しました. 用途によっては、プログラムを組み立てた場合よりも、高精度を示す場合があります.  
バイアスは個々のニューロン(ユニット)が持つ値.ニューロン(ユニット)の発火のしやすさを表す値とされる.  
ハイパーパラメータは,次の 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)
ミニバッチ学習は,学習データの中から、「バッチ」あるいは「ミニバッチ」と呼ばれる少数を無作為に(ランダムに)選び出し,それを使って学習を行うこと.  
メモリクスは,モデルの性能を判定するための関数である. メトリクスは,損失関数とは違い,学習時には使用されない.
Keras では,メトリクスは,関数のリストである.そして,Keras では,任意の損失関数をメトリクスとして使うことができる.
Keras のメトリクスのページ: https://keras.io/api/losses/  
この資料で「モデル」というときは,コンピュータの中に作られたニューラルネットワークのこと.  
ニューロン(ユニット)は, 複数の入力の総和に,バイアスを足したのち,当ニューロン(ユニット)に設定された活性化関数を適用して得られた値を出力する. ニューロン(ユニット)の入力と出力の間には 重みがある. ニューロン(ユニット)の出力には,重みが掛け合わされたのちに,次のニューロン(ユニット)の入力になる.
1つのニューロン(ユニット)は,複数の入力を取ることができる.出力は1つである.これら入力と出力は,次のいずれかの条件を満たす
層構造のニューラルワークでは, バイアスは,ニューロン(ユニット)ごとに違い, 活性化関数は,同じ層(レイヤ)のニューロン(ユニット)では同じものとするのが通例.  
ニューロン(ユニット)の発火は、 所定のバイアスを超えたときに、1を出力すること.  
ラベルは,クラスの番号やクラス名など,クラスを識別できる番号や文字列などのこと.  
分類の結果として得られる数値ベクトルで,正規化されていないもの. ロジットに対しては,正規化が行われるのが普通である.
多クラスの分類では,ロジットを正規化するために ソフトマックス関数 (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)  
重みが複数あるとき,それらは重みベクトルをなす. 重みが複数あり,それら重みをそれぞれ増やしたり減らしたりする量は,重みの方向ベクトルをなす.  
重みに関する損失関数の勾配は,損失関数の値を最も減らすような重みの方向ベクトルである.  
学習は, ニューラルネットワークの重みとバイアスを修正することにより、より正しい出力が得られるように調整すること、 あるいは最適な出力が得られるように重みとバイアスを修正すること.
学習データのうち、入力を使い、 ニューラルネットワークを動かす. そして、正解の出力を使い、 損失関数の値ができるだけ小さくなるように、 オプティマイザ(最適化器)を用いて, ニューラルネットワークを構成するニューロン(ユニット)の重みとバイアスなど, ニューラルネットワークのパラメータをを最適化すること  
学習データは、ニューラルネットワークの入力と、正解の出力.
「訓練データ」などともいう.  
学習データに対して,モデルの学習の余地が残っていること.エポック数が小さすぎる,正則化が過剰である,モデルが十分に強力ではないなどの理由により発生する.  
確率的勾配降下法 (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 の値になっている.
画像全体は配列として扱うことが多い.
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])]
活性化関数 (Activation) は,ReLU (rectified linear unit), LReLU (Leaky rectified linear unit), シグモイド関数 (sigmoid function), ソフトマックス関数 (softmax function) などがある.
http://machinelearning.wustl.edu/mlpapers/paper_files/icml2010_NairH10.pdf
http://ai.stanford.edu/~amaas/papers/relu_hybrid_icml2013_final.pdf
多クラスの交差エントロピーは、
のとき、次の通り.
-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/  
Kerasのサイトで公開されているものを少し書き換えて使用。
「'10.png'」のところは,実際に使用する画像ファイル名に書き換えること.
import h5py from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.vgg16 import VGG16 from tensorflow.keras.applications.vgg16 import preprocess_input import numpy as np m = VGG16(weights='imagenet', include_top=False) img_path = '10.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)
python3 の終了は「exit()」
次のプログラムをコピー&ペースト
Kerasのサイトで公開されているものを少し書き換えて使用。
「'10.png'」のところは,実際に使用する画像ファイル名に書き換えること.
import h5py from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.inception_v3 import preprocess_input, decode_predictions, InceptionV3 import numpy as np m = InceptionV3(weights='imagenet') img_path = '10.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]))
python3 の終了は「exit()」
正規化は,次の 2つの意味がある.
x_train = x_train / / X.train.max()
参考文献: 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/
2クラスの 交差エントロピー(binary_crossentropy )を、 学習 (training)での,損失関数として使うことがある. logloss ともいう.
多クラスの 交差エントロピーを、 学習 (training)での,損失関数として使うこと. マルチクラス logloss ともいう.
Keras の categorical crossentropy を使う場合には, ラベルのデータがバイナリ配列であり、その形状が (n_sample, nb_classes) であること. 2クラスの交差エントロピーを使いたいときは、binary_crossentropy を用いる。
「多クラス」は、クラス数が3以上であること.クラス数が2の場合には「2クラス」という.  
2つ以上のクラスに分類すること. 2クラスに分類するときは binary classication という.  
畳み込みニューラルネットワーク (Convolutional Neural Network) は,
参考文献: Non-linear Convolution Filters for CNN-based Learning, arxiv: https://arxiv.org/abs/1708.07038
参考文献: A new kind of pooling layer for faster and sharper convergence, https://github.com/singlasahil14/sortpool2d
の組み合わせで構成される層構造のニューラルネットワークのこと.
例えば、次のような 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  
事前学習済みの分類のためのモデルなどを使い,新しい分類を行う.新しい分類のための学習データを十分に準備できないときに効果を期待できる.転移学習では,事前学習済みのモデルについて,重みを凍結(フリーズ)する.そして,事前学習済みのモデルに新しい層(レイヤ)を追加して,新しい分類を行えるようにする.このとき事前学習済みのモデルは,新しい分類のための特徴抽出のために使うと考えることができる  
ニューロン(ユニット)の入力が数のベクトルであるとき,そのベクトルの次元数を「入力の次元数」という.  
白色化 (whitening) とは,ニューラルネットワークの入力である数値ベクトルについて, 次のことを行う処理のこと.
転移学習において,モデル全体もしくはモデルの一部の凍結(フリーズ)を解除し,新しいデータで学習を行う.このとき,十分な量のデータを準備すること,そして,学習率を低く設定するなので,モデルの改善を行う.  
分類は,ベクトルデータから,そのクラス名(カテゴリ名)を求めるもの. 分類のために,学習データを用いて事前学習を行う.
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')
上のプログラムの実行結果は下の図の通り。
上のプログラムで作成されるモデルは、次の通り。
学習に追加に使うデータ: x_test と y_test のペア
全部で75行
入力の次元数は「4」なので、入力として一度に受け取るデータが4個(それを1行分)。
正解データ。 全部で75行
print(x_train) print(y_train)
学習のあと、別のデータを使って「予測」をさせてみる
まず予測に使いたいデータの確認
print(x_test)
予測結果の確認
m.predict(x_test)
原則,クリエイティブコモンズ BY NC SAとしている. PDFファイル,パワーポイントファイルなどには, 「クリエイティブコモンズ BY NC SA」を明記するとともに,ロゴを記載するようにしている(作業が間に合っていない分もあるのでご容赦ください).
公開している資料をご利用になる場合の,再配布の条件,剽窃の防止などについて,別ページで説明している. 再配布や資料改変の際には,そのページをご確認ください.