Kelf's Blog

悟已往之不谏,知来者之可追。

0%

在算法竞赛中,我们常常需要用到设置一个常量用来代表“无穷大”,通常使用 memset 来进行初始化。

1
2
#include<cstring>
void *memset(void *str, int c, size_t n)

memset 的作用 - 会将 c 依次填充到 str 的内存区域。总共填充 n 个 Byte。 - c 虽然是 int,但只取其低 8 位

通常我们设置最大值的形式为:

1
memset(arr,0x3f,sizeof arr);

(1)为什么不全部取最大值?

比如对于 int 类型的数,有的人会采用 INT_MAX,即 0x7fffffff 作为无穷大。但是以 INT_MAX 为无穷大常常面临一个问题,即加一个其他的数会溢出

(2)为什么不是 0x4f0x5f

因为 0x4f + 0x4f 会导致溢出,即无穷加无穷会错。

参考资料

  • https://www.acwing.com/file_system/file/content/whole/index/content/4799/

起因

在 IML 领域中,通常使用 F1 来对模型的 Pixel-level (Location) 性能进行评估。

HIFI_IFDL项目中,有一个issue讨论了F1 score的选择问题:

提出者认为,当使用average = 'macro'时,F1 score会比使用average = 'binary'时更高。

When you use "average = 'macro'", will the F1 score be inflated higher than normal (average = 'binary')?

IMDLBenco项目中也针对这个问题做了一个实验,表明使用average = 'macro'时,F1 score确实会比使用average = 'binary'时更高。

数学分析

那么从数学上如何解释这个现象呢?首先要知道 F1 score 和 Macro-F1 score 的定义。

F1 Score

F1 score是针对二分类问题提出的评价指标,是precision和recall的调和平均数,定义如下:

\[ F1 = \frac{2 \cdot precision \cdot recall}{precision + recall} \]

其中,precision和recall的定义如下:

\[ precision = \frac{TP}{TP + FP} \]

\[ recall = \frac{TP}{TP + FN} \]

在IMDL中,正样本是伪造区域(前景),负样本是真实区域(背景)。

Macro-F1 Score

Macro-F1 score是对每个类别的F1 score取平均值,定义如下:

\[ Macro-F1 = \frac{1}{N} \sum_{i=1}^{N} F1_i \]

为什么在IML中Macro-F1 Score会比F1 Score高?

由于IML是一个二分类问题,所以N=2,Macro-F1 score的定义如下:

\[ Macro-F1 = \frac{1}{2} \sum_{i=1}^{2} F1_i = \frac{F1_{positive} + F1_{negative}}{2} \]

针对负样本来说,定义\(F1_{0}\)为负样本的F1 score,\(F1_{1}\)为正样本的F1 score

首先计算\(F1_{0}\)

\[ F1_{0} = \frac{2 \cdot precision_{0} \cdot recall_{0}}{precision_{0} + recall_{0}} = \frac{2TN}{2TN + FP + FN} \]

然后计算\(F1_{1}\)

\[ F1_{1} = \frac{2 \cdot precision_{1} \cdot recall_{1}}{precision_{1} + recall_{1}} = \frac{2TP}{2TP + FP + FN} \]

所以Macro_F1 score为

\[ \begin{align*} MacroF1 & = \frac{F1_{0} + F1_{1}}{2} \\ & = \frac{\frac{2TN}{2TN + FP + FN} + \frac{2TP}{2TP + FP + FN}}{2} \\ & = \frac{TP}{2TP + FP + FN} + \frac{TN}{2TN + FP + FN} \\ \end{align*} \]

要比较MacroF1和 \(F1_{1}\) (就是标准的 \(F_1\),只计算了正样本)的大小,只需要比较MacroF1和 \(F1_{1}\) 的差值即可。

\[ \begin{align*} MacroF1 - F1_{1} & = \frac{TP}{2TP + FP + FN} + \frac{TN}{2TN + FP + FN} - \frac{2TP}{2TP + FP + FN} \\ & = \frac{TN}{2TN + FP + FN} - \frac{TP}{2TP + FP + FN} \\ \end{align*} \]

让两个两个分数都分子分母同时除以分子,得到

\[ \begin{align*} MacroF1 - F1_{1} & = \frac{1}{2+\frac{FP+FN}{TN}} - \frac{1}{2+\frac{FP+FN}{TP}} \end{align*} \]

由于\(FP+FN > 0\),所以只需要看TP和TN的大小关系即可。

由于在IML领域中,通常背景的面积是大于伪造区域的面积的,一般模型也可以很容易检测出背景,所以通常情况下有\(TN > TP\),所以\(MacroF1 - F1_{1} > 0\), 即MacroF1 score会比F1 score高。

IML任务中应该使用哪个?

知道了MacroF1会比F1高,那么在IML领域中,我们应该使用哪个呢?

在IML领域中,背景像素与伪造区域像素的数量并不平衡,背景像素点是大于伪造区域像素点的,一个模型在一定范围内模型倾向于多检测出背景像素点可以使得Macro-F1 score有一定的提升,但是从实际效果上来说模型更难完整的检测出伪造区域,所以在IML领域中,我们应该使用F1 score来评估模型的性能。

另外,许多IML的Paper中也使用F1 score来评估模型的性能,为了评价指标的一致性,我们也应该使用F1 score来评估模型的性能。

结论

在IML领域中,当使用average = 'macro'时,F1 score会比使用average = 'binary'时更高,这是因为Macro-F1 score会综合考虑背景区域的点和伪造区域的点是否被正确分类,而F1 score只考虑伪造区域的点是否被正确分类。但是在IML领域中由于背景区域的面积通常大于伪造区域的面积且模型更容易检测出背景区域,相当于给背景分类任务增加了权重,所以Macro-F1 score会比F1 score高。

在IML领域中背景像素与伪造区域像素的数量并不平衡,在IML领域中,我们应该使用F1 score来评估模型的性能。同时,为了指标的一致性,我们也应该使用F1 score来评估模型的性能。

基本原理

  • Github Pages 寄存网页文件
  • Hexo将Markdown文件渲染成带有样式的HTML文件
    • 样式使用主题提供,例如Next就是一种主题

1. 安装Hexo,并初始化博客

我使用scoop安装的软件,所以这里的安装方式是基于scoop的。

  1. 安装Node.js

1
scoop install nodejs-lts

  1. 安装Git
1
scoop install git
  1. 安装Hexo
1
npm install -g hexo-cli
  1. 初始化博客
1
2
3
hexo init blog
cd blog
npm install
  1. 本地预览
1
hexo server

2. 配置主题

  1. 下载主题

使用 Next 主题

1
git clone https://github.com/theme-next/hexo-theme-next themes/next
  1. 配置主题

修改_config.yml文件

(1)选择next主题

1
theme: next

(2)修改url和root

1
2
url: https://Kelfvin.github.io
root: /

如果不修改,后面部署到Github Pages时主题无法生效

3.部署

  1. 配置_config.yml文件
1
2
3
4
deploy:
type: 'git'
repo: 'https://github.com/Kelfvin/Kelfvin.github.io'
branch: 'main'
  1. 安装hexo-deployer-git
1
npm install hexo-deployer-git --save
  1. 部署到Github Pages
1
2
3
hexo clean
hexo generate
hexo deploy

写第一篇博客啦!记录自己的成长