gpt4 book ai didi

tensorflow - Tensorflow 中的 block 对角矩阵

转载 作者:行者123 更新时间:2023-12-04 00:08:03 25 4
gpt4 key购买 nike

假设我有几个不同形状的张量 A_i [N_i, N_i]。在 tensorflow 中是否可以在对角线上使用这些矩阵创建块对角矩阵?我现在能想到的唯一方法就是通过堆叠和添加 tf.zeros 完全自己构建它。

最佳答案

我同意有一个 C++ op 来做这件事会很好。与此同时,这就是我所做的(正确获取静态形状信息有点繁琐):

import tensorflow as tf

def block_diagonal(matrices, dtype=tf.float32):
r"""Constructs block-diagonal matrices from a list of batched 2D tensors.

Args:
matrices: A list of Tensors with shape [..., N_i, M_i] (i.e. a list of
matrices with the same batch dimension).
dtype: Data type to use. The Tensors in `matrices` must match this dtype.
Returns:
A matrix with the input matrices stacked along its main diagonal, having
shape [..., \sum_i N_i, \sum_i M_i].

"""
matrices = [tf.convert_to_tensor(matrix, dtype=dtype) for matrix in matrices]
blocked_rows = tf.Dimension(0)
blocked_cols = tf.Dimension(0)
batch_shape = tf.TensorShape(None)
for matrix in matrices:
full_matrix_shape = matrix.get_shape().with_rank_at_least(2)
batch_shape = batch_shape.merge_with(full_matrix_shape[:-2])
blocked_rows += full_matrix_shape[-2]
blocked_cols += full_matrix_shape[-1]
ret_columns_list = []
for matrix in matrices:
matrix_shape = tf.shape(matrix)
ret_columns_list.append(matrix_shape[-1])
ret_columns = tf.add_n(ret_columns_list)
row_blocks = []
current_column = 0
for matrix in matrices:
matrix_shape = tf.shape(matrix)
row_before_length = current_column
current_column += matrix_shape[-1]
row_after_length = ret_columns - current_column
row_blocks.append(tf.pad(
tensor=matrix,
paddings=tf.concat(
[tf.zeros([tf.rank(matrix) - 1, 2], dtype=tf.int32),
[(row_before_length, row_after_length)]],
axis=0)))
blocked = tf.concat(row_blocks, -2)
blocked.set_shape(batch_shape.concatenate((blocked_rows, blocked_cols)))
return blocked

举个例子:
blocked_tensor = block_diagonal(
[tf.constant([[1.]]),
tf.constant([[1., 2.], [3., 4.]])])

with tf.Session():
print(blocked_tensor.eval())

打印:
[[ 1.  0.  0.]
[ 0. 1. 2.]
[ 0. 3. 4.]]

关于tensorflow - Tensorflow 中的 block 对角矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42157781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com