摘要
深度神经网络的模型很复杂,需要通过训练来估计的参数很多。为了达到相同的收敛效果,复杂的模型需要更多的训练数据。我们提出在极坐标空间进行径向变换来进行数据增强,以解决小样本的网络训练问题。像素级别的变换提供了原始图片在极坐标下的表达,这增大了数据量不够的类别的表达。在MNIST和多模态医学图像上进行实验,采用alexnet和googlenet,得到很好的分类精度。
方法
笛卡尔坐标映射到极坐标,论文中的这张图很直观:
测试代码
from __future__ import division
import numpy as np
import cv2, math
import matplotlib.pyplot as plt
%matplotlib inline
def imshow(img):
if len(img.shape) == 3:
b,g,r = cv2.split(img)
plt.subplot(111);
plt.imshow(cv2.merge([r, g, b]))
elif len(img.shape) == 2:
plt.subplot(111);
plt.imshow(img, cmap='gray')
else:
print("Unknown input shape")
def RT(I, U, V, m, n):
I_out = np.zeros_like(I)
for u in range(U):
theta_u = 2*math.pi * u / U
for v in range(V):
x = int(v * math.cos(theta_u))
y = int(v * math.sin(theta_u))
if m+x >= 0 and m+x < U and n+y >= 0 and n+y < V:
I_out[u, v] = I[n+y, m+x]
return I_out
img = cv2.imread('/home/dumin/test.png', 0)
imshow(img)
U = V = 76 # 256
m, n = 30,50
img2 = RT(img, U, V, m, n)
imshow(img2)
论文实验
Mnist,每一类只用20张图片(为了呼应主题,“非常小的样本”),用上面这种变换方法扩增100倍,变成每类2000张,总共20k张图片。训练集:验证集:测试集为18k, 1k, 1k。
一点疑问
- 如果为了证明这种数据增强的效果好,个人觉得测试集不应该用增强的数据。数据增强只是一种训练的方法,并不能用在实际的测试当中。
- 有一点分析的很到位,复杂的网络,很多的参数,导致需要大量数据来训练。有一帮人在不断地减少模型的参数(各种连接方法,各种正则手段),同时保证模型的能力不受损失。另一帮人从数据出发,扩增数据集。
- 对于实验令人惊奇的结果,如果自己不实验一番,或者作者不公布实验代码,实在是很难令人信服。
- 从实验也能看出,对于医学图像数据来说(Imagenet预训练效果很小),在数据量不够的情况下,网络越复杂,效果越差。模型的参数一定要和数据量成正比。
- 当数据量很小,测试集本身得到的测试结果,都是存疑的。抽样样本太少,无法代表实际中的效果。