Kerasモデルが背景を認識することを学ぶのはなぜですか?


9

私はPascal VOC2012でこのDeeplabv3 +のKeras実装をトレーニングするために、事前トレーニング済みのモデル(そのデータセットでもトレーニング済み)を使用してトレーニングしています。

精度がすぐに1.0に収束する奇妙な結果が得られました。

5/5 [==============================] - 182s 36s/step - loss: 26864.4418 - acc: 0.7669 - val_loss: 19385.8555 - val_acc: 0.4818
Epoch 2/3
5/5 [==============================] - 77s 15s/step - loss: 42117.3555 - acc: 0.9815 - val_loss: 69088.5469 - val_acc: 0.9948
Epoch 3/3
5/5 [==============================] - 78s 16s/step - loss: 45300.6992 - acc: 1.0000 - val_loss: 44569.9414 - val_acc: 1.0000

モデルをテストすると、100%の精度も得られます。

私はトレーニングの前後に同じランダム画像のセットに予測をプロットすることにしました、そしてモデルはすべてが単なる背景であると言うことを奨励されていることがわかりました(それはPascal VOC2012の最初のクラスです)。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

私はディープラーニングに非常に慣れていないので、これがどこから来るのかを理解するための助けが必要です。

多分それは私の損失関数かもしれないと思った。

def image_categorical_cross_entropy(y_true, y_pred):
    """
    :param y_true: tensor of shape (batch_size, height, width) representing the ground truth.
    :param y_pred: tensor of shape (batch_size, height, width) representing the prediction.
    :return: The mean cross-entropy on softmaxed tensors.
    """
    return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=y_pred, labels=y_true))

私のテンソルが正しい形であるかどうかは、少し不確かです。私はTFのデータセットAPIを使用して.tfrecordファイルをロードしていますが、私の注釈テンソルの形状は(batch_size, height, width)です。う(batch_size, height, width, 21)必要なものも?注釈画像を21個の画像(クラスごとに1つ)を含むテンソルに分離しようとすると、モデル内部からの他のエラーが発生します。

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [12,512,512,21] vs. [12,512,512]
         [[Node: metrics/acc/Equal = Equal[T=DT_INT64, _device="/job:localhost/replica:0/task:0/device:GPU:0"](metrics/acc/ArgMax, metrics/acc/ArgMax_1)]]
         [[Node: training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1/_13277 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:1", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_62151_training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:1"]()]]

ご協力ありがとうございました!


5
ここで検討すべき項目はかなり多く、どこから始めればよいかほとんどわかりません(1)トレーニングにサンプルサイズ5を使用していますか??? (2)画像の前処理はありますか?答えはこれにあり、(3)モデルについてより多くの情報を提供する必要があると思います。ラベル付きのサンプルはいくつありますか?可能なカテゴリはいくつありますか?バランスの取れたトレーニングセットはありますか?(4)1.0の精度は、損失が非常に大きく増加しているため、基本的には意味がありません。精度が向上すると、損失は減少するはずです。
I_Play_With_Data 2018年

(1)サイズ12のバッチを使用していますが、これは私には関係ないと思います。ここでは、わずか5ステップの3つの小さなエポックのみを示しました。これは、収束の速さだからです。(2)私の前処理は、すべての画像とそれに関連する注釈について、いくつかの拡張と512x512への再スケーリング(おそらくトリミング)で構成されています。(3)Pascal VOC 2012には約11,500枚のラベル付き画像があります。ほとんどの論文がこのデータセットで85%以上のmIOUに達したとすると、バランスが取れていると思います。20個の異なるこのデータセット内のカテゴリに加えて、バックグラウンドのための1つまたは«曖昧は»21の合計のために、あります
マット・

私は好奇心が強い。モデルの結果の理由を見つけましたか?
Mark.F 2018

3
コードを共有すると、間違いを見つけることができます。
Dmytro Prylipko

1
事前にトレーニングされたモデルが、最初に使用されたのと同じデータを使用して、3エポック内で100%の精度を得る方法を見つけるという事実は、トレーニングラベルが間違っている、おそらくすべてが対応するラベルに設定されていることがバグだと私に思わせます背景に。いずれにせよ、この問題のスレッドをご覧ください。人々は、モデルの微調整に関する問題と解決策について話し合っています。モデルは必ずしも壊れているわけではなく、Tensorflowのbatchnormバグに対処できます。
n1k31t4

回答:


1

あなたのモデルは過剰適合です。各エポックには5つの画像しかありません。モデルは、各画像の答えを「記憶」しています。

オーバーフィットの可能性を最小限に抑えるには、画像の数を増やします。オブジェクトのカテゴリごとに数千のサンプル画像が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.