Pytorch实现卷积神经网络CNN

Pytorch是torch的Python版本,对TensorFlow造成很大的冲击,TensorFlow无疑是最流行的,但是Pytorch号称在诸多性能上要优于TensorFlow,比如在RNN的训练上,所以Pytorch也吸引了很多人的关注。之前有一篇关于TensorFlow实现的CNN可以用来做对比。

下面我们就开始用Pytorch实现CNN。

step 0 导入需要的包

1 import torch 
2 import torch.nn as nn
3 from torch.autograd import Variable
4 import torch.utils.data as data
5 import matplotlib.pyplot as plt

 

step 1  数据预处理

这里需要将training data转化成torch能够使用的DataLoader,这样可以方便使用batch进行训练。

复制代码
 1 import torchvision  #数据库模块
 2 
 3 torch.manual_seed(1) #reproducible
 4 
 5 #Hyper Parameters
 6 EPOCH = 1
 7 BATCH_SIZE = 50
 8 LR = 0.001
 9 
10 train_data = torchvision.datasets.MNIST(
11     root='/mnist/', #保存位置
12     train=True, #training set
13     transform=torchvision.transforms.ToTensor(), #converts a PIL.Image or numpy.ndarray 
14                                         #to torch.FloatTensor(C*H*W) in range(0.0,1.0)
15     download=True
16 )
17 
18 test_data = torchvision.datasets.MNIST(root='/MNIST/')
19 #如果是普通的Tensor数据,想使用torch_dataset = data.TensorDataset(data_tensor=x, target_tensor=y)
20 #将Tensor转换成torch能识别的dataset
21 #批训练, 50 samples, 1 channel, 28*28, (50, 1, 28 ,28)
22 train_loader = data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)
23 
24 test_x = Variable(torch.unsqueeze(test_data.test_data, dim=1), volatile=True).type(torch.FloatTensor)[:2000]/255.
25 test_y = test_data.test_lables[:2000]
复制代码

 

step 2 定义网络结构

需要指出的几个地方:1)class CNN需要继承Module ; 2)需要调用父类的构造方法:super(CNN, self).__init__()  ;3)在Pytorch中激活函数Relu也算是一层layer; 4)需要实现forward()方法,用于网络的前向传播,而反向传播只需要调用Variable.backward()即可。

复制代码
 1 class CNN(nn.Module):
 2     def __init__(self):
 3         super(CNN, self).__init__()
 4         self.conv1 = nn.Sequential( #input shape (1,28,28)
 5             nn.Conv2d(in_channels=1, #input height 
 6                       out_channels=16, #n_filter
 7                      kernel_size=5, #filter size
 8                      stride=1, #filter step
 9                      padding=2 #con2d出来的图片大小不变
10                      ), #output shape (16,28,28)
11             nn.ReLU(),
12             nn.MaxPool2d(kernel_size=2) #2x2采样,output shape (16,14,14)
13               
14         )
15         self.conv2 = nn.Sequential(nn.Conv2d(16, 32, 5, 1, 2), #output shape (32,7,7)
16                                   nn.ReLU(),
17                                   nn.MaxPool2d(2))
18         self.out = nn.Linear(32*7*7,10)
19         
20     def forward(self, x):
21         x = self.conv1(x)
22         x = self.conv2(x)
23         x = x.view(x.size(0), -1) #flat (batch_size, 32*7*7)
24         output = self.out(x)
25         return output
复制代码

 

step 3 查看网络结构

使用print(cnn)可以看到网络的结构详细信息,ReLU()真的是一层layer。

1 cnn = CNN()
2 print(cnn)

step 4 训练

指定optimizer,loss function,需要特别指出的是记得每次反向传播前都要清空上一次的梯度,optimizer.zero_grad()。

复制代码
 1 #optimizer
 2 optimizer = torch.optim.Adam(cnn.parameters(), lr=LR)
 3 
 4 #loss_fun
 5 loss_func = nn.CrossEntropyLoss()
 6 
 7 #training loop
 8 for epoch in range(EPOCH):
 9     for i, (x, y) in enumerate(train_loader):
10         batch_x = Variable(x)
11         batch_y = Variable(y)
12         #输入训练数据
13         output = cnn(batch_x)
14         #计算误差
15         loss = loss_func(output, batch_y)
16         #清空上一次梯度
17         optimizer.zero_grad()
18         #误差反向传递
19         loss.backward()
20         #优化器参数更新
21         optimizer.step()
复制代码

 

step 5 预测结果

1 test_output =cnn(test_x[:10])
2 pred_y = torch.max(test_output,1)[1].data.numpy().squeeze()
3 print(pred_y, 'prediction number')
4 print(test_y[:10])

 

 

reference:

莫凡python pytorch 教程

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch可以用来实现卷积神经网络CNN)。实现CNN的一般步骤如下: 1. 导入必要的库和模块,包括torch和torchvision。 2. 定义CNN模型的结构,通常包括卷积层、池化层和全连接层。你可以使用torch.nn模块中的类来定义这些层。 3. 初始化模型实例并将其移动到所选的设备(如CPU或GPU)上。 4. 定义损失函数,常用的是交叉熵损失函数(CrossEntropyLoss)。 5. 定义优化器,通常使用随机梯度下降优化器(SGD)。 6. 在训练数据上进行多个epochs的训练,其中每个epoch包括以下步骤: - 将输入数据传递给模型以获得预测输出。 - 计算预测输出和真实标签之间的损失。 - 使用反向传播计算梯度并更新模型参数。 7. 在测试数据上评估模型的性能,通常使用准确率作为评估指标。 下面是一个示例代码,展示了如何使用PyTorch实现一个简单的卷积神经网络: ```python import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms # 定义CNN模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(torch.relu(self.conv1(x))) x = self.pool(torch.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) x = self.fc3(x) return x # 数据预处理 transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) # 加载数据集 trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2) # 初始化模型 net = Net() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) # 训练模型 for epoch in range(2): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 2000 == 1999: print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0 print('Finished Training') # 在测试集上评估模型 testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2) correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: %d %%' % ( 100 * correct / total)) # 相关问题:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值