Инициализация квадратной матрицы партиями - PullRequest
1 голос
/ 09 июля 2020

Задача состоит в том, чтобы произвести умножение вектора размера (87236 x 1) на нижнюю три angular матрицу единиц размера (87236 x 87236).

Поскольку нижняя триада angular очень большой по размеру, не могу инициализировать его для начала.

Я наткнулся на tf.linalg.LinearOperationLowerTri angular () оператор, он игнорирует верхний tri angular часть матрицы. Вот то, что я пробовал, и результат:

tril = tf.ones((4, 21809 , 21809)) 
lmt = tf.linalg.LinearOperatorLowerTriangular(tril)
x = tf.random.normal((87236, 1))
x = tf.reshape(x , (4, 21809,1))

lmt.matmul(x)

После полученной ошибки:

tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM 
when allocating tensor with shape[4,21809,21809] and type float on 
/job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc 
[Op:MatrixBandPart]

Могу я предложить, как я могу эффективно выполнить эту задачу? Я предполагаю, что выполнение его партиями - это решение, однако как инициализировать нижнюю матрицу tri angular партиями?

1 Ответ

0 голосов
/ 09 июля 2020

Если все, что вы хотите сделать, это перемножить две разные матрицы, попробуйте использовать это:

class Matrices:
    def __init__(self, matrix):
        self.matrix = matrix
        self.rows = len(self.matrix)
        self.columns = len(self.matrix[0])

    def multiply_matrices(self, other):
        """multiples 2 matrices together"""
        assert self.columns == other.rows, "Multiplying matrix rules not met"  # remove this line
        new_matrix_dimensions = (self.rows, other.columns)
        new_matrix = list()
            for a in range(self.rows):
                for b in range(other.columns):
                    value = 0
                    for c in range(other.rows):
                        value += self.matrix[a][c] * other.matrix[c][b]
                    new_matrix.append(round(value, 10))
        new_matrix = [new_matrix[i:i + new_matrix_dimensions[1]]
                  for i in range(0, len(new_matrix), new_matrix_dimensions[1])]
        return Matrices(new_matrix)
...