1.神经网络的基本骨架-nn.Module的使用
nn.Module:所有神经网络模块的基类。
torch.nn.Module基本使用规则:
import torch.nn as nn
import torch.nn.functional as F
class Model(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 20, 5)#卷积
self.conv2 = nn.Conv2d(20, 20, 5)#卷积
def forward(self, x): #输入x,经过forward计算,得到输出值
x = F.relu(self.conv1(x))
return F.relu(self.conv2(x))
对上述forward进行解析:
简单使用torch.nn构建简单网络
import torch
from torch import nn
#新建神经网络类
class Base(nn.Module):
def __init__(self) -> None:
super().__init__()
def forward(self,input):
output=input+1
return output
base=Base()
#新建一个输入变量(tensor类型)
input=torch.tensor(1.0)
output=base(input)
print(output)
2.卷积操作(Convolution Layers)
nn.Conv1d | 对由多个输入平面组成的输入信号应用一维卷积。 |
---|---|
nn.Conv2d | 对由多个输入平面组成的输入信号应用二维卷积。 |
nn.Conv2d
参数:
- input – input tensor of shape (minibatch,in_channels,iH,iW)(minibatch,in_channels,i**H,iW)
- weight – filters of shape (out_channels,in_channels/groups,kH,kW),可以当作卷积核
- bias –
- stride – 卷积(内)核与输入图像进行卷积操作时在输入图像上移动的步幅。可以是单个数字,也可以是 元组 (sH, sW)。默认值:1 ,表示卷积核每次横移1格,横移完毕后从头纵移一格在横向移动直至计算完毕。如下图:
上述图片对应代码:
import torch
import torch.nn.functional as F
#定义输入数据(二维),转换为tensor类型
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]])
#定义卷积核(二维),转化为tensor类型
kernel=torch.tensor([[1,2,1],
[0,1,0],
[2,1,0]])
#将input,kernel转换成合适conv2()格式的shape的数据
input=torch.reshape(input,(1,1,5,5))
kernel=torch.reshape(kernel,(1,1,3,3))
#input,kernel转换后尺寸
print(input.shape)
print(kernel.shape)
#使用卷积
output=F.conv2d(input,kernel,stride=1)#stride=1,步径为1
print(output)
output2=F.conv2d(input,kernel,stride=2)#stride=2,步径为2
print(output2)
-
padding –输入两侧的隐式填充,填充值默认为0。可以是字符串 {‘valid’, ‘same’}, 单个数字或元组(padH、padW)。默认值:0 与无填充相同。
上述图片对应代码:
import torch
import torch.nn.functional as F
#定义输入数据(二维),转换为tensor类型
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]])
#定义卷积核(二维),转化为tensor类型
kernel=torch.tensor([[1,2,1],
[0,1,0],
[2,1,0]])
#将input,kernel转换成合适conv2()格式的shape的数据
input=torch.reshape(input,(1,1,5,5))
kernel=torch.reshape(kernel,(1,1,3,3))
#input,kernel转换后尺寸
print(input.shape)
print(kernel.shape)
#使用卷积
output3=F.conv2d(input,kernel,stride=1,padding=1)#stride=2,步径为2,padding=1即上下填充1行,左右填充一行,默认填充零
print(output3)