我需要幫助理解深度學習模型的準確性和數據集輸出格式。瞭解深度學習模型的準確性
我做了基於本網站的深度學習一些訓練: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)有關?
預先感謝您。
兩次運行之間的唯一區別是輸出從整數到字母的變化?從你的代碼,你似乎也改變了層數 – ginge
我重新檢查,並確認我沒有改變層數,除了神經元的數量。您可能會看到層數的差異,因爲我使用了2個不同的腳本。 1腳本,這是來自pima-indian-diabetes教程的例子,輸出是整數(1和0),腳本使用像3層。另一個腳本是輸出在字符串中的虹膜花教程的例子。該腳本使用2層。 – Ling
正如我理解你的問題,在你的第三個代碼片段中,你創建了一個具有3層的Sequential模型,其中你有32.71%的準確性。在你的第四個片段中,你使用了2層的Sequential模型,你的準確率達到了68.42%。這是真的還是在片段之間缺少某些東西? – ginge