import d2l.torch
import torch
from torch import nn
from torch.nn import functional as F
class Inception(nn.Module):
def __init__(self,in_channels,c1,c2,c3,c4):
super(Inception, self).__init__()
self.p1_1 = nn.Conv2d(in_channels=in_channels,out_channels=c1,kernel_size=1,stride=1,padding=0)
self.p2_1 = nn.Conv2d(in_channels=in_channels,out_channels=c2[0],kernel_size=1,padding=0,stride=1)
self.p2_2 = nn.Conv2d(in_channels=c2[0],out_channels=c2[1],kernel_size=3,padding=1,stride=1)
self.p3_1 = nn.Conv2d(in_channels=in_channels,out_channels=c3[0],kernel_size=1,padding=0,stride=1)
self.p3_2 = nn.Conv2d(in_channels=c3[0],out_channels=c3[1],kernel_size=5,padding=2,stride=1)
self.p4_1 = nn.MaxPool2d(kernel_size=3,padding=1,stride=1)
self.p4_2 = nn.Conv2d(in_channels=in_channels,out_channels=c4,kernel_size=1,padding=0,stride=1)
def forward(self,X):
p1 = F.relu(self.p1_1(X))
p2 = F.relu(self.p2_2(F.relu(self.p2_1(X))))
p3 = F.relu(self.p3_2(F.relu(self.p3_1(X))))
p4 = F.relu(self.p4_2(self.p4_1(X)))
return torch.cat((p1,p2,p3,p4),dim=1)
b1 = nn.Sequential(nn.Conv2d(in_channels=1,out_channels=64,kernel_size=7,padding=3,stride=2),
nn.ReLU(),
nn.MaxPool2d(kernel_size=3,padding=1,stride=2))
b2 = nn.Sequential(nn.Conv2d(in_channels=64,out_channels=64,kernel_size=1,padding=0,stride=1),
nn.ReLU(),
nn.Conv2d(in_channels=64,out_channels=192,kernel_size=3,padding=1,stride=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=3,padding=1,stride=2))
b3 = nn.Sequential(Inception(in_channels=192,c1=64,c2=(96,128),c3=(16,32),c4=32),
Inception(in_channels=256,c1=128,c2=(128,192),c3=(32,96),c4=64),
nn.MaxPool2d(kernel_size=3,padding=1,stride=2))
b4 = nn.Sequential(Inception(in_channels=480,c1=192,c2=(96,208),c3=(16,48),c4=64),
Inception(in_channels=512,c1=160,c2=(112,224),c3=(24,64),c4=64),
Inception(in_channels=512,c1=128,c2=(128,256),c3=(24,64),c4=64),
Inception(in_channels=512,c1=112,c2=(144,288),c3=(32,64),c4=64),
Inception(in_channels=528,c1=256,c2=(160,320),c3=(32,128),c4=128),
nn.MaxPool2d(kernel_size=3,padding=1,stride=2))
b5 = nn.Sequential(Inception(in_channels=832,c1=256,c2=(160,320),c3=(32,128),c4=128),
Inception(in_channels=832,c1=384,c2=(192,384),c3=(48,128),c4=128),
nn.AdaptiveAvgPool2d((1,1)),
nn.Flatten())
GoogLeNet = nn.Sequential(b1,b2,b3,b4,b5,nn.Linear(1024,10))
X = torch.randn(size=(1,1,96,96))
for layer in GoogLeNet:
X = layer(X)
print(layer.__class__.__name__," output shape :\t",X.shape)
lr,num_epochs,batch_szie = 0.05,30,128
train_iter,test_iter = d2l.torch.load_data_fashion_mnist(batch_size=batch_szie,resize=96)
d2l.torch.train_ch6(GoogLeNet,train_iter,test_iter,num_epochs,lr,device=d2l.torch.try_gpu())
模型训练和测试结果如下图所示:
1. GoogLeNet在2014年的ImageNet图像识别挑战赛中,一个名叫GoogLeNet 的网络架构大放异彩。 GoogLeNet吸收了NiN中串联网络的思想,并在此基础上做了改进。 这篇论文的一个重点是解决了什么样大小的卷积核最合适的问题。 毕竟,以前流行的网络使用小到 1×1 ,大到 11×11 的卷积核。 本文的一个观点是,有时使用不同大小的卷积核组合是有利的。1.1 Inception块在GoogLeNet中,基本的卷积块被称为Inception块(Inception block)。
常见的分类网络都可以分为两部分,一部分是特征提取部分,另一部分是分类部分。
1、特征提取部分的功能是对输入进来的图片进行特征提取 , 优秀的特征可以帮助更容易区分目标,所以特征提取部分一般由各类卷积组成,卷积拥有强大的特征提取能力 ;
2、分类部分会利用特征提取部分获取到的特征进行分类 ,分类部分一般由全连接组成, 特征提取部分获取到的特征一般是一维向量,可以直接进行全连接分类。
通常情况下,特征提取部分就是我们平常了解到的各种神经网络,比如VGG、Mobilenet、Resnet等等;而分类部分就是
__constants__ = ['aux_logits', 'transform_input']
def __init__(self, num_classes=1000, aux_logits=True, transform_input=False, init_weights=True,
接上一节内容:Pytorch搭建常见分类网络模型------VGG、Googlenet、 MobileNetV3、ResNet50(1)_一只小小的土拨鼠的博客-CSDN博客
前言:AlexNet、VGG等经典的神经网络框架,一个共同特点是:整个网络由不同神经模块的串联构建。神经网络深度不断加深会造成过拟合和模型参数巨大等问题。解决主要方法是引入稀疏特性、将全连接层换成稀疏连接。Googlenet串并联网络结构便是由此提出。
在串联网络中,每一层级的卷积核都是固定尺寸的,只能提取固定尺度的特征。基于这种
一、CNN的引入在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的。当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢,例如一张黑白的 28×2828×28 的手写数字图片,输入层的神经元就有784个,如下图所示:
若在中间只使用一层隐藏层,参数 ww 就有 784×15=11760784×15 = 11760 多个;若输入的
学习深度学习时候,很多人参考的是李沐的动手学深度学习Pytorch版本(附上官方地址:https://tangshusen.me/Dive-into-DL-PyTorch/#/)。
在学习3.5.1节 “获取数据集” 时,会遇到d2lzh_pytorch包缺少的问题,经过查阅资料,下面方法可以解决这个问题。
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import time
import sys
sys.path.appe
Pytorch中DDP :The server socket has failed to bind to [::]:29500 (errno: 98 - Address already in use)