在深度学习任务中,把数据丢给模型训练之前一般都要对数据进行归一化操作,操作的方法有很多,这里用常见的减均值除方差举例。
在对三维矩阵的每层进行归一化操作之后,关键一步是要记着要对每层进行叠加操作,否则参加训练的数据内容还是未经归一化的数据。
例如对一个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很关键,如果没有这个叠加操作,你会发现for循环结束后imgs里面的数据还是未归一化的数据
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框架中使用,因此数据第一个维度是z轴。
还有一种更加简便的操作,但是这种操作要确定imgs的数据类型是否为float型,如果是int型要先转成float型。因为在进行归一化操作的时候,肯定会产生float型数据,如果imgs原始是int型,那归一化产生的数据也会转为int型,这样会大大降低归一化的准确性。
#如果原始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,:,:])
顺便也介绍一下数据类型的查看方式。举个例子,brain_label是一个三维矩阵,下图是它属性的查看方式。
要注意区分dtype和type的不同。