MNISTデータセットを分類するために、Kerasでいくつかのネットワークアーキテクチャをテストしていました。 LeNetに似たものを実装しました。
私がインターネットで見つけた例では、データの正規化のステップがあるようです。例えば:
X_train /= 255
この正規化なしでテストを実行しましたが、ネットワークのパフォーマンス(精度)が低下しているようです(同じエポック数を維持しています)。なぜこれが起こったのですか?
エポックの数を増やすと、正規化でトレーニングされたモデルが到達するのと同じレベルに精度を到達できますか?
それで、正規化は精度に影響するのか、それともトレーニング速度にのみ影響するのか?
トレーニングスクリプトの完全なソースコードは次のとおりです。
from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
from keras.datasets import mnist
from keras.utils import np_utils
from keras.optimizers import SGD, RMSprop, Adam
import numpy as np
import matplotlib.pyplot as plt
from keras import backend as k
def build(input_shape, classes):
model = Sequential()
model.add(Conv2D(20, kernel_size=5, padding="same",activation='relu',input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(50, kernel_size=5, padding="same", activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(500))
model.add(Activation("relu"))
model.add(Dense(classes))
model.add(Activation("softmax"))
return model
NB_Epoch = 4 # number of epochs
BATCH_SIZE = 128 # size of the batch
VERBOSE = 1 # set the training phase as verbose
OPTIMIZER = Adam() # optimizer
VALIDATION_SPLIT=0.2 # percentage of the training data used for
evaluating the loss function
IMG_ROWS, IMG_COLS = 28, 28 # input image dimensions
NB_CLASSES = 10 # number of outputs = number of digits
INPUT_SHAPE = (1, IMG_ROWS, IMG_COLS) # shape of the input
(X_train, y_train), (X_test, y_test) = mnist.load_data()
k.set_image_dim_ordering("th")
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
X_train = X_train[:, np.newaxis, :, :]
X_test = X_test[:, np.newaxis, :, :]
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')
y_train = np_utils.to_categorical(y_train, NB_CLASSES)
y_test = np_utils.to_categorical(y_test, NB_CLASSES)
model = build(input_shape=INPUT_SHAPE, classes=NB_CLASSES)
model.compile(loss="categorical_crossentropy",
optimizer=OPTIMIZER,metrics=["accuracy"])
history = model.fit(X_train, y_train, batch_size=BATCH_SIZE, epochs=NB_Epoch, verbose=VERBOSE, validation_split=VALIDATION_SPLIT)
model.save("model2")
score = model.evaluate(X_test, y_test, verbose=VERBOSE)
print('Test accuracy:', score[1])
正規化は、ディープラーニングまたはKerasだけに限定されない一般的な概念です。
正規化する理由
理解しやすく、正規化を説明する簡単なロジスティック回帰の例を取り上げます。顧客に融資を与えるべきかどうかを予測しようとしていると仮定します。利用可能な多くの独立変数の中で、Age
とIncome
だけを考慮できます。方程式を次の形式にします。
Y = weight_1 * (Age) + weight_2 * (Income) + some_constant
説明のために、Age
の範囲を通常[0,120]とし、Income
の範囲を[10000、100000]と仮定します。 Age
とIncome
のスケールは非常に異なります。それらをそのまま考慮した場合、_weight_1
およびweight_2
には、偏った重みを割り当てることができます。 weight_2
は、機能としてIncome
にweight_1
はAge
に重要性をもたらします。それらを共通のレベルにスケーリングするために、それらを正規化できます。たとえば、[0,1]の範囲のすべての年齢と[0,1]の範囲のすべての収入をもたらすことができます。これで、Age
とIncome
に同じ重要度が機能として与えられたと言えます。
正規化は常に精度を向上させますか?
明らかに、いいえ。正規化によって常に精度が向上する必要はありません。実装するかどうかは分からないかもしれません。繰り返しますが、トレーニングのどの段階で正規化を適用するか、すべてのアクティベーション後に正規化を適用するかどうかなどによって異なります。
正規化によりフィーチャの値の範囲が特定の範囲に絞り込まれると、より小さな値の範囲で計算を実行しやすくなります。そのため、通常、モデルは少し速くトレーニングされます。
エポックの数に関しては、通常、モデルが過剰適合を開始しない限り、エポックの数とともに精度が向上します。
正規化/標準化と関連用語の非常に良い説明は、 ここ です。
簡単に言えば、正規化により、ネットワークが解決しようとしている問題の複雑さが軽減されます。これにより、モデルの精度が向上し、トレーニングがスピードアップする可能性があります。同じスケールでデータを取得し、差異を減らします。ネットワーク内の重みは、正規化の実行に無駄になりません。つまり、実際のタスクをより効率的に解決するために使用できます。