根据模型预测

时间:2018-04-29 06:43:17

标签: python tensorflow deep-learning

我正试图在TensorFlow中建立这样的模型 该模型在损失函数内部(作为A)或在其之前(作为B)具有“函数”,其应该使用CNN(CNN +密度层)估计某些参数来生成图像。
想象一下输入图像是一些具有不同大小和协调的矩形。神经网络假设提取这些参数(矩形的重量,高度,X和Y)。使用这些估计参数“A function”将重新创建矩形并将其发送到“Distance”(A)/“Loss”(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(...)

和“A function”就像:

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 :(得分:0)

我认为您需要在此处添加完整代码。为了更好的答案。 从错误中看,您似乎需要在开始执行(Training)之前添加tf.global_variables_initializer(),因为某些变量未初始化。 此外,您似乎想要基于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*/