我需要帮助理解深度学习模型的准确性和数据集输出格式。了解深度学习模型的准确性
我做了基于本网站的深度学习一些训练: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