在加載模型中的tensor_name,用到了這部分知識,特此記錄:
舉個例子;
import numpy as np
variables_to_restore = ['wc1','wc2','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam']
for var in variables_to_restore:
print(var)
if var.find('Adam')>=0:
variables_to_restore.remove(var)
print(variables_to_restore)
輸出:
['wc1', 'wc2', 'wc1/Adam_1', 'wc2/Adam', 'wc1/Adam_1', 'wc2/Adam']
很明顯我們的代碼,是要找到列表中含子串“Adam” 的字符串並刪除,但是,含“Adam”的明顯沒有被完全刪除,因此筆者開始分析原因,因爲variables_to_restore是動態變化的,所以遍歷自然不同,因此筆者猜想,如果遇到刪除的項則刪除,且會跳過下一項,遍歷下下一項。筆者爲了驗證自己的想法,特此重新打亂順序做了實驗:
import numpy as np
variables_to_restore = ['wc1','wc2','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam']
for var in variables_to_restore:
print(var)
if var.find('Adam_1')>=0:
variables_to_restore.remove(var)
print(variables_to_restore)
結果:
['wc1','wc2','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam']
['wc1', 'wc2', 'wc1/Adam', 'wc2/Adam_1', 'wc2/Adam', 'wc1/Adam', 'wc2/Adam_1', 'wc2/Adam']
這驗證了筆者的猜想。
那麼爲了完全刪除應該怎麼辦呢?有的同學會想,好,那我重新聲明一個list不就好了,於是開始這樣做:
import numpy as np
variables_to_restore = ['wc1','wc2','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam']
for var in variables_to_restore:
print(var)
if var.find('Adam')>=0:
variables_to_restore.remove(var)
print(variables_to_restore)
結果:
['wc1', 'wc2', 'wc1/Adam_1', 'wc2/Adam', 'wc1/Adam_1', 'wc2/Adam']
就驚呆了,明明重新定義了一個list爲什麼還是不行,其實這就跟python的機制有關係了,直接通過名字來賦值,相當於兩個命名指向同一塊內存區域,操作的時候雖然名字不同,但是是同一數據!!
正確做法:
import numpy as np
variables_to_restore = ['wc1','wc2','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam']
variables_map = ['wc1','wc2','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam','wc1/Adam','wc1/Adam_1','wc2/Adam_1','wc2/Adam']
for var in variables_map:
print(var)
if var.find('Adam')>=0:
variables_to_restore.remove(var)
print(variables_to_restore)
結果:
['wc1', 'wc2']
正確的做法是重新將數據賦值給一個新變量,開闢新的內存區域。
PS:python 子串查找
str.find() #未找到返回-1,找到返回索引>=0
list_site.remove(var) #從列表中刪除某個值