赞
踩
作为小白,看到DCNN,一直想知道与CNN的区别,也没找到明确的说法,以下是自己的一点想法,欢迎指正!
目录
卷积神经网络,如:LeNet
深度卷积神经网络,如:AlexNet
AlexNet是第一个现代深度卷积网络模型,首次使用了许多现代深度卷积网络的技术方法,比如,采用ReLu作为非线性激活函数,使用Dropout防止过拟合,是用数据增强提高模型准确率,使用GPU进行并行训练等。
AlexNet与LeNet结构类似,但使用了更多的卷积层和更大的参数空间来拟合大规模数据集ImageNet。
卷积神经网络就是含卷积层的网络。AlexNet是浅层神经网络和深度神经网络的分界线。
(选自书《动手学深度学习》、《神经网络与深度学习》)
来自《神经网络与深度学习》
Input -> conv1 (6) -> pool1 -> conv2 (16) -> pool2 -> fc3 (120) -> fc4 (84) -> fc5 (10) -> softmax
代码实现与原文存在一定差异
- import torch
- import torch.nn as nn
- import torch.nn.functional as func
-
- class LeNet5(nn.Module):
- def __init__(self,num_classes, grayscale=False):
- """
- num_classes: 分类的数量
- grayscale:是否为灰度图
- """
- super(LeNet5, self).__init__()
-
- self.grayscale = grayscale
- self.num_classes = num_classes
-
- if self.grayscale: # 可以适用单通道和三通道的图像
- in_channels = 1
- else:
- in_channels = 3
-
- self.conv1 =self.conv1 = nn.Conv2d(in_channels, 6, kernel_size=5)
- self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
- self.fc1 = nn.Linear(16*5*5, 120)
- self.fc2 = nn.Linear(120, 84)
- self.fc3 = nn.Linear(84, num_classes)
-
- def forward(self, x):
- x = func.max_pool2d(self.conv1(x), 2) # 原始的模型使用的是 平均池化
- x = func.max_pool2d(self.conv2(x), 2)
- x = x.view(x.size(0), -1)
- x = self.fc3(self.fc2(self.fc1(x)))
- x = func.softmax(x,dim=1)
- return x
-
- #(最后模拟了一个输入,输出一个分类器运算后 10 个 softmax 概率值)
- num_classes = 10 # 分类数目
- grayscale = True # 是否为灰度图
- data = torch.rand((1, 1, 32, 32))
- print("input data:\n", data, "\n")
- model = LeNet5(num_classes, grayscale)
- x= model(data)
- print(x)
来自《神经网络与深度学习》
假设输入为32*32大小图像,代码实现与上文所述存在一定差异。
- import torch
- import torch.nn as nn
- class AlexNet(nn.Module):
- def __init__(self,num_classes, grayscale=False):
-
- super(AlexNet, self).__init__()
- self.grayscale = grayscale
- self.num_classes = num_classes
- if self.grayscale: # 可以适用单通道和三通道的图像
- in_channels = 1
- else:
- in_channels = 3
-
- self.features = nn.Sequential(
- nn.Conv2d(in_channels, 96, kernel_size=11,padding=1),
- nn.ReLU(inplace=True),
- nn.MaxPool2d(kernel_size=2),
- nn.Conv2d(96, 256, kernel_size=3, padding=1),
- nn.ReLU(inplace=True),
- nn.MaxPool2d(kernel_size=2),
- nn.Conv2d(256, 384, kernel_size=3, padding=1),
- nn.ReLU(inplace=True),
- nn.Conv2d(384, 384, kernel_size=3, padding=1),
- nn.ReLU(inplace=True),
- nn.Conv2d(384, 256, kernel_size=3, padding=1),
- nn.ReLU(inplace=True),
- nn.MaxPool2d(kernel_size=2),
- )
- self.classifier = nn.Sequential(
- nn.Dropout(),
- nn.Linear(256 * 3 * 3, 4096),
- nn.ReLU(inplace=True),
- nn.Dropout(),
- nn.Linear(4096, 4096),
- nn.ReLU(inplace=True),
- nn.Linear(4096, 10),
- )
-
- def forward(self, x):
- x = self.features(x)
- x = x.view(x.size(0), 256 * 3 * 3)
- x = self.classifier(x)
- return x
-
- #最后模拟了一个输入,输出一个分类器运算后的值
- num_classes = 10 # 分类数目
- grayscale = True # 是否为灰度图
- data = torch.rand((1, 1, 32, 32))
- print("input data:\n", data, "\n")
- model = AlexNet(num_classes,grayscale)
- x=model(data)
- print(x)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。