首页 > 解决方案 > 如何选择代表所有方差的最小验证数据集?

问题描述

我有一个包含 2000 个 256 x 256 x 3 图像的数据集来训练一个 CNN 模型(具有大约 3000 万个可训练参数)以进行像素级二进制分类。在训练它之前,我想把它分成验证集和测试集。现在,我已经浏览了这个问题的所有答案。

这些建议就像 80-20 分割或随机分割,带有训练和观察性能(命中和试验类型)。所以,我的问题 - 有没有一种方法/技术来选择一个最小的数据集进行验证和测试,它代表了整个数据集的所有方差?我有一种直觉,比如应该有一个可以测量每个图像的数量(如平均值),并且可以绘制该数量,以便某些值成为异常值,而有些则没有,我可以从这些组中获取图像,以便最大限度地表示这个品种在那里。

我有一个最小数据集约束,因为我的数据非常少。可能会建议进行增强,但我应该选择基于位置或强度的增强。因为从课堂笔记中,我们的老师告诉我们最大池化层使网络对平移/旋转保持不变。所以,我假设位置增强是行不通的。

标签: pythontensorflowdeep-learning

解决方案


尝试并拒绝:

1. 特征检测器和描述符——检测器不能很好地近似图像,描述符是长向量。我放弃了这个,因为此时我不知道所需的解决方案。这可以重新考虑。

2.自动编码器 - 想法是训练一个自动编码器,在 3d 空间中绘制编码值(保持编码维度为 3)并检查集群并将每个集群中的数据拆分为训练、测试、验证。鉴于 Google Colab 的 GPU 内存有限,这不起作用,因为训练损失没有减少超过一个点。

什么似乎有效:

降维技术:想法是将图像展平,拟合降维模型并将图像转换为较低维度以绘制和组织它们。我发现 t-SNE(邻域图方法)比 PCA(矩阵分解方法)效果更好。因此,我选择了 UMap(一种邻域图技术)

MWE:

import umap

X=np.load(path+'/X_train.npy') # Your image dataset, shape=(number of images,height,width, channels)

# an image of size h x w x c is actually a flattened array of size h*w*c
X_reshaped=np.zeros((X.shape[0],X.shape[1]*X.shape[2]*X.shape[3]))
for i in range(0,X.shape[0]):
  X_reshaped[i,:]=X[i,:,:,:].flatten()
del X
X_reshaped=X_reshaped/255
X_reshaped.shape

reducer=umap.UMAP(n_components=3)

reducer.fit(X=X_reshaped)

embedding=reducer.transform(X_reshaped)
embedding.shape

# Clustering
from sklearn import cluster
kmeans=cluster.KMeans(n_clusters=4,random_state=42).fit(embedding)

import plotly

data = [plotly.graph_objs.Scatter3d(x=embedding[:,0], 
                                  y=embedding[:,1],
                                  z=embedding[:,2], 
                                  mode='markers',     
                                  marker=dict(color=kmeans.labels_)
                                  )
       ]
plotly.offline.iplot(data)

结果图:

阴谋

从这个图中可以观察到异常值,可以从集群中进行手动拆分,尽管集群大小应该是一个不同的问题。:)


推荐阅读