了解深度学习模型准确性

时间:2017-01-12 03:09:43

标签: python-2.7 neural-network deep-learning

我需要帮助理解深度学习模型的准确性和数据集输出格式。

我根据此网站进行了一些深度学习培训:tweepy

我做了皮马 - 印度 - 糖尿病数据集和虹膜花数据集的例子。我使用以下脚本训练我的计算机用于皮肤印第安人 - 糖尿病数据集:https://machinelearningmastery.com/deep-learning-with-python2/

然后我使用下面的脚本训练我的计算机获取虹膜花数据集。

# 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))

在我决定尝试使用此链接中的其他数据集之前,一切正常:http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/

首先,我使用pime-indian-diabetess数据集脚本示例训练这个新数据集,并将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'))

结果产生准确度= 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'变量参考本教程:https://archive.ics.uci.edu/ml/datasets/Glass+Identification

我检查数据集是否使用字母作为输出,并认为我可以重复使用该脚本来训练我修改的新玻璃数据集。

这次结果变得像这样

基线:68.42%(3.03%)

从文章中,68%和3%表示模型准确度的均值和标准差。

我的第一个问题是我何时使用整数或字母作为输出列?当我们使用数据集进行调整时,例如将输出从整数更改为字符串/字母表,这种精确度结果是否常见?

我的第二个问题是我怎么知道每层需要放多少神经元?它与我在编译模型时使用的后端(Tensorflow或Theano)有关吗?

提前谢谢。

2 个答案:

答案 0 :(得分: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]

这意味着您的分类器会看到完全相同的标签。

第二个问题

这个问题没有绝对正确的答案,但肯定不依赖于你的后端。

您应该尝试尝试不同数量的神经元,层数,层类型和所有其他网络参数,以便了解问题的最佳架构。 根据经验,您将获得良好的直觉,以及哪种参数更适合哪种类型的问题以及实验的良好方法。

最好的经验法则(假设您拥有维持此类策略所需的数据集)我已经听说过#34;让您的网络尽可能大,直到它过度适应,添加正规化直到它没有过度 - 重复"。

答案 1 :(得分:0)

  1. 每部分。首先,如果您的输出包含[0,5]的值,则为 使用S形激活不可能获得这一点。 S形函数的范围为[0,1]。您可以使用 激活=线性(不激活)。但是我认为这是一种不好的方法,因为您的问题不是估计连续值。

    第二,您应该问自己的问题不是类型 您正在使用的数据(就如何存储 信息)。是字符串吗?是int吗?是浮标吗?确实 没关系,但是您必须问自己正在尝试哪种问题 解决。

    在这种情况下,不应将问题视为回归 (估计一个连续值)。由于您的输出是分类的, 数字,但绝对。您确实要在以下两个方面进行分类: 玻璃类型:(类属性)。

    进行分类问题时,以下配置为 “通常”使用:

    • 该类通过一键编码进行编码。它不过是一个0的向量和对应类中的一个。

      例如:3类(0个计数)并有6个类-> [0,0,0,1,0,0](与您所拥有的类一样多的零)。

    • 正如您现在看到的,我们没有单个输出,您的模型必须与Y(6个类)一样作为输出。这样最后一层应该 具有与类一样多的神经元。 Dense (classes, ...).

    • 您还对以下事实感兴趣:输出是属于每个类别的概率,即:p(y = class_0), ... p(y_class_n)。为此,使用了 softmax激活层, 这是为了确保所有概率的总和为1。

    • 您必须更改 categorical_crossentropy 的损耗,以便它可以与softmax一起使用。并使用指标categorical_accuracy。

    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)
    from keras.utils import to_categorical
    encoded_Y = to_categorical(encoder.transform(Y))
    
    
    def create_baseline():
        model = Sequential()
        model.add(Dense(10, input_dim=10, init='normal', activation='relu'))
        model.add(Dense(encoded_Y.shape[1], init='normal', activation='softmax'))
    
        model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_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
    model = create_baseline()
    model.fit(X, encoded_Y, epochs=1000, batch_size=100)
    
  2. 神经元的数量不取决于您使用的后端。 但是,如果确实如此,您将永远不会获得相同的结果。那是 因为网络中有足够的随机过程: 初始化,退出(如果使用),批处理订单等。

    已知的是,增加每个致密神经元的数量 使模型更加复杂,因此具有更大的潜力 代表您的问题,但更难学且更多 时间和计算上都很昂贵。这样你总是有 寻找平衡。

    目前尚无明显证据表明它更好:

    • 扩展每层神经元的数量。
    • 添加更多层。

    有些模型使用一种架构,而另一种使用另一种架构。

使用此架构,您将得到以下结果:

Epoch 1000/1000
214/214 [==============================] - 0s 17us/step - loss: 0.0777 - categorical_accuracy: 0.9953
Using this architecture you get the following result:
相关问题