記錄使用random-shuffle函數遇到的一個坑

最近在作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

相關文章
相關標籤/搜索