web-dev-qa-db-ja.com

Keras VGG16 preprocess_inputモード

私は Keras VGG16モデル を使用しています。

VGG16モデルと組み合わせて使用​​するpreprocess_inputメソッド があることがわかりました。このメソッドは、 imagenet_utils.pyのpreprocess_inputメソッド を呼び出すようです(これは(場合によっては) _preprocess_numpy_inputメソッドのimagenet_utils.py を呼び出します)。

preprocess_inputには、 "caffe"、 "tf"、または "torch"を期待するmode引数があります。 TensorFlowバックエンドでKerasのモデルを使用している場合、mode="tf"を絶対に使用する必要がありますか?

はいの場合、これは、Kerasによって読み込まれたVGG16モデルが同じ前処理を受けた画像でトレーニングされたためです(つまり、入力画像の範囲が[0,255]から入力範囲[-1,1]に変更されました)?

また、テストモードの入力画像にもこの前処理を行う必要がありますか?最後の質問への答えはイエスだと確信していますが、少し安心したいと思います。

私はフランソワ・コレットがそれを正しく行ったことを期待しますが、 https://github.com/fchollet/deep-learning-models/blob/master/vgg16.py を見ているか、彼が間違っているか、私が間違っていますmode="tf"の使用について。

更新された情報

@FalconUAは VGG at Oxford に誘導しました。これには、16層モデルへのリンクを含むModelsセクションがあります。 preprocessing_inputmode引数tf -1から1へのスケーリングとcaffeからいくつかの平均値を差し引くことに関する情報は、Models16層モデル: 情報ページ 。説明セクションには次のように書かれています:

「この論文では、モデルはスケールジッターでトレーニングされた構成Dとして示されています。入力画像は、(平均画像ではなく)平均ピクセル減算によってゼロ中心にある必要があります。つまり、次のBGR値が減算されます:[103.939、 116.779、123.68]。」

10
user3731622

ここでのmodeは、バックエンドではなく、モデルがトレーニングされ、移植されたフレームワークに関するについてです。で- keras link からVGG16へ、それは次のように述べられています:

これらのウェイトは VGG at Oxford によってリリースされたウェイトから移植されています。

したがって、VGG16モデルとVGG19モデルはCaffeでトレーニングされ、TensorFlowに移植されたため、mode == 'caffe'ここ(0から255の範囲で、平均を抽出します[103.939, 116.779, 123.68])。

MobileNetShuffleNetなどの新しいネットワークはTensorFlowでトレーニングされたので、mode'tf'を使用し、入力は-1から1の範囲でゼロを中心とします。

10
FalconUA

KerasでVGG16をトレーニングする私の経験では、入力は0から255であり、平均[103.939, 116.779, 123.68]を差し引きます。私は-1から1への入力を中心とした入力で転移学習(下部をフリーズし、分類子を上部にスタック)を試みましたが、結果は0..255 - [103.939, 116.779, 123.68]よりもはるかに悪いです。

4
Dmitrii

最近自分でVGG16を再び使用しようとすると、次のようにvgg16からpreprocess_inputをインポートするだけで降下結果が得られません。

from keras.applications.vgg16 import VGG16, preprocess_input

そうすることで、デフォルトでpreprocess_inputは'caffe'モードに設定されますが、- keras vgg16 code をよく見ると、重みの名前に気づきました

' https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5 '

テンソルフローを2回参照しています。前処理モードは'tf'にすべきだと思います。

processed_img = preprocess_input(img, mode='tf')
0
Ioannis Nasios