Как добиться одинаковой точности с идентичными моделями в Keras и Tensorflow?

Вопрос или проблема

Как всем известно, Keras backend использует TensorFlow, и он должен давать некоторые результаты, когда мы задаем те же параметры, гиперпараметры, инициализацию весов и смещений на каждом слое, но все же точность различна.

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

Есть ли способ убедиться, что один и тот же набор изображений подается в модель, исключая случайность?

Я попробовал использовать все те же параметры, гиперпараметры, ту же инициализацию весов и смещений с установленными значениями seed.

Точность обеих моделей не совпадает.

Я создал правило для достижения воспроизводимости:

  • Работает для Python 3.6, не 3.7
  • Сначала установите Keras 2.2.4
  • После установите TensorFlow 1.9

И, наконец, в коде:

import numpy as np
import random as rn
import tensorflow as tf
import keras
from keras import backend as K

#-----------------------------Keras reproducible------------------#
SEED = 1234

tf.set_random_seed(SEED)
os.environ['PYTHONHASHSEED'] = str(SEED)
np.random.seed(SEED)
rn.seed(SEED)

session_conf = tf.ConfigProto(
    intra_op_parallelism_threads=1, 
    inter_op_parallelism_threads=1
)
sess = tf.Session(
    graph=tf.get_default_graph(), 
    config=session_conf
)
K.set_session(sess)
#-----------------------------------------------------------------#

Проблема не в используемом вами фреймворке, а в генераторе случайных чисел, работающем в фоновом режиме. Если вы разбиваете ваш валидационный набор во время выполнения, то убедитесь, что у вас установлен случайный seed для какого-то конкретного числа. Чтобы устранить случайность генератора случайных чисел, необходимо установить seed.

Вы можете установить случайный seed для TensorFlow, используя переменную tf.random.set_seed(seed) и задав ей какое-то значение. То же самое может быть достигнуто в PyTorch, используя torch.manual_seed(0). Но когда вы это делаете, другие зависимости, такие как numpy и random, также генерируют свои случайные числа, поэтому вам нужно установить их seed. Вы также можете использовать функцию ниже, чтобы установить все seed сразу. Просто сохраняйте проверку согласованности при выполнении чего-либо.

def set_seeds(seed=SEED):
    os.environ['PYTHONHASHSEED'] = str(seed)
    random.seed(seed)
    tf.random.set_seed(seed)
    np.random.seed(seed)

Ответ или решение

Теория

Когда вы пытаетесь достичь одинаковой точности с двумя идентичными моделями, построенными на Keras и TensorFlow, теоретически вы должны получать идентичные результаты, поскольку Keras — это высокоуровневое API для TensorFlow. Однако на практике вы можете столкнуться с различиями из-за нескольких факторов, таких как случайная начальная инициализация весов, порядок обработки данных и алгоритмы оптимизации.

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

Пример

Рассмотрим, как выглядят основные шаги, которые помогут вам добиться одинаковой производительности от двух моделей:

  1. Инициализация веса и псевдослучайные генераторы чисел:
    Убедитесь, что все случайные начальные параметры, такие как веса и смещения, инициализированы с использованием одного и того же сид-значения.

  2. Структура модели:
    Определите абсолютно идентичные архитектуры для обеих моделей Keras и TensorFlow. Это включает в себя такие гиперпараметры, как число слоев, тип активации, сама функция потерь и т. д.

  3. Управление случайностью:
    Используйте те же самые сид-значения для всех библиотек, участвующих в генерации псевдослучайных чисел, таких как numpy, random, и сам TensorFlow. В вашем коде вы уже установили эти сид-значения.

Применение

Для достижения одинаковой точности в Keras и TensorFlow, следуйте приведенному плану действий:

  • Конфигурация среды:

    1. Убедитесь, что используете те же версии Keras и TensorFlow как для разработки, так и для выполнения модели. Версии библиотек имеют значение, так как API функций и внутренние реализации могут различаться.
  • Воспроизводимость данных:

    1. Установите уровень детерминированности для генераторов данных. При формировании пакетов используйте параметр shuffle=False для обеспечения одинакового порядка данных.
    2. Если используется предварительная обработка данных, убедитесь, что набор данных подается одинаковым образом в обе модели.
  • Настройки сеанса:
    Воспользуйтесь строгой конфигурацией сеансов TensorFlow, чтобы управлять количеством потоков, что минимизирует недетерминированность, приходящую из параллельного выполнения:

    import tensorflow as tf
    
    # Установка сеанса
    session_conf = tf.ConfigProto(
        intra_op_parallelism_threads=1, 
        inter_op_parallelism_threads=1
    )
    sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
    K.set_session(sess)
  • Обратите внимание на сложные зависимости

    1. Воспроизводимость может также зависеть от порядка выполнения блоков кода и использования сторонних библиотек. Если какие-то части вашего кода зависят от внешних факторов (например, файловая система), вам нужно гарантировать, что они одинаковы для обеих моделей.

Этот подход с фокусом на сид-значениях и настройках воспроизводимости должен помочь вам минимизировать разницу в производительности. Если же продолжает появляться расхождение, рекомендуется провести дополнительную диагностику, возможно, рассмотреть отладочные средства TensorFlow, которые могут предоставить дополнительную информацию о выполнении модели.

В конечном итоге, жёсткие гарантии идентичности результатов могут быть затруднены, если архитектуры моделей, хоть и похожи, всё же интерпретируются различными компонентами вычислительных библиотек. Всегда важно убедиться, что вы работаете в полностью детерминированной среде.

Оцените материал
Добавить комментарий

Капча загружается...