PYG 研究ノート

グラフの基本構造

torch_geometric.data.Data によって記述されたグラフ インスタンス

from torch_geometric.data import Data

edge_index = torch.tensor([[0, 1, 2, 0, 3], [1, 0, 1, 3, 2]], dtype=torch.long)
x = torch.tensor([[-1], [0], [1]], dtype=torch.float)
data = Data(x=x, edge_index=edge_index)
data.x : ノード機能 - 行列 [num_nodes, num_node_features]
data.edge_index : 形状とタイプ [2, num_edges] を持つ COO 形式のグラフ接続 torch.long
data.edge_attr : エッジ機能 - 行列 [num_edges, num_edge_features]
data.y : トレーニングするターゲット (任意の形状を持つことができます)、 たとえば、 形状のノード レベルのターゲットまたは形状のグラフ レベルのターゲット [num_nodes, *][1, *]
data.pos : 形状 [num_nodes ] のノード位置の行列 , num_dimensions ]
data.num_nodes : ノード数を取得します。
data.num_edges : エッジの数を取得します。
data.num_node_features : ノード フィーチャの数を取得します。
data.num_edge_features : エッジ フィーチャの数を取得します。
data.contains_isolated_nodes() : 分離ノードを含めるかどうかを決定します。
data.contains_self_loops() : 自己ループ エッジを含めるかどうかを決定します。
data.is_directed() : 有向グラフかどうかを判断する
COOフォーマット
これは、座標形式とも呼ばれる疎行列の一般的な表現方法です。COO 形式では、3 つの配列を使用して疎行列を格納します。これら 3 つの配列は、行インデックス配列、列インデックス配列、および数値配列です。
2 次元疎行列を例にとると、行インデックス配列には各非ゼロ要素の行番号が格納され、列インデックス配列には各非ゼロ要素の列番号が格納され、値配列には各要素の値が格納されます。非ゼロ要素
1 0 0
0 2 0
0 0 3

row = [0, 1, 2]
col = [0, 1, 2]
data = [1, 2, 3]
无权图——只有两行

# データ オブジェクトを GPU に転送します。

device=torch.device('cuda')
data=data.to(device)
連続した

contiguous は、Tensor メモリ ブロックが連続しているかどうかを判断するために使用される関数です。Tensor メモリ ブロックが連続していない場合、ビューや転置など、メモリの連続性を必要とするいくつかの操作を実行する場合は、操作を続行する前に、最初にcontiguous関数を呼び出して Tensor メモリ ブロックを連続にする必要があります。

ビュー 関数 が連続していない Tensor で呼び出される と、例外がスローされます. この場合、 Tensor メモリ ブロックを連続にするために、最初に 連続関数を呼び出す必要があり、その後、 ビュー 関数 が呼び出されます
data.validate()

データ オブジェクトの内部の一貫性と整合性を検証するために使用される関数です。データ オブジェクトのさまざまな属性が一致すること、および必要な属性が存在することを確認します。データ オブジェクトに問題がある場合、validate()関数はエラーを発生させ、適切なエラー メッセージを表示します。この関数は、PyTorch ジオメトリックを使用してカスタム データを処理する場合に非常に便利であり、いくつかの一般的なデータ フォーマット エラーを回避できます。

グラフ用ベンチマーク データセット

データセットの初期化は簡単です。データセットの初期化により、元のファイルが自動的にダウンロードされ、前述のデータ形式に処理されます

from torch_geometric.datasets import TUDataset

dataset = TUDataset(root='/tmp/ENZYMES', name='ENZYMES')
>>> ENZYMES(600)

len(dataset)
>>> 600

dataset.num_classes
>>> 6

dataset.num_node_features
>>> 3

data = dataset[0]
>>> Data(edge_index=[2, 168], x=[37, 3], y=[1])

data.is_undirected()
>>> True
data = dataset[0]
>>> Data(edge_index=[2, 10556], test_mask=[2708],
         train_mask=[2708], val_mask=[2708], x=[2708, 1433], y=[2708])

data.is_undirected()
>>> True

data.train_mask.sum().item()
>>> 140

data.val_mask.sum().item()
>>> 500

data.test_mask.sum().item()
>>> 1000

上数行代码表示神经网络的训练集、验证集、测试集、

小ロット

畳み込みニューラル ネットワークと同様に、バッチ処理もローダーを通じて実装されます。

データ変換

torch_geometric.transforms.Compose

データセットの処理中に呼び出される複数のデータ前処理操作をグループ化する PyG のクラスです。このクラスを使用すると、ユーザーはさまざまな変換関数 (Z 正規化やワンホット エンコーディングなど) を組み合わせて、より大きな変換パイプラインを形成できます。このように、複数の変換関数を組み合わせてより複雑な処理フローにすることができるため、データの前処理をより便利に実行できます。torch_geometric.transforms.Compose はtorch_geometric.datasetsのデータセットに渡すか、データセットをカスタマイズするときに使用できます。

pre_transform

pre_transform=T.KNNGraph(k=6)

トレーニング プロセスの前にデータを前処理するために使用される関数です。この例では、pre_transform はトレーニング前にデータを前処理する KNNGraph オブジェクトです。KNNGraph が行うことは、各ノードを k 個の最近傍ノードに接続して、グラフの隣接行列を生成することです。これは、モデルがノード間の関係をよりよく理解するのに役立ちます。ここで、k=6 は、各ノードが 6 つの最近傍ノードに接続されていることを意味します

T.RandomJitter

transform=T.RandomJitter(0.01)

関数。この関数の役割は、ノード座標にランダムな摂動を追加して、モデルの堅牢性を高めることです。ここでのパラメータ0.01は最大擾乱範囲を指定し、各ノードの座標値は[-0.01, 0.01]の間のいくつかのランダムな値を追加します

グラフの学習方法

from torch_geometric.datasets import Planetoid
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
dataset = Planetoid(root='tmp/Cora', name='Cora')
class GCN(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = GCNConv(dataset.num_node_features, 16)
        self.conv2 = GCNConv(16, dataset.num_classes)

    def forward(self, data):
        x, edge_index = data.x, data.edge_index
        x = self.conv1(x, edge_index)
        x = F.relu(x)
        x = F.dropout(x, training=self.training)
        x = self.conv2(x, edge_index)

        return F.log_softmax(x, dim=1)

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = GCN().to(device)
data = dataset[0].to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)

model.train()
for epoch in range(200):
    optimizer.zero_grad()
    out = model(data)
    loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])
    loss.backward()
    optimizer.step()

model.eval()
pred = model(data).argmax(dim=1)
correct = (pred[data.test_mask] == data.y[data.test_mask]).sum()
acc = int(correct) / int(data.test_mask.sum())
print(f'Accuracy: {acc:.4f}')

这段代码用于对模型进行测试并计算分类准确率。首先,使用模型对测试数据集(data.test_mask)进行前向传递,并取预测结果的最大值作为类别标签。这可以通过调用model(data).argmax(dim=1)来实现,其中model是一个已经训练好的模型,data是一个torch_geometric.data.Data对象,它包含了测试数据的图结构和特征。argmax(dim=1)函数用于返回每个样本的预测类别的索引。

接下来,将预测正确的样本数计算出来,这可以通过比较预测结果和真实标签,然后将结果进行求和操作实现,即(pred[data.test_mask] == data.y[data.test_mask]).sum()。这里只对测试集的样本进行计算,因此使用了data.test_mask来进行切片,而不是对整个数据集进行计算。

最后,将预测正确的样本数除以测试集样本总数,得到测试集分类准确率,即acc = int(correct) / int(data.test_mask.sum())。其中,int函数用于将correct和data.test_mask.sum()转换为整数类型,以确保准确率的计算结果为浮点数。最终,通过print(f'Accuracy: {acc:.4f}')将准确率输出到控制台。

GCNConv()

は、グラフベースの畳み込みニューラル ネットワーク (GCN) を実装するための PyG のグラフ畳み込み層です。その入力はノード特徴行列と隣接行列を持つグラフ データであり、畳み込み計算後のノード特徴行列を出力します。

in_channels (入力特徴次元)、

out_channels (出力特徴次元)

バイアス (バイアス項を使用するかどうか)

GCNConv() は、入力ノードの特徴と隣接行列に対して行列乗算と畳み込み演算を実行することにより、出力ノードの特徴を計算します。畳み込みに正規化された隣接行列を使用して、安定性と収束を確保します。

脱落()

これはニューラル ネットワークのオーバーフィッティングを防ぐために使用される手法で、ニューロンの一部の出力をランダムに破棄 (ゼロに設定) することができます。このようにして、これらの破棄されたニューロンは順方向伝播と逆方向伝播の計算に参加しなくなり、特定の入力パターンに対してモデルが過度に最適化される状況が回避されます。PyTorch では、この関数はdropout()関数を介して実現できます。

dropout_layer = nn.Dropout(p=0.5)

ここで、 pパラメータはドロップ率を表します。つまり、入力のどの割合がゼロに設定されるかを表します。たとえば、上記のコードのdropout_layerオブジェクトは、入力の特定の要素を 50% の確率でランダムにゼロに設定します。トレーニング中、dropout()関数は、各ミニバッチの一部のニューロンの出力をランダムに破棄します。

テスト時には、すべてのニューロンの出力が保持されるため、適切な倍率を掛けて出力値を調整する必要があります。

log_softmax()

function は、入力テンソルの対数ソフトマックスを計算する PyTorch の関数です。ソフトマックス関数は入力テンソルを [0,1] 間隔にマッピングして正規化し、対数ソフトマックスはソフトマックスの出力に対して対数変換を実行します。この関数は通常、ニューラル ネットワークのトレーニングで多分類問題の損失関数を計算するために使用され、クロス エントロピー関数の変形と見なすことができます。

output = torch.nn.functional.log_softmax(input, dim=None, _stacklevel=3, dtype=None)
input是输入张量
dim是在哪个维度上进行softmax操作,默认为最后一维。
dtype是输出张量的数据类型

log_softmax()はsoftmax ()に基づいて改良されました。最初に入力に対して指数関数変換を実行し、次に指数関数の和の対数を取ります。この関数は、計算の複雑さを軽減し、数値のアンダーフローを防ぐことができます。同時に、log_softmax()を使用すると、勾配消失の問題を回避できます。

model.train()

関数を使用して、モデルをトレーニング モードに設定します。ディープ ラーニング モデルをトレーニングに使用する場合、トレーニングの前にこの関数を呼び出して、モデル内の特定のレイヤー (ドロップアウトなど) のトレーニング モードを有効にする必要があります。In training mode, these layer will perform their specific training behavior. たとえば、Dropout 層は、オーバーフィッティングを防ぐために、特定の確率でニューロンをランダムに非アクティブ化します。モデル予測では、通常、 model.eval()関数を呼び出して、モデルを評価モードに設定する必要があります。評価モードでは、ドロップアウト層が評価の安定性を確保するためにニューロンを完全に保持するなど、これらの層が評価動作を実行します。

nll_loss()関数

完全な名前は Negative Log-Likelihood Loss で、分類モデルのトレーニングに使用される損失関数の 1 つです。その役割は、負の対数尤度損失を計算することです。これは、ニューラル ネットワークの出力確率分布を真のラベルの対数確率分布と比較します。

おすすめ

転載: blog.csdn.net/weixin_62375715/article/details/129432569