kerasv1.2.2与kerasv2+的奇怪行为(精确度上的巨大差异)

2024-06-24 12:01:46 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我遇到了一些非常奇怪的行为。当我尝试用一个简单的模型在iris数据集上进行分类时,keras版本1.2.2给了我+-95%的准确率,而keras版本2.0+为每个训练示例预测相同的类(导致+-35%的准确率,因为有三种类型的iris)。唯一能让我的模型预测准确率达到+-95%的是将keras降级到2.0以下的版本:

我觉得这是凯拉斯的问题,因为我试过以下几件事,都没什么区别

  • 最后一层的开关激活功能(从Sigmoid到softmax)。你知道吗
  • 交换后端(Theano和Tensorflow都提供大致相同的性能)。你知道吗
  • 使用随机种子。你知道吗
  • 改变隐藏层中神经元的数量(在这个简单模型中我只有一个隐藏层)。你知道吗
  • 开关损耗函数。你知道吗

因为模型非常简单,而且它自己运行(您只需要简单的虹膜.csv数据集)我决定包含整个代码

import pandas as pd
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
from sklearn.model_selection import KFold
from sklearn.preprocessing import LabelEncoder

#Load data
data_frame = pd.read_csv("iris.csv", header=None)
data_set = data_frame.values
X = data_set[:, 0:4].astype(float)
Y = data_set[:, 4]

#Encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)

# convert integers to dummy variables (i.e. one hot encoded)
dummy_y = np_utils.to_categorical(encoded_Y)

def baseline_model():
    #Create & Compile model
    model = Sequential()
    model.add(Dense(8, input_dim=4, init='normal', activation='relu'))
    model.add(Dense(3, init='normal', activation='sigmoid'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

#Create Wrapper For Neural Network Model For Use in scikit-learn
estimator = KerasClassifier(build_fn=baseline_model, nb_epoch=200, batch_size=5, verbose=0)

#Create kfolds-cross validation
kfold = KFold(n_splits=10, shuffle=True)

#Evaluate our model (Estimator) on dataset (X and dummy_y) using a 10-fold cross-validation procedure (kfold).
results = cross_val_score(estimator, X, dummy_y, cv=kfold)
print("Accuracy: {:2f}% ({:2f}%)".format(results.mean()*100, results.std()*100))

如果有人想复制这个错误,下面是我用来观察问题的依赖项:

numpy=1.16.4
pandas=0.25.0
sk-learn=0.21.2
theano=1.0.4
tensorflow=1.14.0

Tags: csvfrom模型import版本irisdatamodel
2条回答

在keras2.0中,许多参数改变了名称,有一个兼容层来保持工作,但是在使用KerasClassifier时,它并不适用。你知道吗

在本部分代码中:

estimator = KerasClassifier(build_fn=baseline_model, nb_epoch=200, batch_size=5, verbose=0)

您使用的是旧名称nb_epoch,而不是现代名称epochs。默认值是epochs=1,这意味着您的模型只针对一个历元进行了训练,产生的预测质量非常低。你知道吗

还要注意的是:

model.add(Dense(3, init='normal', activation='sigmoid'))

您应该使用softmax激活而不是sigmoid,因为您使用的是分类交叉熵损失:

model.add(Dense(3, init='normal', activation='softmax'))

我已经设法隔离了这个问题,如果你把nb_epoch改成epochs(其他条件完全相同),那么这个模型在keras2中也预测得很好。我不知道这是故意的行为还是一个错误。你知道吗

相关问题 更多 >