Вопрос или проблема
Как всем известно, 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. Однако на практике вы можете столкнуться с различиями из-за нескольких факторов, таких как случайная начальная инициализация весов, порядок обработки данных и алгоритмы оптимизации.
Одним из главных источников непоследовательности является случайность, встроенная в процесс обучения. Эта случайность может проявляться в инициализации весов, разбиении на партии и перемешивании данных. Следовательно, для достижения воспроизводимости и одинаковой точности моделей требуется правильно управлять всеми источниками случайности.
Пример
Рассмотрим, как выглядят основные шаги, которые помогут вам добиться одинаковой производительности от двух моделей:
-
Инициализация веса и псевдослучайные генераторы чисел:
Убедитесь, что все случайные начальные параметры, такие как веса и смещения, инициализированы с использованием одного и того же сид-значения. -
Структура модели:
Определите абсолютно идентичные архитектуры для обеих моделей Keras и TensorFlow. Это включает в себя такие гиперпараметры, как число слоев, тип активации, сама функция потерь и т. д. -
Управление случайностью:
Используйте те же самые сид-значения для всех библиотек, участвующих в генерации псевдослучайных чисел, таких какnumpy
,random
, и сам TensorFlow. В вашем коде вы уже установили эти сид-значения.
Применение
Для достижения одинаковой точности в Keras и TensorFlow, следуйте приведенному плану действий:
-
Конфигурация среды:
- Убедитесь, что используете те же версии Keras и TensorFlow как для разработки, так и для выполнения модели. Версии библиотек имеют значение, так как API функций и внутренние реализации могут различаться.
-
Воспроизводимость данных:
- Установите уровень детерминированности для генераторов данных. При формировании пакетов используйте параметр
shuffle=False
для обеспечения одинакового порядка данных. - Если используется предварительная обработка данных, убедитесь, что набор данных подается одинаковым образом в обе модели.
- Установите уровень детерминированности для генераторов данных. При формировании пакетов используйте параметр
-
Настройки сеанса:
Воспользуйтесь строгой конфигурацией сеансов 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)
-
Обратите внимание на сложные зависимости
- Воспроизводимость может также зависеть от порядка выполнения блоков кода и использования сторонних библиотек. Если какие-то части вашего кода зависят от внешних факторов (например, файловая система), вам нужно гарантировать, что они одинаковы для обеих моделей.
Этот подход с фокусом на сид-значениях и настройках воспроизводимости должен помочь вам минимизировать разницу в производительности. Если же продолжает появляться расхождение, рекомендуется провести дополнительную диагностику, возможно, рассмотреть отладочные средства TensorFlow, которые могут предоставить дополнительную информацию о выполнении модели.
В конечном итоге, жёсткие гарантии идентичности результатов могут быть затруднены, если архитектуры моделей, хоть и похожи, всё же интерпретируются различными компонентами вычислительных библиотек. Всегда важно убедиться, что вы работаете в полностью детерминированной среде.