我自己的一个体会,在学习机器学习和深度学习的过程里,包括阅读模型源码的过程里,一个比较大的阻碍是对numpy掌握的不熟,有的时候对矩阵的维度,矩阵中每个元素值的含义晕乎乎的.

本文就以一个2 x 2 x 3的三维矩阵为例,说明矩阵是如何表示图像的.

3d array表示一个图片.比如对ex = numpy.array([ [ [1, 2, 3], [4, 5, 6] ], [ [7, 8, 9], [0, 1, 2] ] ]),ex代表的维度是怎样的?

其实类似于list of list.

  1. 先看最外层的list内有几个list,可以看到有2个[],分别为[ [1, 2, 3], [4, 5, 6] ] 和 [ [7, 8, 9], [0, 1, 2] ],我们分别称之为l1,l2 所以第一个维度是2
  2. 再看上述的l1,l2内有几个list.以[ [1, 2, 3], [4, 5, 6] ]为例,有2个,分别为[1,2,3] 和 [4,5,6] 我们称之为l3,l4 所以第二个维度是2
  3. 再看上述的l3,l4有几个list.以[1,2,3]为例,可以看到已经不再有list了.内部是3个数.所以这是最后一个维度了,维度为3.

所以,我们现在就得出ex是一个2 X 2 X 3的矩阵.假设说它代表一副图的话,代表的就是一个3通道的图片,图片尺寸为2 X 2.

即我们有4个像素点,第一个像素点的rgb值为(1,2,3) 第二个像素点rgb值为(4,5,6)..以此类推.

看一段对图片做预处理的代码.

在用opencv读图像时,是按bgr的顺序读的.

def prep_image(img, inp_dim):
"""
Prepare image for inputting to the neural network. Returns a Variable
"""
img = (letterbox_image(img, (inp_dim, inp_dim)))
img = img[:,:,::-1].transpose((2,0,1)).copy()

重点看img = img[:,:,::-1].transpose((2,0,1)).copy().

::-1表示在这一维度做倒序.通过前面的分析知道第三个维度表示rgb,所以img[:,:,::-1]可以表示前两个维度不变,第三个维度倒序,则此时bgr的表示变成了rgb. 此时矩阵代表的是h x w x c.我们想转换成c x h x w. 原先的第0,1,2维度分别代表h,w,c. 则transpose((2,0,1))代表转换成矩阵c x h x w.

结合下面测试代码体会一下,看看每个元素此时表达什么含义.相信对用三维矩阵表达图片应该不再有问题了.

import numpy
ex = numpy.array([ [ [1, 2, 3], [4, 5, 6] ], [ [7, 8, 9], [0, 1, 2] ] ])
#2 x 2 x 3 print(ex[0][0][0])
print(ex[0][0][1])
print(ex[0][0][2]) ex=ex[:,:,::-1]
print(ex)
print(ex[0][0][0])
print(ex[0][0][1])
print(ex[0][0][2]) print(ex.transpose((2,0,1)))

输出如下:

最新文章

  1. JAVA源码分析-HashMap源码分析(一)
  2. 定制Eclipse IDE之功能篇(一)
  3. 使用 data-* 属性来嵌入自定义数据
  4. BRIEF算法
  5. [转]30分钟学会反向Ajax
  6. 使用zookeeper实现分布式master选举(c 接口版本)
  7. Play Framework 发现并没有热启动的特殊情况
  8. OpenGL4-绘制旋转的立方体
  9. php异步加载、多线程fsockopen()、fputs()
  10. python 错误、调试和测试
  11. Gems
  12. [转] GPS坐标转换经纬度及换算方法
  13. Django REST framework使用ViewSets的自定义路由实现过程
  14. 想做iPhoneX抢购活动?压测大师先教你优化网站后台
  15. 解决Flink输出日志中时间比当前时间晚8个小时的问题
  16. Asp.Net Core 轻松学-HttpClient的演进和避坑
  17. 我常用的sublime快捷键整理
  18. 聊聊基准测试的MVP方案
  19. mongoDB工具类以及测试类【java】
  20. Redis缓存用起来

热门文章

  1. duilib禁止標題欄雙擊放大窗口
  2. 改善C#程序的建议1:非用ICloneable不可的理由
  3. Qt 5.6.0 动态编译(VS2013 x86 target xp openssl icu webkit)
  4. ASP.NET Web API 直到我膝盖中了一箭【1】基础篇
  5. CentOS7.x mini安装OVS
  6. spring boot 2.x 系列 —— spring boot 整合 druid+mybatis
  7. Mui a 链接失效的解决办法
  8. 系统学习 Java IO (三)----文件类 File
  9. Java:HashMap原理与设计缘由
  10. Python静态方法,其实暗藏玄机