热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深度学习在图像分类中的应用ーー利用Pytorch从零开始创建CNN

引言本文将解释一个卷积神经网络(CNN)的一般结构,从而有助于了解如何分类不同类别的图像(在我们的案例中不同类型的动物),使用PyTorch从头开始编写

引言

 

本文将解释一个卷积神经网络(CNN)的一般结构,从而有助于了解如何分类不同类别的图像(在我们的案例中不同类型的动物) ,使用 PyTorch 从头开始编写一个 CNN 模型。

先决条件


  • Python 基础知识

  • 对神经网络的基本理解

  • 对卷积型神经网络(CNN)的基本理解

     

使用的数据集

Animals-10 数据集,小伙伴们可以从这个网址中下载:https://www.kaggle.com/alessiocorrado99/animals10

开始编程

步骤1:(下载数据集)


  • 可以从上述网址中下载数据集

  • 这个数据集包含10个类别的28,000张图片:狗,猫,马,蜘蛛,蝴蝶,鸡,羊,牛,松鼠和大象

图片

步骤2:(创建数据集和数据加载器来加载这些图像)dataset_path = 'BasicCNN_Pytorch/raw-img'

mean = torch.tensor([0.485, 0.456, 0.406], dtype=torch.float32)std = torch.tensor([0.229, 0.224, 0.225], dtype=torch.float32)# Transformation function to be applied on images# 1. Horizontally Flip the image with a probability of 30%# 2. Randomly Rotate the image at an angle between -40 to 40 degress.# 3. Resize each images to a smallest size of 300 pixels maintaining aspect ratio# 4. Crop a square of size 256x256 from the center of image# 5. Convert Image to a Pytorch Tensor# 6. Normalize the pytorch's tensor using mean & std of imagenettransform = transforms.Compose([ transforms.RandomHorizontalFlip(p=0.3), transforms.RandomRotation(degrees=40),
transforms.Resize(300), transforms.CenterCrop(256),
transforms.ToTensor(), transforms.Normalize(mean=mean, std=std)])
# Create a dataset by from the dataset folder by applying the above transformation.dataset = torchvision.datasets.ImageFolder(dataset_path, transform=transform)# Split the dataset into train & test containing 21000 and 5179 images respectively.train_dataset, test_dataset = torch.utils.data.random_split(dataset, (21000, 5179))
# Create a Train DataLoader using Train Datasettrain_dataloader = torch.utils.data.DataLoader( dataset=train_dataset, batch_size=16, shuffle=False, num_workers=4)# Create a Test DataLoader using Test Datasettest_dataloader = torch.utils.data.DataLoader( dataset=test_dataset, batch_size=16, shuffle=False, num_workers=4)

步骤3:创建 CNN 模型架构

让我们创建一个简单的 CNN 模型架构。

class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.model = nn.Sequential( nn.Conv2d(3, 16, kernel_size=3), nn.ReLU(), nn.Conv2d(16, 16, kernel_size=3), nn.ReLU(), nn.MaxPool2d(2,2),
nn.Conv2d(16, 32, kernel_size=3), nn.ReLU(), nn.Conv2d(32, 32, kernel_size=3), nn.ReLU(), nn.MaxPool2d(2,2),
nn.Conv2d(32, 64, kernel_size=3), nn.ReLU(), nn.Conv2d(64, 64, kernel_size=3), nn.ReLU(), nn.MaxPool2d(2,2),
nn.Conv2d(64, 128, kernel_size=3), nn.ReLU(), nn.Conv2d(128, 128, kernel_size=3), nn.ReLU(), nn.MaxPool2d(2,2),
nn.Conv2d(128, 256, kernel_size=3), nn.ReLU(), nn.Conv2d(256, 256, kernel_size=3), nn.ReLU(), nn.MaxPool2d(2,2),
).to(device) self.classifier = nn.Sequential( nn.Flatten(), nn.Dropout(0.25), nn.Linear(4096, 256), nn.ReLU(),
nn.Dropout(0.5), nn.Linear(256, 10) ).to(device) def forward(self, x): x = self.model(x) x = self.classifier(x) return xmodel = MyModel().to(device)summary(model, (3,256,256))

像所有一般的 CNN 体系结构一样,我们的模型也有两个组件:

 


  1. 一组卷积后面跟着一个激活函数(在我们的例子中使用 ReLU)和一个最大池层

  2. 一个线性分类层,将图像分为3类(猫,狗和熊猫)

图片

CNN 模型架构


  • 该模型包含大约223万个参数

  • 当我们沿着卷积层向下走时,我们观察到通道的数量从3个(RGB 图像)增加到16个、32个、64个、128个,然后增加到256个

  • ReLU 层在每次卷积运算后提供非线性操作

  • 由于我们的最大池化层,因此随着通道数目的增加,图像的高度和宽度也随之减小

  • 我们在我们的分类层添加了 dropout,防止模型过拟合

步骤4:定义模型、优化器和损失函数

 

我们使用了学习率为0.0001的 Adam 优化器和交叉熵损失函数。

lr = 0.0001model = MyModel().to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=lr)criterion = nn.CrossEntropyLoss()

步骤5:开始训练

终于到了我们都在等待的时刻,也就是训练模型的时刻。对于训练和测试,我创建了这两个辅助函数。

def Train(epoch, print_every=50): total_loss = 0 start_time = time() accuracy = [] for i, batch in enumerate(train_dataloader, 1): minput = batch[0].to(device) # Get batch of images from our train dataloader target = batch[1].to(device) # Get the corresponding target(0, 1 or 2) representing cats, dogs or pandas moutput = model(minput) # output by our model loss = criterion(moutput, target) # compute cross entropy loss total_loss += loss.item()
optimizer.zero_grad() # Clear the gradients if exists. (Gradients are used for back-propogation.) loss.backward() # Back propogate the losses optimizer.step() # Update Model parameters argmax = moutput.argmax(dim=1) # Get the class index with maximum probability predicted by the model accuracy.append((target==argmax).sum().item() / target.shape[0]) # calculate accuracy by comparing to target tensor
if i%print_every == 0: print('Epoch: [{}]/({}/{}), Train Loss: {:.4f}, Accuracy: {:.2f}, Time: {:.2f} sec'.format( epoch, i, len(train_dataloader), loss.item(), sum(accuracy)/len(accuracy), time()-start_time ))     return total_loss / len(train_dataloader) # Returning Average Training Loss

def Test(epoch): total_loss = 0 start_time = time()
accuracy = [] with torch.no_grad(): # disable calculations of gradients for all pytorch operations inside the block for i, batch in enumerate(test_dataloader): minput = batch[0].to(device) # Get batch of images from our test dataloader target = batch[1].to(device) # Get the corresponding target(0, 1 or 2) representing cats, dogs or pandas moutput = model(minput) # output by our model
loss = criterion(moutput, target) # compute cross entropy loss total_loss += loss.item() # To get the probabilities for different classes we need to apply a softmax operation on moutput argmax = moutput.argmax(dim=1) # Find the index(0, 1 or 2) with maximum score (which denotes class with maximum probability) accuracy.append((target==argmax).sum().item() / target.shape[0]) # Find the accuracy of the batch by comparing it with actual targets print('Epoch: [{}], Test Loss: {:.4f}, Accuracy: {:.2f}, Time: {:.2f} sec'.format( epoch, total_loss/len(test_dataloader), sum(accuracy)/len(accuracy), time()-start_time ))    return total_loss/len(test_dataloader) # Returning Average Testing LossHosted on Jovian

现在让我们开始训练:

感谢我们在上面创建的 helper 函数,我们可以使用下面的代码片段轻松地开始训练过程。

Test(0)
train_loss = []test_loss = []
for epoch in range(1, 51): train_loss.append(Train(epoch,200)) test_loss.append(Test(epoch))
print('\n') if epoch % 10 == 0: torch.save(model, 'model_'+str(epoch)+'.pth')

我们正在训练该模型50个 epoch,并在每10个 epoch 之后将其保存到磁盘。

这是我们在训练中得到的输出(部分):

图片

图片


  • 在谷歌 colab 使用 Tesla T4 GPU 训练这个步骤花了大约2个小时(50个 epoch);

  • 正如我们可以看到的,准确率从第1个 epoch 后的21% 上升到第50个 epoch 后的75% 。(经过另外50个 epoch 的训练,准确率达到了78%)

  • 我们非常基本的 CNN 模型只有2.23 M 的参数

评估模型

我们绘制一下训练和测试损失:


  • 大约20个 epoch 之后,我们可以看到曲线明显的变化

图片

现在让我们用一些随机的图片来测试一下。

图片

·  END  ·

原文 https://mp.weixin.qq.com/s/m8w_G4ea7oOb3J-J7rxQ3A


推荐阅读
  • 图神经网络模型综述
    本文综述了图神经网络(Graph Neural Networks, GNN)的发展,从传统的数据存储模型转向图和动态模型,探讨了模型中的显性和隐性结构,并详细介绍了GNN的关键组件及其应用。 ... [详细]
  • 如何用GPU服务器运行Python
    如何用GPU服务器运行Python-目录前言一、服务器登录1.1下载安装putty1.2putty远程登录 1.3查看GPU、显卡常用命令1.4Linux常用命令二、 ... [详细]
  • 本文探讨了图像标签的多种分类场景及其在以图搜图技术中的应用,涵盖了从基础理论到实际项目实施的全面解析。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 卷积神经网络(CNN)基础理论与架构解析
    本文介绍了卷积神经网络(CNN)的基本概念、常见结构及其各层的功能。重点讨论了LeNet-5、AlexNet、ZFNet、VGGNet和ResNet等经典模型,并详细解释了输入层、卷积层、激活层、池化层和全连接层的工作原理及优化方法。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • 本文档旨在帮助开发者回顾游戏开发中的人工智能技术,涵盖移动算法、群聚行为、路径规划、脚本AI、有限状态机、模糊逻辑、规则式AI、概率论与贝叶斯技术、神经网络及遗传算法等内容。 ... [详细]
  • 基于2-channelnetwork的图片相似度判别一、相关理论本篇博文主要讲解2015年CVPR的一篇关于图像相似度计算的文章:《LearningtoCompar ... [详细]
  • 利用Java与Tesseract-OCR实现数字识别
    本文深入探讨了如何利用Java语言结合Tesseract-OCR技术来实现图像中的数字识别功能,旨在为开发者提供详细的指导和实践案例。 ... [详细]
  • 回顾与学习是进步的阶梯。再次审视卷积神经网络(CNNs),我对之前不甚明了的概念有了更深的理解。本文旨在分享这些新的见解,并探讨CNNs在图像识别和自然语言处理等领域中的实际应用。 ... [详细]
  • 本文详细介绍了 TensorFlow 的入门实践,特别是使用 MNIST 数据集进行数字识别的项目。文章首先解析了项目文件结构,并解释了各部分的作用,随后逐步讲解了如何通过 TensorFlow 实现基本的神经网络模型。 ... [详细]
  • 吴裕雄探讨混合神经网络模型在深度学习中的应用:结合RNN与CNN优化网络性能
    本文由吴裕雄撰写,深入探讨了如何利用Python、Keras及TensorFlow构建混合神经网络模型,特别是通过结合递归神经网络(RNN)和卷积神经网络(CNN),实现对网络运行效率的有效提升。 ... [详细]
  • 尤洋:夸父AI系统——大规模并行训练的深度学习解决方案
    自从AlexNet等模型在计算机视觉领域取得突破以来,深度学习技术迅速发展。近年来,随着BERT等大型模型的广泛应用,AI模型的规模持续扩大,对硬件提出了更高的要求。本文介绍了新加坡国立大学尤洋教授团队开发的夸父AI系统,旨在解决大规模模型训练中的并行计算挑战。 ... [详细]
author-avatar
ni是我的另一半
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有