Tensorflow Can';应用tf.contrib.layers.褶合2D_转置的t恢复模型

Tensorflow Can';应用tf.contrib.layers.褶合2D_转置的t恢复模型,tensorflow,deep-learning,Tensorflow,Deep Learning,我正在尝试使用以下代码还原模型: new_saver = tf.train.import_meta_graph(model_path+'.meta') new_saver.restore(sess, model_path) g=tf.get_default_graph() 对于原始图表中的每个权重或偏差,我都做了g。通过\u name()获取\u tensrr\u。 但当我尝试在deconv2d层上执行此操作时,如下所示: def deconv2d(self,inputs, num_outpu


我正在尝试使用以下代码还原模型:

new_saver = tf.train.import_meta_graph(model_path+'.meta')
new_saver.restore(sess, model_path)
g=tf.get_default_graph()
对于原始图表中的每个权重或偏差,我都做了
g。通过\u name()获取\u tensrr\u
。 但当我尝试在
deconv2d
层上执行此操作时,如下所示:

def deconv2d(self,inputs, num_outputs, kernel_shape, g,scope,strides=[1, 1]):
  with tf.variable_scope(scope) as scope:
    weights_initializer = g.get_tensor_by_name("prsr/conditioning/deconv/Conv2d_transpose/weights:0")
    biases_initializer = g.get_tensor_by_name("prsr/conditioning/deconv/Conv2d_transpose/biases:0")
    return tf.contrib.layers.convolution2d_transpose(inputs=inputs, num_outputs=num_outputs,kernel_size=kernel_shape,stride=strides, \
      padding='SAME', weights_initializer=weights_initializer,biases_initializer=biases_initializer)
它失败并显示以下错误:

  File "restore.py", line 41, in deconv2d
    padding='SAME', weights_initializer=weights_initializer,biases_initializer=biases_initializer)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/framework/python/ops/arg_scope.py", line 177, in func_with_args
    return func(*args, **current_args)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers/python/layers/layers.py", line 1126, in convolution2d_transpose
    outputs = layer.apply(inputs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/base.py", line 323, in apply
    return self.__call__(inputs, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/base.py", line 289, in __call__
    self.build(input_shapes[0])
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/convolutional.py", line 1043, in build
    dtype=self.dtype)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/variable_scope.py", line 1033, in get_variable
    use_resource=use_resource, custom_getter=custom_getter)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/variable_scope.py", line 932, in get_variable
    use_resource=use_resource, custom_getter=custom_getter)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/variable_scope.py", line 349, in get_variable
    validate_shape=validate_shape, use_resource=use_resource)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/base.py", line 278, in variable_getter
    variable_getter=functools.partial(getter, **kwargs))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/base.py", line 228, in _add_variable
    trainable=trainable and self.trainable)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers/python/layers/layers.py", line 1327, in layer_variable_getter
    return _model_variable_getter(getter, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers/python/layers/layers.py", line 1316, in _model_variable_getter
    custom_getter=getter, use_resource=use_resource)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/framework/python/ops/arg_scope.py", line 177, in func_with_args
    return func(*args, **current_args)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/framework/python/ops/variables.py", line 259, in model_variable
    use_resource=use_resource)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/framework/python/ops/arg_scope.py", line 177, in func_with_args
    return func(*args, **current_args)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/framework/python/ops/variables.py", line 214, in variable
    use_resource=use_resource)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/variable_scope.py", line 341, in _true_getter
    use_resource=use_resource)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/variable_scope.py", line 638, in _get_single_variable
    raise ValueError("If initializer is a constant, do not specify shape.")
ValueError: If initializer is a constant, do not specify shape.
我不知道这指的是哪个形状,我也不认为权重和偏差是常数,它们是张量,对吗?顺便说一句,我非常确定这两个张量,
prsr/conditionation/deconv/Conv2d_transpose/weights
prsr/conditionation/deconv/Conv2d_transpose/biases
存在于原始图形中,因为我使用检查点文件中的
print_tensors_检查了这一点,我实际上可以看到这些值。

那个么,我怎样才能恢复应用这个
tf.contrib.layers.convolution2d\u transpose()
layer的模型呢?我在stackoverflow和github上搜索了很多,但都没有找到。任何帮助都将不胜感激

weights\u initializer
bias\u initializer
不是您所认为的那样。你可能认为这两个张量是反褶积中权重的初始值,对吧?但是,初始值设定项参数是一个函数,而不是张量,应该如下所示:

def my_initializer(shape, dtype=tf.float32, partition_info=None):
    # do some computation to build up a tensor of the given shape
    return that_tensor
然后您可以像这样使用此初始值设定项:

tf.contrib.layers.convolution2d_transpose(inputs=inputs, ..., weights_initializer=my_initializer)
因此,为了解决您的问题,我认为以下方法应该有效:

def weights_initializer(shape, dtype=tf.float32, partition_info=None):
    weights = tf.get_default_graph().get_tensor_by_name("prsr/conditioning/deconv/Conv2d_transpose/weights:0")
    return weights
不过,在我看来,这有点令人讨厌。为什么要加载图形,然后在新操作中使用预先训练的权重?为什么在设置初始模型之前,这些权重没有与此操作关联


注:当处理变量时,你可能会发现
tf.get\u variable
很方便。如果使用
tf.get\u variable
创建变量,则可以在以后使用
tf.get\u variable
再次检索这些变量,而无需调用繁琐的
get\u tensor\u by\u name
。查看更多信息。

weights\u initializer
bias\u initializer
不是您所认为的那样。你可能认为这两个张量是反褶积中权重的初始值,对吧?但是,初始值设定项参数是一个函数,而不是张量,应该如下所示:

def my_initializer(shape, dtype=tf.float32, partition_info=None):
    # do some computation to build up a tensor of the given shape
    return that_tensor
然后您可以像这样使用此初始值设定项:

tf.contrib.layers.convolution2d_transpose(inputs=inputs, ..., weights_initializer=my_initializer)
因此,为了解决您的问题,我认为以下方法应该有效:

def weights_initializer(shape, dtype=tf.float32, partition_info=None):
    weights = tf.get_default_graph().get_tensor_by_name("prsr/conditioning/deconv/Conv2d_transpose/weights:0")
    return weights
不过,在我看来,这有点令人讨厌。为什么要加载图形,然后在新操作中使用预先训练的权重?为什么在设置初始模型之前,这些权重没有与此操作关联


注:当处理变量时,你可能会发现
tf.get\u variable
很方便。如果使用
tf.get\u variable
创建变量,则可以在以后使用
tf.get\u variable
再次检索这些变量,而无需调用繁琐的
get\u tensor\u by\u name
。查看更多信息。

谢谢您的回复。我试过你说的,但还是不起作用。我这样做的原因是因为我在恢复tensorflow计算图中节点的值时遇到了麻烦。你能看一下这个截图吗?我试图恢复“c_logits”节点,实际上我可以通过名称(“prsr/condition/conv/c_logits:0”)
,然后
sess.run(node)
,但值与它应该的值不同。天哪,我很抱歉,我知道发生了什么。我将输入馈送到错误的节点!现在它的完美工作!非常感谢。谢谢你的回复。我试过你说的,但还是不起作用。我这样做的原因是因为我在恢复tensorflow计算图中节点的值时遇到了麻烦。你能看一下这个截图吗?我试图恢复“c_logits”节点,实际上我可以通过名称(“prsr/condition/conv/c_logits:0”),然后
sess.run(node)
,但值与它应该的值不同。天哪,我很抱歉,我知道发生了什么。我将输入馈送到错误的节点!现在它的完美工作!非常感谢。