如何在张量流中放大矩阵而不重复值?

时间:2017-05-28 04:23:48

标签: python matrix tensorflow

我想要做的是为我的神经网络设置一个体重增长矩阵(即每次迭代都会添加一个神经元)。但是,我不想再次使用tf.Variable,因为这会通过复制前一个矩阵中的值而不扩展矩阵本身而浪费内存。

我已经看到人们使用tf.assign并将validate_shape设置为False,但是,这并没有正确地改变变量的形状,我认为这是一个bug,但是张量流GitHub似乎并不同意(我不是&#39从他们的reply中了解原因。

以下是该问题的简化示例。 x是我想要展开的矩阵,以便可以将其添加到z。如果有人知道我想在这里实现的解决方案,我将非常感激=)

import tensorflow as tf
import numpy as np

# Initialise some variables
sess = tf.Session()
x = tf.Variable(tf.truncated_normal([2, 4], stddev = 0.04))
z = tf.Variable(tf.truncated_normal([3, 4], stddev = 0.04))
sess.run(tf.variables_initializer([x, z]))

# Enlarge the matrix by assigning it a new set of values
sess.run(tf.assign(x, tf.concat((x, tf.cast(tf.truncated_normal([1, 4], stddev = 0.04), tf.float32)), 0), validate_shape=False))

# Print shapes of matrices, notice that x's actual shape is different for the
# shape tensorflow has recorded for it
print(x.get_shape())
print(x.eval(session=sess).shape)
print(z.get_shape())
print(z.eval(session=sess).shape)

# Add two matrices with equal shapes
print(tf.add(x, z).eval(session=sess))

注意:我意识到,如果我将z初始化为形状(2,4),然后使用tf.assign(就像我使用x一样)展开它,上面的示例将起作用。但由于另一个约束,我无法控制z的原始形状。

1 个答案:

答案 0 :(得分:0)

张量流中的张量是不可变的,因此您无法轻松地重新缩放它们。

您可以尝试使用0&f填充,然后使用tf.gather()访问矩阵的部分,如下所示How to select rows from a 3-D Tensor in TensorFlow?

实现"子矩阵"在较大的填充矩阵内。然而,这似乎不是一个简单或优雅的解决方案。