1、通过谷歌图片搜索将图片的url保存在文件中,通过这些url下载图片,按不同类别放在不同的文件夹中。
2、 data=ImageDataBunch.from_folder(path,train=",",valid_pct=0.2,ds_tfms=get_transforms(),size=224,num_worker=4).normalize(imagenet_stats)
valid_pct从train文件夹中分出20%的数据,自动随机生成一个验证集
3、np.random.seed(42)设置每次的验证集是相同的,否则当我们想确认这个超参数是否改进了模型,但你却用了不同的数据集得出的结果无法排除,可能只是本次数据 让模型表现的更好了
4、谷歌图片搜索不会每次都给你非常精确的匹配,如何解决这个问题,答案是数据清洗,结合人类专家和计算机学习器
5、plot_top_losses()
输出要么是归类错误最严重的,要么是确信度最低的,判断哪一个的噪声干扰最大,似乎不大可能从错标的数据里得到准确的预测结果,而且具有很高的置信度。
6、除了plot_top_losses()
,还有losses,idxs=interp.top_losses()
,它返回两个东西,最差分类结果的损失以及在数据集中的索引,top_loss_paths=data.valid_ds.x[idxs]
每个fastai的数据集都有一个x和一个y,传入idxs索引就可以获取文件的文件名,按损失从高到低排序,FileDeleter会清理验证集错标的数据,然后再去清理训练集,如果还有测试集的也要清理
7、在清理了噪声图像之后,重新运行模型,会发现常常也是徒劳的,这些模型非常擅长处理中等数量的噪声数据,问题是如果你的数据并非randomly noisy
而是biased noisy
,发现它只改善了0.001%,这是很正常的
8、data2=ImageDataBunch.single_from_classes(path,classes,tfms=get_transforms(),size=224).normalize(imagenet_stat)
它每次只会获取单张图片,不用传给他任何数据,path参数是为了让它知道从哪儿加载模型,推荐用Starlette创建的网页应用
9、不同搜索引擎的js图片下载脚本
// Google Images
var urls=Array.from(document.querySelectorAll(".rg_i")).map(el=>el.hasAttribute("data-src")?el.getAttribute("data-src"):el.getAttribute("data-iurl")).filter(l=>l!=null).join("\n");
var a = document.createElement("a");a.download = "filename.txt";a.href = "data:text/csv;charset=utf-8,"+urls;a.click();
// DuckDuckGo Images (uses Bing)
var urls=Array.from(document.querySelectorAll(".tile--img__img")).map(el=>el.hasAttribute("data-src")?el.getAttribute("src"):el.getAttribute("data-src")).filter(l=>l!=null).map(l=>"https:"+l).join("\n");
var a = document.createElement("a");a.download = "filename.txt";a.href = "data:text/csv;charset=utf-8,"+urls;a.click();
// Bing Images
var urls=Array.from(document.querySelectorAll(".mimg")).map(el=>el.hasAttribute("src")?el.getAttribute("src"):null).filter(l=>l!=null&&l.startsWith("http")).join("\n");
var a = document.createElement("a");a.download = "filename.txt";a.href = "data:text/csv;charset=utf-8,"+urls;a.click();
10、学习率过高,验证集损失大于1(通常是小于1的),学习率过低,误差率表现越来越好,但是非常慢,调用learn.recorder().plot_losses()
函数绘出验证和训练损失,会看到这两个损失下降非常缓慢,还会看到另一个现象,训练损失会高于验证损失(训练次数太少也会导致这个问题),意味着还没充分拟合
11、过少的轮次数与过低的学习率,结果非常相似,需要在学习率与轮次数中进行平衡
12、过于轮次数太多引起的过拟合问题,如果训练时间太长,会导致模型可能只会识别特定的泰迪熊,而不会识别任意的泰迪熊,深度学习不容易出现过拟合现象,通过关闭数据增强、 dropout、权重衰减等方法,产生过拟合
13、如果你的训练误差低于验证误差,那就是过拟合了是不正确的,任何经过正确训练的模型,训练误差都会低于验证误差。
14、过度拟合的征兆是错误率升高,只要训练过程中,模型错误率降低,就不是过拟合了
15、图片其实是一个数字矩阵,如果是彩色图像就会有第三个维度,大于二维的就叫张量。创建的泰迪熊检测器实质是一个数学函数能够读取泰迪熊图片中的数据,然后把这些数据转化为三个数字分别是泰迪熊的概率、黑熊的概率、灰熊的概率。np.argmax或torch.argmax函数会找出概率值最高的数。16、错误率的定义是什么?它是如何被计算出来的?是交叉验证错误?
答:使用'error_rate??'查看源代码会发现它是'1-accuracy'得来的,accuracy的源代码如下:
def accuracy(input:Tensor,targs:Tensor)->Rank0Tensor:
''compute accuracy with 'targs' when 'input' is bs*n_classes."
n=targs.shape[0]
input=input.argmax(dim=1).view(n,-1)
targs=targs.view(n,-1)
return (input==targs).float().mean()
17、learn=create_cnn(data,models.resnet50,metrics=error_rate,ps=0,wd=0)
,metrics总是用于验证集,检查训练效果如何,即模型在未知数据上的性能怎样
18、为什么设置的学习率都是3e-n开头的,比如3e-5,3e-4
答:实践中发现,3e-3作为学习率的默认值效果很好,在模型解冻前的首次微调,切片的第一部分是lr_find()函数的返回结果,第二部分的值设置为第一部分默认值的3e-3的1/10
19、可以转换成= + ,在根据线性代数dot product可以转换成矩阵运算:
20、当构建新的图像数据集时,需要多少图片才够,有什么方法评估它是否足够?
答:怎么知道没有足够的数据呢?当找到了合适的学习率,把学习率调高就会出现巨大的损失,而把它调低又变得很慢,由此可知找到了合适的学习率。训练了很长时间,发现错误率开始变大,说明已经训练足够长的时间,而你仍然不满意它的准确率,只有获取更多数据,才可以训练更长时间,获得更高的准确率。 大多数时候,需要的数据比想象的要少,所以先用较小规模的数据看看效果如何
21、如果不同类别的样本数不平衡怎么办?比如有200个灰熊和50个泰迪熊
答: 不均衡数据仍然有效。有一篇论文讲到,如果想让模型再优化一点,最好的方法就是选出那些样本数量较少的类别做一些它们的副本,这就叫做oversampling(过采样)
22、 tensor就是数组,特指形状规则的数组
23、有趣的地方是,如果能找到两个参数用以拟合这100个数据点,那么也能让这样的函数把像素值转换为概率
24、每个数据点到直线的距离是多少,然后取平均值,这就是loss,这样的问题叫做回归问题,函数的因变量是连续的,对于回归问题,常见的损失函数是均方误差MSE
25、如何拟合的更好 ,现在只有两个参数,橙色曲线的截距和斜率,用梯度下降法处理,如果稍微修改这两个数,会发生什么变化,找出运行效果最好的。可以直接计算导数,导数会告诉你应该向上调还是向下调
26通过x值y值计算出梯度值,梯度值其实就是斜率,它会告诉你向那个方向移动,会使之下降!学习率太大,损失变大,太小损失下降慢
27、SGD和所谓的mini-batches(小批次),唯一不同的是,SGD是在整个数据集上对每次迭代都计算一次损失值,mini-batches即随机选择64张图 ,然后计算损失值更新权重,然后再下一批图片。
28、词汇:
学习率:学习率乘以梯度值用来更新权重
epoch(批次):一个epoch是遍历一次所有图像数据,对于非随机梯度下降法来说,如果数据集有一千张图片,而mini-batch大小为100,那么十次迭代后才是一个epoch,如果做很多次epoch,就会多见到同样的图像 ,每多见一次同一张图像 ,就有可能多一分过拟合
mini-batch:是一堆随机数据点 ,用来更新数据正合适
SGD:就是使用mini-batches方法的梯度下降法
model/architecture:architecture就是数学函数,需要确定它的参数
parameters:参数也叫权重,训练时一直更新的数字
Loss function:和正确答案之间的差距
找到恰当数量的参数拟合数据,正则化可以确保模型不出现过拟合