【问题标题】:tensorflow, tf.while_loop: The two structures don't have the same nested structuretensorflow, tf.while_loop:这两个结构没有相同的嵌套结构
【发布时间】:2019-08-24 08:57:41
【问题描述】:

我尝试构建一个嵌套循环,用于创建一个二维零矩阵来解决 LCS 问题(动态规划)。这稍后用于计算 Rouge-L 分数(输入是张量,而不是字符串),但提高 ValueError: The two structures don't have the same nested structure. 时总是出错

我查了一些类似的问题,修改了一些代码,但还是不行(我这里放的代码是最终代码):

  1. 我更改了 shape_invariants。我现在使用 len(inner) 来动态获取内部的形状。
  2. 还是 shape_invariants,我现在把 1 改成 0(shape_invariants 中的第一个参数)。我以为标量的形状是 1,但是我在 github 上查看了一些源代码,发现它都使用了 0。

# the origin code is below, in which sub and string are both string(type), len_sub and len_string are both int:

lengths = [[0 for i in range(0,len_sub+1)] for j in range(0,len_string+1)]

# but in the new code that I need, the sub and string are both tensor, so I code like this:

len_string = tf.shape(string)[0]
len_sub = tf.shape(sub)[0]

def _add_zeros(i,inner):
        inner.append(0)
        return i+1, inner
def _add_inners(j, lengths):
    i=0
    inner = []
    _, inner = tf.while_loop(
                cond=lambda i,*_: i<=len_sub,
                body=_add_zeros,
                loop_vars=[i,inner],
                shape_invariants=[0,len(inner)])
    lengths.append(inner)
    return j+1, lengths

lengths = []
j = 0  
_, lengths = tf.while_loop(
                cond=lambda j,*_: j<=len_string,
                body=_add_inners,
                loop_vars=[j,lengths],
                shape_invariants=[0,len(lengths)])
ValueError: The two structures don't have the same nested structure.  
First structure: type=list str=[0, []]  
Second structure: type=list str=[0, 0]  
More specifically: Substructure "type=list str=[]" is a sequence, while substructure "type=int str=0" is not  
Entire first structure:  
[., []]  
Entire second structure:  
[., .]  

我不知道为什么会出错。如果您能提供帮助,我将不胜感激。

【问题讨论】:

    标签: python tensorflow deep-learning


    【解决方案1】:

    嗨,基本上错误消息的意思是你的返回值是一个列表,而它期望它是一个数字,这是有道理的,因为你已经将 shape_invariants 定义为[0, len(lengths)],它们都是整数,因此是第二个结构定义为[.,.],但第一个结构是一个数字和一个列表[., []],当您传递长度时,它再次有意义。

    TLDR:将您的 shape_invariants=[0,len(lengths)]) 更改为 shape_invariants=[0,lengths]) 或将您的 loop_vars=[j,lengths] 更改为 loop_vars=[j,len(lengths)],

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-18
      • 2017-04-25
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      相关资源
      最近更新 更多