2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

「れロから䜜るDeep Learning」自習メモその TensorFlowの初心者向けチュヌトリアル

2
Last updated at Posted at 2020-11-11

「れロから䜜るDeep Learning」(æ–Žè—€ 康毅 著 オラむリヌ・ゞャパン刊)を読んでいる時に、参照したサむト等をメモしおいきたす。 その← →その

Google Colab がふ぀うに䜿えるので、この本の内容を TensorFlow でやっおみるこずにしたす。

TensorFlow の初心者向けチュヌトリアル

TensorFlow のサむト https://www.tensorflow.org/?hl=ja の初心者向けチュヌトリアル「はじめおのニュヌラルネットワヌク」をそのたた動かしお芋たした。

ほんずに、そのたんた Colab にコピペすれば動くので、特にメモするこずもありたせん。
しかし、動くこずを確認させるためのものなので、内容に぀いおの説明はたったくありたせん。必芁な説明はサむト内のあちこちにあるようですが、初心者はチュヌトリアルをやったあず、自分が今䜕をしたのか、次に䜕をすればよいかがわからず、迷子になっおしたいそうです。

ず蚀うか、

おそらくこのサむトはたったくの初心者向けではなく、pythonやニュヌラルネットに぀いおある皋床知っおいる人が、Google Colab でTensorFlow を䜿えるようにするためのサむトなんだろうず思いたす。実際問題、ニュヌラルネットワヌクそのものに぀いおの解説が芋圓たらないし。

そういう点では、「れロから䜜るDeep Learning」のように、順番に説明を積み䞊げおいく曞籍は必芁なんだず思いたした。

で

このチュヌトリアルで実行したスクリプトを、「れロから䜜るDeep Learning」の内容ず照らし合わせお、keras および TensorFlow が䜕をしおいるかを調べおいこうず思いたす。

モデルの構築

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

ここでは、keras のシヌケンシャルモデルを構築しおいたす。

type(model)

tensorflow.python.keras.engine.sequential.Sequential

model.summary()

Model: "sequential"
Layer (type)       Output Shape       Param #


flatten (Flatten)      (None, 784)       0
dense (Dense)       (None, 128)      100480
dense_1 (Dense)      (None, 10)      1290


Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0

入力局からのoutput( , 784)は
次のdense局で (784, 128) の重みずドット積され、( , 128)をoutputする
それを次のdense-1局で(128, 10)の重みずドット積し、( , 10)をoutputしおいる。

model.layers

[tensorflow.python.keras.layers.core.Flatten at 0x7faf1e9efac8,
tensorflow.python.keras.layers.core.Dense at 0x7faeea73b438,
tensorflow.python.keras.layers.core.Dense at 0x7faeea73b710]

モゞュヌル tensorflow.python.keras.engine.sequential.py で定矩しおあるSequentialクラスでモデルを構築。
最初の局は入力局で、「(28×28ピクセルの2次元配列から、28×28784ピクセルの、1次元配列に倉換」しおいるだけのようです。

ピクセルが次元化されたあず、ネットワヌクは2぀の tf.keras.layers.Dense 局ずなりたす。これらの局は、密結合あるいは党結合されたニュヌロンの局ずなりたす。最初の Dense 局には、128個のノヌドあるはニュヌロンがありたす。最埌の局でもある2番めの局は、10ノヌドのsoftmax局です。この局は、合蚈が1になる10個の確率の配列を返したす。それぞれのノヌドは、今芋おいる画像が10個のクラスのひず぀ひず぀に属する確率を出力したす。

ず蚀う事なので、曞籍「れロから䜜るDeep Learning」のP113 から説明されおいる 2 局ニュヌラルネットワヌククラス TwoLayerNet に盞圓するようです。
ただ、TwoLayerNet クラスの掻性化関数はsigmoid関数でしたが、このkeras のシヌケンシャルモデルではRelu関数を指定しおいたす。

Dense 「密集した、( で)密集しお、密床が高い」ずいう意味から、党結合局のこずのようです。

「れロから䜜るDeep Learning」P205
隣接する局のすべおのニュヌロン間で結合がありたした。これを党結合fully-connectedず呌び、私たちは党結合局をAffine レむダずいう名前で実装したした。

に盞圓するようです。

denseのパラメヌタ

units, 出力の次元数
activation=None, 䜿甚する掻性化関数未指定なら掻性化関数は䜿甚しない
use_bias=True, バむアスを䜿甚するかどうか
kernel_initializer='glorot_uniform', 重みの初期倀
bias_initializer='zeros', バむアスの初期倀
kernel_regularizer=None, 重み行列に適甚される正則化関数
bias_regularizer=None, バむアスに適甚される正則化関数
activity_regularizer=None, レむダヌの出力アクティベヌションに適甚される正則化関数
kernel_constraint=None, 制玄関数
bias_constraint=None, 制玄関数
**kwargs

掻性化関数

softmax
elu
selu
softplus
softsign
relu
tanh
sigmoid
hard_sigmoid
linear

半分くらいは「れロから䜜るDeep Learning」に説明があったものです。linear はP66の恒等関数のこず。

重みの初期倀

glorot_uniform デフォルト倀
Glorot の䞀様分垃Xavier の䞀様分垃による初期化を返したす

Keras Documentationより
これは limit を sqrt(6 / (fan_in + fan_out)) ずしたずき [limit, -limit] を範囲ずする䞀様分垃ず同じです ここで fan_in は入力ナニット数fant_out は出力ナニット数です

glorot_normal
Glorot の正芏分垃Xavier の正芏分垃ずによる初期化を返したす
「れロから䜜るDeep Learning」p182の「Xavier の初期倀」
前局のノヌドの数がn 個の堎合、$\frac{1}{\sqrt n}$ を暙準偏差ずするガりス分垃

he_normal
He の正芏分垃による初期化を返したす
「れロから䜜るDeep Learning」p184の「He の初期倀」
前局のノヌドの数がn 個の堎合、$\sqrt\frac{2}{n}$ を暙準偏差ずするガりス分垃

random_normal
正芏分垃に埓っお重みを初期化。
文字列で指定するず mean=0.0, stddev=0.05, seed=None の蚭定(暙準偏差が0.05のガりス分垃)で初期化する。
パラメヌタを蚭定したい堎合は以䞋のように、関数で指定する。
keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)

「れロから䜜るDeep Learning」P184
sigmoid 関数やtanh 関数は巊右察称で䞭倮付近が線圢関数ずしお芋なせるので、
「Xavier の初期倀」が適しおいたす。䞀方、ReLU を甚いる堎合は、ReLU に特化し
た初期倀を甚いるこずが掚奚されおいたす。それは、Kaiming He らが掚奚する初期
倀――その名も「He の初期倀」です。

model.compileメ゜ッドで指定できるパラメヌタ

model.compile(optimizer='adam', 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

モデルのコンパむルでは、オプティマむザにadam、損倱関数に sparse_categorical_crossentropy を指定しおいたす。

optimizer='rmsprop', 最適化 デフォルトは rmsprop
loss=None,  損倱関数 
metrics=None, 評䟡関数
loss_weights=None,
weighted_metrics=None,
run_eagerly=None,
**kwargs

最適化 optimizer

SGD
RMSprop
Adagrad
Adadelta
Adam
Adamax
Nadam
TFOptimizer

損倱関数 loss

mean_squared_error
mean_absolute_error
mean_absolute_percentage_error
mean_squared_logarithmic_error
squared_hinge
hinge
categorical_hinge
logcosh
categorical_crossentropy
sparse_categorical_crossentropy
binary_crossentropy
kullback_leibler_divergence
poisson
cosine_proximity

meanは回垰問題で䜿う損倱関数
crossentropyは分類問題で䜿う損倱関数で、「れロから䜜るDeep Learning」P89で説明しおいたす。
正解ラベルがone-hot 衚珟のずきはcategorical_crossentropyを䜿い、
敎数の目的倀のずきはsparse_categorical_crossentropyを䜿うようです。
binary_crossentropy 二倀亀差゚ントロピヌ 1出力ずしその出力 y∈[0,1]の倀が1/2 より倧きいか吊かでクラス刀定をする。

評䟡関数 metrics

compileメ゜ッドに曞いおあるコメントによるず、

通垞、 metrics = ['accuracy']を䜿甚したす。

ずいうこずです。たた、

文字列「accuracy」たたは「acc」を枡すず、
䜿甚した損倱関数ずモデルの出力圢状に基づいお、これを tf.keras.metrics.BinaryAccuracy、
tf.keras.metrics.CategoricalAccuracy、 tf.keras.metrics.SparseCategoricalAccuracy
のいずれかに倉換したす。

ずいうこずです。

他に、metrics = ['mae'] ずいう指定もできるようですが、これは回垰問題甚で平均絶察誀差(Mean Absolute Error)を求めるもののようです。
たた、ここに損倱関数の名前を指定しおも、それに合わせお適切な評䟡関数に倉換しおくれるようです。

で

文字列「accuracy」を tf.keras.metrics.SparseCategoricalAccuracyのいずれかに倉換したす。

ずあるように、本圓は関数そのものを指定するずころに、文字列識別子で指定すれば倉換しおくれる、ずいうこずになっおいるようです。これは最適化や損倱関数でも同じです。文字列で指定すれば分かりやすいし、間違うこずも少なくなるず思いたすが、パラメヌタがデフォルト倀になっおしたいたす。

たずえば、optimizer で 'adam' を指定した堎合モゞュヌル tensorflow.python.keras.optimizer_v2.adam.py のクラス Adam を呌び出しおたすが、以䞋のパラメヌタがデフォルトで蚭定されおいたす。
learning_rate=0.001,
beta_1=0.9,
beta_2=0.999,

「れロから䜜るDeep Learning」P175
Adam は3 ぀のハむパヌパラメヌタを蚭定したす。ひず぀は、これたでの孊習係数論文ではαずしお登堎。埌の2 ぀は、䞀次モヌメント甚の係数β1 ず二次モヌメント甚の係数β2 です。論文によるず、暙準の蚭定倀は、β1 は0.9、β2 は0.999 であり、その蚭定倀であれば、倚くの堎合うたくいくようです。

ずいうこずなので、デフォ倀で問題ないようですが、これを倉曎したい堎合は関数を盎接指定しないずいけなくなりたす。

model.compile(optimizer=keras.optimizers.Adam(0.001, 0.9, 0.999), 
              loss=keras.losses.SparseCategoricalCrossentropy(),
              metrics=[keras.metrics.SparseCategoricalAccuracy()])

モデルの蚓緎

model.fit(train_images, train_labels, epochs=5)

model.fit メ゜ッドで蚓緎孊習をしたす。蚓緎デヌタの画像ずラベルを指定しおたす。
epochs ゚ポック数をず指定しおいたす。回孊習を繰り返す、ずいうこずで、実際に実行するず、以䞋のように行の実行結果が衚瀺されたす。

Epoch 1/5
1875/1875 [==============================] - 2s 1ms/step - loss: 1.5450 - accuracy: 0.6806
Epoch 2/5
1875/1875 [==============================] - 2s 1ms/step - loss: 0.7987 - accuracy: 0.8338
Epoch 3/5
1875/1875 [==============================] - 2s 1ms/step - loss: 0.5804 - accuracy: 0.8666
Epoch 4/5
1875/1875 [==============================] - 2s 1ms/step - loss: 0.4854 - accuracy: 0.8804
Epoch 5/5
1875/1875 [==============================] - 2s 1ms/step - loss: 0.4319 - accuracy: 0.8893
tensorflow.python.keras.callbacks.History at 0x7fd89467f550

fitメ゜ッドのパラメヌタには、以䞋のものがありたす
x=None, 蚓緎デヌタ画像
y=None, 蚓緎デヌタラベル
batch_size=None, バッチサむズ 床のバッチで凊理するデヌタ数 デフォルトは32
epochs=1, 孊習の回数
verbose=1, ログ出力の指定 0:出力しない 1、2:出力する
callbacks=None,
validation_split=0.,
validation_data=None,
shuffle=True,
class_weight=None,
sample_weight=None,
initial_epoch=0,
steps_per_epoch=None,
validation_steps=None,
validation_batch_size=None,
validation_freq=1,
max_queue_size=10,
workers=1,
use_multiprocessing=False

蚓緎デヌタが60000件、バッチサむズのデフォルトが32件なので、
iter_per_epoch むテレヌション数 は 60000 ÷ 32 = 1875
1回の゚ポックで 1875個のバッチ凊理孊習をするずすべおの蚓緎デヌタを芋たずいうこずになりたす。
これを回繰り返しおいたす。

正解率の評䟡

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

print('\nTest accuracy:', test_acc)

313/313 - 0s - loss: 0.3390 - accuracy: 0.8781
Test accuracy: 0.8780999779701233

model.evaluateメ゜ッドのパラメヌタ

x=None, テストデヌタ画像
y=None, テストデヌタラベル
batch_size=None, バッチサむズ デフォルトは32
verbose=1, ログ出力の指定 0:出力しない 1、2:出力する
sample_weight=None,
steps=None,
callbacks=None,
max_queue_size=10,
workers=1,
use_multiprocessing=False,
return_dict=False

孊習したモデルで、テストデヌタの損倱倀ず正解率を返す

TensorFlowのサむトでは、パラメヌタにどういうものがあるか、よくわからないので、こちらのサむトを参考にしたした。説明はいたひず぀足りたせんが、䜕を指定できるかがわかりたす。
→Keras Documentation 、Keras API ref

 その← →その
メモの目次等はこちらから 読めない甚語集

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?