图像训练
数据集就是最基础的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副本。
这个方法看似可行,但是在两种情况都表现欠佳:
- heload_learner(cpu = True) 在cpu上跑卷积,速度巨慢,cpu满载。测试环境为AMD Ryzen7 5800X(8C16T,pbo开启并手动拉到最高),讲道理比5800X强的零售级CPU并没有几款,性能差距也不会特别巨大,所以这种方法不可取。
超算大佬除外。 - heload_learner(cpu = False)在gpu上跑,但是实验结果,gpu占用仍为20%左右, 基本上就是cpu每个线程都在摸鱼(占用率20%左右),并且pytorch并没有分配额外的显存用来预测,加上模型保存加载的耗时,最终耗时在600s左右。
反向改进。
研究了一些介绍python多线程技术的文章,总的来说还是趋于假多线程,性能与C++和Java差距太远。learn.predict()方法不堪大用还是。
小插曲
fastai是基于torch的,但是torch也有自己的问题,在读取数据时如果不是传的是文件路径,会引发没有权限访问的报错,而不是找不到文件。一开始不注意的话很难解决和找到原因。