私は 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_input
mode
引数tf
-1から1へのスケーリングとcaffe
からいくつかの平均値を差し引くことに関する情報は、Models16層モデル: 情報ページ 。説明セクションには次のように書かれています:
「この論文では、モデルはスケールジッターでトレーニングされた構成Dとして示されています。入力画像は、(平均画像ではなく)平均ピクセル減算によってゼロ中心にある必要があります。つまり、次のBGR値が減算されます:[103.939、 116.779、123.68]。」
ここでのmode
は、バックエンドではなく、モデルがトレーニングされ、移植されたフレームワークに関するについてです。で- keras link からVGG16へ、それは次のように述べられています:
これらのウェイトは VGG at Oxford によってリリースされたウェイトから移植されています。
したがって、VGG16モデルとVGG19モデルはCaffeでトレーニングされ、TensorFlowに移植されたため、mode == 'caffe'
ここ(0から255の範囲で、平均を抽出します[103.939, 116.779, 123.68]
)。
MobileNetやShuffleNetなどの新しいネットワークはTensorFlowでトレーニングされたので、mode
は'tf'
を使用し、入力は-1から1の範囲でゼロを中心とします。
KerasでVGG16をトレーニングする私の経験では、入力は0から255であり、平均[103.939, 116.779, 123.68]
を差し引きます。私は-1
から1
への入力を中心とした入力で転移学習(下部をフリーズし、分類子を上部にスタック)を試みましたが、結果は0..255 - [103.939, 116.779, 123.68]
よりもはるかに悪いです。
最近自分でVGG16を再び使用しようとすると、次のようにvgg16からpreprocess_input
をインポートするだけで降下結果が得られません。
from keras.applications.vgg16 import VGG16, preprocess_input
そうすることで、デフォルトでpreprocess_inputは'caffe'
モードに設定されますが、- keras vgg16 code をよく見ると、重みの名前に気づきました
テンソルフローを2回参照しています。前処理モードは'tf'
にすべきだと思います。
processed_img = preprocess_input(img, mode='tf')