使用numpy解决图像维度变换问题

在这篇文章中:

  • numpy函数介绍
    • 1. np.transpose(input, axes=None)
    • 2. np.concatenate((a1, a2, …), axis=0)
    • 3. np.newaxis
  • 实践出真知
    • 1. 扩展出一个新的维度用来表示channel
    • 2.叠加channel
    • 3.维度转置
    • 4.验证是否正确
    • 5.整体演示代码

numpy函数介绍

1. np.transpose(input, axes=None)

在机器学习中经常会碰到各种图像数据集,有的是按照num*height*width*channel来存储的,而有的则是num*channel*height*width。然后每次碰到这种问题都会想半天该怎么相互变换。

也想过自己手敲代码实现,但是一方面速度肯定没别人的方法好,另一方面还不一定是对的233。其实numpy已经帮我们都弄好了,我们只要使用np.transpose方法即可。

例如输入数据是a.shape = 1000*32*32*3(num*height*width*channel)

我们只需要使用如下代码即可达到要求。

  1. a = np.transpose(a, [0,3,1,2]) 

2. np.concatenate((a1, a2, …), axis=0)

  • 参数1:表示需要叠加的一组矩阵,可以是元组形式 (a1, a2, …),也可以是列表形式[a1,a2,…]。另外,各个矩阵的维度必须保持一致!
  • 参数2:axis默认为0,当然也可以设置为其他的值。

3. np.newaxis

这个可以用于扩展一个新的维度,例如假设我们的标签y.shape=(10,),我们想把它变成**(10,1)**该怎么做?很简单:

  1. y = y[:, np.newaxis] 
  2. # 其实也可以这样
  3. y = np.reshape(y, [len(y),1]) 

效果图如下:

使用numpy解决图像维度变换问题_第1张图片

实践出真知

现假设我们有一组二维图像数据集,其大小为3*2*2 (num*height*width)。我们现在想将这个二维数据集转化成3维的,而且最后维度顺序要是num*height*width*channel,我们应该咋办呢?

1. 扩展出一个新的维度用来表示channel

新增加一个维度,建议先将channel增加在第二个维度,这样更好理解,而且数据不会被打乱。

使用numpy解决图像维度变换问题_第2张图片

2.叠加channel

3.维度转置

4.验证是否正确

最后来验证一下这一波操作是否正确:

使用numpy解决图像维度变换问题_第3张图片

可以看到是正确的!!!

5.整体演示代码

import numpy as np
y=np.random.randn(10)
y.shape

y1=y[:,np.newaxis]

y1.shape

y2=np.reshape(y,[len(y),1])
y2.shape

a=np.random.random((3,2,2))
b=a[:,np.newaxis,:,:]
b[0,0,:,:]==a[0,:,:]

b.shape

c= np.concatenate([b,b,b],axis=1)
c.shape

c.shape

d =np.transpose(c,[0,2,3,1])
d.shape

d[:,:,:,0]==a

 

你可能感兴趣的:(TensorFlow,图像处理与机器视觉,机器学习,线性代数与矩阵分析,深度学习)