python - 如何选择代表所有方差的最小验证数据集?
问题描述
我有一个包含 2000 个 256 x 256 x 3 图像的数据集来训练一个 CNN 模型(具有大约 3000 万个可训练参数)以进行像素级二进制分类。在训练它之前,我想把它分成验证集和测试集。现在,我已经浏览了这个问题的所有答案。
这些建议就像 80-20 分割或随机分割,带有训练和观察性能(命中和试验类型)。所以,我的问题 - 有没有一种方法/技术来选择一个最小的数据集进行验证和测试,它代表了整个数据集的所有方差?我有一种直觉,比如应该有一个可以测量每个图像的数量(如平均值),并且可以绘制该数量,以便某些值成为异常值,而有些则没有,我可以从这些组中获取图像,以便最大限度地表示这个品种在那里。
我有一个最小数据集约束,因为我的数据非常少。可能会建议进行增强,但我应该选择基于位置或强度的增强。因为从课堂笔记中,我们的老师告诉我们最大池化层使网络对平移/旋转保持不变。所以,我假设位置增强是行不通的。
解决方案
尝试并拒绝:
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)
结果图:
从这个图中可以观察到异常值,可以从集群中进行手动拆分,尽管集群大小应该是一个不同的问题。:)
推荐阅读
- php - 如何在 Symfony 4 中禁用返回其他实体引用?
- android - 如果位置 ImageView1 = ImageView2,则拖放和消失 ImageView
- rust - 如何在 src 中布局我的 Rust 模块以便在我的应用程序中访问
- sharepoint - 通过 Microsoft Graph 访问共享的 OneDrive 文件?
- django - 返回模板中的相关字段
- javascript - 未处理的 JS 异常:无法为组件创建样式化组件:[object Object]
- windows - 尝试删除本地应用程序数据,适用于任何计算机
- c# - 如何到达 appdata 中的文件夹并将其删除?
- typescript - 使用 Socket.io-client、Node JS express 和 Webpack 时,我在浏览器中收到“require is not defined”错误
- python - 使用 pyspark 按 agg 多列分组