Многократная партия Тензор с разреженной матрицей - PullRequest
1 голос
/ 28 апреля 2020

Я хочу выполнить линейное преобразование в функции потерь, умножив данные с разреженной матрицей.

Я написал несколько фиктивных кодов для этого, пожалуйста, помогите мне преобразовать это:

from __future__ import absolute_import, division, print_function, unicode_literals

import numpy as np
import pandas as pd

from scipy import sparse

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers


# I have a 0-1 sparse matrix
sparse_matix = sparse.random(1000, 20, density=.2, format='coo', data_rvs=np.ones,dtype='f' ).astype('int8') 
sparse_matix # <1000x20 sparse matrix of type '<class 'numpy.int8'>' with 4000 stored elements in COOrdinate format>

# Dummy data generator
def data_gen():
    for i in range(100):
        yield np.random.normal(size=(500, 1000)).astype('float32')

dataset = tf.data.Dataset.from_generator(data_gen, output_types=np.dtype('float32'), output_shapes=(500, 1000)).batch(5)

dataset_batch = dataset.__iter__().__next__()
dataset_batch.shape # TensorShape([5, 500, 1000])



def fn(dataset_batch): # i want this function to written completly in tensorflow, so that i can use this in my loss function
    dataset_batch = dataset_batch.numpy()
    return np.array([dataset_batch[i]*sparse_matix for i in range(dataset_batch.shape[0])]) # mutiple with sparse matrix

fn(dataset_batch).shape # (5, 500, 20)

Пожалуйста, помогите мне написать fn с помощью tenorflow. Слой Tensorflow будет в порядке

1 Ответ

0 голосов
/ 28 апреля 2020

Я нашел одно решение, которое требует, чтобы разреженная матрица была преобразована в плотный тензорный объект, поэтому использует больше оперативной памяти. Если кто-то знает лучшее решение, пожалуйста, напишите.

КОД:

order = np.lexsort((sparse_matix.col, sparse_matix.row))
sparse_matix_tensor = tf.SparseTensor(indices=list(zip(sparse_matix.row[order], sparse_matix.col[order])), values=sparse_matix.data[order].astype('float32'), dense_shape=sparse_matix_tensor.shape)
sparse_matix_tensor = tf.sparse.to_dense(sparse_matix_tensor)

def fn(dataset_batch):
    return tf.tensordot(dataset_batch, sparse_matix_tensor, axes=[[2], [0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...