3

我有一个根据 Mark Ruffalo 的图像(裁剪的脸)训练的 CNN。对于我的正面类,我有大约 200 张图像,对于负面数据点,我采样了 200 个随机人脸。

该模型具有高召回率但非常低的精度。我怎样才能提高精度?我也受到我拥有的正面图像数量的限制。我准备在这个权衡中妥协召回。

我尝试增加负样本的数量,但这会引入一种形式的偏差,并且模型开始将所有内容分类为负样本以达到局部最优。

我将我的 CNN 建立在过大的基础上:

local features = nn.Sequential()

features:add(nn.SpatialConvolutionMM(3, 96, 11, 11))
features:add(nn.ReLU())
features:add(nn.SpatialMaxPooling(2, 2, 2, 2))

features:add(nn.SpatialConvolutionMM(96, 256, 5, 5))
features:add(nn.ReLU())
features:add(nn.SpatialMaxPooling(2, 2, 2, 2))

features:add(nn.SpatialConvolutionMM(256, 512, 3, 3))
features:add(nn.ReLU())
features:add(nn.SpatialMaxPooling(2, 2, 2, 2))

-- 24x24x512
features:add(nn.SpatialConvolutionMM(512, 1024, 3, 3))
features:add(nn.ReLU())
features:add(nn.SpatialMaxPooling(2, 2, 2, 2))

--11x11x1024
features:add(nn.SpatialConvolutionMM(1024, 1024, 3, 3))
features:add(nn.ReLU())
features:add(nn.SpatialMaxPooling(2, 2, 2, 2))

-- 1.3. Create Classifier (fully connected layers)
local classifier = nn.Sequential()
classifier:add(nn.View(1024*4*4))
classifier:add(nn.Dropout(0.5))
classifier:add(nn.Linear(1024*4*4, 3072))
classifier:add(nn.Threshold(0, 1e-6))

classifier:add(nn.Dropout(0.5))
classifier:add(nn.Linear(3072, 4096))
classifier:add(nn.Threshold(0, 1e-6))

classifier:add(nn.Linear(4096, noutputs))




model = nn.Sequential():add(features):add(classifier)

请帮助

4

1 回答 1

1

尝试使用 CNN 的原始输出,而不是使用输出节点的 sign() (因为它是一个正负类,我假设在 range 中只有一个输出[-1,1])。

例如,对于一个样本,输出可能[0.9]表明应该选择正类。但是如果你使用这个值,你可以找到一个特定的threshold值,希望它能给你所需的精度。换句话说,如果你发现任何大于[-0.35]实际应该被选为正类,因为它给了你更好的精度,那么-0.35应该是你的threshold值。

这就是ROC 分析派上用场的地方。

让我知道这是否有帮助。

于 2015-07-02T19:16:32.630 回答