Функция Keras `valu` возвращает неверную точность на разных машинах - PullRequest
0 голосов
/ 04 марта 2019

Фон

Я использую среду Anaconda в Windows 10, сделанную следующим образом этот пост Майком Мюллером:

conda create -n keras python=3.6
conda activate keras
conda install keras

В этой среде есть Python 3.6.8,Keras 2.2.4, TensorFlow 1.12.0 и NumPy 1.16.1.

Я работал над оптимизацией кода для команды, к которой я только что присоединился, когда обнаружил, что не могу даже запустить их код.Я сократил его до контрольного примера с MCVE (по крайней мере, для меня; извинения за то, что не смог привести тестируемый пример):

class TestEvaluation(unittest.TestCase):
    def setUp(self):
        # In-house function loads inputs and labels properly.
        self.inputs, self.labels = load_data()
        # Using a pretrained model, known to work.
        self.model = keras.models.load_model('model_name.h5')
        # Passes, and is loaded successfully.
        self.assertIsNotNone(self.model)

    def test_model_evaluation(self):
        # Fails on my machine, reporting high loss and 0% accuracy.
        scores = self.model.evaluate(self.inputs, self.labels)
        accuracy = scores[1] * 100
        self.assertAlmostEqual(accuracy, 93, delta=5)

Исследования

Это точноСценарий прекрасно работает с чужого компьютера, поэтому мы пришли к следующему выводу: у нас одинаковый код, модель и данные.Следовательно, это должна быть среда, верно?

Я создал больше сред Anaconda для воспроизведения номеров версий, которые работают на их компьютере.Однако это не исправило это.Более того, похоже, что это проблема, с которой сталкивались не многие другие люди, насколько я обнаружил при поиске в Интернете.

Я прошел через следующие другие среды:

  • Python 3.6.4, Keras 2.2.4, TensorFlow 1.12.0, NumPy 1.16.2
    • (тот, который работал для кого-то другого, хотя по общему признанию без Анаконды)
  • Python 3.5.2, Keras 2.2.2, TensorFlow 1.10.0, NumPy 1.15.2

Вопрос

Модель прошла предварительную подготовку, набор проверки корректно загружен, но Keras не может сообщить ожидаемую точность ~ 93%.

Как это исправитьвопрос получения точности 0%?


Обновление

Я узнал намного больше о ситуации.Я обнаружил, что установка среды Python 3.6 в Ubuntu 18.04 привела меня к случайным угадываниям (точность ~ 25%).Таким образом, это больше не 0%!Далее я попытался скопировать машину, которая часто использовалась для тестирования, на которой была установлена ​​Ubuntu 16.04.5.Это дало мне точность ~ 46%.Я не смог точно воспроизвести его, так как Ubuntu вынудил меня обновиться до 16.04.6, когда я установил некоторые пакеты, и я также не знаю, как они запускают вещи на машине, с которой они тестируют (я попробовал сам, и это не помогло).не работает).

Я также узнал, что парень, который скомпилировал и сохранил модель, использовал MacOS High Sierra, но он также заставляет ее работать в лабораторной среде.Мне нужно следить за этим.

Кроме того, я продолжил поиск в Интернете и нашел других с такой же проблемой:

  • Проблема с Keras # 7676 - открытый вопрос в течение почти 2 лет.ОП сообщил, что его сохраненная модель работает по-разному на разных машинах, что очень похоже на мою проблему.

  • Проблема с Keras # 4875 - Открытая проблема для свыше 2 года.Этот конкретный комментарий кажется общим решением.Я не уверен, решит ли это проблему или нет, и на самом деле у меня нет кода, который скомпилировал эту модель.Тем не менее, похоже, что многие люди находили проблемы в том, как была построена и сохранена их модель, поэтому мне, возможно, придется исследовать это подробнее ...

Я прошу прощения за утверждение решения прежде, ябыл экскотичен, чтобы увидеть, что assertNotEqual(accuracy, 0) прошло.

1 Ответ

0 голосов
/ 30 марта 2019

Будьте в курсе

Ранее я писал неправильный ответ, и это вполне может быть другим плохо сформированным решением.Пожалуйста, знайте, что я не полностью проверил эту гипотезу.Также имейте в виду, что этот вопрос все еще остается открытым в сообществе Keras, и многие люди пытаются решить эту проблему несколькими способами.


Разработка нашего решения

Пусть Person A будет парнем, который может нормально управлять моделью на наших лабораторных компьютерах, а также на своем MacBook.Пусть Человек B будет тем, кто не может (т.е. я и все остальные).

Я заставил свою команду более серьезно относиться к этой проблеме.Мы добрались до точки, где A имеет открытый терминал на рабочем столе рядом с B. A запускает тестовый сценарий и получает точность 92%.Б запускает скрипт и получает 2%.В этот момент мы были на одной машине, используя ту же среду Python и настройки Keras (~/.keras).Мы также были уверены, что у нас был тот же сценарий, модель и данные.Или, так мы подумали.

Я решил сомневаться во всем на этом этапе.Я scp сделал скрипт, модель и данные из учетной записи А в учетную запись Б.Это сработало.Вот что это может означать как решение:


Угадай проблему

Файлы B были плохими.B получил их из группового хранилища на Google Drive, а также Slack.Кроме того, некоторые были доставлены через его MacBook.Сценарии были действительно одинаковыми.Модель и данные B фактически отличались в двоичном формате, но имели одинаковый размер в байтах, выглядели «похожими» в двоичном формате и, возможно, могли быть проблемой кодирования.

  1. не Google Drive.Я загрузил и повторно загрузил правильные файлы, и ничего не пошло не так.Однако с самого начала там был неправильный файл.

  2. Возможно Slack? Возможно, Slack искажал кодировку, когда B загружал файлы A.

  3. Возможно, это с MacBook?MacOS генерирует много .DS_Store -подобных файлов, и я мало что знаю об этом.MacOS мог играть роль в модели, а данные зависели от ОС.Я не исключаю этого просто потому, что не знаю, как работает эта ОС.Хотя я сильно подозреваю, что у меня есть запасной MacBook, и я заставил его работать в этой среде, прежде чем мы начали тестирование на той же машине.


Сценарий наихудшего случая

Мы признаем, что можем заставить модель работать на одной машине, к которой у всех есть доступ.Означает ли это, что модель все еще может не работать на других машинах?К сожалению, да.

Мы не тратим время на тестирование других машин, потратив почти 2 месяца на эту проблему.Я надеюсь, что это исследование и отладка помогут кому-то еще.Я не хотел оставлять это в «не говоря уже о том, чтобы исправить это».

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