List 在while\u loop TensorFlow函数中为列表编制索引

List 在while\u loop TensorFlow函数中为列表编制索引,list,tensorflow,indexing,while-loop,List,Tensorflow,Indexing,While Loop,你好 我有个问题。我实际上有一个占位符列表(realpythonlist)。 我的列表长度为n(=以下代码中的T),如下所示: 我的列表=[[D0,K],[D1,K],…[Dn,K]] 不需要相同尺寸的Di。这就是我使用列表的原因(因为我无法在没有填充的情况下将此列表转换为张量) 我想做的是: temp=[] 对于步进范围(T): 临时追加(tf.减少总和(x[步进],轴=0)) 总和=tf.堆栈(温度) 其中x=my_列表,长度n。 这段代码将转换我的输入列表x,如下所示: [[D0,K

你好

我有个问题。我实际上有一个占位符列表(realpythonlist)。 我的列表长度为n(=以下代码中的T),如下所示:


我的列表=[[D0,K],[D1,K],…[Dn,K]]

不需要相同尺寸的Di。这就是我使用列表的原因(因为我无法在没有填充的情况下将此列表转换为张量)

我想做的是:

temp=[]
对于步进范围(T):
临时追加(tf.减少总和(x[步进],轴=0))
总和=tf.堆栈(温度)
其中x=my_列表,长度n。 这段代码将转换我的输入列表x,如下所示:

[[D0,K],[D1,K],…[Dn,K]]
进入

[n,K]
其中,我实际对每个Di行求和,因此,大小为[n,K]的新张量的第j行包含:sum([Dj,K],axis=0)

问题是如果我使用python来。。。loop我不确定反向传播是否真的会起作用(我对TensorFlow很陌生,但我认为如果我不使用while\u loop函数,我的操作将不会添加到图中,因此使用本机python for loop没有意义?)

所以我试着用tensorflow while_循环重新编码这段代码。 代码如下:

def reduce_it(i,输出):
i_row=tf.reduce_sum(x[i],axis=0)#x[i]抛出一个错误,因为i是张量
输出=输出。写入(i,i_行)
返回i+1,输出
temp=tf.TensorArray(数据类型=tf.float32,推断形状=False,大小=1,
动态(单位大小=真)
_,temp=tf.while_循环(λi,*args:tf.less(i,T),
降低温度[0,温度])
temp=临时堆栈()
我已经看到有人问过这个问题,但没有人能给他一个解决办法。我试图将张量I转换为整数,方法是传递一个numpy数组,在while循环中我在该数组上添加元素,以获得该数组的形状:

def reduce_it(arr,输出):
idx=arr.shape[0]-1#使用数组的shape[0]作为i
i_行=tf。减少总和(x[idx],轴=0)
输出=输出写入(tf.常数([idx]),i_行)
arr=np.append(arr,0)
返回arr,输出
temp=tf.TensorArray(数据类型=tf.float32,推断形状=False,大小=1,
动态(单位大小=真)
_,temp=tf.while_循环(λarr,*args:tf.less(arr.shape[0],T),
减少它,[np.array([0]),temp])
temp=临时堆栈()
但它不起作用,因为我的数组的形状在循环过程中发生了变化,所以我可能需要使用while_循环的shape_不变量选项,但我没有找到一个工作代码

此外,我还通过添加填充将列表转换为张量,这样我的张量大小为:[T,max(Di),K],但我仍然需要知道我在循环的每次迭代中使用的是哪个维度的Di,这意味着我需要创建一个大小为n的张量(1d数组),其中Di作为位置I上的数字:

my_张量=[D1,D2,…,Dn]
然后我需要在while循环中收集Di,但如果我只是这样做:

my_dim=tf.gather(my_张量,i)
我只收集一个张量,需要一个整数

我认为我无法定义会话并恢复我的_dim.eval(),因为这段代码是我的模块的一部分,然后在培训期间调用该模块(此时我创建了一个会话)

TF的一些专家能想到一个解决方法或黑客

先谢谢你

注意:填充也是一种解决方案,但实际上在我的代码后面,我需要得到大小为[Di,K]的每个初始矩阵,因此如果我填充[Di,K],以便可以构建形状张量:

[n,最大值(Dn),K]
然后,我仍然需要恢复每个[Di,K],以便能够使用具有正确维度的tf.matmul()(例如操作)。所以填充实际上不是我的解决方案


我希望我的帖子足够清晰。

在下面找到一个可能的解决方案,但是我不建议对
t
的大值使用这个方法(这个方法创建的操作与
我的列表中的元素一样多)

你用零填充张量的想法似乎是个好主意。如果我正确理解您的最终目标,那么这些额外的零不应该影响您的
tf。减少总和(x[idx],axis=0)
(但是,由于与以前相同的原因,对于较大的
t
,可能不建议使用此解决方案)

最后,您还可以尝试将代码转换为使用和


使用
tf.case()和
tf.while\u loop()解决方案
将tensorflow导入为tf
将numpy作为np导入
T=10
my_list=[tf.ones((np.random.randint(2,42))(对于范围(T)内的i)]#随机大小张量列表
def reduce_it(i,输出):
获取\u列表\u元素的\u lambda\u=lambda idx:lambda:my\u list[idx]
cases={tf.equal(i,idx):获取范围(len(my_list))内idx的_列表元素(idx)的_lambda_}
x=tf.case(cases,exclusive=True)
#我不清楚我的_列表包含什么/你的循环应该计算什么。
#下面是一个假设循环计算的玩具示例:
#输出[i]=tf.范围(T)内i的减少_和(我的_列表[i])
i_行=tf.减少总和(x)
指数=tf.范围(0,T)
输出=tf.where(tf.equal(索引,i),tf.tile(tf.expand_dims(i_行,0),[T]),输出)
返回i+1,输出
温度=温度零点((T))
_,temp=tf.while_循环(lambda i,*args:tf.less(i,T),reduce_it,[0,temp])
使用tf.Session()作为sess:
res=sess.运行(温度)
打印(res)
# [37.  2. 22. 16. 37. 40. 10.  3. 12. 26.]
#检查值是否正确:
打印([sess.run(tf.reduce_sum(tensor)),用于我的列表中的张量])
# [37.0, 2.0, 22.0, 16.0, 37.0, 40.0, 10.0, 3.0, 12.0, 26.0]
使用
tf.pad()解决方案
导入张量