论文复现:数据归一化和标准化
1.背景介绍:
近期在复现论文JFSSL的结果,Github上有它的Matlab版实现代码,并提供了Wiki数据集和测试代码。该论文实验还包含了NUS-WIDE数据集,但代码中并未提供测试demo。NUS-WIDE数据集包含了大量图片和文本对及其标记信息构成。我并没有使用NUS-WIDE数据集提供的SIFT等手工特征,而是使用Resnet对其进行处理并输出深度特征,文本模态,我使用pca对其进行降维(pca函数来自sklearn)。
2. 遇到的问题
这样的输入进行训练,效果非常差,一看就是没有训练好。我一步步分析发现,由于JFSSL方法中会使用欧式距离计算两个样本特征(图片和图片)之间的相似度,而我的输入计算出欧式距离非常大,这导致了后面的计算出现了问题。
分析过程:我发现NUS-WIDE的特征输入和代码中提供的Wiki数据集demo差异非常大,导致了模型不能正常运行,分析输入特征。
Wiki | NUS-WIDE | |
---|---|---|
文本 | 0~1 | -1.2~2.4 |
图片 | 0~0.7 | 0~16 |
这显然是存在问题的,NUS-WIDE的特征数值范围那么大,才造成了欧氏距离过大,方法不能运行。而文本特征和图片特征之间在量纲上是不同的,这也给训练造成了影响。
3. 解决方案:归一化/标准化
3.1 归一化(Normalization)
我先使用归一化,即将数据映射到0~1之间,这样就和Wiki特征的分布差不多了。
使用min-max归一化,即
x
→
x
−
m
i
n
m
a
x
−
m
i
n
x \to{\frac{x- min}{max - min}}
x→max−minx−min
代码:image.shape: (sample_num, feature_num)
image = (image - np.min(image , axis=0, keepdims=True)) / (
np.max(image , axis=0, keepdims=True) - np.min(image , axis=0, keepdims=True))
具有一定的效果,但是文本的评估还是不正常,只有图片特征的评估提升了。
3.2 标准化(Standardization)
和归一化类似,同样是映射到小区间,但只要求数据满足标准正态分布即可。
转换方式:
x
→
x
−
m
e
a
n
s
t
d
x \to{\frac{x- mean}{std}}
x→stdx−mean
代码:image.shape: (sample_num, feature_num)
image = (image- np.mean(image, axis=0, keepdims=True)) /
np.std(image, axis=0, keepdims=True)
通过标准化,模型能够正常训练了!
总结
在尝试传统方法复现的时候,要看看数据分布是否和原文的相同。大多现在流行的深度网络方法特征都是相对固定的,比如ResNet的特征。而传统方法容易忘记考虑这一点。本文仅提供一种论文复现过程中影响复现的可能性。为什么归一化、标准化在NUS-WIDE数据集和我的setting下效果不同,我并未进行深入分析,等有空再补这个坑吧~
参考