簡體   English   中英

需要幫助理解 GPT-2s 源代碼中的 Python 函數

[英]Need Help understanding a Python Function in GPT-2s Source Code

我正在 Github 中瀏覽 GPT-2 的源代碼。 我試圖了解這一切是如何運作的。 我被一個函數難住了,我希望有人能向我解釋發生了什么。

https://github.com/nshepperd/gpt-2/blob/finetuning/src/model.py

代碼可以在上面鏈接中的 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() 返回的內容以及靜態和動態形狀之間的差異進行了一些研究: 如何理解 TensorFlow 中的靜態形狀和動態形狀?

我也通讀了這一系列文章: https : //medium.com/analytics-vidhya/understanding-the-gpt-2-source-code-part-3-9796a5a5cc7c

盡管讀了這么多,我還是不完全確定發生了什么。 我不清楚的是最后一句話:

return [dynamic[i] if s is None else s for i, s in enumerate(static)]

它到底在說什么? 我的猜測是函數的目的是確定 X 的值是否已經定義。 如果沒有,則返回靜態形狀,如果有,則返回動態形狀。

我離這兒很遠嗎?

您的問題不在於 Tensorflow,而在於 Python 中的列表推導式,這是一種基於其他可迭代對象定義列表的更 Python 化的方式。

最后一條語句(幾乎*)相當於:

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

* : 關於上面的“幾乎”,其實推導的效率更高,因為內部是為整個結果預先分配內存,而循環每次迭代都會appends s,從而導致擴展列表時多次分配,比較慢.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM