回归的CNN架构?


32

我一直在研究回归问题,其中输入是图像,标签是80到350之间的连续值。图像是发生反应后的某些化学物质。原来的颜色表示剩余的另一种化学品的浓度,这就是模型要输出的-该化学品的浓度。图像可以旋转,翻转,镜像,并且预期的输出应该仍然相同。这种分析是在真实的实验室中完成的(非常专业的机器使用颜色分析来输出化学药品的浓度,就像我正在训练该模型一样)。

到目前为止,我仅试验了大致基于VGG(conv-conv-conv-pool块的多个序列)的模型。在尝试使用较新的体系结构(Inception,ResNets等)之前,我想研究一下是否存在其他更常用的图像回归体系结构。

数据集如下所示:

在此处输入图片说明

该数据集包含约5,000个250x250样本,我将其大小调整为64x64,因此训练更加容易。一旦找到有前途的体系结构,我将尝试更大分辨率的图像。

到目前为止,我的最佳模型在训练集和验证集上的均方误差约为0.3,这在我的用例中还远远不能接受。

到目前为止,我最好的模型如下所示:

// pseudo code
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = dropout()->conv2d(x, filters=128, kernel=[1, 1])->batch_norm()->relu()
x = dropout()->conv2d(x, filters=32, kernel=[1, 1])->batch_norm()->relu()

y = dense(x, units=1)

// loss = mean_squared_error(y, labels)

从图像输入回归输出的合适架构是什么?

编辑

我改写了我的解释,并删除了准确性的提法。

编辑2

我已经重新整理了我的问题,所以希望我很清楚


4
准确性不是可以直接应用于回归问题的度量。您说的准确度是30%是什么意思?准确性实际上仅适用于分类任务,而不适用于回归。
核王

1
“ 30%的时间正确预测”是什么意思?你真的在做回归吗?
Firebug

1
为什么将这个问题称为回归?您不是要尝试分类标签吗?标签是主要的吗?
阿克萨卡(Aksakal)'18

2
我不想和vgg完全一样。我正在做类似vgg的操作,这意味着一系列转换,然后是最大池化,然后是完全连接。好像是处理图像的通用方法。但是再说一遍,这就是我最初的问题的全部。似乎所有这些评论,尽管对我来说都是洞察力,但完全错过了我首先要问的问题。
rodrigo-silveira

1
另外,如果您对问题进行了更好的描述,我们也许可以提供更好的帮助。1)什么是图像?他们的解决方案是什么?是什么关系的图像和您的回复,之间?这个关系是旋转不变的吗,即,如果我将圆形图像旋转任意角度θ,我是否期望y改变?2)您是否知道用于训练VGG-net体系结构的5000张图像是一种苦难?您是否计算了架构的参数数量?有什么办法可以获取更多图像?如果不能,那么可能您需要...y[80,350]θy
DeltaIV

Answers:


42

首先是一般性建议:在开始对您不熟悉的主题进行实验之前,请先进行文献检索。您会节省很多时间。

在这种情况下,查看现有论文,您可能已经注意到

  1. CNN已多次用于回归:是经典之作,但是它已经过时了(是的,在DL中已经使用了3年)。更现代化的论文将不会使用AlexNet来完成此任务。是最近的事,但这是针对一个非常复杂的问题(3D旋转)的,无论如何我都不熟悉。
  2. 使用CNN进行回归并不是一个小问题。再次查看第一篇论文,您会发现它们存在一个问题,即它们基本上可以生成无限数据。他们的目标是预测校正2D图片所需的旋转角度。这意味着我基本上可以采用我的训练集,并通过将每个图像旋转任意角度来增强它,然后我将获得一个有效的更大的训练集。因此,就深度学习问题而言,该问题似乎相对简单。顺便说一句,请注意他们使用的其他数据增强技巧:

    我们使用平移(最大图像宽度的5%),在[-0.2,0.2]范围内的亮度调整,使用γ∈[-0.5,0.1]的伽玛调整以及在[0]范围内的标准偏差的高斯像素噪声,0.02]。

    我不太了解您的问题,无法说出在实验室中仔细拍摄的照片考虑位置,亮度和伽马噪声的变化是否有意义。但是您始终可以尝试,如果不能改善测试集损失,则将其删除。其实,你真的应该使用验证组或k对这类实验倍交叉验证,并且不看测试集,直到你定义了你的设置,如果你想测试定损为代表的泛化错误。

    yxα=atan2(y,x)转移学习>11%[180°,90°],[90°,0°],[0°,90°][90°,180°][45°,45°]

    2.6%

那么,我们可以从中学到什么呢?首先,这5000张图像是您的任务的小型数据集。第一篇论文使用了一个预先训练过的网络,其图像类似于他们想要学习回归任务的图像:不仅您需要学习与架构设计(分类)不同的任务,而且您的训练集不需要看上去根本不像通常训练这些网络的训练集(CIFAR-10 / 100或ImageNet)。因此,您可能不会从迁移学习中获得任何好处。MATLAB示例中有5000张图像,但是它们是黑白图像,并且在语义上都非常相似(嗯,这也可能是您的情况)。

那么,比0.3更好的现实表现呢?我们首先必须了解平均损失0.3意味着什么。您是说RMSE误差是0.3吗?

1Ni=1N(h(xi)yi)2

NN<5000h(xi)xiyiyi[80,350]0.12%

另外,只需尝试计算网络中的参数数量:我很着急,可能会犯一些愚蠢的错误,因此,summary无论您使用哪种框架,都必须通过某种功能仔细检查我的计算。但是,大概我会说你有

9×(3×32+2×32×32+32×64+2×64×64+64×128+2×128×128)+128×128+128×32+32×32×32=533344

(请注意,我跳过了批处理规范图层的参数,但是它们只是图层的4个参数,因此它们没有任何区别)。您有500万个参数和5000个示例...您期望什么?当然,参数的数量并不是神经网络容量的良好指标(这是一个不可识别的模型),但是...我认为您不能做得更好,但是您可以尝试一些事情:

  • 标准化所有输入(例如,在-1和1之间重新缩放每个像素的RGB强度,或使用标准化)和所有输出。如果您有收敛问题,这将特别有帮助。
  • y
  • 数据增强:既然你说,翻转,任意角度旋转或镜像您的图片应该产生相同的输出,你可以增加你的数据的大小设置了很多。请注意,数据集越大,训练集的误差就会越大:我们在这里寻找的是训练集损失与测试集损失之间的差距较小。另外,如果训练集损失增加很多,这可能是个好消息:这可能意味着您可以在这个更大的训练集上训练更深的网络,而不必担心过度拟合的风险。尝试添加更多的层,看看现在是否得到较小的训练集测试集损失。最后,如果上面提到的其他数据增强技巧在您的应用程序上下文中有意义,您也可以尝试。
  • y[80,97],[97,124][0,27]
  • 尝试使用现代架构(Inception或ResNet)而不是老式架构。ResNet实际上比VGG-net 具有更少的参数。当然,您想在这里使用小型ResNet-我认为ResNet-101不能帮助处理5000个图像数据集。不过,您可以增加很多数据集。
  • 由于您的输出对旋转不变,因此另一个好主意是使用组等变CNN(可将其输出(当用作分类器时)对离散旋转不变)或可转向CNN其输出对于连续旋转不变。invariance属性可让您以更少的数据扩充来获得良好的结果,或者理想情况下根本不会获得任何结果(因为它涉及轮换:当然,您仍然需要其他类型的da)。从实现的角度来看,组等变CNN比可操纵CNN更成熟,因此我将首先尝试组CNN。您可以对分类部分使用G-CNN尝试先分类后回归,也可以尝试使用纯回归方法。请记住相应地更改顶层。
  • 用批处理大小进行实验(是的,我知道超参数黑客并不酷,但这是我可以在有限的时间内免费提供的最好的方法:-)
  • 最后,有一些特别开发的体系结构可以使用少量数据集进行准确的预测。他们中的大多数使用膨胀卷积:一个著名的例子是混合尺度密集卷积神经网络。但是,该实现并非易事。

3
感谢您的详细回答。我已经在进行大量的数据扩充了。尝试了初始模型的几个变体(变体意味着滤波器的数量在整个模型中均等地缩放)。看到了令人难以置信的改进。仍有路要走。我会尝试您的一些建议。再次感谢。
rodrigo-silveira

@ rodrigo-silveira,不客气,让我知道如何发展。取得结果后,也许我们可以聊天。
DeltaIV

1
好的答案,值得更多^
Gilly

1
组成很好!
Karthik Thiagarajan

1
如果可以的话,我会给你1万点。惊人的答案
Boppity Bop
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.