Различная точность на разных машинах, использующих одни и те же семена, код и набор данных - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь разработать CNN для распознавания подписи, чтобы определить, кому принадлежит данная подпись. Есть 3 разных класса (человек) и 23 подписи для каждого из них. Имея это небольшое количество образцов, я решил использовать Keras ImageDataGenerator для создания дополнительных изображений.

Однако тестирование CNN на разных машинах (Windows 10 и Mac OS) дает разные оценки точности при оценке модели по данным испытаний. 100% на Windows и 93% на Mac OS. Обе машины работают под управлением Python 3.7.3 64-bit.

Данные разделены с использованием 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, создавая 100% точность данных теста, используя seed(1) на ПК, однако то же начальное число на другом компьютере все еще дает другой показатель точности.

Вот архитектура 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)

EDIT Поэтому после дополнительных исследований я обнаружил, что использование различного оборудования, в частности разных видеокарт, приведет к различной точности. Сохранение обученной модели и ее использование для оценки данных на разных машинах является идеальным решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...