Использовать возвращаемые значения пользовательской функции в потерях на основе прогнозов модели - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь построить такую ​​модель в TensorFlow.
Модель имеет «функцию» внутри функции потерь (как A) или перед ней (как B), которая должна создавать изображение с использованием оценки некоторых параметров CNN (слои CNN + Dens).
Представьте, что входные изображения представляют собой прямоугольники с разными размерами и координатами. Нейронная сеть предполагает извлечь эти параметры (вес, рост, X и Y прямоугольника). Используя эти оценочные параметры, «функция» воссоздает прямоугольник и отправляет его в функцию «Расстояние» (A) / «Потеря» (B), чтобы выходные данные можно было использовать для обновления весов в нейронной сети.

Model diagram

Я сделал каждую часть сети, но когда я пытаюсь получить параметры, оцененные CNN для каждого изображения, чтобы получить изображение и отправить его в функцию потери / расстояния, я не могу получить доступ к реальным числовым данным. вместо этого выход CNN - Tensor. Я попытался набрать output, используя новый tf.Session, но это происходит:

FailedPreconditionError: Attempting to use uninitialized value conv2d/kernel
 [[Node: conv2d/kernel/read = Identity[T=DT_FLOAT, _class=["loc:@conv2d/kernel"], _device="/job:localhost/replica:0/task:0/device:GPU:0"](conv2d/kernel)]]
 [[Node: dense_2/BiasAdd/_11 = _Recv[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_80_dense_2/BiasAdd", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

Как мне построить подобную модель в TensorFlow?

Мой пример кода выглядит так: CNN:

def cnn_model_fn(features, labels, mode):
   input_layer = tf.reshape(features["x"], [-1, 96,96,1])
   conv1 = tf.layers.conv2d(inputs=input_layer,...)
   other convs....
   output = tf.layers.dense(inputs=lastlayer, units=4)

   predictions = {"params": output}

   if mode == tf.estimator.ModeKeys.PREDICT:
      return   tf.estimator.EstimatorSpec(mode=mode,predictions=predictions)

   # Calculate Loss - here the output will go to "A Function"
   loss = distance_function(features["x"],AFunction(output))

   # Configure the Training Op (for TRAIN mode)
   if mode == tf.estimator.ModeKeys.TRAIN:
       optimizer = ....

   # Add evaluation metrics (for EVAL mode)
   eval_metric_ops = {...}
   return tf.estimator.EstimatorSpec(...)

и «Функция» имеет вид:

def AFunction(y_pred):
   _sess = tf.Session()
   y_pred = _sess.run(y_pred)
   _sess.close()
return rectangle(y_pred)

также я попробовал это, и та же самая ошибка происходит:

def AFunction(y_pred):
    _sess = tf.Session()
    with _sess.as_default():
        y_pred = y_pred.eval()
return rectangle(y_pred)

Функция расстояния является одной из функций tf.losses (необходимо проверить, какая из них работает лучше всего)

Спасибо.

1 Ответ

0 голосов
/ 29 апреля 2018

Я думаю, вам нужно добавить полный код здесь. Для лучшего ответа. Из-за ошибки кажется, что вам нужно добавить tf.global_variables_initializer () перед тем, как вы начнете (Training) что-либо, поскольку некоторые переменные не инициализированы. Также кажется, что вы хотите создать новую функцию потерь на основе A_Function и изображений.

def A_Function(inp):
    return np.pow(inp,2)/*Do something with input*/

В коде CNN напишите это loss = distance_function(features["x"],AFunction(output)) Теперь тренируйся используя

with tf.Session as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(cost, feed_dict) /* Just usual training stuff*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...