使用相同的种子,代码和数据集,在不同计算机上具有不同的精度

时间:2019-04-22 19:57:44

标签: python tensorflow machine-learning keras conv-neural-network

我正在尝试开发一种用于签名识别的CNN,以识别给定签名属于哪个人。有3个不同的类别(人),每个类别有23个签名。有了这么少的样本,我决定使用Keras ImageDataGenerator来创建其他图像。

但是,在评估测试数据上的模型时,在不同的机器(Windows 10和Mac OS)上测试CNN会得出不同的准确性得分。在Windows上为100%,在Mac OS上为93%。两台机器都运行python 3.7.3 64位。

使用train_test_split中的sklearn.model_selection对数据进行拆分,其中0.8用于训练,0.2用于测试,random_state为1。数据和标签已正确归一化并调整为适合CNN。已尝试使用steps_per_epochbatch_sizeepoch的各种数字。

我尝试同时使用np.random.seedtensorflow.set_random_seed,使用PC上的seed(1)在测试数据上产生100%的准确性,但是另一台机器上的相同种子仍然产生不同的准确性得分了。

此处是CNN体系结构以及用于创建其他图像的方法调用。以下代码在一台机器上产生100%的精度,而在另一台机器上产生93.33%的精度。

seed(185)
set_random_seed(185)
X_train, X_test, y_train, y_test = train_test_split(data, labels, train_size=0.8, test_size=0.2, random_state=1)

datagen = ImageDataGenerator()

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

model.fit_generator(datagen.flow(X_train, y_train, batch_size=64), validation_data=(X_test,y_test),steps_per_epoch= 30, epochs=10)

model.evaluate(X_test, y_test)

编辑 因此,经过更多研究,我发现使用不同的硬件(尤其是不同的图形卡)会导致精度不同。 理想的解决方案是保存经过训练的模型,并用它来评估不同计算机上的数据。

1 个答案:

答案 0 :(得分:0)

即使在问题部分中提供了解决方案,也可以在此提供解决方案(答案部分),以使社区受益。

尽管我们使用相同的种子,代码和数据集,但使用不同的硬件(特别是不同的图形卡)将导致精度有所不同。在不同计算机上使用Saving the trained model and using that to evaluate data是理想的解决方案。