Python 稀疏矩阵乘张量批

Python 稀疏矩阵乘张量批,python,numpy,tensorflow,matrix,keras,Python,Numpy,Tensorflow,Matrix,Keras,我想通过将数据与稀疏矩阵相乘,在损失函数中执行线性变换 我已经为它编写了一些虚拟代码,请帮助我转换: 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 ke

我想通过将数据与稀疏矩阵相乘,在损失函数中执行线性变换

我已经为它编写了一些虚拟代码,请帮助我转换:

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)

来自未来导入绝对导入、除法、打印函数、unicode文本
将numpy作为np导入
作为pd进口熊猫
从scipy导入稀疏
导入tensorflow作为tf
从tensorflow进口keras
从tensorflow.keras导入图层
#我有一个0-1稀疏矩阵
稀疏矩阵=sparse.random(1000,20,密度=0.2,格式为'coo',数据=np.one,数据类型为'f').astype('int8'))
稀疏矩阵
#虚拟数据发生器
def数据_gen():
对于范围(100)内的i:
产量np.random.normal(大小=(5001000)).astype('float32'))
dataset=tf.data.dataset.from_生成器(data_gen,output_types=np.dtype('float32'),output_shapes=(5001000))。批处理(5)
dataset\u batch=dataset.\uuuu iter\uuuuuuuuuuuuu()。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
数据集_batch.shape#TensorShape([55001000])
def fn(dataset_batch):#我希望这个函数完全用tensorflow编写,这样我就可以在我的loss函数中使用它
dataset\u batch=dataset\u batch.numpy()
返回np.array([dataset_batch[i]*范围内i的稀疏矩阵(dataset_batch.shape[0]))#带稀疏矩阵的多重
fn(数据集_批次).shape#(5500,20)

请帮我用tensorflow写fn。一个Tensorflow层会很好

我找到了一个解决方案,它需要将稀疏矩阵转换为稠密的tensor对象,从而使用更多的ram。如果有人知道更好的解决方案,请张贴

代码:


我找到了一个解决方案,它需要将稀疏矩阵转换成稠密的张量对象,从而使用更多的ram。如果有人知道更好的解决方案,请张贴

代码:

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]])