我正在研究一个简单的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].
谁能帮忙吗
谢谢
好吧,所以这个问题很愚蠢。事实证明,稀疏传感器存储的值与索引是分开的。tensor input.values只包含一个没有任何结构的扁平值数组。matmul期望两个操作数都是秩2,因此它抱怨不能对input.values进行操作。为了解决此问题,需要在执行multip之前进行进一步的预穿透
相关问题 更多 >
编程相关推荐