PyTorch中的卷积神经网络

1  输入、输出和卷积层的维度

 

import torch
in_channels,out_channels=5,10
width,height=100,100
kernel_size=3
batch_size=1

input=torch.randn(batch_size,in_channels,width,height)
conv_layer=torch.nn.Conv2d(in_channels,out_channels,kernel_size=kernel_size)
output=conv_layer(input)

print(input.shape)              #B*inC*W*H
print(output.shape)             #B*outC*W*H
print(conv_layer.weight.shape)  #outC*inC*W*H

2 torch.nn.Conv2d的参数

  • padding表示周围填充的像素个数
  • stride表示卷积核在图像上移动时每两步之间的跨度
import torch
input=[3,4,6,5,7,
       2,4,6,8,2,
       1,6,7,8,4,
       9,7,4,6,2,
       3,7,5,4,1]
input=torch.Tensor(input).view(1,1,5,5)

conv_layer=torch.nn.Conv2d(1,1,kernel_size=3,padding=1,bias=False)
kernel=torch.Tensor([1,2,3,4,5,6,7,8,9]).view(1,1,3,3)
conv_layer.weight.data=kernel.data  #给卷积层的权重赋值

output=conv_layer(input)
print(output)

2.1 padding=1和padding=2(默认stride=1)

padding=1时

padding=2时

2.2 stride=1和stride=2(默认padding=0)

stride=1时

stride=2时 

 

3  torch.nn.MaxPool2d

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)
output=maxpooling_layer(input)
print(output)

4 卷积神经网络

4.1 两层卷积 

 

4.2 三层卷积

 

import torch
from torch.utils.data import DataLoader
from torchvision import transforms,datasets
import torch.nn.functional as F
import torch.optim as optim

batch_size=64
transform=transforms.Compose([
    transforms.ToTensor(),  #把PIL图像转化为Tensor,W*H*C->C*W*H
    transforms.Normalize((0.1307,),(0.3081,))   #第一个是均值,第二个是标准差,针对MNIST
])

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

class Net(torch.nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.conv1=torch.nn.Conv2d(1,10,kernel_size=1)
        self.conv2=torch.nn.Conv2d(10,20,kernel_size=3)
        self.conv3=torch.nn.Conv2d(20,30,kernel_size=3)
        self.pooling=torch.nn.MaxPool2d(2)
        self.fc=torch.nn.Linear(120,10)

    def forward(self,x):
        batch_size=x.size(0)                    #(batch,1,28,28)
        x=F.relu(self.pooling(self.conv1(x)))   #(batch,10,14,14)
        x=F.relu(self.pooling(self.conv2(x)))   #(batch,20,6,6)
        x=F.relu(self.pooling(self.conv3(x)))   #(batch,30,2,2)
        x=x.view(batch_size,-1)
        x=self.fc(x)
        return x

model=Net()

criterion=torch.nn.CrossEntropyLoss()
optimizer=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):
        inputs,target=data
        optimizer.zero_grad()

        #forward+backward+update
        outputs=model(inputs)
        loss=criterion(outputs,target)
        loss.backward()
        optimizer.step()

        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

def test():
    correct=0
    total=0
    with torch.no_grad():   #不计算梯度
        for data in test_loader:    #test_loader中按batch把数据分开
            images,labels=data
            outputs=model(images)
            _,predicted=torch.max(outputs.data,dim=1)
            total+=labels.size(0)
            #print('labels=',labels)
            correct+=(predicted==labels).sum().item()
    print('Accuracy on test set:%d %% [%d/%d]'%(100*correct/total,correct,total))

if __name__=='__main__':
    for epoch in range(10):
        train(epoch)
        test()

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch卷积神经网络(CNN)的反向传播是通过计算梯度来更新网络参数的过程。在PyTorch,可以使用自动求导机制来自动计算梯度。下面是一个简单的示例代码,展示了如何在PyTorch实现CNN的反向传播: ```python import torch import torch.nn as nn # 定义一个简单的卷积神经网络 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1) self.relu = nn.ReLU() self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.fc = nn.Linear(16 * 14 * 14, 10) def forward(self, x): x = self.conv1(x) x = self.relu(x) x = self.pool(x) x = torch.flatten(x, 1) x = self.fc(x) return x # 创建网络实例 net = Net() # 定义损失函数 criterion = nn.CrossEntropyLoss() # 定义优化器 optimizer = torch.optim.SGD(net.parameters(), lr=0.001) # 前向传播和反向传播 inputs = torch.randn(1, 1, 28, 28) # 输入数据 labels = torch.tensor([0]) # 标签 # 清零梯度 optimizer.zero_grad() # 前向传播 outputs = net(inputs) # 计算损失 loss = criterion(outputs, labels) # 反向传播 loss.backward() # 更新参数 optimizer.step() ``` 在上述代码,我们首先定义了一个简单的卷积神经网络`Net`,然后创建了网络实例`net`。然后我们定义了损失函数和优化器(这里使用了交叉熵损失和随机梯度下降优化器)。接下来,我们通过前向传播计算网络输出,并计算损失。然后,我们调用`backward()`方法执行反向传播,自动计算网络参数的梯度。最后,我们调用`optimizer.step()`方法来更新网络参数。 这就是PyTorch卷积神经网络的反向传播过程。希望对你有帮助!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值