pytorch——卷积神经网络

目录

一.课程内容

 二.代码复现

三.补充


一.课程内容

类似这种彩色图片就是多通道图片,如图:有三层(通常是红绿蓝)然后在这个基础上去除一小块像素块,开始遍历,得到的值包含所有像素的信息

例如上图的单通道的图片 卷积操作:是相应的区域做数乘,即对应位置相乘并相加。

 对于多通道,多通道有几层,那么卷积核就要有几个。多通道的计算方式就如图上。

 这样就把多通道变为了单通道,假设需要m通道输出,就需要m个(3*w*h)卷积核来计算。

对于特定的输出和输入,需要的卷积核的大小: 

n:通道数 k_sie:可以随意选择相应的大小  m:卷积核的数量    

 还可以使用填充,增加步长。

这里:存在数学关系

若图像为正方形:设输入图像尺寸为WxW,卷积核尺寸为FxF,步幅为S,Padding使用P(图片被填充了几圈),经过该卷积层后输出的图像尺寸为NxN:

N=\frac{W-F+2P}{S}+1

池化or下采样--减少数据

然后利用卷积和池化对minist处理。

 二.代码复现

import torch

in_c,out_c=5,10
width,height=100,100
k_size=3
batch_size=1

input=torch.randn(batch_size,in_c,width,height)
#当我去掉batch_size时他从思维变成了三维的张量,说明batch_size对他进行了打包,当我把batch_size改为2时并没有发生变化,我不明白
juanji=torch.nn.Conv2d(in_c,out_c,kernel_size=k_size)

output=juanji(input)

print(input.shape)
print(output.shape)
print(juanji.weight.shape)#卷积层权重的形状

另外两个就不写了,只是加了步长和扩充。

import torch
input=[3,4,6,5,2,4,6,8,1,6,7,8,9,7,4,6]

input=torch.Tensor(input).view(1,1,4,4)

maxpooling_layer=torch.nn.MaxPool2d(kernel_size=2)#相当于步长为2

output=maxpooling_layer(input)

print(output)
from ast import Return
from operator import itemgetter
from pickletools import optimize
from unittest import result
from winreg import REG_FULL_RESOURCE_DESCRIPTOR
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import Dataset #抽象类,不能有实例化对象,只能被继承
from torch.utils.data import DataLoader
import numpy.matlib
import torch
import numpy as np
import torch.optim as optim
import torch.nn.functional as F
import matplotlib.pyplot as plt

batch_size=64
transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081))])


train_dataset = datasets.MNIST(root='../data/mnist',train=True, download=True, transform=transform)
train_loader=DataLoader(train_dataset,shuffle=True,batch_size=batch_size)
test_dataset=datasets.MNIST(root='../data/mnist',train=False, download=True, transform=transform)
test_loader=DataLoader(test_dataset,shuffle=False,batch_size=batch_size)

class Model(torch.nn.Module):
    def __init__(self) :
        super(Model,self).__init__()
        self.Conv1=torch.nn.Conv2d(1,10,kernel_size=5)
        self.Conv2=torch.nn.Conv2d(10,20,kernel_size=5)
        self.pooling=torch.nn.MaxPool2d(2)
        self.linear=torch.nn.Linear(320,10)
    

    def forward(self,x):
        batch_size=x.size(0)
        x=F.relu(self.pooling(self.Conv1(x)))
        x=F.relu(self.pooling(self.Conv2(x)))
        x=x.view(batch_size,-1)
        x=self.linear(x)
        return x

model=Model()
device=torch.device("cuda:0"if torch.cuda.is_available()else"cpu")#使用GPU进行计算
model.to(device)#把model模型放进去

sunshi=torch.nn.CrossEntropyLoss()
youhua=optim.SGD(model.parameters(),lr=0.01,momentum=0.5)


def train(epoch):
     running_loss=0.0
     for batch_idx, data in enumerate(train_loader,0):
        input,target=data
        input,target=input.to(device),target.to(device)#这里的数据(原数据)也要迁移过去
        output=model(input)
        loss=sunshi(output,target)
        loss.backward()
        
        youhua.step()
        youhua.zero_grad()
        running_loss+=loss.item()
        
        if batch_idx%300==299 :
            print('[%d,%5d]loss:%.3f'%(epoch+1,batch_idx+1,running_loss/300))
            running_loss=0.0

 
corect=[]
def test():
    correct=0
    total=0
    with torch.no_grad():
        for data in test_loader:
            image,labels=data
            image,labels=image.to(device),labels.to(device)
            output=model(image)
            _,predicted= torch.max(output.data,dim=1)
            total+=labels.size(0)
            correct+=(predicted==labels).sum().item()
    print("正确率:%d %%"%(100*correct/total))        
    corect.append(100*correct/total) 

ep=[]

if __name__=='__main__':
    for epoch in range(10):
        ep.append(epoch)
        train(epoch)
        test()
        
plt.plot(ep,corect)
plt.xlabel("epoch")
plt.ylabel("正确率")
plt.show()

 作业:

class Model(torch.nn.Module):
    def __init__(self) :
        super(Model,self).__init__()
        self.Conv1=torch.nn.Conv2d(1,10,kernel_size=3)#经过变换,会输出10*26*26((28-3+0)/1+1)
        self.Conv2=torch.nn.Conv2d(10,20,kernel_size=2) 
        self.Conv3=torch.nn.Conv2d(20,10,kernel_size=3)
        self.pooling=torch.nn.MaxPool2d(2)
        self.linear1=torch.nn.Linear(40,30)
        self.linear2=torch.nn.Linear(30,20)
        self.linear3=torch.nn.Linear(20,10)

    def forward(self,x):
        batch_size=x.size(0)
        x=F.relu(self.pooling(self.Conv1(x)))
        x=F.relu(self.pooling(self.Conv2(x)))
        x=F.relu(self.pooling(self.Conv3(x)))
        x=x.view(batch_size,-1)
        x=self.linear1(x)
        x=self.linear2(x)
        x=self.linear3(x)
        return x

三.补充

1.关于卷积池化

(54条消息) [CNN] 卷积、反卷积、池化、反池化_nana-li的博客-CSDN博客_奇数池化

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值