在tensorflow 2.0中,是否有传统的方法来创建带有可变元素的张量?

时间:2019-08-29 11:37:01

标签: python tensorflow2.0

我正在尝试将研究论文中的机器学习模型实现为张量流,这需要我创建张量块对角矩阵。在本文中,他们给出了类似于

的块的公式
[[cos(x * theta_1), sin(x * theta_2)], [-sin(x * theta_3), cos(x * theta_4)]]

我已经在tf中创建了一个函数,该函数接受x并返回一个对角矩阵,但是这个矩阵在训练周期中将要被使用数十万次,所以我想找到一种避免创建它的方法从头开始,每次需要使用它时。不幸的是,因为x可以是一个范围内的任何实数,所以我不能只为x的每个可能值创建一个矩阵并将其存储在列表中以备后用。

我想知道是否有一种方法可以创建矩阵,使其在某些元素中包含变量x,以便我可以做类似的事情

 "create_tensor_from_schematic(tensor_with_variables, value_of_x)" 

它将 返回针对那个x值评估的张量,使我不必每次都重建对角矩阵。

这个矩阵是函数的关键组成部分,它位于我模型的中间,并且每个时期每个训练和测试样本都会使用该矩阵。这是该矩阵的代码:

def build_D(self, n, j):
    def theta(k):
      return (2 * math.pi * k) / n

    def A(k, j):
      j_thetak = j * theta(k)
      return tf.convert_to_tensor([[math.cos(j_thetak), math.sin(j_thetak)],
                                   [-math.sin(j_thetak), math.cos(j_thetak)]], dtype=tf.float32)

    if n % 2 == 1: #n is odd
      s = int((n - 1) / 2)
      block_list_A = [tf.reshape(tf.convert_to_tensor([1], dtype=tf.float32), [1, 1])] + [A(k, j) for k in range(1, s + 1)]
    else: #n is even
      s = int((n - 2) / 2)
      last_term = (-1) ** j
      block_list_A = [tf.reshape(tf.convert_to_tensor([1], dtype=tf.float32), [1, 1])] + [A(k, j) for k in range(1, s + 1)] \
      + [tf.reshape(tf.convert_to_tensor([last_term], dtype=tf.float32), [1, 1])] 

    return tf.linalg.LinearOperatorBlockDiag(list(
        map(lambda x: tf.linalg.LinearOperatorFullMatrix(x), block_list_A))).to_dense()

(此版本的代码是我当前使用的版本,它仅支持整数j,这使我可以为范围内的每个j创建矩阵并将其存储在列表中,但将来j将是实值,我显然无法为每个可能的j值创建一个矩阵。)

j是唯一更改的变量,所以如果有一种方法可以运行一次并保持复制,只需将j的副本复制到矩阵中进行评估,当我需要与某个j值相对应的矩阵时,这将是很好的选择

我想知道是否可以创建一个以lambda表达式为元素的张量,但是我无法想象如何将参数传递给它们。

是否存在一种内置的常规方法来创建类似tensorflow中的张量原理图的东西?我有什么选择?任何想法都值得赞赏。

0 个答案:

没有答案