首先是需要定义一个神经网络,实现nn.Module的init和forward方法
class nn_conv2d_zj(nn.Module):#定义一个神经网络
def __init__(self) -> None:#定义初始化方法
super().__init__()
self.conv1 = nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1)
def forward(self,x):#定义forward方法,这个方法相当于很多神经元
x = self.conv1(x)
return x
接下来,需要通过Init方法,实例化神经网络
nn_conv2d_zj_1 = nn_conv2d_zj()#实例化出一个神经网络,调用初始化函数
下面是完整代码
import torchvision
from tensorboardX import SummaryWriter
from torch import nn
from torch.utils.data import DataLoader
from torchvision import transforms
import torch
test_set = torchvision.datasets.CIFAR10("./datasets2",train=False,transform=transforms.ToTensor(),download=True)
test_loader = DataLoader(dataset=test_set,batch_size=64)
class nn_conv2d_zj(nn.Module):#定义一个神经网络
def __init__(self) -> None:#定义初始化方法
super().__init__()
self.conv1 = nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1)
def forward(self,x):#定义forward方法,这个方法相当于很多神经元
x = self.conv1(x)
return x
nn_conv2d_zj_1 = nn_conv2d_zj()#实例化出一个神经网络,调用初始化函数
# output = nn_conv2d_zj_1(test_loader)
writer = SummaryWriter("logs")
step = 0
for data in test_loader:#从第一个batch进行遍历
imgs,targets = data
print(imgs.shape)
output = nn_conv2d_zj_1(imgs)#将data中取出的图片送入神经网络中去,直接调用内置的forward方法
print(output.shape)
output = torch.reshape(output,(-1,3,30,30))#一个不太严谨的做法直接将6通道转变成3通道,多余的通道直接将batchsize成倍增加
print(output.shape)
writer.add_images("input",imgs,step)
writer.add_images("output",output,step)
step = step+1
writer.close()
下面展示在nn.functional 模块下调用卷积操作
import torch
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]])
# print(input.shape)
# print(kernel.shape)
input = torch.reshape(input,(1,1,5,5))#在进入卷积运算的时候必须reshape成这种形状,第一个代表batchsize ,第二个是通道,第三个是高,第四个是宽
kernel = torch.reshape(kernel,(1,1,3,3))
# print(input.shape)
# print(kernel.shape)
output = F.conv2d(input,kernel,stride=1)#stride等于1 的意思是上下都等于1
print(output)