91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Pytorch+PyG實現EdgeCNN的方法是什么

發布時間:2023-04-21 17:15:01 來源:億速云 閱讀:137 作者:iii 欄目:開發技術

這篇文章主要介紹了Pytorch+PyG實現EdgeCNN的方法是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Pytorch+PyG實現EdgeCNN的方法是什么文章都會有所收獲,下面我們一起來看看吧。

1.EdgeCNN簡介

EdgeCNN是一種用于圖像點云處理的卷積神經網絡(Convolutional Neural Network,CNN)模型。與傳統的CNN僅能處理圖片二維數據不同,EdgeCNN可以對三維點云中每個點周圍的局部鄰域進行操作,并適用于物體識別、深度估計、自動駕駛等多項任務。

2. 實現步驟

2.1 數據準備

在本實驗中,我們使用了一個包含4萬個點云的數據集ModelNet10,作為示例。與其它標準圖像數據集不同的是,這個數據集中圖形的構成量非常大,而且各圖之間結構差異很大,因此需要進行大量的預處理工作。

# 導入模型數據集
from torch_geometric.datasets import ModelNet
# 加載ModelNet數據集
dataset = ModelNet(root='./modelnet', name='10')
data = dataset[0]
# 定義超級參數
num_points = 1024
batch_size = 32
train_dataset_size = 8000
# 將數據集分割成訓練、驗證及測試三個數據集
train_dataset = data[0:train_dataset_size]
val_dataset = data[train_dataset_size: 9000]
test_dataset = data[9000:]
# 定義數據加載批處理器
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

通過上述代碼,我們先是導入ModelNet數據集并將其分割成訓練、驗證及測試三個數據集,并創建了數據加載批處理器,以便于在訓練過程中對這些數據進行有效的處理。

2.2 實現模型

在定義EdgeCNN模型時,我們需要根據圖像點云經常使用的架構定義網絡結構。同時,在實現卷積操作時應引入相應的鄰域信息,來使得網絡能夠學習到系統中附近點之間的關系。

from torch.nn import Sequential as Seq, Linear as Lin, ReLU
from torch_geometric.nn import EdgeConv, global_max_pool
class EdgeCNN(torch.nn.Module):
    def __init__(self, dataset):
        super(EdgeCNN, self).__init__()
        # 定義基礎參數
        self.input_dim = dataset.num_features
        self.output_dim = dataset.num_classes
        self.num_points = num_points
        # 定義模型結構
        self.conv1 = EdgeConv(Seq(Lin(self.input_dim, 32), ReLU()))
        self.conv2 = EdgeConv(Seq(Lin(32, 64), ReLU()))
        self.conv3 = EdgeConv(Seq(Lin(64, 128), ReLU()))
        self.conv4 = EdgeConv(Seq(Lin(128, 256), ReLU()))
        self.fc1 = torch.nn.Linear(256, 1024)
        self.fc2 = torch.nn.Linear(1024, self.output_dim)
    def forward(self, pos, batch):
        # 構造圖
        edge_index = radius_graph(pos, r=0.6, batch=batch, loop=False)
        # 第一層CNN模型的卷積 + 池化處理
        x = F.relu(self.conv1(x=pos, edge_index=edge_index))
        x = global_max_pool(x, batch)
        # 第二層CNN模型的卷積 + 池化處理
        edge_index = radius_graph(x, r=0.9, batch=batch, loop=False)
        x = F.relu(self.conv2(x=x, edge_index=edge_index))
        x = global_max_pool(x, batch)
        # 第三層CNN模型的卷積 + 池化處理
        edge_index = radius_graph(x, r=1.2, batch=batch, loop=False)
        x = F.relu(self.conv3(x=x, edge_index=edge_index))
        x = global_max_pool(x, batch)
        # 第四層CNN模型的卷積 + 池化處理
        edge_index = radius_graph(x, r=1.5, batch=batch, loop=False)
        x = F.relu(self.conv4(x=x, edge_index=edge_index))
        # 定義全連接網絡
        x = global_max_pool(x, batch)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return F.log_softmax(x, dim=-1)

在上述代碼中,實現了基于EdgeCNN的模型的各個卷積層和全連接層,并使用radius_graph等函數將局部區域問題歸約到定義的卷積核檢測范圍之內,以便更好地對點進行分析和特征提取。最后結合全連接層輸出一個維度為類別數的向量,并通過softmax函數來計算損失。

2.3 模型訓練

在定義好EdgeCNN網絡結構之后,我們還需要指定合適的優化器、損失函數,并控制訓練輪數、批大小與學習率等超參數。同時也需要記錄大量日志信息,方便后期跟蹤及管理。

# 定義訓練計劃,包括損失函數、優化器及迭代次數等
train_epochs = 50
learning_rate = 0.01
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(edge_cnn.parameters(), lr=learning_rate)
losses_per_epoch = []
accuracies_per_epoch = []
for epoch in range(train_epochs):
    running_loss = 0.0
    running_corrects = 0.0
    count = 0.0
    for samples in train_loader:
        optimizer.zero_grad()
        pos, batch, label = samples.pos, samples.batch, samples.y.to(torch.long)
        out = edge_cnn(pos, batch)
        loss = criterion(out, label)
        loss.backward()
        optimizer.step()
        running_loss += loss.item() / len(train_dataset)
        running_corrects += torch.sum(torch.argmax(out, dim=1) == label).item() / len(train_dataset)
        count += 1
    losses_per_epoch.append(running_loss)
    accuracies_per_epoch.append(running_corrects)
    if (epoch + 1) % 5 == 0:
        print("Train Epoch {}/{} Loss {:.4f} Accuracy {:.4f}".format(
            epoch + 1, train_epochs, running_loss, running_corrects))

在訓練過程中,我們遍歷每個batch,通過反向傳播算法進行優化,并更新loss及accuracy輸出。同時,為了方便可視化與記錄,需要將訓練過程中的loss和accuracy輸出到相應的容器中,以便后期進行分析和處理。

關于“Pytorch+PyG實現EdgeCNN的方法是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Pytorch+PyG實現EdgeCNN的方法是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

家居| 祁连县| 塘沽区| 通许县| 南江县| 宁乡县| 永丰县| 枣庄市| 南和县| 宜良县| 建宁县| 宁南县| 衢州市| 丹棱县| 金平| 苏尼特右旗| 静宁县| 来凤县| 湘西| 新晃| 昌平区| 浦东新区| 自贡市| 班戈县| 陕西省| 定兴县| 昔阳县| 都兰县| 新和县| 宾阳县| 通许县| 晋州市| 三亚市| 壤塘县| 叙永县| 延寿县| 留坝县| 泗水县| 农安县| 银川市| 原平市|