03 | NumPy(下):深度学习中的常用操作
数据加载阶段
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了NumPy在深度学习中的重要性,并以图像分类项目为例,详细介绍了NumPy在数据加载、训练和模型评估中的常用操作。在数据加载阶段,使用Pillow和OpenCV模块将图片转换为NumPy数组,并讨论了两者的区别。此外,还介绍了NumPy数组的索引、切片和合并操作,以及如何处理RGB格式的图片数据。通过实际代码演示,帮助读者快速了解NumPy在深度学习项目中的实际应用,为进一步学习和应用提供了基础知识。 文章还介绍了深拷贝与浅拷贝的概念,以及NumPy中的argmax、argmin和argsort等函数的使用方法,帮助读者更好地处理模型输出的概率数据。最后,通过一个练习,引导读者在实际操作中应用所学知识。 总的来说,本文通过丰富的示例和实际应用场景,使读者能够快速掌握NumPy在深度学习中的关键操作和技术要点。同时,作者还提醒读者注意深拷贝和浅拷贝的区别,以及在处理模型输出时的常用函数,为读者在深度学习项目中的实际应用提供了有力支持。
《PyTorch 深度学习实战》,新⼈⾸单¥59
全部留言(41)
- 最新
- 精选
- IUniverseimport 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-1520 - Yuhan方法一: result = np.argmax(scores, axis=2) 方法二: result = (scores[:, :, 0] < scores[:, :, 1]).astype('int')
作者回复: 你好,Yuhan。感谢你的留言。👍🏻,你的答案是正确的。^^
2021-10-15212 - 王骥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-2455 - cabOpenCV提取RGB通道很方便: b, g, r = cv2.split(image)
作者回复: 你好,cab,感谢你的留言。是的,你说的没错👍🏻。OpenCV可以这么提取通道数据。 文中只是通过确定通道顺序这个小例子,引出Numpy数组的一些操作。
2021-10-172 - 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-271 - 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-2521 - 平常心老师,您好!想请教一下,下边这个问题: 课程中,您提到:“其实我们还有一种更加简单的方式获得三个通道的 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-2431 - 文森特没有眼泪mask = (s[:,:,0] > s[:,:,1]) mask = mask.astype('int')
作者回复: 你好,文森特没有眼泪。首先,谢谢你的留言,然后为你的思路点赞👍🏻。 不过稍微有点小瑕疵,题目要求的是,如果通道0的值大于通道1的值,那么mask对应位置的数值就为0,否则为1。 你这样做的结果正好是相反了。 另外,你可以考虑考虑如何使用聚合函数np.argmax来求解,思考一下它的axis应该等于几,才能获得正确的答案。^^
2021-10-151 - 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归属地:吉林