Tensorflow:将常量张量从预训练的 Vgg 模型转换为变量
Tensorflow: Convert constant tensor from pre-trained Vgg model to variable
我的问题是如何将从预训练的 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
方法将内核更新为变量类型张量,初始值设置为原始内核,但它给出了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
.
的class中
您没有从预训练模型中获取变量的原因可以在 中解释。简而言之,tf.import_graph_def
只是恢复了一个图的结构,没有变量。
解决这个问题的方法是自己构建模型,使用与预训练模型相同的变量名。然后加载预训练模型并为每个变量分配特定参数。
我推荐this vgg model。
我的问题是如何将从预训练的 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
方法将内核更新为变量类型张量,初始值设置为原始内核,但它给出了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
.
您没有从预训练模型中获取变量的原因可以在 tf.import_graph_def
只是恢复了一个图的结构,没有变量。
解决这个问题的方法是自己构建模型,使用与预训练模型相同的变量名。然后加载预训练模型并为每个变量分配特定参数。
我推荐this vgg model。