如何在tensorflow中使用map_fn中的稀疏张量

2024-10-02 10:18:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个简单的Tensorflow(版本“1.13.1”)模型,它使用了一个映射。在map_fn中,我尝试将稠密张量和稀疏张量相乘,但我面临一些问题

下面是我的代码的一个片段:

    def wight_multiply(self ,  current ): 
        ### self.vars['weights'] is a trainable variable of shape [300,32]
        result = tf.sparse_tensor_dense_matmul(current, self.vars['weights'])
        return result

#### input1 is a tf.sparse_placeholder containing data of shape [400,40 , 300] 
x = tf.SparseTensor(input1 .indices, tf.map_fn( map_multiply, input1.values  ) , input1.dense_shape)
### x should be a sparse tensor of shape [400,40,32]

但是,上面的代码在图形编译期间抛出以下错误:

Traceback (most recent call last):

File "C:\Users\USER\Documents\Projects\MastersEnv\GraphAutoEncoder\gae\layers.py", line 131, in _call
    x = tf.SparseTensor(x.indices,tf.map_fn(self._scan_wight_multiply , x.values  ) , x.dense_shape) #   x[Batch , Node , Feature ] X Wight[ Feature , 32 ] = output[Batch , Node , 32 ]
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\functional_ops.py", line 497, in map_fn
    maximum_iterations=n)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3556, in while_loop
    return_same_structure)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3087, in BuildLoop
    pred, body, original_loop_vars, loop_vars, shape_invariants)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3022, in _BuildLoop
    body_result = body(*packed_vars_for_body)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3525, in <lambda>
    body = lambda i, lv: (i + 1, orig_body(*lv))
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\functional_ops.py", line 486, in compute
    packed_fn_values = fn(packed_values)
  File "C:\Users\USER\Documents\Projects\MastersEnv\GraphAutoEncoder\gae\layers.py", line 113, in _wight_multiply
    result = tf.sparse_tensor_dense_matmul(current, self.vars['weights'])
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\sparse_ops.py", line 2326, in sparse_tensor_dense_matmul
    sp_a = _convert_to_sparse_tensor(sp_a)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\sparse_ops.py", line 68, in _convert_to_sparse_tensor
    raise TypeError("Input must be a SparseTensor.")
TypeError: Input must be a SparseTensor.


I also tried replacing tf.sparse_tensor_dense_matmul with tf.matmul inside the map_function 
 wight_multiply but I got the below error : 

  File "C:\Users\USER\Documents\Projects\MastersEnv\GraphAutoEncoder\gae\layers.py", line 131, in _call
    x = tf.SparseTensor(x.indices,tf.map_fn(self._scan_wight_multiply , x.values  ) , x.dense_shape) #   x[Batch , Node , Feature ] X Wight[ Feature , 32 ] = output[Batch , Node , 32 ]
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\functional_ops.py", line 497, in map_fn
    maximum_iterations=n)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3556, in while_loop
    return_same_structure)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3087, in BuildLoop
    pred, body, original_loop_vars, loop_vars, shape_invariants)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3022, in _BuildLoop
    body_result = body(*packed_vars_for_body)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 3525, in <lambda>
    body = lambda i, lv: (i + 1, orig_body(*lv))
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\functional_ops.py", line 486, in compute
    packed_fn_values = fn(packed_values)
  File "C:\Users\USER\Documents\Projects\MastersEnv\GraphAutoEncoder\gae\layers.py", line 113, in wight_multiply
    result = tf.matmul(current, self.vars['weights'])
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\math_ops.py", line 2455, in matmul
    a, b, transpose_a=transpose_a, transpose_b=transpose_b, name=name)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\ops\gen_math_ops.py", line 5333, in mat_mul
    name=name)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 788, in _apply_op_helper
    op_def=op_def)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\util\deprecation.py", line 507, in new_func
    return func(*args, **kwargs)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\framework\ops.py", line 3300, in create_op
    op_def=op_def)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\framework\ops.py", line 1823, in __init__
    control_input_ops)
  File "C:\ProgramData\Anaconda3\envs\weaklySupervisedGraph\lib\site-packages\tensorflow\python\framework\ops.py", line 1662, in _create_c_op
    raise ValueError(str(e))
ValueError: Shape must be rank 2 but is rank 0 for 'gcnmodelae/graphconvolutionsparse_1/map/while/MatMul' (op: 'MatMul') with input shapes: [], [300,32].

谁能帮忙吗

谢谢


Tags: inpylibpackagestftensorflowlinesite
1条回答
网友
1楼 · 发布于 2024-10-02 10:18:38

好吧,所以这个问题很愚蠢。事实证明,稀疏传感器存储的值与索引是分开的。tensor input.values只包含一个没有任何结构的扁平值数组。matmul期望两个操作数都是秩2,因此它抱怨不能对input.values进行操作。为了解决此问题,需要在执行multip之前进行进一步的预穿透

相关问题 更多 >

    热门问题