2017-01-12 121 views
-1

我需要幫助理解深度學習模型的準確性和數據集輸出格式。瞭解深度學習模型的準確性

我做了基於本網站的深度學習一些訓練:https://machinelearningmastery.com/deep-learning-with-python2/

我做了皮馬印糖尿病的數據集,以及鳶尾花數據集的例子。我使用以下腳本訓練我的計算機用於皮馬印第安人 - 糖尿病數據集:http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/

然後我使用下面的腳本訓練我的計算機使用虹膜花數據集。

# import package 
import numpy 
from pandas import read_csv 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.wrappers.scikit_learn import KerasClassifier 
from keras.utils import np_utils 
from sklearn.model_selection import cross_val_score, KFold 
from sklearn.preprocessing import LabelEncoder 
from sklearn.pipeline import Pipeline 
from keras.callbacks import ModelCheckpoint 

# fix random seed for reproductibility 
seed = 7 
numpy.random.seed(seed) 

# load dataset 
dataframe = read_csv("iris_2.csv", header=None) 
dataset = dataframe.values 
X = dataset[:,0:4].astype(float) 
Y = dataset[:,4] 

# encode class value as integers 
encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 
### one-hot encoder ### 
dummy_y = np_utils.to_categorical(encoded_Y) 

# define base model 
def baseline_model(): 
    # create model 
    model = Sequential() 
    model.add(Dense(4, input_dim=4, init='normal', activation='relu')) 
    model.add(Dense(3, init='normal', activation='sigmoid')) 

    # Compile model 
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
    model_json = model.to_json() 
    with open("iris.json", "w") as json_file: 
     json_file.write(model_json) 

    model.save_weights('iris.h5') 

    return model 

estimator = KerasClassifier(build_fn=baseline_model, nb_epoch=1000, batch_size=6, verbose=0) 
kfold = KFold(n_splits=10, shuffle=True, random_state=seed) 
results = cross_val_score(estimator, X, dummy_y, cv=kfold) 
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) 

一切工作正常,直到我決定嘗試從這個鏈接其他數據集:https://archive.ics.uci.edu/ml/datasets/Glass+Identification

起初我使用的宗座外方傳教會印糖尿病數據集腳本的例子訓練這一新的數據集,並改變X的值和Y變量此

dataset = numpy.loadtxt("glass.csv", delimiter=",") 
X = dataset[:,0:10] 
Y = dataset[:,10] 

並且還用於神經元層,以這

model = Sequential() 
model.add(Dense(10, input_dim=10, init='uniform', activation='relu')) 
model.add(Dense(10, init='uniform', activation='relu')) 
model.add(Dense(1, init='uniform', activation='sigmoid')) 
值210

結果產生精度= 32.71%

然後,我改變這個數據集的輸出列這是最初在整數(1〜7)的字符串(A〜G),並使用實施例的腳本虹膜花數據集做一些修改,它

import numpy 
from pandas import read_csv 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.wrappers.scikit_learn import KerasClassifier 
from sklearn.model_selection import cross_val_score 
from sklearn.preprocessing import LabelEncoder 
from sklearn.model_selection import StratifiedKFold 
from sklearn.preprocessing import StandardScaler 
from sklearn.pipeline import Pipeline 

seed = 7 
numpy.random.seed(seed) 

dataframe = read_csv("glass.csv", header=None) 
dataset = dataframe.values 

X = dataset[:,0:10].astype(float) 
Y = dataset[:,10] 

encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 

def create_baseline(): 
    model = Sequential() 
    model.add(Dense(10, input_dim=10, init='normal', activation='relu')) 
    model.add(Dense(1, init='normal', activation='sigmoid')) 

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

    model_json = model.to_json() 
    with open("glass.json", "w") as json_file: 
     json_file.write(model_json) 

    model.save_weights('glass.h5') 

    return model 

estimator = KerasClassifier(build_fn=create_baseline, nb_epoch=1000, batch_size=10, verbose=0) 
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) 
results = cross_val_score(estimator, X, encoded_Y, cv=kfold) 
print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) 

我沒有用「dummy_y」變量是指本教程:http://machinelearningmastery.com/binary-classification-tutorial-with-the-keras-deep-learning-library/

我檢查,使用字母作爲輸出和想,也許我可以重複使用的數據集該腳本來訓練我修改的新玻璃數據集。

這一次的結果變成這樣

基線:68.42%(3.03%)

從文章,即68%和3%表示的平均值和模型精確度的標準偏差。

我的第一個問題是我什麼時候使用整數或字母作爲輸出列?並且當我們像數據集一樣鍛鍊時,這種精度結果很常見,就像將輸出從整數轉換爲字符串/字母表一樣?

我的第二個問題是我怎麼知道我必須爲每個圖層放置多少個神經元?它與編譯模型時使用的後端(Tensorflow還是Theano)有關?

預先感謝您。

+0

兩次運行之間的唯一區別是輸出從整數到字母的變化?從你的代碼,你似乎也改變了層數 – ginge

+0

我重新檢查,並確認我沒有改變層數,除了神經元的數量。您可能會看到層數的差異,因爲我使用了2個不同的腳本。 1腳本,這是來自pima-indian-diabetes教程的例子,輸出是整數(1和0),腳本使用像3層。另一個腳本是輸出在字符串中的虹膜花教程的例子。該腳本使用2層。 – Ling

+0

正如我理解你的問題,在你的第三個代碼片段中,你創建了一個具有3層的Sequential模型,其中你有32.71%的準確性。在你的第四個片段中,你使用了2層的Sequential模型,你的準確率達到了68.42%。這是真的還是在片段之間缺少某些東西? – ginge

回答

0

第一個問題

沒關係,你可以在這裏看到:

Y = range(10) 
encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 
print encoded_Y 

Y = ['a', 'b', 'c', 'd', 'e', 'f','g','h','i','j'] 
encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 
print encoded_Y 

結果:

[0 1 2 3 4 5 6 7 8 9] 
[0 1 2 3 4 5 6 7 8 9] 

這意味着你的分類看到完全一樣的標籤。

第二個問題

沒有針對此問題沒有絕對正確的答案,但可以肯定它不依賴於後端。

您應該嘗試使用不同數量的神經元,層數,圖層類型和所有其他網絡參數進行實驗,以瞭解什麼是最適合您問題的體系結構。 憑藉豐富的經驗,您將發展出一種良好的直覺,就什麼樣的參數更適合哪種類型的問題以及實驗的好方法而言。

最好的經驗法則(假設你有維持這樣的策略所需的數據集)我聽說過「讓你的網絡儘可能大,直到它過度配合,增加正規化,直到它不過度 - 重複」 。