[英]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.