在创建后对变量修改进行加权,并且仍然希望在Tensorflow中对其进行训练

在创建后对变量修改进行加权,并且仍然希望在Tensorflow中对其进行训练,tensorflow,Tensorflow,是否可以使用不同于初始值的值重新分配权重,并且仍然可以成功地对其进行训练 例如: Weights= tf.Variable(shape, zeros(), name="weights") update_weights = weights + steps * bytes Weights = Weights.assign(update_weights) 但当我使用AdamOptimizer对其进行训练时,会出现以下错误: Trying to optimize unsupported type &l

是否可以使用不同于初始值的值重新分配权重,并且仍然可以成功地对其进行训练

例如:

Weights= tf.Variable(shape, zeros(), name="weights")
update_weights = weights + steps * bytes
Weights = Weights.assign(update_weights)
但当我使用AdamOptimizer对其进行训练时,会出现以下错误:

Trying to optimize unsupported type <tf.Tensor 'conv_1/Assign:0' shape=(5, 5, 1, 30) dtype=float32_ref>
但是得到了下面的错误

tensorflow.python.framework.errors_impl.InvalidArgumentError: Input 0 of node conv_2/Variable/conv_2/Assign_conv_2/Variable_0 was passed float from conv_2/Variable/cond/Merge:0 incompatible with expected float_ref.
随附完整的代码流程:

Weights= tf.Variable(shape, zeros(), name="weights")
update_weights = weights + steps * bytes
Weights = Weights.assign(update_weights)

conv = tf.nn.conv2d(input, Weights, ...)
act = tf.nn.relu(...)

tf.add_to_collection('train_params, Weights)

do dot ....
tf.add_to_collection('train_params, Weights)


do all remaining layers.....
tf.add_to_collection('train_params, Weights)

do logits 
tf.add_to_collection('train_params, Weights)

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels, logits)

back_prop = tf.train.AdamOptimizer(LR).minimize(loss, var_list = tf.get_collection('train_params')

repeat for every iteration

谢谢您的帮助。

只需在图形上添加一些依赖项,因为您希望告诉“在开始计算之前,像这样更新权重”,这将转换为:

Weights= tf.Variable(shape, zeros(), name="weights")
update_weights = tf.assign(Weights,  Weights + steps * bytes)
with tf.control_dependencies([update_weights]):
    conv = tf.nn.conv2d(input, Weights, ...)
    etc. etc.

发生错误的原因是
tf.assign
返回了
tf.Tensor
,而不是
tf.Variable
。您是否会在每次迭代时通过
steps*bytes
更新
Weights
?如果是这样,只要在以下计算中使用
update_weights
,因为
weights
updated_weights
的梯度相同。如果不是,则将
权重初始化为
步骤*字节将是最佳选项。否则,请尝试使用tf.control\u dependencies(tf.assign(Weights,update\u Weights)):
将rest图定义放在
下。否则很难理解错误的来源。似乎您正在直接最小化
assign
操作。您只需使用初始的
Weights
对象,然后只需运行
Weights.assign(更新权重)
,当您想要分配它时。@Richard\w我无法直接使用更新的权重。它抛出上面的错误。因为亚当;优化器只接受一个变量来进行梯度更新。有没有办法将张量转换为可训练变量,即)将更新权重视为一个变量,并在每次训练迭代期间更新它?@GiuseppeMarra更新权重不是AdamopOptimizer的w.r.t梯度。我想将update_权重作为初始权重值,并在每次迭代期间对其应用adamoptimizer的梯度更新。但该类型与adam在最小化函数中所期望的类型不匹配。这是使用Adam的minimize()的更新的_权重的一种方法吗?@mkar我担心将
张量
转换为
变量
是不可能的。当我说“在下面的计算中使用
update\u weights
”时,我的意思是,例如,您可以使用
update\u weights
进行卷积。我并不是说在Adam update中也使用它……正如GiuseppeMarra所说,也许您最好提供一些代码,以便我们能够确切地知道您想要做什么。:)我通过在初始化期间提供更新的权重解决了这个问题。非常感谢你的帮助,。
Weights= tf.Variable(shape, zeros(), name="weights")
update_weights = tf.assign(Weights,  Weights + steps * bytes)
with tf.control_dependencies([update_weights]):
    conv = tf.nn.conv2d(input, Weights, ...)
    etc. etc.