最近在做tensorflow相關(guān)項(xiàng)目時(shí)司抱,遇到一個(gè)問題是這樣的:
訓(xùn)練程序運(yùn)行后損失函數(shù)loss開始在不斷減小绳锅,沒過多久卻越來越大,最后固定值不變。
還以為產(chǎn)生了震蕩宝恶,但最后loss一直保持不變讓人疑惑墩新,或者是模型哪塊出了問題還是優(yōu)化函數(shù)出了問題锰什,調(diào)試了很久還是很不正常小压,于是擺出了不找到原因不罷休的氣勢(shì)來,調(diào)試了兩天終于發(fā)現(xiàn)蒸播,原來是random.shuffle函數(shù)搗的鬼睡榆。想到tensorflow中tensor處理數(shù)據(jù)是numpy.array類型,在批量訓(xùn)練時(shí)候袍榆,將array類型數(shù)據(jù)傳給feed_dict參數(shù)胀屿。在傳給feed_dict之前,對(duì)數(shù)據(jù)順序有個(gè)隨機(jī)打亂操作包雀,用到了random.shuffle函數(shù)宿崭。問題就處在這:random.shuffle對(duì)numpy.array類型多維矩陣數(shù)據(jù)進(jìn)行操作時(shí)會(huì)出現(xiàn)不能理解的結(jié)果。
random.shuffle函數(shù):用于list類型沒問題才写,用于array類型會(huì)出現(xiàn)問題葡兑,舉例說明:
import random
import numpy as np
a = []
for i in range(10):
a.append([i]*5)
b = a[:]
b = np.array(b)
print('a',a)
print('b',b)
random.shuffle(a)
random.shuffle(b)
print('shuffle a:',a)
print('shuffle b:',b)
輸出結(jié)果:
a: [[0, 0, 0, 0, 0], [1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5], [6, 6, 6, 6, 6], [7, 7, 7, 7, 7], [8, 8, 8, 8, 8], [9, 9, 9, 9, 9]]
b: [[0 0 0 0 0]
[1 1 1 1 1]
[2 2 2 2 2]
[3 3 3 3 3]
[4 4 4 4 4]
[5 5 5 5 5]
[6 6 6 6 6]
[7 7 7 7 7]
[8 8 8 8 8]
[9 9 9 9 9]]
shuffle a: [[1, 1, 1, 1, 1], [0, 0, 0, 0, 0], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [9, 9, 9, 9, 9], [8, 8, 8, 8, 8], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5], [7, 7, 7, 7, 7], [6, 6, 6, 6, 6]]
shuffle b: [[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[3 3 3 3 3]
[1 1 1 1 1]
[3 3 3 3 3]
[6 6 6 6 6]
[0 0 0 0 0]
[6 6 6 6 6]
[6 6 6 6 6]]
可以看出,對(duì)array進(jìn)行shuffle操作并沒有按行順序打亂赞草,而是出現(xiàn)多個(gè)重復(fù)的行(感覺很奇怪讹堤,具體邏輯沒研究,但對(duì)一維array數(shù)據(jù)是可行的。)
其實(shí)厨疙,array數(shù)據(jù)有專門打亂順序的函數(shù):numpy.random.shuffle(arr)
import random
import numpy as np
a = []
for i in range(10):
a.append([i]*5)
print('a:',a)
b = a[:]
b = np.array(b)
print('b:',b)
random.shuffle(a)
np.random.shuffle(b)
print('shuffle a:',a)
print('shuffle b:',b)
輸出結(jié)果:
a: [[0, 0, 0, 0, 0], [1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5], [6, 6, 6, 6, 6], [7, 7, 7, 7, 7], [8, 8, 8, 8, 8], [9, 9, 9, 9, 9]]
b: [[0 0 0 0 0]
[1 1 1 1 1]
[2 2 2 2 2]
[3 3 3 3 3]
[4 4 4 4 4]
[5 5 5 5 5]
[6 6 6 6 6]
[7 7 7 7 7]
[8 8 8 8 8]
[9 9 9 9 9]]
shuffle a: [[6, 6, 6, 6, 6], [8, 8, 8, 8, 8], [0, 0, 0, 0, 0], [2, 2, 2, 2, 2], [4, 4, 4, 4, 4], [7, 7, 7, 7, 7], [1, 1, 1, 1, 1], [9, 9, 9, 9, 9], [3, 3, 3, 3, 3], [5, 5, 5, 5, 5]]
shuffle b: [[2 2 2 2 2]
[4 4 4 4 4]
[6 6 6 6 6]
[1 1 1 1 1]
[0 0 0 0 0]
[7 7 7 7 7]
[9 9 9 9 9]
[5 5 5 5 5]
[3 3 3 3 3]
[8 8 8 8 8]]
記錄一下洲守。同時(shí),特別提醒大家不要和我一樣犯同樣錯(cuò)誤。