web-dev-qa-db-ja.com

KerasのDenseメソッドでレイヤーのサイズを決定する方法は?

以下は、IRISデータを使用したマルチクラス分類タスクの簡単な例です。

import seaborn as sns
import numpy as np
from sklearn.cross_validation import train_test_split
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.regularizers import l2
from keras.utils import np_utils


#np.random.seed(1335)

# Prepare data
iris = sns.load_dataset("iris")
iris.head()
X = iris.values[:, 0:4]
y = iris.values[:, 4]


# Make test and train set
train_X, test_X, train_y, test_y = train_test_split(X, y, train_size=0.5, random_state=0)


################################
# Evaluate Keras Neural Network
################################


# Make ONE-HOT
def one_hot_encode_object_array(arr):
    '''One hot encode a numpy array of objects (e.g. strings)'''
    uniques, ids = np.unique(arr, return_inverse=True)
    return np_utils.to_categorical(ids, len(uniques))

train_y_ohe = one_hot_encode_object_array(train_y)
test_y_ohe = one_hot_encode_object_array(test_y)


model = Sequential()
model.add(Dense(16, input_shape=(4,),
      activation="tanh",
      W_regularizer=l2(0.001)))
model.add(Dropout(0.5))
model.add(Dense(3, activation='sigmoid'))
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')


# Actual modelling
# If you increase the Epoch the accuracy will increase until it drop at
# certain point. Epoch 50 accuracy 0.99, and after that drop to 0.977, with
# Epoch 70 
hist = model.fit(train_X, train_y_ohe, verbose=0,   nb_Epoch=100,  batch_size=1)


score, accuracy = model.evaluate(test_X, test_y_ohe, batch_size=16, verbose=0)
print("Test fraction correct (NN-Score) = {:.2f}".format(score))
print("Test fraction correct (NN-Accuracy) = {:.2f}".format(accuracy))

私の質問は、人々は通常どのようにレイヤーのサイズを決定するのですか?たとえば、上記のコードに基づくと、次のようになります。

model.add(Dense(16, input_shape=(4,),
      activation="tanh",
      W_regularizer=l2(0.001)))
model.add(Dense(3, activation='sigmoid'))

ここで、Denseの最初のパラメーターは16で、2番目のパラメーターは3です。

  • 2つのレイヤーがDenseに2つの異なる値を使用するのはなぜですか?
  • Denseの最良の値をどのように選択しますか?
10
neversaint

基本的には試行錯誤です。これらはハイパーパラメータと呼ばれ、検証セットで調整する必要があります(元のデータからトレイン/検証/テストに分割)。

チューニングとは、パラメーターのさまざまな組み合わせを試し、問題に応じて、検証セットで損失値が最も低いか、精度が高いパラメーターを維持することを意味します。

2つの基本的な方法があります。

  • グリッド検索:パラメーターごとに、範囲を決定し、2の累乗(8、16、32、64)で8〜64ニューロンなどのその範囲にステップインし、パラメーターの各組み合わせを試してください。これは明らかに、指数関数的な数のモデルをトレーニングおよびテストする必要があり、多くの時間がかかります。

  • ランダム検索:同じことを行いますが、各パラメーターの範囲を定義し、各範囲の一様分布から抽出されたパラメーターのランダムなセットを試してください。可能な限り、必要な数のパラメータセットを試すことができます。これは、情報に基づいたランダムな推測です。

残念ながら、そのようなパラメータを調整する他の方法はありません。ニューロンの数が異なるレイヤーについては、チューニングプロセスから発生する可能性があります。または、前のレイヤーの圧縮バージョンのように、次元削減として見ることもできます。

10

入力または出力の数を評価する適切なネットワーク構造を決定する既知の方法はありません。基本的に、トレーニングの例の数、バッチサイズ、エポックの数に依存します。通信網。

さらに、ユニットの数が多いと、勾配の過剰適合や爆発の問題などの問題が発生する可能性があります。一方、ユニット数が少ないと、モデルのバイアス値が高くなり、精度値が低くなる可能性があります。繰り返しになりますが、トレーニングに使用されるデータのサイズによって異なります。

悲しいことに、それはあなたに最良の調整を与えるいくつかの異なる値を試しています。前の投稿で述べたように、損失と検証損失の値が最小になり、データセットの精度が最高になる組み合わせを選択できます。

ユニット数の値に比例して、次のようにすることができます。

# Build the model
model = Sequential()
model.add(Dense(num_classes * 8, input_shape=(shape_value,),  activation = 'relu' )) 
model.add(Dropout(0.5))

model.add(Dense(num_classes * 4, activation = 'relu'))
model.add(Dropout(0.2))

model.add(Dense(num_classes * 2, activation = 'relu'))
model.add(Dropout(0.2))

#Output layer
model.add(Dense(num_classes, activation = 'softmax'))

上記のモデルは、分類AIシステムの例を示しています。 num_classesは、システムが選択する必要のあるさまざまなカテゴリの数です。たとえば、Kerasのアイリスデータセットには次のものがあります。

  • アイリスセトサ
  • アイリスバーシカラー
  • アイリスバージニカ

num_classes =

ただし、これは他のランダム値よりも悪い結果につながる可能性があります。いくつかの異なる試行を行ってトレーニングデータセットに合わせてパラメーターを調整し、結果を分析してパラメーターの最適な組み合わせを探す必要があります。

2
Joel Carneiro