Python 在tensorflow 2.0中,有没有一种传统的方法来创建具有可变元素的张量?

Python 在tensorflow 2.0中,有没有一种传统的方法来创建具有可变元素的张量?,python,tensorflow2.0,Python,Tensorflow2.0,我正试图实现一个来自tensorflow研究论文的机器学习模型,它要求我创建一个张量块对角矩阵。在本文中,他们给出了类似于 [[cos(x * theta_1), sin(x * theta_2)], [-sin(x * theta_3), cos(x * theta_4)]] 我在tf中创建了一个函数,它接受x并返回一个对角矩阵,但是这个矩阵在一个训练周期中将被使用数十万次,所以我想找到一种方法,避免每次需要使用它时从头开始创建它。不幸的是,因为x可以是一个范围内的任何实数,所以我不能为x的

我正试图实现一个来自tensorflow研究论文的机器学习模型,它要求我创建一个张量块对角矩阵。在本文中,他们给出了类似于

[[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
中是否有一种内置的常规方法来创建类似于张量示意图的内容?我有什么选择?欢迎提出任何意见。

我不确定我是否理解这个问题?您有一个函数,它将
x
作为输入,并将张量作为输出返回
x
可以变化,因此需要计算张量时,您需要计算张量吗?你想避免的是什么?只需在训练循环中调用该函数,不是吗?该函数相当复杂,因此,当唯一改变的是x时,为每个训练示例创建新的块对角矩阵似乎效率低下。我只是想,如果有一种方法可以创建一个类似于
[2x,5x]
的张量,我可以将它存储在一个类似于原理图的变量中,然后通过类似于
的tensor\u(schematic,x\u val)
来计算,它将返回计算出的张量,那会更优雅。但是处理器仍然必须对每个值进行求和,不管怎样,不是吗?最终,张量需要是一个数字矩阵,以便进行训练。您可以(可能)创建一个表示抽象矩阵的操作(或一组操作),但最终需要对其进行计算,所以抽象作为函数有什么不对?(本质上,这只是一组操作!)我不确定我是否理解这个问题?您有一个函数,它将
x
作为输入,并将张量作为输出返回
x
可以变化,因此需要计算张量时,您需要计算张量吗?你想避免的是什么?只需在训练循环中调用该函数,不是吗?该函数相当复杂,因此,当唯一改变的是x时,为每个训练示例创建新的块对角矩阵似乎效率低下。我只是想,如果有一种方法可以创建一个类似于
[2x,5x]
的张量,我可以将它存储在一个类似于原理图的变量中,然后通过类似于
的tensor\u(schematic,x\u val)
来计算,它将返回计算出的张量,那会更优雅。但是处理器仍然必须对每个值进行求和,不管怎样,不是吗?最终,张量需要是一个数字矩阵,以便进行训练。您可以(可能)创建一个表示抽象矩阵的操作(或一组操作),但最终需要对其进行计算,所以抽象作为函数有什么不对?(本质上,这只是一组操作!)