Tensorflow Estimator + API набора данных с заполнителями + модель Keras - PullRequest
1 голос
/ 21 марта 2019

Я построил собственную модель керас (create_model).Затем модель используется для построения оценки.С оценщиком я хочу обучить мою модель с input_fn аргументом = train_input_fn.Я построил эту функцию с помощью API набора данных.Я получаю сообщение об ошибке: Вы должны указать значение для тензора-заполнителя.

Во-первых, я построил model_fn согласно этой демонстрации: https://github.com/tensorflow/models/blob/master/official/mnist/mnist.py#L102.

У меня естьзаимствовал функцию API набора данных (dataset_train_input_fn) из этой демонстрации, просто добавив в функцию аргументы data, num_epochs и batch_size: https://gist.github.com/peterroelants/6a7b3cc802f7f855744e3a74a1fab354#file-mnist_new_dataset_hook-py.

Я построил свою оценку следующим образом:

model_function = model_fn
classifier = tf.estimator.Estimator(    model_fn = model_function, 
                                        model_dir = OUTDIR )

Я пытаюсь обучить мою оценку следующим образом:

train_input_function, train_iterator_hook = dataset_train_input_fn(train_images, train_labels, 10, 128)
classifier.train(input_fn=train_input_function, hooks = [train_iterator_hook])

И моя пользовательская модель Keras выглядит следующим образом:

def create_model():
shape = (4,4096)
# define input for each network
inp = tf.keras.layers.Input(shape = shape, dtype = 'float32', name = '4dim_input')
slice0 = tf.keras.layers.Lambda(lambda inp: tf.slice(inp, [0, 0, 0], [-1, 1, 4096]), output_shape = (-1, 1, 4096), name = 'image_1')
slice1 = tf.keras.layers.Lambda(lambda inp: tf.slice(inp, [0, 1, 0], [-1, 1, 4096]), output_shape = (-1, 1, 4096), name = 'image_2')
slice2 = tf.keras.layers.Lambda(lambda inp: tf.slice(inp, [0, 2, 0], [-1, 1, 4096]), output_shape = (-1, 1, 4096), name = 'image_3')
slice3 = tf.keras.layers.Lambda(lambda inp: tf.slice(inp, [0, 3, 0], [-1, 1, 4096]), output_shape = (-1, 1, 4096), name = 'image_4')

# for each output, pass through stages of FC layers
model_2 = tf.keras.models.clone_model(model_stage2_fc_layers)
#model_2 = stage2_fc_layers

out1 = model_2(slice0(inp))
out2 = model_2(slice1(inp))
out3 = model_2(slice2(inp))
out4 = model_2(slice3(inp))

# merging models
out = tf.keras.layers.concatenate([out1, out2, out3, out4])

# stage3_fc_layers
prediction = stage3_fc_layers(out)

# generate model from layers above
model = tf.keras.models.Model(inputs = inp, outputs = prediction)
return model

Я не знаю, какая часть этой смеси мешает train_input_function извозвращаемые тензоры.

Заранее спасибо.

Вот полный след ошибки:

    Caused by op '4dim_input', defined at:
  File "tf_greater_london_summary.py", line 343, in <module>
    classifier.train(input_fn=train_input_function, hooks = [train_iterator_hook])
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/estimator/estimator.py", line 354, in train
    loss = self._train_model(input_fn, hooks, saving_listeners)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/estimator/estimator.py", line 1207, in _train_model
    return self._train_model_default(input_fn, hooks, saving_listeners)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/estimator/estimator.py", line 1237, in _train_model_default
    features, labels, model_fn_lib.ModeKeys.TRAIN, self.config)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/estimator/estimator.py", line 1195, in _call_model_fn
    model_fn_results = self._model_fn(features=features, **kwargs)
  File "tf_greater_london_summary.py", line 263, in model_fn
    model = final_model()
  File "tf_greater_london_summary.py", line 188, in final_model
    inp = tf.keras.layers.Input(shape = shape, dtype = 'float32', name = '4dim_input')
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/keras/engine/input_layer.py", line 229, in Input
    input_tensor=tensor)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/keras/engine/input_layer.py", line 112, in __init__
    name=self.name)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/array_ops.py", line 1747, in placeholder
    return gen_array_ops.placeholder(dtype=dtype, shape=shape, name=name)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/gen_array_ops.py", line 5206, in placeholder
    "Placeholder", dtype=dtype, shape=shape, name=name)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/op_def_library.py", line 787, in _apply_op_helper
    op_def=op_def)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/util/deprecation.py", line 488, in new_func
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", line 3274, in create_op
    op_def=op_def)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", line 1770, in __init__
    self._traceback = tf_stack.extract_stack()

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor '4dim_input' with dtype float and shape [?,4,4096]
     [[node 4dim_input (defined at tf_greater_london_summary.py:188)  = Placeholder[dtype=DT_FLOAT, shape=[?,4,4096], _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]
...