バッチ処理
深層学習では、堅牢な学習のために、最適化の各ステップで複数の入力例を処理します。したがって、効率的なバッチ処理は非常に重要です。画像入力の場合、バッチ処理は簡単です。N個の画像は同じ高さ、幅にリサイズされ、N x 3 x H x W
の形状の4次元テンソルとしてスタックされます。しかし、メッシュの場合、バッチ処理はそれほど簡単ではありません。
メッシュのバッチモード
mesh1 = (v1: V1 x 3, f1: F1 x 3)
(頂点V1
個、面F1
個)とmesh2 = (v2: V2 x 3, f2: F2 x 3)
(頂点V2 (!= V1)
個、面F2 (!= F1)
個)の2つのメッシュを含むバッチを作成したいとします。Meshesデータ構造は、異なるヘテロジニアスなメッシュをバッチ処理する3つの異なる方法を提供します。meshes = Meshes(verts = [v1, v2], faces = [f1, f2])
がデータ構造のインスタンス化である場合、
- リスト: バッチ内の例をテンソルのリストとして返します。具体的には、
meshes.verts_list()
は頂点のリスト[v1, v2]
を返し、meshes.faces_list()
は面のリスト[f1, f2]
を返します。 - パディング済み: パディング済み表現は、余分な値をパディングすることでテンソルを作成します。具体的には、
meshes.verts_padded()
は2 x max(V1, V2) x 3
の形状のテンソルを返し、余分な頂点を0
でパディングします。同様に、meshes.faces_padded()
は2 x max(F1, F2) x 3
の形状のテンソルを返し、余分な面を-1
でパディングします。 - パック済み: パック済み表現は、バッチ内の例をテンソルに連結します。具体的には、
meshes.verts_packed()
は(V1 + V2) x 3
の形状のテンソルを返します。同様に、meshes.faces_packed()
は面に対して(F1 + F2) x 3
の形状のテンソルを返します。パックモードでは、パックモードとパディング済みモードまたはリストモード間の効率的な変換を可能にする補助変数が計算されます。
バッチモードのユースケース
異なるメッシュバッチモードの必要性は、PyTorch演算子の実装方法に固有です。最適化されたPyTorch演算子を最大限に活用するために、Meshesデータ構造は、異なるバッチモード間の効率的な変換を可能にします。これは、高速で効率的なトレーニングサイクルを目指す際に重要です。Mesh R-CNNはその例です。ここでは、同じ順伝播パスでネットワークの異なる部分が異なる入力を受け入れ、それらは異なるバッチモード間を変換することで計算されます。具体的には、vert_alignはパディング済み入力テンソルを想定していますが、直後にgraph_convはパック済み入力テンソルを想定しています。