欢迎光临
我们一直在努力

pytorch->conv2d卷积的简单应用

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset =torchvision.datasets.CIFAR10(
'./data',
train=False,
transform =torchvision.transforms.ToTensor(),
download=True

)
dataloader =DataLoader(dataset,batch_size=64)
class Tudui(nn.Module):
def __init__(self):
super().__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()
writer =SummaryWriter('logs/p18')
step=0

for data in dataloader:
imgs,targets=data
output =tudui(imgs)
writer.add_images('input',imgs,step)
output=torch.reshape(output,(-1,3,30,30))
writer.add_images('output',output,step)
step+=1
if step>5:
break
writer.close()
print('完成')

1.Conv2d:Conv2d 是 2D Convolution(二维卷积) 的缩写,是用一个"小窗口"在图片上滑动,提取局部特征。

2.CIFAR10:

CIFAR 加拿大高等研究院(Canadian Institute For Advanced Research),这个数据集就是他们整理的
10 有 10 个类别

数据集长什么样

项目说明
图片数量 60000 张
图片尺寸 32×32 像素(很小)
颜色 RGB 彩色
类别数 10 个
训练集 50000 张
测试集

10000 张

3.train=False,
    transform =torchvision.transforms.ToTensor(),

train:True是训练集,False是测试集

torchvision.transforms.ToTensor(),把图片张量化,

转换前(PIL)转换后(Tensor)
像素值:0~255 像素值:0~1(自动归一化)

4.dataloader =DataLoader(dataset,batch_size=64),所有图片64个分成一组

5.self.conv1=Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

        进行卷积操作,n_channels=3,out_channels=6,输入通道是3,输出通道是6

        输入三个通道是RGB三原色,输出的6个通道是用6个卷积核提取的6个特征

        kernel_size=3:卷积核是3*3,注意:卷积核也可以是长方形,比如识别人的时候长方形可能更好用,

        stride=1:步长是1,意思是卷积核从左到右,从上到下每次动一格扫描完整个图片

        padding=0:

例如

原图:5×5

text

[1][2][3][4][5]
[6][7][8][9][10]
[11][12][13][14][15]
[16][17][18][19][20]
[21][22][23][24][25]

如果 padding=0,意思是不填充边缘,那么卷积核3*3只能存在

7 ,  8,  9,

12,13,14,

17,18,19的位置

这么说不准确,但我理解就是卷积核中心只能在这9个位置,原来5*5的图片会变成3*3

如果padding=1,那么

填充后的图片:7×7
[0][0][0][0][0][0][0]
[0][1][2][3][4][5][0]
[0][6][7][8][9][10][0]
[0][11][12][13][14][15][0]
[0][16][17][18][19][20][0]
[0][21][22][23][24][25][0]
[0][0][0][0][0][0][0]

卷积核中心就可以取到1到25,这样卷积后图片大小不变,图片也不丢失信息

6.for data in dataloader:

imgs,targets=data

        dataloader是迭代器,总共10000张图片,一次给你一组64张图片,data就是其中一组

   # imgs: [64, 3, 32, 32] ← 64张图,3通道RGB,像素32*32
#  targets: [64] ← 64个标签

7.output =tudui(imgs)

writer.add_images('input',imgs,step)

output=torch.reshape(output,(-1,3,30,30))

writer.add_images('output',output,step)

        output =tudui(imgs), 把64张图片放进卷积网络

        writer.add_images('input',imgs,step),原图片在tensorboard上显示

        output=torch.reshape(output,(-1,3,30,30)),改变形状,正常输出是

# 输入:imgs.shape = [64, 3, 32, 32]
# 经过卷积:Conv2d(3→6, 3×3, stride=1, padding=0)
# 输出:output.shape = [64, 6, 30, 30]

由于padding=0,卷积核没法扫描边缘,所以上下左右像素丢失一行,成了30*30

tensorboard只能输出3通道,所以reshape=3,

-1是让pytorch自己算,保证图片大小一致,一张图片 = 通道数 × 每个通道的大小,这道题中-1就是128

赞(0)
未经允许不得转载:171主机测评 » pytorch->conv2d卷积的简单应用
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址