Python 2.7 理解深度学习模型的准确性
我需要帮助理解深度学习模型的准确性和数据集输出格式 我在这个网站上进行了一些深度学习培训: 我做了pima印度糖尿病数据集和iris flower数据集的示例。我使用以下脚本对计算机进行pima印度糖尿病数据集培训: 然后我用下面的脚本训练我的计算机获取虹膜花数据集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
# 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的向量和对应类中的一个向量 例如:类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: