Python 如何解决tensorflow中动态_划分的无效参数问题?

Python 如何解决tensorflow中动态_划分的无效参数问题?,python,tensorflow,machine-learning,neural-network,Python,Tensorflow,Machine Learning,Neural Network,我试图使用tf.dynamic_partition()替换tf.gather(),以避免将稀疏表示隐式转换为密集矩阵 这是我的密码 # edge_source_states = tf.gather(params=node_states_per_layer[-1], indices=edge_sources) partitions0 = tf.reduce_sum(tf.one_hot(edge_sources, tf.shape(node_states_per_layer[-1])[0], dt

我试图使用
tf.dynamic_partition()
替换
tf.gather()
,以避免将稀疏表示隐式转换为密集矩阵

这是我的密码

# edge_source_states = tf.gather(params=node_states_per_layer[-1], indices=edge_sources)
partitions0 = tf.reduce_sum(tf.one_hot(edge_sources, tf.shape(node_states_per_layer[-1])[0], dtype='int32'),
                                                        0)
edge_source_states = tf.dynamic_partition(node_states_per_layer[-1], partitions0, 2)
edge_source_states = edge_source_states[1]
注释是
tf.gather()
的原始用法。使用
tf.gather()
时没有错误,唯一的问题是它将稀疏表示转换为密集矩阵,从而消耗大量内存。
但是,当我使用
tf.dynamic_partition()
方法时,我得到了一个错误:

InvalidArgumentError (see above for traceback): partitions[21] = 2 is not in [0, 2)
根据回溯,这个错误是由以下句子引起的:

edge_source_states = tf.dynamic_partition(node_states_per_layer[-1], partitions0, 2)
作为一个新手,我真的搞不懂

我的问题是:

1) 我认为我使用
tf.dynamic_partition()
的新代码在功能上等同于使用
tf.gather()的原始代码。那么,为什么会出现错误呢


2)
tf.dynamic_partition()
是否像
tf.gather()
那样避免了从稀疏到密集的隐式转换?还有其他解决办法吗?我真的需要严格控制内存消耗。

问题是你的
分区0
张量在某个点上有一个
2
(可能比
1
有更多的值)。我想这意味着
edge\u源中有重复的值。在这种情况下,
tf.dynamic_partition
本身对您没有用处,因为它将每个值分配给一个分区,并且不能“重用”值。一个值的重复次数有限制吗?我不确定我是否理解你关于密集矩阵和稀疏矩阵的推理。
node\u states\u per\u layer[-1]
edge\u sources
都是正则张量,正如您所说,当
edge\u sources
中没有重复值时,这两种方法(我认为)应该做同样的事情。如果可以使用,第二个可能会更快,但如果不能,我不确定是什么通过
tf.gather
从稀疏转换为密集。(我确实知道
tf.gather
的速度可能有点慢)@jdehesa是的,我认为你是对的。错误应该是由分区0的元素大于1引起的。事实上,在我的edge_资源中总是有重复的元素。所以直接应用动态分区似乎是不可行的。你知道我还能做些什么来避免转换和减少内存使用吗?