Не удается преобразовать модель Кераса в оценку тензорного потока с помощью tf.keras.estimator.model_to_estimator - PullRequest
0 голосов
/ 29 апреля 2018

У меня проблемы с использованием tf.keras.estimator.model_to_estimator для преобразования модели Keras, чтобы она работала в тензорном потоке. Вот код модели в керасе

from tensorflow.python.keras.applications.inception_v3 import InceptionV3
from tensorflow.python.keras._impl.keras.models import Model, load_model
from tensorflow.python.keras._impl.keras.layers import Input, Convolution2D, MaxPooling2D, Activation,GlobalAveragePooling2D,\
                    Dropout, Dropout, Flatten, Dense, Lambda, BatchNormalization
def measure_accuracy()
     ...
def dense_block()
     ...
gen_tr= ...
gen_vl= ...

input_shape = (config.IMAGE_SHAPE[0], config.IMAGE_SHAPE[1], 3)
input_tensor = Input(input_shape, name='input_tensor')
base_model = InceptionV3(input_tensor=input_tensor,weights='imagenet', include_top=False)

x = base_model.output
x = Flatten()(x)
x = dense_block(x, num_fv)
embedding = Lambda(lambda x: K.l2_normalize(x, axis=1))(x)

inputs = input_tensor
outputs = embedding

triplet_model = Model(inputs, outputs)
triplet_model.compile(loss=triplet_loss,metrics=[measure_accuracy], optimizer=Adam(0.0001))
triplet_model.fit_generator(gen_tr,
                          validation_data = gen_vl,
                          epochs=50, 
                          verbose=2, 
                          workers=1,
                          steps_per_epoch=32, 
                          validation_steps=25)

Модель, кажется, отлично работает в Keras, но суть здесь в том, что я хочу использовать tf.dataset в качестве конвейера данных, чтобы преобразовать модель в тензорный поток. Вот код

model_dir = os.path.join(os.getcwd(), "models/triplet_5")
os.makedirs(model_dir, exist_ok=True)
tf_model = tf.keras.estimator.model_to_estimator(keras_model=triplet_model, model_dir=model_dir)

А вот и ошибка

FailedPreconditionError                   Traceback (most recent call last)
~/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args)
   1326     try:
-> 1327       return fn(*args)
   1328     except errors.OpError as e:

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in _run_fn(feed_dict, fetch_list, target_list, options, run_metadata)
   1311       return self._call_tf_sessionrun(
-> 1312           options, feed_dict, fetch_list, target_list, run_metadata)
   1313 

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py in _call_tf_sessionrun(self, options, feed_dict, fetch_list, target_list, run_metadata)
   1419             self._session, options, feed_dict, fetch_list, target_list,
-> 1420             status, run_metadata)
   1421 

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/errors_impl.py in __exit__(self, type_arg, value_arg, traceback_arg)
    515             compat.as_text(c_api.TF_Message(self.status.status)),
--> 516             c_api.TF_GetCode(self.status.status))
    517     # Delete the underlying status object from memory otherwise it stays alive

FailedPreconditionError: Attempting to use uninitialized value conv2d_29/kernel
     [[Node: conv2d_29/kernel/_626 = _Send[T=DT_FLOAT, client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_1366_conv2d_29/kernel", _device="/job:localhost/replica:0/task:0/device:GPU:0"](conv2d_29/kernel)]]
     [[Node: batch_normalization_41/beta/_235 = _Recv[_start_time=0, client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=

Это мой первый раз, когда я задаю вопрос здесь, поэтому, если я пропустил некоторую информацию, которая вам нужна, пожалуйста, спросите

...