回答:
それを行うにはいくつかの方法があります。これらのほとんどは、StackOverflow、Quora、およびその他のコンテンツWebサイトに関する多くの投稿ですでに取り上げられています。
要約すると、リストされているテクニックのほとんどは、2つのクラスのソリューションにグループ化できます。
変換では、次のようなテクニックを調べることができます
ネットワークを構築するレイヤーの動作により、入力のサイズに影響されない固有の特性を持つネットワークを調べることもできます。この例は、
カーネルとステップサイズが記述されると、各レイヤーでの畳み込みは、対応する入力に従って適切な次元出力を生成できるため、完全畳み込みネットワーク(FCN)は入力サイズにまったく制限がありません。
空間ピラミッドプーリング(SPP)、FCNには完全に接続された高密度レイヤーがないため、画像サイズにとらわれませんが、入力変換を考慮せずに高密度レイヤーを使用したい場合は、レイヤーを説明する興味深い論文がありますディープラーニングネットワーク。
PSいくつかのテクニックを引用して見逃したかもしれません。これが完全なリストであるとは主張しません。
畳み込み層とプーリング層自体は、入力次元とは無関係です。ただし、畳み込みレイヤーの出力は、異なるサイズの画像に対して異なる空間サイズを持ちます。これは、後で完全に接続されたレイヤーがある場合に問題を引き起こします(完全に接続されたレイヤーには固定サイズの入力が必要なため)。これにはいくつかの解決策があります:
1.グローバルプーリング:畳み込みレイヤーの最後にある完全に接続されたレイヤーを避け、代わりにプーリング(グローバル平均プーリングなど)を使用して、フィーチャマップを(N、H、W、C)の形状から削減します(グローバルプールの前) )を(N、1,1、C)に(グローバルプール後)
に変換します。ここで、N =ミニバッチサンプルの数
H =フィーチャマップの空間の高さ
W = フィーチャマップの空間の幅
C =フィーチャマップ(チャネル)の数
Asこれで、出力の次元(N * C)がフィーチャマップの空間サイズ(H、W)に依存しなくなりました。分類の場合は、完全に接続されたレイヤーを使用してクラスのロジットを取得できます。
2.可変サイズのプール:可変サイズのプーリング領域を使用して、異なる入力サイズに対して同じフィーチャマップサイズを取得します。
3.入力画像のクロップ/サイズ変更/パディング:入力画像をすべて同じ形状にリスケール/クロップ/パディングすることができます。
今日はこの問題に対処しなければならなかったので、うまくいったことを共有したいと思いました。「理論的にはこれでうまくいく」という答えとちょっとした情報がウェブ上にかなりあることがわかりましたが、実用的な「これは具体的にどのようにこれを実装するのですか」からではありません。
Tensorflow Kerasを使用してこれを実装するには、以下を実行する必要がありました。おそらく、他の誰かがこれらの一部を変更、緩和、または削除できることに気付くでしょう。
Model.predictの呼び出しがパフォーマンスについて不満を述べたことに注意してください-これはソリューションの非効率性を考えると当然のことですが-機能します!
はい、入力画像のサイズに依存しない適切なバックボーンネットワークを選択するだけで正確な値になります。ほとんどのネットワークはこの基準を満たしています。
Flatten
レイヤーで使用しているほとんどの人は、現代のCNNが原理的にどのようなサイズの画像を取得できるかを理解していません。