tensorflow, tf.while_loop: 这两个结构没有相同的嵌套结构

vvz*_*vzh 5 python deep-learning tensorflow

我试图构建一个嵌套循环,用于创建一个二维零矩阵来解决 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)])
Run Code Online (Sandbox Code Playgroud)
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:  
[., .]  
Run Code Online (Sandbox Code Playgroud)

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

Har*_*rry 0

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

TLDR:要么更改为shape_invariants=[0,len(lengths)])shape_invariants=[0,lengths])要么更改loop_vars=[j,lengths]loop_vars=[j,len(lengths)],