GNN
圖神經網路。
分類器
屬性 labels_
會將一個標籤指派給圖中的每個節點。
- class sknetwork.gnn.GNNClassifier(dims: int | Iterable | None = None, layer_types: str | Iterable = 'Conv', activations: str | Iterable = 'ReLu', use_bias: bool | list = True, normalizations: str | Iterable = 'both', self_embeddings: bool | Iterable = True, sample_sizes: int | list = 25, loss: BaseLoss | str = 'CrossEntropy', layers: Iterable | None = None, optimizer: BaseOptimizer | str = 'Adam', learning_rate: float = 0.01, early_stopping: bool = True, patience: int = 10, verbose: bool = False)[source]
用於節點分類的圖神經網路。
- 參數:
dims (可疊代 或 整數) – 各個層輸出的維度 (順向)。如果為整數,則為輸出層維度 (沒有隱藏層)。如果指定
層
則此參數為選用。layer_types (可疊代 或 字串) – 各層類型 (順向)。如果為字串,表示在每層使用相同類型。可以是
'Conv'
(圖形卷積層,預設) 或'Sage'
(GraphSage)。啟動器 (可迭代或字串) – 啟動器功能 (正向方向)。若為字串,則每層使用相同的啟動器功能。可以是
'Identity'
、'Relu'
、'Sigmoid'
或'Softmax'
(預設 ='Relu'
)。使用偏差 (可迭代或布林值) – 每層是否加上偏差值 (正向方向)。若
True
,則每層使用偏差值。正規化 (可迭代或字串) –訊息傳遞時鄰接矩陣的正規化 (正向方向)。若為字串,則每層使用相同的正規化類型。可以是
'left'
(以度數進行左正規化)、'right'
(以度數進行右正規化)、'both'
(以度數的平方根進行對稱正規化,預設) 或None
(不正規化)。自我嵌入 (可迭代或字串) – 訊息傳遞時是否為每個節點加上嵌入 (正向方向)。若
True
,則每層加上自我嵌入。取樣大小 (可迭代或整數) – 為每個節點取樣鄰域時的大小 (正向方向)。若為整數,則每層使用相同的取樣大小。僅使用於
'Sage'
類型的層。損失 (字串 (預設 =
'CrossEntropy'
) 或 BaseLoss) – 損失函數的名稱或自訂損失函數。層 (可迭代或None) – 自訂層 (正向方向)。若使用,則略過前一個參數。
最佳化器 (字串或最佳化器) –
'Adam'
,隨機梯度最佳化器 (預設)。'GD'
,梯度下降法。
學習率 (浮點數) – 學習率。
早期停止 (布林值 (預設 =
True
)) – 是否使用早期停止來結束訓練。若True
,則當驗證得分經過 耐心 次反覆運算後沒有改善時,訓練便會終止。耐心 (整數 (預設 = 10)) – 在沒有改善的情況下等待的重複次數,才會停止擬合。
詳細 (布林值) – 詳細模式。
- 變數:
conv1 (conv2, ...,) – 圖形卷積層。
output (np.ndarray) – GNN 輸出。
labels (np.ndarray) – 預測節點標籤。
history (dict) – 每個數據點的訓練歷程:{
'embedding'
,'loss'
,'train_accuracy'
,'val_accuracy'
}。
範例
>>> from sknetwork.gnn.gnn_classifier import GNNClassifier >>> from sknetwork.data import karate_club >>> from numpy.random import randint >>> graph = karate_club(metadata=True) >>> adjacency = graph.adjacency >>> labels_true = graph.labels >>> labels = {i: labels_true[i] for i in [0, 1, 33]} >>> features = adjacency.copy() >>> gnn = GNNClassifier(dims=1, early_stopping=False) >>> labels_pred = gnn.fit_predict(adjacency, features, labels, random_state=42) >>> round(np.mean(labels_pred == labels_true), 2) 0.88
- backward(features: csr_matrix, labels: ndarray, mask: ndarray)
計算反向傳遞。
- 參數:
features (sparse.csr_matrix) – 特徵,形狀為 (n_nodes, n_features) 的陣列。
labels (np.ndarray) – 標籤,形狀為 (n_nodes,) 的陣列。
mask (np.ndarray) – 布林值遮罩,形狀為 (n_nodes,) 的陣列。
- fit(鄰接矩陣: csr_矩陣 | ndarray, 特徵: csr_矩陣 | ndarray, 標籤: ndarray, 循環次數: int = 100, 驗證: float = 0, 重新初始化: 布林值 = False, 隨機狀態: int | 無 = None) GNNClassifier [來源]
依據資料調整模型並儲存訓練好的參數。
- 參數:
鄰接矩陣 (sparse.csr_matrix) – 圖形的鄰接矩陣。
特徵 (sparse.csr_matrix, np.ndarray) – 形狀為 \((n, d)\) 的輸入特徵,其中 \(n\) 為圖中節點的數量,而 \(d\) 為特徵空間的大小。
標籤 (dict, np.ndarray) – 已知的標籤。忽略負值。
循環次數 (int (預設 = 100)) – 循環次數(遍歷整個圖表)。
驗證 (float) – 用於驗證的訓練集比例(介於 0 到 1 之間)。
reinit (bool (預設 =
False
)) – 若為True
,則重新初始化 GNN 可訓練參數(權重和偏置)。random_state (int) – 隨機種子,用於在多次執行中產生可重現的結果。
- fit_predict(*args, **kwargs) ndarray
將演算法擬合到資料並傳回標籤。與
fit
方法相同的參數。- 傳回::
labels – 節點的標籤。
- 傳回型別::
np.ndarray
- fit_predict_proba(*args, **kwargs) ndarray
將演算法擬合到資料並傳回標籤的機率分佈。與
fit
方法相同的參數。- 傳回::
probs – 標籤的機率分布。
- 傳回型別::
np.ndarray
- fit_transform(*args, **kwargs) ndarray
將演算法擬合到資料並傳回節點的嵌入。與
fit
方法相同的參數。- 傳回::
embedding – 節點的嵌入。
- 傳回型別::
np.ndarray
- forward(adjacency: list | csr_matrix, features: csr_matrix | ndarray) ndarray [source]
執行圖形上的前進傳遞並傳回輸出。
- 參數:
鄰接矩陣 (Union[list, sparse.csr_matrix]) – 鄰接矩陣或採樣鄰接矩陣清單。
特徵 (sparse.csr_matrix, np.ndarray) – 特徵,形狀為 (n_nodes, n_features) 的陣列。
- 傳回::
輸出 – GNN 的輸出。
- 傳回型別::
np.ndarray
- get_params()
以字典形式取得參數。
- 傳回::
params – 演算法的參數。
- 傳回型別::
dict
- predict()
傳回預測的標籤。
- predict_proba()
傳回標籤上的機率分佈。
- print_log(*args)
填入文字到 log 中。
- set_params(params: dict) Algorithm
設定演算法的參數。
- 參數:
params (dict) – 演算法的參數。
- 傳回::
self
- 傳回型別::
Algorithm
- transform()
傳回節點內嵌。
卷積層
- 類別 sknetwork.gnn.Convolution(layer_type: str, out_channels: int, activation: BaseActivation | str | None = 'Relu', use_bias: bool = True, normalization: str = 'both', self_embeddings: bool = True, sample_size: int | None = None, loss: BaseLoss | str | None = None)[原始碼]
圖形捲積層。
將以下函式應用至嵌入 \(X\)
\(\sigma(\bar AXW + b)\),
其中 \(\bar A\) 是正規化鄰接矩陣(可能插入自嵌入),\(W\),\(b\) 是可訓練參數,\(\sigma\) 是激活函數。
- 參數:
layer_type (str) – 層類型。可以是
'Conv'
,卷積運算子,如同 [1] 中所述,或是'Sage'
,如同 [2] 中所述。out_channels (int) – 輸出的維度。
activation (str (預設值 =
'Relu'
) 或自訂激活。) – 激活函數。如果是字串,可以使用'Identity'
、'Relu'
、'Sigmoid'
或'Softmax'
。use_bias (bool (預設值 = 真)) – 如果
真
,新增偏差向量。normalization (str (預設值 =
'both'
)) – 傳遞訊息時,鄰接矩陣的正規化。可以使用 ‘left’` (依據度數進行左正規化),'right'
(依據度數進行右正規化),'both'
(依據度數的平方根對稱正規化,預設值) 或None
(不正規化)。self_embeddings (bool (預設值 = 真)) – 如果
真
,除了相鄰的嵌入之外,考慮加入圖形中每個節點的自嵌入。sample_size (int (預設值 = 25)) – 對每個節點抽樣的鄰域大小。僅用於
'Sage'
層。
- 變數:
weight (np.ndarray,) – 可訓練權重矩陣。
bias (np.ndarray) – 偏差向量。
embedding (np.ndarray) – 節點的嵌入(在激活之前)。
output (np.ndarray) – 層的輸出(在激活之後)。
參考文獻
[1] Kipf, T., & Welling, M. (2017). 以圖形卷積網路進行半監督分類。 第五屆表示學習國際研討會。
[2] Hamilton, W. Ying, R., & Leskovec, J. (2017) 大型圖形上的歸納表示學習。 NIPS
啟動函數
- class sknetwork.gnn.BaseActivation(name: str = 'custom')[原始程式碼]
啟動函數的基本類別。:param name: 啟動函數的名稱。:type name: str
損失函數
- 類別 sknetwork.gnn.BaseLoss(name: 字串 = 'custom')[來源]
損失函數的基本類別。
- 靜態 梯度(訊號: ndarray, 方向: ndarray) ndarray
啟動函數的梯度。
- 參數:
signal (np.ndarray, shape (n_samples, n_channels)) – 輸入訊號。
direction (np.ndarray, shape (n_samples, n_channels)) – 擷取梯度的方向。
- 傳回::
gradient – 梯度。
- 傳回型別::
np.ndarray, shape (n_samples, n_channels)
- 靜態 損失(訊號: ndarray, 標籤: ndarray) 浮點數 [來源]
取得損失值。
- 參數:
訊號 (np.ndarray, 形狀 (範例數, 頻道數)) – 輸入訊號 (在啟用前)。
標籤 (np.ndarray, 形狀 (範例數)) – 正確標籤。
- 靜態 loss_gradient(訊號: ndarray, 標籤: ndarray) ndarray [來源]
損失函數的梯度。
- 參數:
signal (np.ndarray, shape (n_samples, n_channels)) – 輸入訊號。
標籤(np.ndarray、形狀(n_samples、))– 真實標籤。
- 傳回::
gradient – 梯度。
- 傳回型別::
np.ndarray, shape (n_samples, n_channels)
- static 輸出(訊號: ndarray) ndarray
激活函數的輸出。
- 參數:
signal (np.ndarray, shape (n_samples, n_channels)) – 輸入訊號。
- 傳回::
output – 輸出訊號。
- 傳回型別::
np.ndarray, shape (n_samples, n_channels)
- 類別 sknetwork.gnn.交叉熵損失[來源]
帶有 softmax 啟用的交叉熵損失。
對於具有值 \(x\) 和真實標籤 \(y\) 的單一樣本,交叉熵損失為
\(-\sum_i 1_{\{y=i\}} \log (p_i)\)
其中
\(p_i = e^{x_i} / \sum_j e^{x_j}\).
對於 \(n\) 個樣本,傳回平均損失。
- static 梯度(訊號: ndarray, 方向: ndarray) ndarray
Softmax 函式的梯度。
- static 損失(訊號: ndarray, 標籤: ndarray) 浮點數 [來源]
取得損失值。
- 參數:
訊號(np.ndarray、形狀(n_samples、n_channels))– 輸入訊號(在啟用之前)。通道數量至少必須為 2。
標籤 (np.ndarray, 形狀 (範例數)) – 正確標籤。
- 傳回::
值 – 損失值。
- 傳回型別::
浮點數
- 靜態 損失函數梯度(訊號: ndarray, 標籤: ndarray) ndarray [來源]
取得損失函數的梯度(包含活化函數)。
- 參數:
訊號 (np.ndarray, 形狀 (範例數, 頻道數)) – 輸入訊號 (在啟用前)。
標籤 (np.ndarray, 形狀 (範例數)) – 正確標籤。
- 傳回::
梯度 – 損失函數的梯度。
- 傳回型別::
浮點數
- 靜態 輸出(訊號: ndarray) ndarray
Softmax 函式的輸出(行總和為 1)。
- 類別 sknetwork.gnn.二元交叉熵[來源]
具有 sigmoid 活化函數的二元交叉熵損失。
對於具有真實標籤 \(y\) 和預測機率 \(p\) 的單一樣本,二元交叉熵損失為
\(-y \log (p) - (1-y) \log (1 - p).\)
對於 \(n\) 個樣本,傳回平均損失。
- 靜態 梯度(訊號: ndarray, 方向: ndarray) ndarray
Sigmoid 函式的梯度。
- 靜態 損失函數(訊號: ndarray, 標籤: ndarray) 浮點數 [原始碼]
取得損失值。
- 參數:
訊號(np.ndarray、形狀(n_samples、n_channels))– 輸入訊號(在啟用之前)。通道數量至少必須為 2。
標籤 (np.ndarray, 形狀 (範例數)) – 正確標籤。
- 傳回::
值 – 損失值。
- 傳回型別::
浮點數
- 靜態 損失函數梯度(訊號: ndarray, 標籤: ndarray) ndarray [原始碼]
取得損失函數的梯度(包含活化函數)。
- 參數:
訊號 (np.ndarray, 形狀 (範例數, 頻道數)) – 輸入訊號 (在啟用前)。
標籤 (np.ndarray, 形狀 (範例數)) – 正確標籤。
- 傳回::
梯度 – 損失函數的梯度。
- 傳回型別::
浮點數
- 靜態 輸出(訊號: ndarray) ndarray
Sigmoid 函式的輸出。
最佳化器
- 類別 sknetwork.gnn.ADAM(學習率: 浮點數 = 0.01, 貝塔 1: 浮點數 = 0.9, 貝塔 2: 浮點數 = 0.999, epsilon: 浮點數 = 1e-08)[原始碼]
Adam 優化器。
- 參數:
learning_rate (浮點數 (預設 = 0.01)) – 更新權重的學習率。
貝塔 1 (浮點數) – 用來計算梯度執行平均的係數。
貝塔 2 (浮點數) – 用來計算梯度執行平均的係數。
epsilon (浮點數 (預設 = 1e-8)) – 加到分母的項目以提升穩定性。
參考文獻
Kingma, D. P., & Ba, J. (2014)。Adam:一種用於隨機最佳化的方法。第 3 屆學習表徵國際會議。