Inception块:
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实现:
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())