В чем разница между tf.keras и tf.python.keras?

Я столкнулся с серьезными проблемами несовместимости из-за того, что один и тот же код работал с одним против другого; например:

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

В чем дело? В чем разница, и когда мне следует использовать тот или иной?


from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Nadam
import numpy as np

ipt   = Input(shape=(4,))
out   = Dense(1, activation='sigmoid')(ipt)
model = Model(ipt, out)
model.compile(optimizer=Nadam(lr=1e-4), loss='binary_crossentropy')

X = np.random.randn(32,4)
Y = np.random.randint(0,2,(32,1))
model.train_on_batch(X,Y)

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

  • CUDA 10.0.130, cuDNN 7.4.2, Python 3.7.4, Windows 10
  • tensorflow, tensorflow-gpu v2.0.0 и Keras 2.3.0 через pip, все остальное через Anaconda 3

1 ответ

Решение

От официального разработчика TensorFlow, сокращенно (выделено мной):

Импорт API находится в корне пакета. Любой другой импорт - это просто Python, позволяющий получить доступ к частным лицам без учета хорошей практики кодирования.

Единственный способ, которым должен быть импорт, - это

import tensorflow as tf
tf.keras

Мы также оказываем поддержку from tensorflow.keras import, хотя это хрупко и может сломаться по мере продолжения рефакторинга. Импорт изtensorflow.pythonили любые другие модули (включаяimport tensorflow_core) не поддерживается и может выйти из строя без предварительного уведомления.

Я: Чтобы подтвердить,tf.python.kerasявляется частным, предназначенным для разработки, а не для общественного пользования?

Да, именно так. Что-нибудь подtf.python личное


Однако это не полная картина. tf.python остается единственным способом получить доступ к определенным функциям / классам - например, tf.python.framework а также tf.python.ops, оба используются в tf.keras.optimizers. Но, как указано выше, это не вызывает беспокойства, если вы не "разрабатываете", то есть пишете пользовательские функции или классы. Использование "из коробки" должно быть нормально, даже не касаясьtf.python.

Обратите внимание, что это не только вопрос совместимости, и они не являются взаимозаменяемыми, "пока ничего не сломается"; например,tf.kerasиспользует optimizer_v2, который существенно отличается отtf.python.keras Оптимизатор.

Наконец, обратите внимание, что обе ссылки выше попадают в tf.python.keras - не уверен, но похоже, что tf.keras на самом деле не существует в TF Github (например, ничего не упоминается OptimizerV2), Но это делает слияние с TF вtensorflow_core/python/keras/api/_v2 папка при локальной установке:

from tensorflow import keras
print(keras.__file__)
from tensorflow.python import keras
print(keras.__file__)
D:\Anaconda\lib\site-packages\tensorflow_core\python\keras\api\_v2\keras\__init__.py
D:\Anaconda\lib\site-packages\tensorflow_core\python\keras\__init__.py

Хотя оба разделяют python/папка, они не обаtf.python - можно проверить из их соответствующих __init__.py.


ОБНОВЛЕНИЕ:tf.python.keras.optimizers используется с tf.python.keras.layers против tf.keras.optimizers используется с tf.keras.layersработает в 11,5 раза медленнее для модели среднего размера (код). Я по-прежнему вижу первое в пользовательском коде - считайте это предупреждением.

Другие вопросы по тегам