我刚开始学习机器学习。我正在尝试从一组图像(斯坦福狗种数据集,包含120个品种)中创建一个输入矩阵(X),以训练卷积神经网络。我的目标是调整图像大小,并将每张图像转换为一行,每个像素作为一个单独的列。
如果我直接将图像调整到固定大小,图像会因为压缩或拉伸而失去原有的特性,这是不好的(第一种解决方案)。
我可以固定宽度或高度来调整大小,然后进行裁剪(所有结果图像将是相同的大小,如100×100),但图像的关键部分可能会被裁掉(第二种解决方案)。
我在考虑另一种方法,但还不确定。假设我希望每张图像有10000列。不是将图像调整到100×100,而是在调整图像大小后,使总像素数约为10000像素。因此,50×200、100×100和250×40大小的图像都将转换为10000列。对于其他大小如52×198,将考虑前10000个像素中的10296个(第三种解决方案)。
我上面提到的第三种解决方案似乎能保留图像的原始形状。然而,在转换成一行时,由于并非所有图像大小相同,可能会失去这种原创性。我想听听您对这个问题的看法。如果您能指导我一些可以学习这个话题的资源,那就更好了。
回答:
解决方案1(简单调整输入图像大小)是一种常见的方法。除非您的图像纵横比与预期输入形状有很大差异(或者您的目标类别有严格的几何约束),否则通常仍能获得良好的性能。
如您所述,解决方案2(裁剪您的图像)有可能会排除图像的关键部分。您可以通过在原始图像的多个子窗口上运行分类来解决这个问题(即,通过在输入图像上以适当的步长水平和/或垂直移动来分类多个100 x 100的子图像)。然后,您需要决定如何组合多个分类结果。
解决方案3将无法工作,因为卷积网络需要知道图像的尺寸(否则,它将不知道哪些像素是水平和垂直相邻的)。因此,除非网络期望从假设尺寸展平的数组,否则您需要传递具有明确尺寸的图像(例如,100 x 100)。但如果您只是传递一个包含10000个像素值的数组,而网络不知道(或无法假设)图像是100 x 100、50 x 200还是250 x 40,那么网络将无法正确应用卷积滤波器。
解决方案1显然是最容易实现的,但您需要平衡改变图像纵横比的可能影响与为每张图像运行和组合多个分类的所需工作量之间的关系。