它们的数据看起来像一对图像和一系列关键点元组,例如 [(0,1),(2,2)],其中每个关键点是一对 x 和 y 坐标。
我们已经通过可视化检测到这个问题,但是,使用 x=0 点的单元测试也会有帮助。一个有趣的事实是:我们团队三个人(包括我自己)各自地犯了几乎相同的错误。
这意味着增强实际上改变了语义:left 变为 right,right 变为 left,金字旁的女孩名字但是我们不交换数组中的 keypoints 索引。它会给训练带来巨大的噪音和更糟糕的指标。
熟悉语义分割问题的人可能知道 IoU (intersection over union)度量。不幸的是,我们不能直接用 S 来优化它,所以一个常见的技巧是用可微损失函数来逼近它。让我们编写相关代码!
在 x1 中,我们计算了与标准答案完全不同的损失,x2 常接近标准答案的函数的结果。我们预计 x1 会很大,因为预测结果并不好,x2 应该接近于零。这其中发生了什么?
的函数是度量的一个很好的近似。度量不是损失:它通常越高越好。因为我们要用 S 把损失降到最低,我们真的应该采用用相反的方法:
假设一个人有一个预先训练好的模型,并且是一个时序模型。我们基于 ceevee api 编写预测类。
这个密码正确吗?也许吧!对某些模型来说确实是正确的。例如,当模型没有规范层时,例如 torch.nn.BatchNorm2d;或者当模型需要为每个图像使用实际的 norm 统计信息时(例如,许多基于 pix2pix 的架构需要它)。
如果试图将动态 pytorch 图转换为静态 pytorch 图,则很容易识别此问题。有一个 torch.jit 模块是用于这种转换的。
然而,这里的 torch.jit.trace 不是万能的。这是一种应该知道并记住的细微差别。
很多东西都是成对存在的:训练和验证、宽度和高度、纬度和经度……如果仔细阅读,你可以很容易地发现由一对之间的复制粘贴引起的错误:
别担心,这个错误已经修复了。如何避免?不要复制粘贴代码,尽量以不要以复制粘贴的方式进行编码。
这里出了什么问题?首先,使用三次插值调整 mask 的大小是个坏主意。将 float32 转换为 uint8 也存在同样的问题:三次插值可以输出大于输入的值,并导致溢出。
假设需要对全卷积网络(如语义分割问题)和一幅巨大的图像进行处理。图像太大了,你没有机会把它放进你的 gpu 中——例如,它可以是一个医学或卫星图像。
在这种情况下,可以将图像分割成一个网格,地对每一块进行推理,最后合并。另外,一些预测交集可以用来平滑边界附近的伪影。
有一个符号输入错误,代码片段足够大,因此可以很容易地找到它。我怀疑仅仅通过代码就可以快速识别它,很容易检查代码是否正确:
训练循环中一个简单的断言(例如 assert mask.max=1)会很快检测到问题。同样,单元测试也可以检测到问题。
网友评论 ()条 查看