需要了解GPT-2s源代码中的Python函数的帮助吗

需要了解GPT-2s源代码中的Python函数的帮助吗,python,tensorflow,Python,Tensorflow,我正在Github中浏览GPT-2s源代码。我正在努力理解这一切是如何运作的。我被一个函数难住了,我希望有人能向我解释发生了什么 代码可以在上面的链接中的model.py中找到。具体来说: def shape_list(x): """Deal with dynamic shape in tensorflow cleanly.""" static = x.shape.as_list() dynamic = tf.shape(x) return [dynamic[i] if

我正在Github中浏览GPT-2s源代码。我正在努力理解这一切是如何运作的。我被一个函数难住了,我希望有人能向我解释发生了什么

代码可以在上面的链接中的model.py中找到。具体来说:

def shape_list(x):
   """Deal with dynamic shape in tensorflow cleanly."""
   static = x.shape.as_list()
   dynamic = tf.shape(x)
   return [dynamic[i] if s is None else s for i, s in enumerate(static)]
我在这里研究了Tensorflow.Shape()返回的内容以及静态和动态形状之间的差异:

我还通读了这一系列文章:

尽管读了那么多书,我还是不能完全确定到底发生了什么。我不清楚的是最后一句话:

return [dynamic[i] if s is None else s for i, s in enumerate(static)]
这里到底在说什么?我猜函数的目的是确定X的值是否已经定义。如果没有,则返回静态形状,如果有,则返回动态形状


我离这儿远吗

您的问题不在于Tensorflow,而在于python中的列表理解,这是一种基于其他iterables定义列表的更具python风格的方法

最后一条语句(几乎*)相当于:

ret = []
for i, s in enumerate(static):
  if s is None:
    ret.append(dynamic[i])
  else:
    ret.append(s)
return ret

*:关于上面的“几乎”,理解实际上更有效,因为它在内部为整个结果预先分配内存,而循环
在每次迭代中附加
s,因此在扩展列表时会导致多次分配,这会更慢。

这是否回答了您的问题?我已经通读了那个链接。我甚至把它贴在上面的问题上。我相信我理解在图形计算(动态)和图形定义(静态)期间返回形状的概念。我的问题是最后一句话。它背后的逻辑是什么?那么您的问题不在于任何Tensorflow,而在于python中的列表理解。最后一句话是“构建一个列表,其中每个元素都是来自
静态
的匹配元素,如果不是
,则是来自
动态
的匹配元素”(注释中的拼写看起来很糟糕,但基本上这只是一个重新排列的for循环。查找列表理解,很快就会清楚)哦,好吧,这更有意义。谢谢你的帮助。如何将您的评论标记为答案?您不需要评论,但我会删除它并将其移动到答案(在那里我还可以更好地解释)