Tensorflow - 使用以前学过的权重来初始化不同维度的新权重

时间:2017-09-08 19:22:13

标签: python tensorflow

我正在尝试使用之前学习的维度m权重来初始化维度n的权重张量,其中n > m。我可以这样做,就像我在下面所做的那样。

all_weights['w1'] = tf.Variable(tf.zeros([n, output_sz], dtype=tf.float32))
all_weights['w1'] = all_weights['w1'][:m,:].assign(initial_weights['w1'])

然而,如果我不使用体重分享,我实际学习时会遇到一个问题。 w1最初是tf.Variable,我注意到它在切片赋值后更改为Tensor对象:Tensor("strided_slice/_assign:0")。我的问题是我收到了错误:

`LookupError: No gradient defined for operation 'strided_slice_2/_assign' (op type: StridedSliceAssign)`.

这与类型(Tensor vs tf.Variable)有关吗?有些人如何将Tensor投射到tf.Variable是否有意义?我试图这样做,但后来我得到一个错误:

`FailedPreconditionError: Attempting to use uninitialized value Variable_4
 [[Node: strided_slice/_assign = StridedSliceAssign[Index=DT_INT32, T=DT_FLOAT, _class=["loc:@Variable_4"], begin_mask=3, ellipsis_mask=0, end_mask=2, new_axis_mask=0, shrink_axis_mask=0, _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_4, strided_slice/stack, strided_slice/stack_1, strided_slice/stack_2, strided_slice/_assign/value)]]`

我对Tensorflow相对较新,所以任何帮助都会受到高度赞赏。谢谢!

1 个答案:

答案 0 :(得分:1)

tf.VariableTensor完全不同。在他们之间“施放”是没有意义的。

最简单的解决方案是直接在initial_weights创建中使用Variable。例如,像这样:

import numpy as np
tf.Variable(np.append(initial_weights['w1'],
                      np.zeros((n-m, output_sz)),
                      axis=0),
            dtype=tf.float32)