当前位置:   article > 正文

卷积神经网络(CNN)与深度卷积神经网络(DCNN)

dcnn

作为小白,看到DCNN,一直想知道与CNN的区别,也没找到明确的说法,以下是自己的一点想法,欢迎指正!

 

目录

一、CNN与DCNN

二、基于pytorch的实现

1.LeNet-5

2.AlexNet


一、CNN与DCNN

卷积神经网络,如:LeNet

深度卷积神经网络,如:AlexNet

AlexNet是第一个现代深度卷积网络模型,首次使用了许多现代深度卷积网络的技术方法,比如,采用ReLu作为非线性激活函数,使用Dropout防止过拟合,是用数据增强提高模型准确率,使用GPU进行并行训练等。

AlexNet与LeNet结构类似,但使用了更多的卷积层和更大的参数空间来拟合大规模数据集ImageNet。

卷积神经网络就是含卷积层的网络。AlexNet是浅层神经网络和深度神经网络的分界线。

(选自书《动手学深度学习》、《神经网络与深度学习》)

二、基于pytorch的实现

参考卷积神经网络之 - Lenet

LeNet、AlexNet模型实现(pytorch)

1.LeNet-5:

来自《神经网络与深度学习》

Input -> conv1 (6) -> pool1 -> conv2 (16) -> pool2 -> fc3 (120) -> fc4 (84) -> fc5 (10) -> softmax

代码实现与原文存在一定差异

  1. import torch
  2. import torch.nn as nn
  3. import torch.nn.functional as func
  4. class LeNet5(nn.Module):
  5. def __init__(self,num_classes, grayscale=False):
  6. """
  7. num_classes: 分类的数量
  8. grayscale:是否为灰度图
  9. """
  10. super(LeNet5, self).__init__()
  11. self.grayscale = grayscale
  12. self.num_classes = num_classes
  13. if self.grayscale: # 可以适用单通道和三通道的图像
  14. in_channels = 1
  15. else:
  16. in_channels = 3
  17. self.conv1 =self.conv1 = nn.Conv2d(in_channels, 6, kernel_size=5)
  18. self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
  19. self.fc1 = nn.Linear(16*5*5, 120)
  20. self.fc2 = nn.Linear(120, 84)
  21. self.fc3 = nn.Linear(84, num_classes)
  22. def forward(self, x):
  23. x = func.max_pool2d(self.conv1(x), 2) # 原始的模型使用的是 平均池化
  24. x = func.max_pool2d(self.conv2(x), 2)
  25. x = x.view(x.size(0), -1)
  26. x = self.fc3(self.fc2(self.fc1(x)))
  27. x = func.softmax(x,dim=1)
  28. return x
  29. #(最后模拟了一个输入,输出一个分类器运算后 10 个 softmax 概率值)
  30. num_classes = 10 # 分类数目
  31. grayscale = True # 是否为灰度图
  32. data = torch.rand((1, 1, 32, 32))
  33. print("input data:\n", data, "\n")
  34. model = LeNet5(num_classes, grayscale)
  35. x= model(data)
  36. print(x)

2.AlexNet

 

preview

来自《神经网络与深度学习》

 

假设输入为32*32大小图像,代码实现与上文所述存在一定差异。

  1. import torch
  2. import torch.nn as nn
  3. class AlexNet(nn.Module):
  4. def __init__(self,num_classes, grayscale=False):
  5. super(AlexNet, self).__init__()
  6. self.grayscale = grayscale
  7. self.num_classes = num_classes
  8. if self.grayscale: # 可以适用单通道和三通道的图像
  9. in_channels = 1
  10. else:
  11. in_channels = 3
  12. self.features = nn.Sequential(
  13. nn.Conv2d(in_channels, 96, kernel_size=11,padding=1),
  14. nn.ReLU(inplace=True),
  15. nn.MaxPool2d(kernel_size=2),
  16. nn.Conv2d(96, 256, kernel_size=3, padding=1),
  17. nn.ReLU(inplace=True),
  18. nn.MaxPool2d(kernel_size=2),
  19. nn.Conv2d(256, 384, kernel_size=3, padding=1),
  20. nn.ReLU(inplace=True),
  21. nn.Conv2d(384, 384, kernel_size=3, padding=1),
  22. nn.ReLU(inplace=True),
  23. nn.Conv2d(384, 256, kernel_size=3, padding=1),
  24. nn.ReLU(inplace=True),
  25. nn.MaxPool2d(kernel_size=2),
  26. )
  27. self.classifier = nn.Sequential(
  28. nn.Dropout(),
  29. nn.Linear(256 * 3 * 3, 4096),
  30. nn.ReLU(inplace=True),
  31. nn.Dropout(),
  32. nn.Linear(4096, 4096),
  33. nn.ReLU(inplace=True),
  34. nn.Linear(4096, 10),
  35. )
  36. def forward(self, x):
  37. x = self.features(x)
  38. x = x.view(x.size(0), 256 * 3 * 3)
  39. x = self.classifier(x)
  40. return x
  41. #最后模拟了一个输入,输出一个分类器运算后的值
  42. num_classes = 10 # 分类数目
  43. grayscale = True # 是否为灰度图
  44. data = torch.rand((1, 1, 32, 32))
  45. print("input data:\n", data, "\n")
  46. model = AlexNet(num_classes,grayscale)
  47. x=model(data)
  48. print(x)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/220983
推荐阅读
相关标签
  

闽ICP备14008679号