我正在尝试使用带有python框架的tensorflow与CNN构建对象检测器。我想训练我的模型,首先只做对象识别(分类),然后使用预先加盖模型的几个卷积层来训练它来预测边界框。我将需要替换完全连接的层以及可能的最后一些卷积层。因此,由于这个原因,我想知道是否有可能仅将用于训练对象分类器的tensorflow图中的权重导入到我将训练用于进行对象检测的新定义的图中。所以基本上我想做这样的事情:
# here I initialize the new graph
conv_1=tf.nn.conv2d(in, weights_from_old_graph)
conv_2=tf.nn.conv2d(conv_1, weights_from_old_graph)
...
conv_n=tf.nn.nnconv2d(conv_n-1,randomly_initialized_weights)
fc_1=tf.matmul(conv_n, randomly_initalized_weights)
Run Code Online (Sandbox Code Playgroud)
使用不带参数的保护程序来保存整个模型。
tf.reset_default_graph()
v1 = tf.get_variable("v1", [3], initializer = tf.initializers.random_normal)
v2 = tf.get_variable("v2", [5], initializer = tf.initializers.random_normal)
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
saver.save(sess, save_path='./test-case.ckpt')
print(v1.eval())
print(v2.eval())
saver = None
Run Code Online (Sandbox Code Playgroud)
v1 = [ 2.1882825 1.159807 -0.26564872]
v2 = [0.11437789 0.5742971 ]
Run Code Online (Sandbox Code Playgroud)
然后在要还原为某些值的模型中,将要还原的变量名列表或的字典{"variable name": variable}传递给Saver。
tf.reset_default_graph()
b1 = tf.get_variable("b1", [3], initializer= tf.initializers.random_normal)
b2 = tf.get_variable("b2", [3], initializer= tf.initializers.random_normal)
saver = tf.train.Saver(var_list={'v1': b1})
with tf.Session() as sess:
saver.restore(sess, "./test-case.ckpt")
print(b1.eval())
print(b2.eval())
Run Code Online (Sandbox Code Playgroud)
INFO:tensorflow:Restoring parameters from ./test-case.ckpt
b1 = [ 2.1882825 1.159807 -0.26564872]
b2 = FailedPreconditionError: Attempting to use uninitialized value b2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5099 次 |
| 最近记录: |