Python三维矩阵的归一化操作

在深度学习任务中,把数据丢给模型训练之前一般都要对数据进行归一化操作,操作的方法有很多,这里用常见的减均值除方差举例。
在对三维矩阵的每层进行归一化操作之后,关键一步是要记着要对每层进行叠加操作,否则参加训练的数据内容还是未经归一化的数据。
例如对一个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是一个三维矩阵,下图是它属性的查看方式。

print.png


result.png

要注意区分dtype和type的不同。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容