В чем разница между 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 раза медленнее для модели среднего размера (код). Я по-прежнему вижу первое в пользовательском коде - считайте это предупреждением.