基於GCN的代碼實現與應用

一、GCN代碼實現

GCN即圖卷積神經網路,是一種廣泛應用於圖像識別、社交網路等領域的深度學習演算法。以下是一個基於PyTorch實現的簡單的GCN代碼:

import torch
import torch.nn.functional as F

class GCN(torch.nn.Module):
    def __init__(self, n_feat, n_hidden, n_class):
        super(GCN, self).__init__()
        self.layer1 = torch.nn.Linear(n_feat, n_hidden)
        self.layer2 = torch.nn.Linear(n_hidden, n_class)

    def forward(self, x, adj):
        h = F.relu(self.layer1(adj@x))
        out = self.layer2(h)
        return out

在這個代碼中,輸入變數x表示節點的特徵向量,adj表示節點之間的鄰接矩陣。代碼實現了兩層線性變換加ReLU的GCN結構,並將輸出作為分類結果。

二、GCN代碼詳解PyTorch

PyTorch是一個基於Python的機器學習庫,簡單易用且具有高效的計算能力,是深度學習領域不可或缺的工具之一。下面介紹一些PyTorch中關於GCN代碼的詳解:

1、nn.Linear

nn.Linear是PyTorch中的一個線性變換層,其實現公式為:y=Ax+b,其中A是輸入,b是偏差向量,y是輸出。代碼中通過兩個nn.Linear層分別實現GCN中的兩次線性變換。

2、torch.nn.functional.relu

torch.nn.functional.relu是PyTorch中的ReLU激活函數。在GCN中,每次線性變換之後都會使用ReLU函數進行非線性變換,以增加模型的表達能力。

3、模型的前向傳播函數forward

在PyTorch中,所有自定義的模型都需要實現一個前向傳播函數forward,用於對輸入進行預測並輸出結果。在GCN中,forward函數接受節點特徵向量和鄰接矩陣作為輸入,在經過兩次線性變化和ReLU激活後輸出分類結果。

三、GCN預測代碼

以下是一個使用GCN進行節點分類預測的代碼示例,使用的是上海地鐵站點數據集:

import numpy as np
import torch
from torch import nn
from torch.utils.data import DataLoader
from tqdm import tqdm

from dataset import NodeClassificationDataset
from model import GCN

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

train_data = NodeClassificationDataset("data/shanghai_nodes.txt", "data/shanghai_edges.txt", "data/shanghai_labels.txt", mode="train")
test_data = NodeClassificationDataset("data/shanghai_nodes.txt", "data/shanghai_edges.txt", "data/shanghai_labels.txt", mode="test")

train_loader = DataLoader(train_data, batch_size=16, shuffle=True)
test_loader = DataLoader(test_data, batch_size=16, shuffle=True)

model = GCN(in_feat=train_data.num_features, hid_feat=16, out_class=len(train_data.class_dict)).to(device)

optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
loss_fn = nn.CrossEntropyLoss()

for epoch in range(50):
    model.train()
    pbar = tqdm(train_loader)
    for batch in pbar:
        optimizer.zero_grad()
        batch = {k: v.to(device) for k, v in batch.items()}
        pred = model(batch["feature"], batch["adj"])
        loss = loss_fn(pred, batch["label"])
        loss.backward()
        optimizer.step()

        pbar.set_description(f"Train loss: {loss.item():.4f}")

    model.eval()
    test_loss = 0
    test_acc = 0
    with torch.no_grad():
        for batch in test_loader:
            batch = {k: v.to(device) for k, v in batch.items()}
            pred = model(batch["feature"], batch["adj"])
            loss = loss_fn(pred, batch["label"])
            test_loss += loss.item() * len(batch["label"])
            test_acc += (pred.argmax(dim=-1) == batch["label"]).sum().item()

    test_loss /= len(test_data)
    test_acc /= len(test_data)
    print(f"Epoch {epoch + 1}: Test loss: {test_loss:.4f}, Test accuracy: {test_acc:.4f}")

在這個代碼中,我們先對上海地鐵站點數據集進行預處理,得到包含節點特徵、鄰接矩陣和標籤的數據集。然後,我們構建一個包含兩層卷積的GCN模型,定義CrossEntropyLoss函數作為損失函數,使用Adam優化器進行優化。在每個epoch中,我們使用train_loader對模型進行訓練,然後用test_loader對模型進行測試並輸出結果。

四、GCode代碼

GCode是一種用於驅動數控機床的指令語言。以下是一個簡單的GCode代碼片段,用於實現在坐標系中沿著X軸和Y軸分別移動50mm:

G00 X50 Y50

在這個代碼中,G00是一個指令代碼,用於進行快速移動;X50和Y50分別表示在X軸和Y軸方向上移動的距離為50mm。

五、上汽大眾機油GCN代碼

圖神經網路不僅可以用於圖像、社交網路等領域,還可以應用於工業領域中的機油預測。以下是一個上汽大眾機油GCN代碼的示例:

import torch
import torch.nn as nn

class GCN(nn.Module):
    def __init__(self, n_feat, n_hid, n_class):
        super(GCN, self).__init__()
        self.lin1 = nn.Linear(n_feat, n_hid)
        self.lin2 = nn.Linear(n_hid, n_class)

    def forward(self, x, adj):
        h = torch.sigmoid(self.lin1(adj@x))
        h = self.lin2(adj@h)
        return h

在這個代碼中,我們定義了一個包含兩層GCN卷積的模型。模型的輸入包括節點的特徵向量x和節點之間的鄰接矩陣adj。在這個模型中,我們使用了Sigmoid函數作為非線性變換,並使用兩層線性變換來實現GCN的功能。

六、GCN鏈路預測代碼

鏈路預測是指在給定一個圖結構時,預測其中可能存在的邊。以下是一個使用GCN進行鏈路預測的Python代碼示例:

import numpy as np
import torch
from torch import nn
from torch.utils.data import DataLoader
from tqdm import tqdm

from dataset import LinkPredictionDataset
from model import GCN

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

data = LinkPredictionDataset("data/soc-Epinions1.txt")
data_size = len(data)
train_size = int(0.8*data_size)
test_size = data_size - train_size
train_data, test_data = torch.utils.data.random_split(data, [train_size, test_size])

train_loader = DataLoader(train_data, batch_size=16, shuffle=True)
test_loader = DataLoader(test_data, batch_size=16, shuffle=True)

model = GCN(in_feat=len(data.nodes), hid_feat=64, out_class=2).to(device)

optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
loss_fn = nn.BCEWithLogitsLoss()

for epoch in range(10):
    model.train()
    pbar = tqdm(train_loader)
    for batch in pbar:
        optimizer.zero_grad()
        batch = {k: v.to(device) for k, v in batch.items()}
        pred = model(torch.cat([batch["src_feat"], batch["dst_feat"]]), batch["adj"])
        loss = loss_fn(pred.view(-1), batch["label"].float())
        loss.backward()
        optimizer.step()

        pbar.set_description(f"Train loss: {loss.item():.4f}")

    model.eval()
    test_loss = 0
    test_acc = 0
    with torch.no_grad():
        for batch in test_loader:
            batch = {k: v.to(device) for k, v in batch.items()}
            pred = model(torch.cat([batch["src_feat"], batch["dst_feat"]]), batch["adj"])
            loss = loss_fn(pred.view(-1), batch["label"].float())
            test_loss += loss.item() * len(batch["label"])
            test_acc += ((pred > 0) == batch["label"]).sum().item()

    test_loss /= len(test_data)
    test_acc /= len(test_data)
    print(f"Epoch {epoch + 1}: Test loss: {test_loss:.4f}, Test accuracy: {test_acc:.4f}")

在這個代碼中,我們使用了一個包含兩層GCN卷積的模型,將預測任務轉化為二分類問題,並使用BCEWithLogitsLoss作為損失函數。在每個epoch中,我們使用train_loader對模型進行訓練,然後用test_loader對模型進行測試並輸出結果。

七、GCode代碼生成

以下是一個簡單的Python代碼示例,用於生成一組GCode代碼,實現在坐標系中從(0,0)點到(50,50)點的直線移動:

code_str = f"G00 X0 Y0\nG01 X50 Y50"
with open("test.gcode", "w") as f:
    f.write(code_str)

在這個代碼中,我們首先定義了一個包含兩行的GCode代碼字元串code_str,其中第一行表示進行快速移動,第二行表示進行線性移動。然後,我們使用Python中的文件操作將這個代碼字元串寫入到test.gcode文件中。

八、CNC代碼G

CNC代碼是一種用於控制數控設備進行加工的指令語言。以下是一個簡單的CNC代碼G示例,用於實現在坐標系中從(0,0)點到(50,50)點的直線移動:

G00 X0 Y0
G01 X50 Y50 F100

在這個代碼中,G00和G01分別表示快速移動和線性移動,X0和Y0表示起點坐標,X50和Y50表示終點坐標,F100表示移動速度為100。

九、GCCC代碼集合

以下是一個簡單的GCCC代碼集合示例,用於實現數控機床的一些常見加工操作:

G00 X0 Y0
G01 X50 Y50 F100
M03 S1000
G02 X50 Y25 I25 J0 F50
M05

在這個代碼中,G00和G01表示快速移動和線性移動,X0和Y0表示起點坐標,X50和Y50表示終點坐標,F100表示移動速度為100。M03和M05分別表示啟動和停止主軸旋轉,S1000表示主軸轉速為1000。G02表示沿著一條順時針圓弧進行移動,I25和J0表示圓弧中心的坐標偏移量,F50表示移動速度為50。

十、CNC代碼G和M代碼選取

在CNC代碼中,G代碼包含針對幾何運動的指令,而M代碼則包含針對副加工功能的指令。以下是幾個最常用的CNC代碼G和M代碼:

1、G00:快速移動

該指令用於在加工區域內進行快速移動,節省時間。

2、G01:線性插補

該指令用於沿著一條直線進行移動。

3、G02和G03:圓弧插補

<p

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/188415.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-28 13:29
下一篇 2024-11-28 13:30

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字元串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字元串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字元串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變數和數…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在著手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29
  • 怎麼寫不影響Python運行的長段代碼

    在Python編程的過程中,我們不可避免地需要編寫一些長段代碼,包括函數、類、複雜的控制語句等等。在編寫這些代碼時,我們需要考慮代碼可讀性、易用性以及對Python運行性能的影響。…

    編程 2025-04-29
  • 北化教務管理系統介紹及開發代碼示例

    本文將從多個方面對北化教務管理系統進行介紹及開發代碼示例,幫助開發者更好地理解和應用該系統。 一、項目介紹 北化教務管理系統是一款針對高校學生和教職工的綜合信息管理系統。系統實現的…

    編程 2025-04-29
  • Python愛心代碼動態

    本文將從多個方面詳細闡述Python愛心代碼動態,包括實現基本原理、應用場景、代碼示例等。 一、實現基本原理 Python愛心代碼動態使用turtle模塊實現。在繪製一個心形的基礎…

    編程 2025-04-29

發表回復

登錄後才能評論