上两篇在使用numpy实现卷积和tensorflow实现卷积进行结果对比时,对数据有个转换处理。
因为在numpy构造数据的shape是[B,C,H,W]
,在tensorflow中输入默认要求shpae是[B,H,W,C]
,所以我们必须把维度进行转换。
在numpy里面有两个方法都可以让shape进行改变,reshape
和transpose
。下面我们就来看下两者对区别,以及我们应该使用哪一个才是正确的。
先构造一个[3,5,5]的数据,代表3个5*5大小的矩阵。
代码语言:javascript复制if __name__ == '__main__':
inputs = np.zeros([3,5,5])
for i in range(3):
for j in range(5):
for z in range(5):
inputs[i][j][z] = i j z
数据打印
代码语言:javascript复制inputs
[[[ 0. 1. 2. 3. 4.]
[ 1. 2. 3. 4. 5.]
[ 2. 3. 4. 5. 6.]
[ 3. 4. 5. 6. 7.]
[ 4. 5. 6. 7. 8.]]
[[ 1. 2. 3. 4. 5.]
[ 2. 3. 4. 5. 6.]
[ 3. 4. 5. 6. 7.]
[ 4. 5. 6. 7. 8.]
[ 5. 6. 7. 8. 9.]]
[[ 2. 3. 4. 5. 6.]
[ 3. 4. 5. 6. 7.]
[ 4. 5. 6. 7. 8.]
[ 5. 6. 7. 8. 9.]
[ 6. 7. 8. 9. 10.]]]
然后我们执行分别执行下transpose和reshape,并且运行看下结果
代码语言:javascript复制def numpy_transpose(data):
#把维度进行转换,[3,5,5]转换为[5,5,3]
result = data.transpose((1,2,0))
print("numpy_transpose n",result,"n")
def numpy_reshape(data):
C,H,W=data.shape
#[3,5,5]变形为[5,5,3]
r_data=data.reshape((H,W,C))
print("numpy_reshape n",r_data,"n")
numpy_reshape
[[[ 0. 1. 2.]
[ 3. 4. 1.]
[ 2. 3. 4.]
[ 5. 2. 3.]
[ 4. 5. 6.]]
[[ 3. 4. 5.]
[ 6. 7. 4.]
[ 5. 6. 7.]
[ 8. 1. 2.]
[ 3. 4. 5.]]
[[ 2. 3. 4.]
[ 5. 6. 3.]
[ 4. 5. 6.]
[ 7. 4. 5.]
[ 6. 7. 8.]]
[[ 5. 6. 7.]
[ 8. 9. 2.]
[ 3. 4. 5.]
[ 6. 3. 4.]
[ 5. 6. 7.]]
[[ 4. 5. 6.]
[ 7. 8. 5.]
[ 6. 7. 8.]
[ 9. 6. 7.]
[ 8. 9. 10.]]]
numpy_transpose
[[[ 0. 1. 2.]
[ 1. 2. 3.]
[ 2. 3. 4.]
[ 3. 4. 5.]
[ 4. 5. 6.]]
[[ 1. 2. 3.]
[ 2. 3. 4.]
[ 3. 4. 5.]
[ 4. 5. 6.]
[ 5. 6. 7.]]
[[ 2. 3. 4.]
[ 3. 4. 5.]
[ 4. 5. 6.]
[ 5. 6. 7.]
[ 6. 7. 8.]]
[[ 3. 4. 5.]
[ 4. 5. 6.]
[ 5. 6. 7.]
[ 6. 7. 8.]
[ 7. 8. 9.]]
[[ 4. 5. 6.]
[ 5. 6. 7.]
[ 6. 7. 8.]
[ 7. 8. 9.]
[ 8. 9. 10.]]]
可以看到最终结果都是变成5个5*3的矩阵,reshape呢是按顺序开始排,看结果比较好理解。transpose是转置,只是维度进行来交换但是内部结构没有变。比如二维图像,转置就是进行来旋转,宽高进行来转置。对于三维就是想象为立放体从不同角度去观察它。
按理解自己实现transpose,可以运行和np.transpose进行对比。
代码语言:javascript复制def my_transpose(data):
C,H,W = data.shape
result = np.zeros((H,W,C))
for i in range(C):
result[:,:,i] = data[i,:,:]
print("my_transpose n ",result,"n")
因为在深度学习中,很多对多维矩阵对操作,而且被框架封装对很好, 如果不理解去使用,可能可以跑通算法不报错,但是最后结果是完全错误对,而且不好排查。 理解了原理后,后面在很多应用中就不会错误使用reshape和transpose啦~