[レガシー] 変形エラーのトラブルシューティング

危険

ここで説明されているコードは非推奨になりました。従来のソリューションの適用を避けるため使用しないでください。下位互換性を確保するためにしばらく保持されますが、最新のアプリケーションでは使用してはなりません

形状の衝突を避ける方法

操作セマンティクスにより、操作の入力形状に制限が課される場合があります。形状伝播中の形状の衝突は、新しい形状が要件を満たしていないことを示している可能性があります。モデルの入力形状を変更すると、中間操作で形状の衝突が発生する可能性があります。次に例を示します。

  • ハードコードされた出力形状値を使用した Reshape 操作。

  • Const の 2 番目の入力とこの入力を使用した MatMul 演算は、演算セマンティクスにより空間次元によってサイズ変更できません。

モデルの再形状後にモデルの構造とロジックが大幅に変更されてはなりません。

  • グローバル・プーリング操作は、分類モデル出力の出力特徴マップを削減するために使用されます。形状 [N, C, H, W] の入力があると、グローバル・プーリングは形状 [N, C, 1, 1] の出力を返します。モデル設計者は通常、固定カーネルサイズ [H, W] を使用したプーリング操作を利用してグローバルプーリングを表現します。空間リシェイプ中に、形状 [N, C, H1, W1] の入力を持ち、固定カーネルサイズ [H, W]プーリングすると、形状 [N, C, H2, W2] の出力が返されます。通常ここで、H2W2 は 1 に等しくありません。分類モデルの構造が壊れます。例えば、TensorFlow のパブリック・インセプション・ファミリーモデルにはこの問題があります。

  • モデルの入力形状を変更すると、精度に大きな影響を与える可能性があります。例えば、TensorFlow のオブジェクト検出モデルには、設計によりサイズ変更の制限があります。形状変更後もモデルを有効に保つには、pipeline.config ファイルにリストされている条件を満たす新しい入力形状を選択します。

再形状不可能なモデルを修正する方法

通常の形状の伝播を妨げる一部の演算子を修正するには以下を行います。

  • 一部の操作の入力値を変更することで、問題を解決できるかどうかを確認してください。例えば、再形状不可能なモデルで最も一般的な問題は、出力形状がハードコードされた Reshape 操作があります。Reshape のハードコードされた 2 番目の入力をカットして、緩和された値で埋めることができます。以下の図の例では、モデル変換 API コマンドラインは次のようになります。

    mo --input_model path/to/model --input data[8,3,224,224],1:reshaped[2]->[0,-1]`
    

    1:reshaped[2] では、reshaped という名前の操作の 2 番目の入力 (0 から数えて 1: は 2 番目の入力を意味します) を切り取り、形状 [2]パラメーターに置き換える必要があります。->[0 -1] を使用すると、この新しいパラメーター[0, -1] 値を持つ定数オペレーターに置き換えられます。Reshape オペレーターは特定の値として 0-1 を持っているため、Reshape の本来の意味を失うことなく自由に形状を伝播できます。詳細は、仕様を参照してください。

    ../../../../_images/batch_relaxation.png

  • バックフェーズでモデル変換を行います。詳細については、モデルを変換する方法を参照してください。

  • 実行時に OpenVINO モデルを変換します。詳細は、OpenVINO ランタイム・トランスフォーメーションを参照してください。

  • 元のフレームワークを使用して元のモデルを変更します。