FastAi-CSV图像批量分类预测完美解决方案&ImageDataLoders源码解读&踩坑轨迹

图像训练数据集就是最基础的70000张minist数据集无图只有CSV,图片靠CSV生成或者直接使用像素数据。我们常规的操作是这样的:读取数据dls = ImageDataLoaders.from_folder(train_image_folder,valid_pct=0.2,seed=1024)迁移学习训练learn = cnn_learner(dls,models.resnet34)learn.lr_find()learn.fine_tune(1)图像预测-基于f.
摘要由CSDN通过智能技术生成

图像训练

数据集就是最基础的70000张minist数据集无图只有CSV,图片靠CSV生成或者直接使用像素数据。

我们常规的操作是这样的:

读取数据

dls = ImageDataLoaders.from_folder(train_image_folder,valid_pct=0.2,seed=1024)

迁移学习训练 

learn = cnn_learner(dls,models.resnet34)
learn.lr_find()
learn.fine_tune(1)

图像预测-基于fastai官方文档和fastbook(Course2020)

我们得到的示例有:

preds,targs = learn.get_preds()

 这样的。

x,y = dls.one_batch()
preds= learn.get_preds(dl=[(x,y)])

 还有这样的。

第一种不用多说,根本没有传入任何数据给到learn.get_preds(),第二种给到的数据是训练数据,同样是没有任何用的。

图像预测-踩坑轨迹

learn.predict()

那么learn.predict()呢?

答案是可以的,但是非常的慢。

learn.predict()方法可以接收一个PIL.Image类型的数据,而这个数据可以从ndarray生成,然后返回一个label。那么思路是迭代就完事了,实验证明这个办法也确实可以。就是仅仅28000个数据在1660 super(cuda算力7.5)上耗时接近500s,cuda算力占用在20%左右。

learn.predict()改进?

主要思路:拷贝多个learner放在多个线程中作预测,learner自带了learn.export()方法和heload_learner()方法,用这两个方法可以将训练learner保存为pkl文件,然后通过读取pkl获得想要数量的learner副本。

这个方法看似可行,但是在两种情况都表现欠佳:

  1. heload_learner(cpu = True) 在cpu上跑卷积,速度巨慢,cpu满载。测试环境为AMD Ryzen7 5800X(8C16T,pbo开启并手动拉到最高),讲道理比5800X强的零售级CPU并没有几款,性能差距也不会特别巨大,所以这种方法不可取。超算大佬除外。
  2. heload_learner(cpu = False)在gpu上跑,但是实验结果,gpu占用仍为20%左右, 基本上就是cpu每个线程都在摸鱼(占用率20%左右),并且pytorch并没有分配额外的显存用来预测,加上模型保存加载的耗时,最终耗时在600s左右。反向改进

 研究了一些介绍python多线程技术的文章,总的来说还是趋于假多线程,性能与C++和Java差距太远。learn.predict()方法不堪大用还是。

小插曲

fastai是基于torch的,但是torch也有自己的问题,在读取数据时如果不是传的是文件路径,会引发没有权限访问的报错,而不是找不到文件。一开始不注意的话很难解决和找到原因。

learn.get_preds()踩坑

基于示例方法改进?

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值