def random_mini_batches(X,Y,mini_batch_size=64,seed=0):"""從(X,Y)中創建一個隨機的mini-batch列表
參數:
X - 輸入數據,維度為(輸入節點數量,樣本的數量)
Y - 對應的是X的標簽,【1 | 0】(藍|紅),維度為(1,樣本的數量)
mini_batch_size - 每個mini-batch的樣本數量
返回:
mini-bacthes - 一個同步列表,維度為(mini_batch_X,mini_batch_Y)"""np.random.seed(seed)#指定隨機種子
m = X.shape[1]
mini_batches=[]#第一步:打亂順序
permutation = list(np.random.permutation(m)) #它會返回一個長度為m的隨機數組,且里面的數是0到m-1
shuffled_X = X[:,permutation] #將每一列的數據按permutation的順序來重新排列。
shuffled_Y = Y[:,permutation].reshape((1,m))"""#博主注:
#如果你不好理解的話請看一下下面的偽代碼,看看X和Y是如何根據permutation來打亂順序的。
x = np.array([[1,2,3,4,5,6,7,8,9],
[9,8,7,6,5,4,3,2,1]])
y = np.array([[1,0,1,0,1,0,1,0,1]])
random_mini_batches(x,y)
permutation= [7, 2, 1, 4, 8, 6, 3, 0, 5]
shuffled_X= [[8 3 2 5 9 7 4 1 6]
[2 7 8 5 1 3 6 9 4]]
shuffled_Y= [[0 1 0 1 1 1 0 1 0]]"""
#第二步,分割
num_complete_minibatches = math.floor(m / mini_batch_size) #把你的訓練集分割成多少份,請注意,如果值是99.99,那么返回值是99,剩下的0.99會被舍棄
for k inrange(0,num_complete_minibatches):
mini_batch_X= shuffled_X[:,k * mini_batch_size:(k+1)*mini_batch_size]
mini_batch_Y= shuffled_Y[:,k * mini_batch_size:(k+1)*mini_batch_size]"""#博主注:
#如果你不好理解的話請單獨執行下面的代碼,它可以幫你理解一些。
a = np.array([[1,2,3,4,5,6,7,8,9],
[9,8,7,6,5,4,3,2,1],
[1,2,3,4,5,6,7,8,9]])
k=1
mini_batch_size=3
print(a[:,1*3:(1+1)*3]) #從第4列到第6列
'''
[[4 5 6]
[6 5 4]
[4 5 6]]
'''
k=2
print(a[:,2*3:(2+1)*3]) #從第7列到第9列
'''
[[7 8 9]
[3 2 1]
[7 8 9]]
'''
#看一下每一列的數據你可能就會好理解一些"""mini_batch=(mini_batch_X,mini_batch_Y)
mini_batches.append(mini_batch)#如果訓練集的大小剛好是mini_batch_size的整數倍,那么這里已經處理完了
#如果訓練集的大小不是mini_batch_size的整數倍,那么最后肯定會剩下一些,我們要把它處理了
if m % mini_batch_size !=0:#獲取最后剩余的部分
mini_batch_X = shuffled_X[:,mini_batch_size *num_complete_minibatches:]
mini_batch_Y= shuffled_Y[:,mini_batch_size *num_complete_minibatches:]
mini_batch=(mini_batch_X,mini_batch_Y)
mini_batches.append(mini_batch)return mini_batches