gpt4 book ai didi

tensorflow - TFSlim - 加载 VGG16 的已保存检查点时出现问题

转载 作者:行者123 更新时间:2023-12-04 13:57:44 25 4
gpt4 key购买 nike

(1) 我试图通过将预训练权重加载到除 fc8 之外的所有层中来使用 TFSlim 微调 VGG-16 网络。层。我通过使用 TF-SLIm 函数实现了这一点,如下所示:

import tensorflow as tf
import tensorflow.contrib.slim as slim
import tensorflow.contrib.slim.nets as nets

vgg = nets.vgg

# Specify where the Model, trained on ImageNet, was saved.
model_path = 'path/to/vgg_16.ckpt'

# Specify where the new model will live:
log_dir = 'path/to/log/'

images = tf.placeholder(tf.float32, [None, 224, 224, 3])
predictions = vgg.vgg_16(images)

variables_to_restore = slim.get_variables_to_restore(exclude=['fc8'])
restorer = tf.train.Saver(variables_to_restore)




init = tf.initialize_all_variables()

with tf.Session() as sess:
sess.run(init)
restorer.restore(sess,model_path)
print "model restored"

只要我不更改 num_classes 就可以正常工作对于 VGG16 模型。我想做的是改变 num_classes从 1000 到 200。我的印象是,如果我通过定义一个新的 vgg16-modified 来进行这种修改替换 fc8 的类产生 200 个输出,(连同 variables_to_restore = slim.get_variables_to_restore(exclude=['fc8']) 一切都会好起来的。然而,tensorflow 提示尺寸不匹配:
InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [1,1,4096,200] rhs shape= [1,1,4096,1000] 

那么,如何真正做到这一点呢? TFSlim 的文档非常不完整,并且在 Github 上散布着多个版本 - 所以在那里没有得到太多帮助。

最佳答案

您可以尝试使用slim的恢复方式— slim.assign_from_checkpoint .

瘦身来源中有相关文档:
https://github.com/tensorflow/tensorflow/blob/129665119ea60640f7ed921f36db9b5c23455224/tensorflow/contrib/slim/python/slim/learning.py

对应部分:

*************************************************
* Fine-Tuning Part of a model from a checkpoint *
*************************************************
Rather than initializing all of the weights of a given model, we sometimes
only want to restore some of the weights from a checkpoint. To do this, one
need only filter those variables to initialize as follows:
...
# Create the train_op
train_op = slim.learning.create_train_op(total_loss, optimizer)
checkpoint_path = '/path/to/old_model_checkpoint'
# Specify the variables to restore via a list of inclusion or exclusion
# patterns:
variables_to_restore = slim.get_variables_to_restore(
include=["conv"], exclude=["fc8", "fc9])
# or
variables_to_restore = slim.get_variables_to_restore(exclude=["conv"])
init_assign_op, init_feed_dict = slim.assign_from_checkpoint(
checkpoint_path, variables_to_restore)
# Create an initial assignment function.
def InitAssignFn(sess):
sess.run(init_assign_op, init_feed_dict)
# Run training.
slim.learning.train(train_op, my_log_dir, init_fn=InitAssignFn)

更新

我尝试了以下方法:

import tensorflow as tf
import tensorflow.contrib.slim as slim
import tensorflow.contrib.slim.nets as nets
images = tf.placeholder(tf.float32, [None, 224, 224, 3])
predictions = nets.vgg.vgg_16(images)
print [v.name for v in slim.get_variables_to_restore(exclude=['fc8']) ]

并得到这个输出(缩短):
[u'vgg_16/conv1/conv1_1/weights:0',
u'vgg_16/conv1/conv1_1/biases:0',

u'vgg_16/fc6/weights:0',
u'vgg_16/fc6/biases:0',
u'vgg_16/fc7/weights:0',
u'vgg_16/fc7/biases:0',
u'vgg_16/fc8/weights:0',
u'vgg_16/fc8/biases:0']

所以看起来你应该用 vgg_16 作为作用域前缀:

print [v.name for v in slim.get_variables_to_restore(exclude=['vgg_16/fc8']) ]

给出(缩短):
[u'vgg_16/conv1/conv1_1/weights:0',
u'vgg_16/conv1/conv1_1/biases:0',

u'vgg_16/fc6/weights:0',
u'vgg_16/fc6/biases:0',
u'vgg_16/fc7/weights:0',
u'vgg_16/fc7/biases:0']

更新 2

执行无错误的完整示例(在我的系统中)。

import tensorflow as tf
import tensorflow.contrib.slim as slim
import tensorflow.contrib.slim.nets as nets

s = tf.Session(config=tf.ConfigProto(gpu_options={'allow_growth':True}))

images = tf.placeholder(tf.float32, [None, 224, 224, 3])
predictions = nets.vgg.vgg_16(images, 200)
variables_to_restore = slim.get_variables_to_restore(exclude=['vgg_16/fc8'])
init_assign_op, init_feed_dict = slim.assign_from_checkpoint('./vgg16.ckpt', variables_to_restore)
s.run(init_assign_op, init_feed_dict)

在上面的例子中 vgg16.ckpttf.train.Saver 保存的检查点用于 1000 类 VGG16 模型。

将此检查点与 200 个类模型(包括 fc8)的所有变量一起使用会产生以下错误:

init_assign_op, init_feed_dict = slim.assign_from_checkpoint('./vgg16.ckpt', slim.get_variables_to_restore())
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
1 init_assign_op, init_feed_dict = slim.assign_from_checkpoint(
----> 2 './vgg16.ckpt', slim.get_variables_to_restore())

/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/framework/python/ops/variables.pyc in assign_from_checkpoint(model_path, var_list)
527 assign_ops.append(var.assign(placeholder_value))
528
--> 529 feed_dict[placeholder_value] = var_value.reshape(var.get_shape())
530
531 assign_op = control_flow_ops.group(*assign_ops)

ValueError: total size of new array must be unchanged

关于tensorflow - TFSlim - 加载 VGG16 的已保存检查点时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40350539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com