Documentation Index
Fetch the complete documentation index at: https://dripart-mintlify-e28287af.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
pytorch、張量、および torch.Tensor
Comfy におけるすべての核心的な数値計算は pytorch によって行われています。カスタムノードが stable diffusion の内部構造に深く関わる場合、このライブラリに精通する必要がありますが、それはこの導入文の範囲を大きく超えています。 しかし、多くのカスタムノードは画像、潜変量、マスクを操作する必要があり、これらは内部でtorch.Tensor として表現されているため、torch.Tensor のドキュメント をブックマークしておくとよいでしょう。
張量とは?
torch.Tensor は張量を表します。張量は、ベクトルや行列を任意の次元数に一般化した数学的な概念です。張量の 秩(rank)はそれが持つ次元の数であり(つまりベクトルは 秩 1、行列は 秩 2)、形状(shape)は各次元のサイズを記述します。
したがって、RGB 画像(高さ H、幅 W)は、3 つの配列(各色チャンネルごとに 1 つ)であり、それぞれが H x W であるため、形状 [H,W,3] の張量として表現できると考えられます。Comfy では、画像はほぼ常にバッチとして扱われます(バッチに画像が 1 枚しか含まれていない場合でも)。torch は常にバッチ次元を最初に配置するため、Comfy の画像の 形状 は [B,H,W,3] となり、通常は C をチャンネル(Channels)を表すものとして [B,H,W,C] と記述されます。
squeeze、unsqueeze、および reshape
張量の次元のサイズが 1 である場合(縮退次元と呼ばれます)、その次元を削除した張量と同じものとなります(バッチに画像が 1 枚しかない場合は、単なる画像です)。このような縮退次元を削除することを squeezing(スクイーズ)と呼び、挿入することを unsqueezing(アンスクイーズ)と呼びます。 同じデータを異なる形状で表現することを reshape(リシェイプ)と呼びます。これには多くの場合、基礎となるデータ構造を知る必要があるため、注意して扱ってください!重要な記法
torch.Tensor は、ほとんどの Python のスライス記法、イテレーション、以及其他常见的类列表操作 (その他の一般的なリストのような操作) をサポートしています。張量には .shape 属性もあり、サイズを torch.Size として返します(これは tuple のサブクラスであり、そのように扱えます)。
他にも、よく目にする重要な記法がいくつかあります(これらのいくつかは標準的な Python の記法としてはあまり一般的ではありませんが、張量を扱う際には非常に頻繁に見られます)
torch.Tensorはスライス記法においてNoneを使用して、サイズ 1 の次元の挿入を示すことができます。:は張量をスライスする際によく使用されます。これは単に「次元全体を保持する」ことを意味します。Python のa[start:end]を使用するようなものですが、開始点と終点を省略した形です。...は「指定されていない数の次元全体」を表します。したがって、a[0, ...]は次元の数に関係なく、バッチから最初のアイテムを抽出します。- 形状の受け渡しを必要とするメソッドでは、しばしば次元の
tupleとして渡され、その中で単一の次元にサイズ-1を指定できます。これは、この次元のサイズがデータの総サイズに基づいて計算されるべきであることを示します。
要素ごとの操作
torch.Tensor における多くの二項演算(’+’, ’-’, ’*’, ’/’、’==’ などを含む)は要素ごとに適用されます(各要素に独立して適用されます)。オペランドは、同じ形状の 2 つの張量 または 張量とスカラーの いずれか でなければなりません。したがって:
張量の真偽値
Python リストの真偽値については馴染みがあるかもしれません。空でないリストはTrue、None または [] は False となります。対照的に、torch.Tensor(要素が 2 つ以上ある場合)には定義された真偽値がありません。代わりに、.all() または .any() を使用して要素ごとの真偽値を結合する必要があります:
if a: ではなく if a is not None: を使用する必要があることを意味します。