我正在尝试将研究论文中的机器学习模型实现为张量流,这需要我创建张量块对角矩阵。在本文中,他们给出了类似于
的块的公式[[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
中的张量原理图的东西?我有什么选择?任何想法都值得赞赏。