2017-01-12 132 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] 

这意味着你的分类看到完全一样的标签。

第二个问题

没有针对此问题没有绝对正确的答案,但可以肯定它不依赖于后端。

您应该尝试使用不同数量的神经元,层数,图层类型和所有其他网络参数进行实验,以了解什么是最适合您问题的体系结构。 凭借丰富的经验,您将发展出一种良好的直觉,就什么样的参数更适合哪种类型的问题以及实验的好方法而言。

最好的经验法则(假设你有维持这样的策略所需的数据集)我听说过“让你的网络尽可能大,直到它过度配合,增加正规化,直到它不过度 - 重复” 。