我正在尝试开发一种用于签名识别的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_epoch
,batch_size
和epoch
的各种数字。
我尝试同时使用np.random.seed
和tensorflow.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)
编辑 因此,经过更多研究,我发现使用不同的硬件(尤其是不同的图形卡)会导致精度不同。 理想的解决方案是保存经过训练的模型,并用它来评估不同计算机上的数据。
答案 0 :(得分:0)
即使在问题部分中提供了解决方案,也可以在此提供解决方案(答案部分),以使社区受益。
尽管我们使用相同的种子,代码和数据集,但使用不同的硬件(特别是不同的图形卡)将导致精度有所不同。在不同计算机上使用Saving the trained model and using that to evaluate data
是理想的解决方案。