PyTorch 深度学习实战
方远
LINE China 数据科学家
10381 人已学习
新⼈⾸单¥59
登录后,你可以任选3讲全文学习
课程目录
已完结/共 32 讲
开篇词 (1讲)
PyTorch 深度学习实战
15
15
1.0x
00:00/00:00
登录|注册

03 | NumPy(下):深度学习中的常用操作

你好,我是方远。
通过上节课的学习,我们已经对 NumPy 数组有了一定的了解,正所谓实践出真知,今天我们就以一个图像分类的项目为例,看看 NumPy 的在实际项目中都有哪些重要功能。
我们先从一个常见的工作场景出发,互联网教育推荐平台,每天都有千万量级的文字与图片的广告信息流入。为了给用户提供更加精准的推荐,你的老板交代你设计一个模型,让你把包含各个平台 Logo(比如包含极客时间 Logo)的图片自动找出来。
想要解决这个图片分类问题,我们可以分解成数据加载、训练与模型评估三部分(其实基本所有深度学习的项目都可以这样划分)。其中数据加载跟模型评估中,就经常会用到 NumPy 数组的相关操作。
那么我们先来看看数据的加载。

数据加载阶段

这个阶段我们要做的就是把训练数据读进来,然后给模型训练使用。训练数据不外乎这三种:图片、文本以及类似二维表那样的结构化数据。
不管使用 PyTorch 还是 TensorFlow,或者是传统机器学习的 scikit-learn,我们在读入数据这一块,都会先把数据转换成 NumPy 的数组,然后再进行后续的一系列操作。
对应到我们这个项目中,需要做的就是把训练集中的图片读入进来。对于图片的处理,我们一般会使用 Pillow 与 OpenCV 这两个模块。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了NumPy在深度学习中的重要性,并以图像分类项目为例,详细介绍了NumPy在数据加载、训练和模型评估中的常用操作。在数据加载阶段,使用Pillow和OpenCV模块将图片转换为NumPy数组,并讨论了两者的区别。此外,还介绍了NumPy数组的索引、切片和合并操作,以及如何处理RGB格式的图片数据。通过实际代码演示,帮助读者快速了解NumPy在深度学习项目中的实际应用,为进一步学习和应用提供了基础知识。 文章还介绍了深拷贝与浅拷贝的概念,以及NumPy中的argmax、argmin和argsort等函数的使用方法,帮助读者更好地处理模型输出的概率数据。最后,通过一个练习,引导读者在实际操作中应用所学知识。 总的来说,本文通过丰富的示例和实际应用场景,使读者能够快速掌握NumPy在深度学习中的关键操作和技术要点。同时,作者还提醒读者注意深拷贝和浅拷贝的区别,以及在处理模型输出时的常用函数,为读者在深度学习项目中的实际应用提供了有力支持。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《PyTorch 深度学习实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(41)

  • 最新
  • 精选
  • IUniverse
    import numpy as np scores=np.random.rand(256,256,2) scores[:,:,0]=1-scores[:,:,1] mask=np.argmax(scores,axis=2) print(mask)

    作者回复: 你好,IUniverse。感谢你的留言。你的回答是正确的👍🏻。^^

    2021-10-15
    20
  • Yuhan
    方法一: result = np.argmax(scores, axis=2) 方法二: result = (scores[:, :, 0] < scores[:, :, 1]).astype('int')

    作者回复: 你好,Yuhan。感谢你的留言。👍🏻,你的答案是正确的。^^

    2021-10-15
    2
    12
  • 王骥
    im_pillow_c1_3ch = im_pillow.copy() im_pillow_c2_3ch = im_pillow.copy() im_pillow_c3_3ch = im_pillow.copy() # 只留 r 通道 im_pillow_c1_3ch[:, :, 1:] = 0 im_pillow_c1_3ch[:, :, 2:] = 0 # 只留 g 通道 im_pillow_c2_3ch[:, :, 0:] = 0 im_pillow_c2_3ch[:, :, 2:] = 0 # 只留 b 通道 im_pillow_c3_3ch[:, :, 0:] = 0 im_pillow_c3_3ch[:, :, 1:] = 0 老师,尝试用深拷贝来实现RGB通道过滤。R 显示没有问题,不过在显示 GB 通道的时候,获得的图片背景是黑色的。是我哪里理解出了问题吗?还是代码有问题?

    作者回复: 你好,王骥,感谢你的留言。 问题出现在最后的那个冒号上^^。 先看只留 r 通道的代码。 im_pillow_c1_3ch[:, :, 1:] = 0 这一行中的"1:"是指将从第一个通道到最后通道的所有数据赋值为0。 im_pillow_c1_3ch[:, :, 2:] = 0这一行中的"2:"是指将从第二个通道到最后通道的所有数据赋值为0。 其实,在第一行中已经把第二行的数据都赋值为0了。 又因为显示R通道的数据是将第1和第2个通道的数据都赋值为0,所以只有R的通道是正常显示出来。 在“只保留g通道”的代码中,"0:"是指从第0个通道开始到最后一个通道的所有数据都赋值为0,所以显示为黑色了。 “# 只留 b 通道”的代码同理。 可以这样修改代码: # 只留 r 通道 im_pillow_c1_3ch[:, :, 1:] = 0 # 只留 g 通道 im_pillow_c2_3ch[:, :, 0] = 0 im_pillow_c2_3ch[:, :, 2] = 0 # 只留 b 通道 im_pillow_c3_3ch[:, :, 0:1] = 0

    2021-10-24
    5
    5
  • cab
    OpenCV提取RGB通道很方便: b, g, r = cv2.split(image)

    作者回复: 你好,cab,感谢你的留言。是的,你说的没错👍🏻。OpenCV可以这么提取通道数据。 文中只是通过确定通道顺序这个小例子,引出Numpy数组的一些操作。

    2021-10-17
    2
  • nico
    请问下为什么这样合并下来都是红色底图的,第二种方式是可以的 im_pillow_c1_3ch = np.concatenate((im_pillow_c1, zeros), axis=2) im_pillow_c2_3ch = np.concatenate((im_pillow_c2, zeros), axis=2) im_pillow_c3_3ch = np.concatenate((im_pillow_c3, zeros), axis=2)

    作者回复: hi,你好,非常感谢你的留言。 为了引出np.newaxis和concatenate可能稍微有点绕了,concatenate讲的也有点不是很清楚,我稍后更新一下。 np.concatenate中第一个参数是要合并的数组,np.concatenate((im_pillow_c1, zeros), axis=2) 这么写就是要将im_pillow_c1与zeros沿着axis=2进行合并。合并后的数组的shape是(im_pillow_c1.shape[0], im_pillow_c1.shape[1], 3)。 从第三个维度上来看有三个值,第一个是im_pillow_c1,第二个是0,第三个也是0。 所以这么写下来im_pillow_c1_3ch, im_pillow_c2_3ch, im_pillow_c3_3ch都是一样的结果。 可以这么修改 zeros = np.zeros((im_pillow.shape[0], im_pillow.shape[1], 1)) im_pillow_c1 = im_pillow_c1[:,:,np.newaxis] im_pillow_c2 = im_pillow_c2[:,:,np.newaxis] im_pillow_c3 = im_pillow_c3[:,:,np.newaxis] im_pillow_c1_3ch = np.concatenate((im_pillow_c1, zeros, zeros),axis=2) im_pillow_c2_3ch = np.concatenate((zeros, im_pillow_c1, zeros),axis=2) im_pillow_c3_3ch = np.concatenate((zeros, zeros,im_pillow_c1),axis=2)

    2022-06-27
    1
  • clee
    你好,为什么我执行 im_pillow_c1 = im_pillow_c1[:, :, np.newaxis] 后打印im_pillow_c1的shape变量,输出是 (116, 318, 1, 1, 1), 而不是 (116, 318, 1,) 呢

    作者回复: 你好,clee,感谢你的留言。如果是用Jupyter的话,可以检查检查一个单元格是否被执行多次了。 比如“im_pillow_c1 = im_pillow_c1[:, :, np.newaxis] ”它所在的单元格。第一次被执行im_pillow_c1变为(116, 318, 1)。 不小心再次执行的话,不会报错,im_pillow_c1就变为(116, 318, 1,1)了。 如果还是不行的话,你可以把你的代码发给我看看。

    2021-10-25
    2
    1
  • 平常心
    老师,您好!想请教一下,下边这个问题: 课程中,您提到:“其实我们还有一种更加简单的方式获得三个通道的 BGR 数据,只需要将图片读入后,直接将其中的两个通道赋值为 0 即可。” im_pillow = np.array(im) im_pillow[:,:,1:]=0 这个出来的结果是:R通道的图像,想请教一下,G、B通道的图像,用同样的办法实现,代码im_pillow[:,:,:]=0应该是什么?谢谢

    作者回复: 你好,平常心,感谢你的留言。关于G与B通道的代码可以这样写。 ^^ # g 通道 im_pillow_c2_3ch = im_pillow.copy() im_pillow_c2_3ch[:, :, 0] = 0 im_pillow_c2_3ch[:, :, 2] = 0 # b 通道 im_pillow_c3_3ch = im_pillow.copy() im_pillow_c3_3ch[:, :, 0:1] = 0

    2021-10-24
    3
    1
  • 文森特没有眼泪
    mask = (s[:,:,0] > s[:,:,1]) mask = mask.astype('int')

    作者回复: 你好,文森特没有眼泪。首先,谢谢你的留言,然后为你的思路点赞👍🏻。 不过稍微有点小瑕疵,题目要求的是,如果通道0的值大于通道1的值,那么mask对应位置的数值就为0,否则为1。 你这样做的结果正好是相反了。 另外,你可以考虑考虑如何使用聚合函数np.argmax来求解,思考一下它的axis应该等于几,才能获得正确的答案。^^

    2021-10-15
    1
  • Geek_f3b405
    用PIL和opencv打开同一张图片得到的图片一个是4维的一个是3维的是什么情况

    作者回复: 感觉像是图像本身的问题。

    2023-11-30归属地:河南
  • Difer
    方法一遍历了整个数组(可能在某些条件下有用,但相对耗时),方法二则采用求特定轴上最大索引的方法 ## mthod1 a = scores[:, :, [0]] b = scores[:, :, [1]] mask_flat = [] for x, y in zip(a.flat, b.flat): if x > y: mask_flat.append(0) else: mask_flat.append(1) mask_m1 = np.asarray(mask_flat).reshape(256, 256) ## method2 mask_m2 = np.argmax(scores, axis=2) if (mask_m1 == mask_m2).all(): print(True)

    作者回复: 👍🏻

    2023-11-03归属地:吉林
收起评论
显示
设置
留言
41
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部