PyTorch深度学习笔记(九)(卷积层)
·
卷积原理
Conv1d代表一维卷积,Conv2d代表二维卷积,Conv3d代表三维卷积。
kernel_size在训练过程中不断调整,定义为3就是3 * 3的卷积核,实际我们在训练神经网络过程中其实就是对kernel_size不断调整。
可以根据输入的参数获得输出的情况,如下图所示。

搭建卷积层
下载CIFAR10数据集作为训练数据(因为前几节下载过了,所以直接使用)
dataset = torchvision.datasets.CIFAR10("./dataset_transform",train=False,transform=torchvision.transforms.ToTensor(),download=False)
设定dataloader数据处加载方法(每批次为64)
dataloader = DataLoader(dataset,batch_size = 64)
创建Tudui类继承nn.Module类,并继承初始化方法
class Tudui(nn.Module):
def __init__(self):
super(Tudui,self).__init__()
设定卷积层,输入为3层,输出为6层,卷积核为3*3,步辐为1,填充为0
self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)
定义forward函数,x为conv1的输出
def forward(self,x):
x = self.conv1(x)
return x
初始化网络,并输出
tudui = Tudui()
print(tudui)
结果

可以看出网络的格式
将每张图片输入进网络,data由img和target组成,网络输入img返回结果,输出输入的图片的格式和返回的结果的格式,作对比
for data in dataloader:
imgs,targets = data
output = tudui(imgs)
print(imgs.shape)
print(output.shape)
结果可以看出卷积前后的输出层数和图像尺寸变化

完整代码
import torch
from torch.utils.data import DataLoader
import torchvision
from torch import nn
from torch.nn import Conv2d
dataset = torchvision.datasets.CIFAR10("./dataset_transform",train=False,transform=torchvision.transforms.ToTensor(),download=False)
dataloader = DataLoader(dataset,batch_size = 64)
class Tudui(nn.Module):
def __init__(self):
super(Tudui,self).__init__()
self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)
def forward(self,x):
x = self.conv1(x)
return x
tudui = Tudui()
print(tudui)
for data in dataloader:
imgs,targets = data
output = tudui(imgs)
print(imgs.shape)
print(output.shape)
Tensorboard显示
创建日志并设置步数
writer = SummaryWriter("logs_conv2d")
step = 0
写输入前后的图像日志,步数每轮加一
writer.add_images("input",imgs,step)
writer.add_images("output",output,step)
step += 1
因为输入输出的图像层数不一样,输入为3层,输出为6层,所以用reshape改一下格式
torch.reshape(output,(-1,3,30,30))
将6层改为3层的办法是多加一倍的batch_size,改为三层后64batch放不下的图像就用新的batch输出,batch_size不确定,所以用-1。
在Tensorboard中显示效果(最后一个batch为16)

完整代码
import torch
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
import torchvision
from torch import nn
from torch.nn import Conv2d
dataset = torchvision.datasets.CIFAR10("./dataset_transform",train=False,transform=torchvision.transforms.ToTensor(),download=False)
dataloader = DataLoader(dataset,batch_size = 64)
class Tudui(nn.Module):
def __init__(self):
super(Tudui,self).__init__()
self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)
def forward(self,x):
x = self.conv1(x)
return x
tudui = Tudui()
print(tudui)
writer = SummaryWriter("logs_conv2d")
step = 0
for data in dataloader:
imgs,targets = data
output = tudui(imgs)
print(imgs.shape)
print(output.shape)
writer.add_images("input",imgs,step)
output = torch.reshape(output,(-1,3,30,30))
writer.add_images("output",output,step)
step += 1
更多推荐
所有评论(0)