2017-07-12 78 views
1

我做了一个分类句子的以前训练过的模型。如何在TensorFlow中将较小的变量恢复为较大的变量?

我想使一些变量更大,但想要恢复较小的旧变量,并将其余部分变量初始化为新的。

这里是我想要的图像:

enter image description here

当我尝试这样做,这个错误发生。

InvalidArgumentError (see above for traceback): Assign requires shapes 
of both tensors to match. lhs shape= [13173,32] rhs shape= [13113,32] 
[[Node: save_1/Assign = Assign[T=DT_FLOAT, 
_class=["loc:@embedding/embedding_W"], use_locking=true, validate_shape=true, 
_device="/job:localhost/replica:0/task:0/gpu:0"](embedding/embedding_W, 
save_1/RestoreV2/_5)]] 

回答

0

不能直接原因有几个恢复较小的变量变数较大,例如TensorFlow不知道应该嵌入在什么较大的变化较小的变量的一部分。

正确地做到这一点的方法而是加载旧变量,创建新变量,然后将旧变量分配给新变量的子集。

在代码中,这将是:

# the old variable, as it was before 
old_variable = tf.Variable(..., name='old_name') 

# variable with new shape, the one you want to use now 
new_variable = tf.Variable(...) 

# Initialize the variables and restore the checkpoint 
sess.run(tf.global_variables_initializer()) 
saver.restore(sess, 'old_checkpoint') 

# assign op for the places you want to fill in the old variable 
idx = tuple(slice(0, osi) for osi in old_variable.shape) 
asssign_op = new_variable[idx].assign(old_variable) 
sess.run(asssign_op) 
+1

谢谢你的快速回复!我尝试过,但可变。分配不工作。 –

+1

ValueError:这两种形状的尺寸0必须相等,但对于'Assign'(op:'Assign'),其输入形状为13173和13113:[13173,32],[13113,32]。 –

+1

你是不是指'new_variable [:13113,:32] .assign(old_variable)'???有用!!!!!非常感谢!!!我爱你!!!你救了我的命。 –