在深度學(xué)習(xí)任務(wù)中,把數(shù)據(jù)丟給模型訓(xùn)練之前一般都要對數(shù)據(jù)進行歸一化操作,操作的方法有很多,這里用常見的減均值除方差舉例。
在對三維矩陣的每層進行歸一化操作之后,關(guān)鍵一步是要記著要對每層進行疊加操作,否則參加訓(xùn)練的數(shù)據(jù)內(nèi)容還是未經(jīng)歸一化的數(shù)據(jù)。
例如對一個z軸方向有20層,大小為256*256的三維矩陣imgs進行歸一化
for i , brain_slice in enumerate(imgs):
brain_slice = (brain_slice - np.mean(brain_slice))/np.std(brain_slice)
#下面的if...else很關(guān)鍵,如果沒有這個疊加操作,你會發(fā)現(xiàn)for循環(huán)結(jié)束后imgs里面的數(shù)據(jù)還是未歸一化的數(shù)據(jù)
if i == 0:
imgs = np.reshape(brain_slice, [1,brain_slice.shape[0],brain_slice.shape[1]])
else:
imgs = np.concatenate((imgs, np.reshape(brain_slice, [1,brain_slice.shape[0],brain_slice.shape[1]])), axis = 0)
此代碼是在Keras框架中使用,因此數(shù)據(jù)第一個維度是z軸。
還有一種更加簡便的操作,但是這種操作要確定imgs的數(shù)據(jù)類型是否為float型,如果是int型要先轉(zhuǎn)成float型。因為在進行歸一化操作的時候,肯定會產(chǎn)生float型數(shù)據(jù),如果imgs原始是int型,那歸一化產(chǎn)生的數(shù)據(jù)也會轉(zhuǎn)為int型,這樣會大大降低歸一化的準(zhǔn)確性。
#如果原始imgs是int型,那下面的第一句代碼是很有必要的
imgs = np.array(imgs, np.float32)
for i in range(imgs.shape[0]):
imgs[i,:,:] = (imgs[i,:,:] - np.mean(imgs[i,:,:]))/np.std(imgs[i,:,:])
順便也介紹一下數(shù)據(jù)類型的查看方式。舉個例子,brain_label是一個三維矩陣,下圖是它屬性的查看方式。

print.png

result.png
要注意區(qū)分dtype和type的不同。