Tensorflow:将常数张量从预训练的Vgg模型转换为变量

时间:2016-10-16 14:46:57

标签: tensorflow gradient-descent

我的问题是如何将从预训练的Vgg16模型加载的常数张量转换为tf.Variable张量?动机是我需要计算相对于Conv4_3层的特定损失的梯度。但是,内核似乎设置为tf.Constant类型,tf.Optimizer.compute_gradients方法不接受它。

F = vgg.graph.get_tensor_by_name('pretrained_vgg16/conv4_3/filter:0')
G = optimizer.compute_gradients(losses, var_list=[F])

# TypeError: Argument is not a tf.Variable: Tensor("pretrained_vgg16/conv4_3/filter:0", shape=(3, 3, 512, 512), dtype=float32)

我尝试过使用tf.assign方法将内核更新为变量类型tensor,初始值设置为原始内核,但它提供TypeError: Input 'ref' of 'Assign' Op requires l-value input

F = tf.assign(F, tf.Variable(F, trainable=False))

那么,我该怎么做呢?非常感谢提前!

更新:我根据Pretrained Vgg16 Tensorflow model下载了预训练模型,然后我按以下方式加载了模型:

with open('vgg16.tfmodel', mode='rb') as f:
    fileContent = f.read()

graph_def = tf.GraphDef()
graph_def.ParseFromString(fileContent)

# Map input tensor
inputs = tf.placeholder("float", [1, 224, 224, 3], name='inputs')
tf.import_graph_def(graph_def, input_map={ "images": inputs }, name='pretrained_vgg16')

graph = tf.get_default_graph() 

上面的所有代码都是在名为vgg的类中定义的。

1 个答案:

答案 0 :(得分:3)

您可以在this answer中解释您未从预训练模型中获取变量的原因。简而言之,tf.import_graph_def只是恢复图的结构,没有变量。

对此的解决方案是自己构建模型,使用与预训练模型相同的变量名称。然后加载预先训练的模型并为每个变量分配特定的参数。

我建议this vgg model