2016-04-30 71 views
3

下面是使用IRIS數據的多級分類任務的簡單示例。如何確定Keras密集方法中圖層的大小?

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和第二是3

  • 爲什麼兩個層使用兩個不同的值密集?
  • 我們如何選擇密集的最佳價值?

回答

3

基本上它只是反覆試驗而已。這些被稱爲超參數,應該在驗證集上進行調整(從原始數據拆分爲火車/驗證/測試)。

調整隻是意味着嘗試不同的參數組合,並根據問題在驗證集上保留具有最低損失值或更高精度的參數。

有兩種基本方法:

  • 網格搜索:對於每個參數,決定的範圍和步驟進入該範圍,如8至64個神經細胞,在兩個(8,16,32驅動, 64),並嘗試每個參數的組合。這顯然需要指數數量的模型進行培訓和測試,並需要大量的時間。

  • 隨機搜索:做同樣的事情,但只是爲每個參數定義一個範圍,然後嘗試隨機設置一組參數,從每個範圍的均勻分佈中繪製。你可以嘗試儘可能多的參數設置,因爲你可以多久。這只是一個明智的隨機猜測。

不幸的是,沒有其他的方法來調整這些參數。關於具有不同數量的神經元的圖層,可能來自調整過程,或者您也可以將其視爲降低維度,如前一圖層的壓縮版本。