4. 神經網絡的簡單搭建、卷積操作與卷積層


  在前3篇博客介紹完pytorch的基礎知識之后,我這里我們接着介紹簡單網絡的搭建,詳述卷積操作,最后根據卷積操作搭建 神經網絡的卷積層。

1. nn.Module的簡單使用

     官方幫助文檔

  首先,我們還是要從幫助文檔看起,進入 pytorch 官網,查看 Pytorch 的官方幫助文檔


  然后進入 torch.nn 部分(nn 是神經網絡 neural network 的簡稱),查看 container 容器(也可以稱之為骨架)

我們可以看到 torch.nn 下面有很多東西,像是卷積層、池化層、非線性激活、正則化層等等,感興趣可以提前看一下,后續博客我會有介紹。



  我們主要查看兩個部分,torch.nn.Module 的介紹,以及他的 使用:



     代碼示例運行

  看完,幫助文檔之后,我們進行試驗一下(需要用到之前的 tensorboarddatasetstransformDataLoader,如果不會或者是已經忘記需要參考一下我之前寫的博客)。
下面我們的定義了一個 MyModel 類別,繼承而來 torch.nn.Module,forward完成的是一個簡單的加法操作。

import cv2
from PIL import Image
import torch
import torchvision
from torch.utils.data import DataLoader
from torch.utils.data import Dataset
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms


class MyModel(torch.nn.Module):
    def __init__(self, delta):
        super(MyModel, self).__init__()
        self.delta = delta

    def forward(self, x):
        return x + self.delta


if __name__ == "__main__":
    my_model = MyModel(torch.tensor(10))
    x = torch.tensor(5)
    print(my_model(x))

2. 卷積操作(convolution)

  學過數字圖像處理或者是相關課程的小伙伴們對卷積操作一定不陌生,倘若不了解的話,可以參考知乎上卷積的提問,個人認為寫的非常好!

     torch.nn.functional.conv2d()

  首先,我們查閱官方文檔



根據官方文檔,我們寫一個例子來實踐一下:

import torch
import torchvision
from torch.utils.tensorboard import SummaryWriter
from torch.utils.data import DataLoader
import torch.nn.functional as F


input = torch.tensor([
    [1, 2, 0, 3, 1],
    [0, 1, 2, 3, 1],
    [1, 2, 1, 0, 0],
    [5, 2, 3, 1, 1],
    [2, 1, 0, 1, 1]
])
kernel = torch.tensor([
    [1, 2, 1],
    [0, 1, 0],
    [2, 1, 0]
])

# 為了滿足 torch.nn.functional.con2d 輸入和卷積核的 size 類型,我們需要對其進行 reshape
my_list = list(input.shape)
my_list.insert(0, 1)
my_list.insert(0, -1)
input = torch.reshape(input, my_list)   # 直接這樣插入。。。
kernel = torch.reshape(kernel, [1, 1, -1, 3])

result1 = F.conv2d(input=input, weight=kernel, stride=1, padding=0)
print(result1)


result2 = F.conv2d(input=input, weight=kernel, stride=1, padding=1)
print(result2)

3. 神經網絡的卷積層

前兩部分,我們了解了 torch.nn.Module,使用該抽象類派生出 Model,並且學習了 torch.nn.functional.conv2d() 卷積操作,下面我們將要學習 torch.nn.Conv2d(),並用此來寫一個神經網絡的卷積層

     torch.nn.Conv2d()

  下面,我們查看 Torch.nn.Conv2d的官方文檔,並對參數進行一些講解。



     簡單的卷積神經網絡

步驟如下所示:

  1. 首先,我們仍舊是使用 datasets 和 Dataloader 進行加載數據集
  2. 使用 torch.nn.Module 派生出一個簡單的神經網絡
  3. 將網絡的運行結果寫入到 tensorboard 可視化工具中
  4. 使用 tensorboard 可視化查看結果

代碼:

import torch
import torchvision
from PIL import Image
import cv2
from torch.utils.tensorboard import SummaryWriter
from torch.utils.data import DataLoader


class MyModel(torch.nn.Module):
    r""" 
        a class used as neural network modek
    """
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv1 = torch.nn.Conv2d(in_channels=3, out_channels=1, kernel_size=(4, 4), stride=1, padding=1)
        self.conv2 = torch.nn.Conv2d(in_channels=1, out_channels=3, kernel_size=(3, 3), stride=2, padding=1)

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        return x


data_path = "../../data_cifar10"
dataset_test = torchvision.datasets.CIFAR10(data_path, train=False, transform=torchvision.transforms.ToTensor(),                                            download=True)
data_loader = DataLoader(dataset_test, batch_size=64, shuffle=True, drop_last=False)

log_path = "../../logs"
writer = SummaryWriter(log_dir=log_path)
step = 0
my_model = MyModel()
step_list = []
for imgs, targets in data_loader:
    step_list.append(step)
    writer.add_images("original", imgs, step)
    imgs = my_model(imgs)
    writer.add_images("conventional", imgs, step)
    step += 1

writer.close()
print(step_list)

author:luckylight(xyg)
date: 2021/11/11


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM