一、神經網絡模塊
進入到PyTorch的torch.nnAPI學習頁面
PyTorch提供了很多的神經網絡方面的模塊,NN就是Neural Networks的簡稱
二、Containers
torch.nn下的Containers
一共有六個模塊,最常用的就是Module模塊,看解釋可以知道,Module是為所有的神經網絡所提供的基礎類
Moduel
torch.nn.Containers下的Moduel
自己所搭建的神經網絡必須繼承這個Moduel類,其也相當于一個模板
模仿一下,創建一個神經網絡模型,y = 5 + x
神經網絡中的參數都是tensor類型,這點需要注意
import torch
from torch import nnclass Beyond(nn.Module):def __init__(self):super().__init__()def forward(self,input):output = input + 5return outputbeyond = Beyond()
x = torch.tensor(5.0)
out = beyond(x)
print(out)#tensor(10.)
三、Convolution Layers
torch.nn下的Convolution Layers卷積層
常用的就是nn.Conv2d二維卷積,卷積核是二維
四、torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)
TORCH.NN.FUNCTIONAL.CONV2D方法使用說明
參數 | 描述 | 解釋 |
---|---|---|
input | 形狀的輸入張量 | |
weight | 權重 | 也就是卷積核 |
bias | 偏置 | |
stride | 卷積核的步幅。可以是單個數字或元組(sH, sW)。默認值:1 | 可以指定兩個方向的步長,也可以輸入一個參數同時設置兩個方向 |
padding | 輸入兩側的隱式填充 | 也就是加邊 |
卷積操作這里就不再贅述了,與kernel對應相乘再相加運算而已
import torch
import torch.nn.functionalinput = torch.tensor([[1,2,3,4,5],[5,4,3,2,1],[1,2,3,4,5],[5,4,3,2,1],[1,2,3,4,5]])kernel = torch.tensor([[1,2,3],[3,2,1],[1,2,3]])
print(input.shape)#torch.Size([5, 5])
print(kernel.shape)#torch.Size([3, 3])
#目前input和weight僅為(H,W),不符合conv2d的輸入要求#由官網看到的input為四維(minibatch,in_channels,iH,iW)數據,故通過reshape進行轉變
#weight也就是kernel是要求四維數據信息
input_re = torch.reshape(input,(1,1,5,5))
kernel_re = torch.reshape(kernel,(1,1,3,3,))
print(input_re.shape)#torch.Size([1, 1, 5, 5])
print(kernel_re.shape)#torch.Size([1, 1, 3, 3])out_1 = torch.nn.functional.conv2d(input_re,kernel_re,stride=1)
print(out_1)
"""
tensor([[[[54, 60, 66],[54, 48, 42],[54, 60, 66]]]])
"""out_2 = torch.nn.functional.conv2d(input_re,kernel_re,stride=2)
print(out_2)
"""
tensor([[[[54, 66],[54, 66]]]])
"""out_3 = torch.nn.functional.conv2d(input_re,kernel_re,stride=1,padding=1)
print(out_3)
"""
tensor([[[[26, 32, 32, 32, 26],[30, 54, 60, 66, 36],[48, 54, 48, 42, 30],[30, 54, 60, 66, 36],[26, 32, 32, 32, 26]]]])
"""
五、torch.nn.ReLU(inplace=False)
ⅠReLU函數介紹
torch.nn.ReLU(inplace=False)官網提供的API
其中inplace表示是否在對原始數據進行替換
由函數圖可以看出,負數通過ReLU之后會變成0,正數則不發生變化
例如:input = -1,若inplace = True,表示對原始輸入數據進行替換,當通過ReLU函數(負數輸出均為0)之后,input = 0
若inplace = False(默認),表示不對原始輸入數據進行替換,則需要通過另一個變量(例如output)來對ReLU函數的結果進行接收存儲,通過ReLU函數之后,output = 0,input = -1
ⅡReLU函數使用
創建一個二維tensor數據,通過reshape轉換成(batch_size,channel,H,W)
類型數據格式
傳入僅含有ReLU的神經網絡中,運行結果可以看出,負數都變成了0,正數均保持不變
import torch
from torch import nninput = torch.tensor([[1,-0.7],[-0.8,2]])input = torch.reshape(input,(-1,1,2,2))print(input)
"""
tensor([[[[ 1.0000, -0.7000],[-0.8000, 2.0000]]]])
"""class Beyond(nn.Module):def __init__(self):super(Beyond,self).__init__()self.relu_1 = torch.nn.ReLU()def forward(self,input):output = self.relu_1(input)return outputbeyond = Beyond()
output = beyond(input)
print(output)
"""
tensor([[[[1., 0.],[0., 2.]]]])
"""
ⅢReLU訓練CIFAR-10數據集上傳至tensorboard
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdataset_test = torchvision.datasets.CIFAR10("CIFAR_10",train=False,transform=torchvision.transforms.ToTensor(),download=True)dataloader = DataLoader(dataset_test,batch_size=64)class Beyond(nn.Module):def __init__(self):super(Beyond,self).__init__()self.relu_1 = torch.nn.ReLU()def forward(self,input):output = self.relu_1(input)return outputwriter = SummaryWriter("y_log")beyond = Beyond()
i=0
for data in dataloader:imgs,targets = datawriter.add_images("input_ReLU",imgs,i)output = beyond(imgs)writer.add_images("output_ReLU",output,i)i = i + 1writer.close()
在Terminal下運行tensorboard --logdir=y_log --port=9999
,logdir為打開事件文件的路徑,port為指定端口打開;
通過指定端口9999進行打開tensorboard,若不設置port參數,默認通過6006端口進行打開。
點擊該鏈接或者復制鏈接到瀏覽器打開即可
六、torch.nn.Sigmoid
ⅠSigmoid函數介紹
torch.nn.Sigmoid
ⅡSigmoid函數使用
創建一個二維tensor數據,通過reshape轉換成(batch_size,channel,H,W)
類型數據格式
傳入僅含有Sigmoid的神經網絡中,代入Sigmodi公式即可得到相應返回結果
import torch
from torch import nninput = torch.tensor([[1,-0.7],[-0.8,2]])input = torch.reshape(input,(-1,1,2,2))print(input)
"""
tensor([[[[ 1.0000, -0.7000],[-0.8000, 2.0000]]]])
"""class Beyond(nn.Module):def __init__(self):super(Beyond,self).__init__()self.sigmoid_1 = torch.nn.Sigmoid()def forward(self,input):output = self.sigmoid_1(input)return outputbeyond = Beyond()
output = beyond(input)
print(output)
"""
tensor([[[[0.7311, 0.3318],[0.3100, 0.8808]]]])
"""
ⅢSigmoid訓練CIFAR-10數據集上傳至tensorboard
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdataset_test = torchvision.datasets.CIFAR10("CIFAR_10",train=False,transform=torchvision.transforms.ToTensor(),download=True)dataloader = DataLoader(dataset_test,batch_size=64)class Beyond(nn.Module):def __init__(self):super(Beyond,self).__init__()self.sigmoid_1 = torch.nn.Sigmoid()def forward(self,input):output = self.sigmoid_1(input)return outputwriter = SummaryWriter("y_log")beyond = Beyond()
i=0
for data in dataloader:imgs,targets = datawriter.add_images("input_Sigmoid",imgs,i)output = beyond(imgs)writer.add_images("output_Sigmoid",output,i)i = i + 1writer.close()
在Terminal下運行tensorboard --logdir=y_log --port=9999
,logdir為打開事件文件的路徑,port為指定端口打開;
通過指定端口9999進行打開tensorboard,若不設置port參數,默認通過6006端口進行打開。