3

Mark Ruffalo の画像 (トリミングされた顔) でトレーニングされた CNN があります。私のポジティブ クラスには約 200 の画像があり、ネガティブ データポイントには 200 のランダムな顔をサンプリングしました。

モデルの再現率は高いですが、精度は非常に低くなります。どうすれば精度を上げることができますか?また、私が持っている肯定的な画像の数によって制約されています。このトレードオフでリコールを妥協する準備ができています。

負のサンプルの数を増やしてみましたが、それによって一種のバイアスが発生し、モデルは局所的な最適値を達成するためにすべてを負として分類し始めます。

CNN は overfeat に基づいています。

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

出力ノードの sign() を取得する代わりに、CNN の未加工の出力を試してみてください (これは正と負のクラスであるため、 range には出力が 1 つしかないと想定しています[-1,1])。

たとえば、1 つのサンプルの場合、出力[0.9]は陽性クラスを選択する必要があることを示している可能性があります。しかし、この値をいじってみると、必要な精度が得られる特定のthreshold値 (できれば )を見つけることができます。言い換えれば、より良い精度が得られるという理由で実際に陽性クラスとして選択されるべきであるよりも大きいものを見つけた場合、それはあなたの値であるべきです。[-0.35]-0.35threshold

ここでROC 分析が役に立ちます。

これが役立つかどうか教えてください。

于 2015-07-02T19:16:32.630 に答える