Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 理解深度学习模型的准确性_Python 2.7_Neural Network_Deep Learning - Fatal编程技术网

Python 2.7 理解深度学习模型的准确性

Python 2.7 理解深度学习模型的准确性,python-2.7,neural-network,deep-learning,Python 2.7,Neural Network,Deep Learning,我需要帮助理解深度学习模型的准确性和数据集输出格式 我在这个网站上进行了一些深度学习培训: 我做了pima印度糖尿病数据集和iris flower数据集的示例。我使用以下脚本对计算机进行pima印度糖尿病数据集培训: 然后我用下面的脚本训练我的计算机获取虹膜花数据集 # import package import numpy from pandas import read_csv from keras.models import Sequential from keras.layers impo

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

我在这个网站上进行了一些深度学习培训:

我做了pima印度糖尿病数据集和iris flower数据集的示例。我使用以下脚本对计算机进行pima印度糖尿病数据集培训:

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

# 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))
一切正常,直到我决定尝试此链接中的其他数据集:

首先,我使用pime indian diabetes dataset脚本的示例来训练这个新数据集,并将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),并通过对iris flower数据集进行一些修改来使用示例脚本

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”变量:

我使用字母表作为输出检查数据集,并认为也许我可以重用该脚本来训练我修改的新glass数据集

这次的结果是这样的

基线:68.42%(3.03%)

从文章中可以看出,68%和3%表示模型精度的平均值和标准偏差

我的第一个问题是何时使用整数或字母作为输出列?当我们处理数据集(比如将输出从整数更改为字符串/字母表)时,这种精度结果常见吗

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


提前谢谢。

第一个问题

没关系,正如你在这里看到的:

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]
这意味着您的分类器可以看到完全相同的标签

第二个问题

这个问题没有绝对正确的答案,但可以肯定的是,它并不依赖于您的后端

您应该尝试和实验不同数量的神经元、层数、层类型和所有其他网络参数,以了解什么是解决问题的最佳架构。 根据经验,您将培养出一种良好的直觉,即对于哪种类型的问题,哪些参数会更好,以及一种良好的实验方法

我听过的最好的经验法则(假设你拥有维持这种策略所需的数据集)是“尽可能地扩大你的网络,直到它过度拟合,添加正则化,直到它不过度拟合-重复”

  • 每一部分。首先,如果您的输出包含值​​在[0,5]中,它是 不可能使用乙状结肠激活,你可以得到。 sigmoid函数的范围为[0,1]。你可以用一个 激活=线性(无激活)。但我认为这是一个糟糕的方法,因为你的问题不是估计一个连续的值

    第二,你应该问自己的问题不是那种类型 您正在使用的数据(从存储数据的方式来看) 信息)。它是一根绳子吗?是整数吗?是浮子吗?是的 没关系,但你必须问自己在尝试什么样的问题 解决

    在这种情况下,不应将问题视为回归 (估计一个连续值)。因为您的输出是分类的, 数字,但分类。您真的想在以下两者之间进行分类: 玻璃类型:(类属性)

    当您遇到分类问题时,请执行以下配置: “通常”用于:

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

      例如:类3(0计数)和有6个类->[0,0,0,1,0,0](与类的数量相同)

    • 正如您现在看到的,我们没有单一的输出,您的模型必须与您的Y(6个类)一样输出。这样,最后一层应该 拥有和类一样多的神经元<代码>密集(类等)。

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

    • 您必须更改分类交叉熵的损失,以便它能够与softmax一起工作。并使用度量分类精度

  • 神经元的数量并不取决于您使用的后端。 但如果这是真的,你将永远不会有相同的结果。那是 因为网络中有足够多的随机过程: 初始化、退出(如果使用)、批量订单等

    我们所知道的是,每小时神经元数量的增加 使模型更加复杂,因此具有更大的开发潜力 代表您的问题,但更难学习,而且 在时间和计算上都很昂贵。你总是这样 寻求平衡

    目前没有明确的证据表明它更好:

    • 扩大每层神经元的数量
    • 添加更多层
    有些模型使用一种体系结构,而另一些则使用另一种体系结构

  • 使用此体系结构,您可以获得以下结果:

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

    两次运行之间的唯一区别是将输出从整数更改为字母吗?从你的代码来看,似乎你也改变了层的数量。我重新检查并确认,除了神经元的数量,我没有改变层的数量。您可能会看到层数之间的差异,因为我使用了两个不同的脚本。1个脚本,这是pima indian diabetes教程中的示例,输出为整数(1和0),脚本使用like 3层。ot
    Epoch 1000/1000
    214/214 [==============================] - 0s 17us/step - loss: 0.0777 - categorical_accuracy: 0.9953
    Using this architecture you get the following result: