最近在作tensorflow相關項目時,遇到一個問題是這樣的:app
訓練程序運行後損失函數loss開始在不斷減少,沒過多久卻愈來愈大,最後固定值不變。dom
還覺得產生了震盪,但最後loss一直保持不變讓人疑惑,或者是模型哪塊出了問題仍是優化函數出了問題,調試了好久仍是很不正常,因而擺出了不找到緣由不罷休的氣勢來,調試了兩天終於發現,原來是random.shuffle函數搗的鬼。想到tensorflow中tensor處理數據是numpy.array類型,在批量訓練時候,將array類型數據傳給feed_dict參數。在傳給feed_dict以前,對數據順序有個隨機打亂操做,用到了random.shuffle函數。問題就處在這:random.shuffle對numpy.array類型多維矩陣數據進行操做時會出現不能理解的結果。函數
random.shuffle函數:用於list類型沒問題,用於array類型會出現問題,舉例說明:優化
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) 輸出結果: 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]]
能夠看出,對array進行shuffle操做並無按行順序打亂,而是出現多個重複的行(感受很奇怪,具體邏輯沒研究,但對一維array數據是可行的。) 其實,array數據有專門打亂順序的函數: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) 輸出結果: 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]]
記錄一下。同時,特別提醒你們不要和我同樣犯一樣錯誤。code