第J9周:Inception v3算法实战与解析

文章目录

一、前期准备

1.设置GPU/CPU

python 复制代码
import torch 
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision 
from torchvision import transforms, datasets

import os,PIL,pathlib,random 

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

device

device(type='cpu')

2.导入数据

python 复制代码
data_dir = './weather_photos/'
data_dir = pathlib.Path(data_dir)

data_paths = list(data_dir.glob('*'))
classeNames = [str(path).split("/")[1] for path in data_paths]
classeNames

'cloudy', 'rain', '.DS_Store', 'shine', 'sunrise'

python 复制代码
import matplotlib.pyplot as plt
from PIL import Image

## 指定图像文件夹路径
image_folder = './weather_photos/shine/'

## 获取文件夹中的所有图像文件
image_files = [f for f in os.listdir(image_folder) if f.endswith((".jpg", ".png", ".jpeg"))]

## 创建Matplotlib图像
fig, axes = plt.subplots(3, 8, figsize=(16, 6))

## 使用列表推导式加载和显示图像
for ax, img_file in zip(axes.flat, image_files):
    img_path = os.path.join(image_folder, img_file)
    img = Image.open(img_path)
    ax.imshow(img)
    ax.axis('off')
    
## 显示图像
plt.tight_layout()
plt.show()    
python 复制代码
total_datadir = './weather_photos/'

train_transforms = transforms.Compose([
    transforms.Resize([299, 299]),      ## 将输入图片resize成统一尺寸
    transforms.ToTensor(),              ## 将PIL Image或numpy.ndarray转换为tensor,并归一化到[0,1]之间
    transforms.Normalize(               ## 标准化处理-->转换为标准正态分布(高斯分布),使模型更容易收敛
        mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225])      ## 其中 mean=[0.485, 0.456, 0.406]与std=[0.229, 0.224, 0.225]从数据集中随机抽样计算得到的。
])

total_data = datasets.ImageFolder(total_datadir, transform=train_transforms)
total_data

Dataset ImageFolder

Number of datapoints: 1125

Root location: ./weather_photos/

StandardTransform

Transform: Compose(

Resize(size=299, 299, interpolation=bilinear, max_size=None, antialias=True)

ToTensor()

Normalize(mean=0.485, 0.456, 0.406, std=0.229, 0.224, 0.225)

)

3.划分数据集

● train_size表示训练集大小,通过将总体数据长度的80%转换为整数得到;

● test_size表示测试集大小,是总体数据长度减去训练集大小。

使用torch.utils.data.random_split()方法进行数据集划分。该方法将总体数据total_data按照指定的大小比例(train_size, test_size)随机划分为训练集和测试集,并将划分结果分别赋值给train_dataset和test_dataset两个变量。

python 复制代码
train_size = int(0.8 * len(total_data))
test_size = len(total_data) - train_size
train_dataset, test_dataset = torch.utils.data.random_split(total_data, [train_size, test_size])
train_dataset, test_dataset

(<torch.utils.data.dataset.Subset at 0x16554d2a0>,

<torch.utils.data.dataset.Subset at 0x16603bd60>)

python 复制代码
train_size,test_size

(900, 225)

python 复制代码
batch_size = 32 

train_dl = torch.utils.data.DataLoader(train_dataset,
                                       batch_size=batch_size,
                                       shuffle=True,
                                       num_workers=1)
test_dl = torch.utils.data.DataLoader(test_dataset,
                                      batch_size=batch_size,
                                      shuffle=True,
                                      num_workers=1)
python 复制代码
for X, y in test_dl:
    print("Shape of X [N, C, H, W]: ", X.shape)
    print("Shape of y: ", y.shape, y.dtype)
    break

Shape of X N, C, H, W: torch.Size(32, 3, 299, 299)

Shape of y: torch.Size(32) torch.int64

二、搭建网络模型

1. Inception-A

python 复制代码
class InceptionA(nn.Module):

    def __init__(self, in_channels, pool_features):
        super(InceptionA, self).__init__()
        self.branch1x1 = BasicConv2d(in_channels, 64, kernel_size=1) # 1

        self.branch5x5_1 = BasicConv2d(in_channels, 48, kernel_size=1)
        self.branch5x5_2 = BasicConv2d(48, 64, kernel_size=5, padding=2)

        self.branch3x3dbl_1 = BasicConv2d(in_channels, 64, kernel_size=1)
        self.branch3x3dbl_2 = BasicConv2d(64, 96, kernel_size=3, padding=1)
        self.branch3x3dbl_3 = BasicConv2d(96, 96, kernel_size=3, padding=1)

        self.branch_pool = BasicConv2d(in_channels, pool_features, kernel_size=1)

    def forward(self, x):
        branch1x1 = self.branch1x1(x)

        branch5x5 = self.branch5x5_1(x)
        branch5x5 = self.branch5x5_2(branch5x5)

        branch3x3dbl = self.branch3x3dbl_1(x)
        branch3x3dbl = self.branch3x3dbl_2(branch3x3dbl)
        branch3x3dbl = self.branch3x3dbl_3(branch3x3dbl)

        branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1)
        branch_pool = self.branch_pool(branch_pool)

        outputs = [branch1x1, branch5x5, branch3x3dbl, branch_pool]
        return torch.cat(outputs, 1)
  1. Inception-B
python 复制代码
class InceptionB(nn.Module):

    def __init__(self, in_channels, channels_7x7):
        super(InceptionB, self).__init__()
        self.branch1x1 = BasicConv2d(in_channels, 192, kernel_size=1)

        c7 = channels_7x7
        self.branch7x7_1 = BasicConv2d(in_channels, c7, kernel_size=1)
        self.branch7x7_2 = BasicConv2d(c7, c7, kernel_size=(1, 7), padding=(0, 3))
        self.branch7x7_3 = BasicConv2d(c7, 192, kernel_size=(7, 1), padding=(3, 0))

        self.branch7x7dbl_1 = BasicConv2d(in_channels, c7, kernel_size=1)
        self.branch7x7dbl_2 = BasicConv2d(c7, c7, kernel_size=(7, 1), padding=(3, 0))
        self.branch7x7dbl_3 = BasicConv2d(c7, c7, kernel_size=(1, 7), padding=(0, 3))
        self.branch7x7dbl_4 = BasicConv2d(c7, c7, kernel_size=(7, 1), padding=(3, 0))
        self.branch7x7dbl_5 = BasicConv2d(c7, 192, kernel_size=(1, 7), padding=(0, 3))

        self.branch_pool = BasicConv2d(in_channels, 192, kernel_size=1)

    def forward(self, x):
        branch1x1 = self.branch1x1(x)

        branch7x7 = self.branch7x7_1(x)
        branch7x7 = self.branch7x7_2(branch7x7)
        branch7x7 = self.branch7x7_3(branch7x7)

        branch7x7dbl = self.branch7x7dbl_1(x)
        branch7x7dbl = self.branch7x7dbl_2(branch7x7dbl)
        branch7x7dbl = self.branch7x7dbl_3(branch7x7dbl)
        branch7x7dbl = self.branch7x7dbl_4(branch7x7dbl)
        branch7x7dbl = self.branch7x7dbl_5(branch7x7dbl)

        branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1)
        branch_pool = self.branch_pool(branch_pool)

        outputs = [branch1x1, branch7x7, branch7x7dbl, branch_pool]
        return torch.cat(outputs, 1)

3. Inception-C

python 复制代码
class InceptionC(nn.Module):

    def __init__(self, in_channels):
        super(InceptionC, self).__init__()
        self.branch1x1 = BasicConv2d(in_channels, 320, kernel_size=1)

        self.branch3x3_1 = BasicConv2d(in_channels, 384, kernel_size=1)
        self.branch3x3_2a = BasicConv2d(384, 384, kernel_size=(1, 3), padding=(0, 1))
        self.branch3x3_2b = BasicConv2d(384, 384, kernel_size=(3, 1), padding=(1, 0))

        self.branch3x3dbl_1 = BasicConv2d(in_channels, 448, kernel_size=1)
        self.branch3x3dbl_2 = BasicConv2d(448, 384, kernel_size=3, padding=1)
        self.branch3x3dbl_3a = BasicConv2d(384, 384, kernel_size=(1, 3), padding=(0, 1))
        self.branch3x3dbl_3b = BasicConv2d(384, 384, kernel_size=(3, 1), padding=(1, 0))

        self.branch_pool = BasicConv2d(in_channels, 192, kernel_size=1)

    def forward(self, x):
        branch1x1 = self.branch1x1(x)

        branch3x3 = self.branch3x3_1(x)
        branch3x3 = [
            self.branch3x3_2a(branch3x3),
            self.branch3x3_2b(branch3x3),
        ]
        branch3x3 = torch.cat(branch3x3, 1)

        branch3x3dbl = self.branch3x3dbl_1(x)
        branch3x3dbl = self.branch3x3dbl_2(branch3x3dbl)
        branch3x3dbl = [
            self.branch3x3dbl_3a(branch3x3dbl),
            self.branch3x3dbl_3b(branch3x3dbl),
        ]
        branch3x3dbl = torch.cat(branch3x3dbl, 1)

        branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1)
        branch_pool = self.branch_pool(branch_pool)

        outputs = [branch1x1, branch3x3, branch3x3dbl, branch_pool]
        return torch.cat(outputs, 1)

4. Reduction-A

python 复制代码
class ReductionA(nn.Module):

    def __init__(self, in_channels):
        super(ReductionA, self).__init__()
        self.branch3x3 = BasicConv2d(in_channels, 384, kernel_size=3, stride=2)

        self.branch3x3dbl_1 = BasicConv2d(in_channels, 64, kernel_size=1)
        self.branch3x3dbl_2 = BasicConv2d(64, 96, kernel_size=3, padding=1)
        self.branch3x3dbl_3 = BasicConv2d(96, 96, kernel_size=3, stride=2)

    def forward(self, x):
        branch3x3 = self.branch3x3(x)

        branch3x3dbl = self.branch3x3dbl_1(x)
        branch3x3dbl = self.branch3x3dbl_2(branch3x3dbl)
        branch3x3dbl = self.branch3x3dbl_3(branch3x3dbl)

        branch_pool = F.max_pool2d(x, kernel_size=3, stride=2)

        outputs = [branch3x3, branch3x3dbl, branch_pool]
        return torch.cat(outputs, 1)

5. Reduction-B

python 复制代码
class ReductionB(nn.Module):

    def __init__(self, in_channels):
        super(ReductionB, self).__init__()
        self.branch3x3_1 = BasicConv2d(in_channels, 192, kernel_size=1)
        self.branch3x3_2 = BasicConv2d(192, 320, kernel_size=3, stride=2)

        self.branch7x7x3_1 = BasicConv2d(in_channels, 192, kernel_size=1)
        self.branch7x7x3_2 = BasicConv2d(192, 192, kernel_size=(1, 7), padding=(0, 3))
        self.branch7x7x3_3 = BasicConv2d(192, 192, kernel_size=(7, 1), padding=(3, 0))
        self.branch7x7x3_4 = BasicConv2d(192, 192, kernel_size=3, stride=2)

    def forward(self, x):
        branch3x3 = self.branch3x3_1(x)
        branch3x3 = self.branch3x3_2(branch3x3)

        branch7x7x3 = self.branch7x7x3_1(x)
        branch7x7x3 = self.branch7x7x3_2(branch7x7x3)
        branch7x7x3 = self.branch7x7x3_3(branch7x7x3)
        branch7x7x3 = self.branch7x7x3_4(branch7x7x3)

        branch_pool = F.max_pool2d(x, kernel_size=3, stride=2)
        outputs = [branch3x3, branch7x7x3, branch_pool]
        return torch.cat(outputs, 1)

6. 辅助分支

python 复制代码
class InceptionAux(nn.Module):

    def __init__(self, in_channels, num_classes):
        super(InceptionAux, self).__init__()
        self.conv0 = BasicConv2d(in_channels, 128, kernel_size=1)
        self.conv1 = BasicConv2d(128, 768, kernel_size=5)
        self.conv1.stddev = 0.01
        self.fc = nn.Linear(768, num_classes)
        self.fc.stddev = 0.001

    def forward(self, x):
        # 17 x 17 x 768
        x = F.avg_pool2d(x, kernel_size=5, stride=3)
        # 5 x 5 x 768
        x = self.conv0(x)
        # 5 x 5 x 128
        x = self.conv1(x)
        # 1 x 1 x 768
        x = x.view(x.size(0), -1)
        # 768
        x = self.fc(x)
        # 1000
        return x

7. 模型搭建

python 复制代码
import torch.nn.functional as F

class BasicConv2d(nn.Module):

    def __init__(self, in_channels, out_channels, **kwargs):
        super(BasicConv2d, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, bias=False, **kwargs)
        self.bn = nn.BatchNorm2d(out_channels, eps=0.001)

    def forward(self, x):
        x = self.conv(x)
        x = self.bn(x)
        return F.relu(x, inplace=True)
    
class InceptionV3(nn.Module):
    def __init__(self, num_classes=1000, aux_logits=False, transform_input=False):
        super(InceptionV3, self).__init__()
        self.aux_logits = aux_logits
        self.transform_input = transform_input
        self.Conv2d_1a_3x3 = BasicConv2d(3, 32, kernel_size=3, stride=2)
        self.Conv2d_2a_3x3 = BasicConv2d(32, 32, kernel_size=3)
        self.Conv2d_2b_3x3 = BasicConv2d(32, 64, kernel_size=3, padding=1)
        self.Conv2d_3b_1x1 = BasicConv2d(64, 80, kernel_size=1)
        self.Conv2d_4a_3x3 = BasicConv2d(80, 192, kernel_size=3)
        self.Mixed_5b = InceptionA(192, pool_features=32)
        self.Mixed_5c = InceptionA(256, pool_features=64)
        self.Mixed_5d = InceptionA(288, pool_features=64)
        self.Mixed_6a = ReductionA(288)
        self.Mixed_6b = InceptionB(768, channels_7x7=128)
        self.Mixed_6c = InceptionB(768, channels_7x7=160)
        self.Mixed_6d = InceptionB(768, channels_7x7=160)
        self.Mixed_6e = InceptionB(768, channels_7x7=192)
        if aux_logits:
            self.AuxLogits = InceptionAux(768, num_classes)
        self.Mixed_7a = ReductionB(768)
        self.Mixed_7b = InceptionC(1280)
        self.Mixed_7c = InceptionC(2048)
        self.fc = nn.Linear(2048, num_classes)

    def forward(self, x):
        if self.transform_input: # 1
            x = x.clone()
            x[:, 0] = x[:, 0] * (0.229 / 0.5) + (0.485 - 0.5) / 0.5
            x[:, 1] = x[:, 1] * (0.224 / 0.5) + (0.456 - 0.5) / 0.5
            x[:, 2] = x[:, 2] * (0.225 / 0.5) + (0.406 - 0.5) / 0.5
        # 299 x 299 x 3
        x = self.Conv2d_1a_3x3(x)
        # 149 x 149 x 32
        x = self.Conv2d_2a_3x3(x)
        # 147 x 147 x 32
        x = self.Conv2d_2b_3x3(x)
        # 147 x 147 x 64
        x = F.max_pool2d(x, kernel_size=3, stride=2)
        # 73 x 73 x 64
        x = self.Conv2d_3b_1x1(x)
        # 73 x 73 x 80
        x = self.Conv2d_4a_3x3(x)
        # 71 x 71 x 192
        x = F.max_pool2d(x, kernel_size=3, stride=2)
        # 35 x 35 x 192
        x = self.Mixed_5b(x)
        # 35 x 35 x 256
        x = self.Mixed_5c(x)
        # 35 x 35 x 288
        x = self.Mixed_5d(x)
        # 35 x 35 x 288
        x = self.Mixed_6a(x)
        # 17 x 17 x 768
        x = self.Mixed_6b(x)
        # 17 x 17 x 768
        x = self.Mixed_6c(x)
        # 17 x 17 x 768
        x = self.Mixed_6d(x)
        # 17 x 17 x 768
        x = self.Mixed_6e(x)
        # 17 x 17 x 768
        if self.training and self.aux_logits:
            aux = self.AuxLogits(x)
        # 17 x 17 x 768
        x = self.Mixed_7a(x)
        # 8 x 8 x 1280
        x = self.Mixed_7b(x)
        # 8 x 8 x 2048
        x = self.Mixed_7c(x)
        # 8 x 8 x 2048
        x = F.avg_pool2d(x, kernel_size=8)
        # 1 x 1 x 2048
        x = F.dropout(x, training=self.training)
        # 1 x 1 x 2048
        x = x.view(x.size(0), -1)
        # 2048
        x = self.fc(x)
        # 1000 (num_classes)
        if self.training and self.aux_logits:
            return x, aux
        return x
python 复制代码
device = "cuda" if torch.cuda.is_available() else "cpu"
print("Using {} device".format(device))
    
model = InceptionV3().to(device)
model

Using cpu device

InceptionV3(

(Conv2d_1a_3x3): BasicConv2d(

(conv): Conv2d(3, 32, kernel_size=(3, 3), stride=(2, 2), bias=False)

(bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(Conv2d_2a_3x3): BasicConv2d(

(conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), bias=False)

(bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(Conv2d_2b_3x3): BasicConv2d(

(conv): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(Conv2d_3b_1x1): BasicConv2d(

(conv): Conv2d(64, 80, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(80, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(Conv2d_4a_3x3): BasicConv2d(

(conv): Conv2d(80, 192, kernel_size=(3, 3), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(Mixed_5b): InceptionA(

(branch1x1): BasicConv2d(

(conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch5x5_1): BasicConv2d(

(conv): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(48, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch5x5_2): BasicConv2d(

(conv): Conv2d(48, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_1): BasicConv2d(

(conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_2): BasicConv2d(

(conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_3): BasicConv2d(

(conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch_pool): BasicConv2d(

(conv): Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

)

(Mixed_5c): InceptionA(

(branch1x1): BasicConv2d(

(conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch5x5_1): BasicConv2d(

(conv): Conv2d(256, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(48, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch5x5_2): BasicConv2d(

(conv): Conv2d(48, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_1): BasicConv2d(

(conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_2): BasicConv2d(

(conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_3): BasicConv2d(

(conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch_pool): BasicConv2d(

(conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

)

(Mixed_5d): InceptionA(

(branch1x1): BasicConv2d(

(conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch5x5_1): BasicConv2d(

(conv): Conv2d(288, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(48, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch5x5_2): BasicConv2d(

(conv): Conv2d(48, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_1): BasicConv2d(

(conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_2): BasicConv2d(

(conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_3): BasicConv2d(

(conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch_pool): BasicConv2d(

(conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

)

(Mixed_6a): ReductionA(

(branch3x3): BasicConv2d(

(conv): Conv2d(288, 384, kernel_size=(3, 3), stride=(2, 2), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_1): BasicConv2d(

(conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_2): BasicConv2d(

(conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_3): BasicConv2d(

(conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(2, 2), bias=False)

(bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

)

(Mixed_6b): InceptionB(

(branch1x1): BasicConv2d(

(conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7_1): BasicConv2d(

(conv): Conv2d(768, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7_2): BasicConv2d(

(conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7_3): BasicConv2d(

(conv): Conv2d(128, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_1): BasicConv2d(

(conv): Conv2d(768, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_2): BasicConv2d(

(conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_3): BasicConv2d(

(conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_4): BasicConv2d(

(conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_5): BasicConv2d(

(conv): Conv2d(128, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch_pool): BasicConv2d(

(conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

)

(Mixed_6c): InceptionB(

(branch1x1): BasicConv2d(

(conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7_1): BasicConv2d(

(conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7_2): BasicConv2d(

(conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7_3): BasicConv2d(

(conv): Conv2d(160, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_1): BasicConv2d(

(conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_2): BasicConv2d(

(conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_3): BasicConv2d(

(conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_4): BasicConv2d(

(conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_5): BasicConv2d(

(conv): Conv2d(160, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch_pool): BasicConv2d(

(conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

)

(Mixed_6d): InceptionB(

(branch1x1): BasicConv2d(

(conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7_1): BasicConv2d(

(conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7_2): BasicConv2d(

(conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7_3): BasicConv2d(

(conv): Conv2d(160, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_1): BasicConv2d(

(conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_2): BasicConv2d(

(conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_3): BasicConv2d(

(conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_4): BasicConv2d(

(conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_5): BasicConv2d(

(conv): Conv2d(160, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch_pool): BasicConv2d(

(conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

)

(Mixed_6e): InceptionB(

(branch1x1): BasicConv2d(

(conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7_1): BasicConv2d(

(conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7_2): BasicConv2d(

(conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7_3): BasicConv2d(

(conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_1): BasicConv2d(

(conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_2): BasicConv2d(

(conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_3): BasicConv2d(

(conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_4): BasicConv2d(

(conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7dbl_5): BasicConv2d(

(conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch_pool): BasicConv2d(

(conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

)

(Mixed_7a): ReductionB(

(branch3x3_1): BasicConv2d(

(conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3_2): BasicConv2d(

(conv): Conv2d(192, 320, kernel_size=(3, 3), stride=(2, 2), bias=False)

(bn): BatchNorm2d(320, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7x3_1): BasicConv2d(

(conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7x3_2): BasicConv2d(

(conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7x3_3): BasicConv2d(

(conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch7x7x3_4): BasicConv2d(

(conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(2, 2), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

)

(Mixed_7b): InceptionC(

(branch1x1): BasicConv2d(

(conv): Conv2d(1280, 320, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(320, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3_1): BasicConv2d(

(conv): Conv2d(1280, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3_2a): BasicConv2d(

(conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3_2b): BasicConv2d(

(conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_1): BasicConv2d(

(conv): Conv2d(1280, 448, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(448, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_2): BasicConv2d(

(conv): Conv2d(448, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_3a): BasicConv2d(

(conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_3b): BasicConv2d(

(conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch_pool): BasicConv2d(

(conv): Conv2d(1280, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

)

(Mixed_7c): InceptionC(

(branch1x1): BasicConv2d(

(conv): Conv2d(2048, 320, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(320, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3_1): BasicConv2d(

(conv): Conv2d(2048, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3_2a): BasicConv2d(

(conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3_2b): BasicConv2d(

(conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_1): BasicConv2d(

(conv): Conv2d(2048, 448, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(448, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_2): BasicConv2d(

(conv): Conv2d(448, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_3a): BasicConv2d(

(conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch3x3dbl_3b): BasicConv2d(

(conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)

(bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

(branch_pool): BasicConv2d(

(conv): Conv2d(2048, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)

)

)

(fc): Linear(in_features=2048, out_features=1000, bias=True)

)

8. 查看模型详情

python 复制代码
# 统计模型参数量以及其他指标
import torchsummary as summary
summary.summary(model, (3, 299, 299))
复制代码
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 32, 149, 149]             864
       BatchNorm2d-2         [-1, 32, 149, 149]              64
       BasicConv2d-3         [-1, 32, 149, 149]               0
            Conv2d-4         [-1, 32, 147, 147]           9,216
       BatchNorm2d-5         [-1, 32, 147, 147]              64
       BasicConv2d-6         [-1, 32, 147, 147]               0
            Conv2d-7         [-1, 64, 147, 147]          18,432
       BatchNorm2d-8         [-1, 64, 147, 147]             128
       BasicConv2d-9         [-1, 64, 147, 147]               0
           Conv2d-10           [-1, 80, 73, 73]           5,120
      BatchNorm2d-11           [-1, 80, 73, 73]             160
      BasicConv2d-12           [-1, 80, 73, 73]               0
           Conv2d-13          [-1, 192, 71, 71]         138,240
      BatchNorm2d-14          [-1, 192, 71, 71]             384
      BasicConv2d-15          [-1, 192, 71, 71]               0
           Conv2d-16           [-1, 64, 35, 35]          12,288
      BatchNorm2d-17           [-1, 64, 35, 35]             128
      BasicConv2d-18           [-1, 64, 35, 35]               0
           Conv2d-19           [-1, 48, 35, 35]           9,216
      BatchNorm2d-20           [-1, 48, 35, 35]              96
      BasicConv2d-21           [-1, 48, 35, 35]               0
           Conv2d-22           [-1, 64, 35, 35]          76,800
      BatchNorm2d-23           [-1, 64, 35, 35]             128
      BasicConv2d-24           [-1, 64, 35, 35]               0
           Conv2d-25           [-1, 64, 35, 35]          12,288
      BatchNorm2d-26           [-1, 64, 35, 35]             128
      BasicConv2d-27           [-1, 64, 35, 35]               0
           Conv2d-28           [-1, 96, 35, 35]          55,296
      BatchNorm2d-29           [-1, 96, 35, 35]             192
      BasicConv2d-30           [-1, 96, 35, 35]               0
           Conv2d-31           [-1, 96, 35, 35]          82,944
      BatchNorm2d-32           [-1, 96, 35, 35]             192
      BasicConv2d-33           [-1, 96, 35, 35]               0
           Conv2d-34           [-1, 32, 35, 35]           6,144
      BatchNorm2d-35           [-1, 32, 35, 35]              64
      BasicConv2d-36           [-1, 32, 35, 35]               0
       InceptionA-37          [-1, 256, 35, 35]               0
           Conv2d-38           [-1, 64, 35, 35]          16,384
      BatchNorm2d-39           [-1, 64, 35, 35]             128
      BasicConv2d-40           [-1, 64, 35, 35]               0
           Conv2d-41           [-1, 48, 35, 35]          12,288
      BatchNorm2d-42           [-1, 48, 35, 35]              96
      BasicConv2d-43           [-1, 48, 35, 35]               0
           Conv2d-44           [-1, 64, 35, 35]          76,800
      BatchNorm2d-45           [-1, 64, 35, 35]             128
      BasicConv2d-46           [-1, 64, 35, 35]               0
           Conv2d-47           [-1, 64, 35, 35]          16,384
      BatchNorm2d-48           [-1, 64, 35, 35]             128
      BasicConv2d-49           [-1, 64, 35, 35]               0
           Conv2d-50           [-1, 96, 35, 35]          55,296
      BatchNorm2d-51           [-1, 96, 35, 35]             192
      BasicConv2d-52           [-1, 96, 35, 35]               0
           Conv2d-53           [-1, 96, 35, 35]          82,944
      BatchNorm2d-54           [-1, 96, 35, 35]             192
      BasicConv2d-55           [-1, 96, 35, 35]               0
           Conv2d-56           [-1, 64, 35, 35]          16,384
      BatchNorm2d-57           [-1, 64, 35, 35]             128
      BasicConv2d-58           [-1, 64, 35, 35]               0
       InceptionA-59          [-1, 288, 35, 35]               0
           Conv2d-60           [-1, 64, 35, 35]          18,432
      BatchNorm2d-61           [-1, 64, 35, 35]             128
      BasicConv2d-62           [-1, 64, 35, 35]               0
           Conv2d-63           [-1, 48, 35, 35]          13,824
      BatchNorm2d-64           [-1, 48, 35, 35]              96
      BasicConv2d-65           [-1, 48, 35, 35]               0
           Conv2d-66           [-1, 64, 35, 35]          76,800
      BatchNorm2d-67           [-1, 64, 35, 35]             128
      BasicConv2d-68           [-1, 64, 35, 35]               0
           Conv2d-69           [-1, 64, 35, 35]          18,432
      BatchNorm2d-70           [-1, 64, 35, 35]             128
      BasicConv2d-71           [-1, 64, 35, 35]               0
           Conv2d-72           [-1, 96, 35, 35]          55,296
      BatchNorm2d-73           [-1, 96, 35, 35]             192
      BasicConv2d-74           [-1, 96, 35, 35]               0
           Conv2d-75           [-1, 96, 35, 35]          82,944
      BatchNorm2d-76           [-1, 96, 35, 35]             192
      BasicConv2d-77           [-1, 96, 35, 35]               0
           Conv2d-78           [-1, 64, 35, 35]          18,432
      BatchNorm2d-79           [-1, 64, 35, 35]             128
      BasicConv2d-80           [-1, 64, 35, 35]               0
       InceptionA-81          [-1, 288, 35, 35]               0
           Conv2d-82          [-1, 384, 17, 17]         995,328
      BatchNorm2d-83          [-1, 384, 17, 17]             768
      BasicConv2d-84          [-1, 384, 17, 17]               0
           Conv2d-85           [-1, 64, 35, 35]          18,432
      BatchNorm2d-86           [-1, 64, 35, 35]             128
      BasicConv2d-87           [-1, 64, 35, 35]               0
           Conv2d-88           [-1, 96, 35, 35]          55,296
      BatchNorm2d-89           [-1, 96, 35, 35]             192
      BasicConv2d-90           [-1, 96, 35, 35]               0
           Conv2d-91           [-1, 96, 17, 17]          82,944
      BatchNorm2d-92           [-1, 96, 17, 17]             192
      BasicConv2d-93           [-1, 96, 17, 17]               0
       ReductionA-94          [-1, 768, 17, 17]               0
           Conv2d-95          [-1, 192, 17, 17]         147,456
      BatchNorm2d-96          [-1, 192, 17, 17]             384
      BasicConv2d-97          [-1, 192, 17, 17]               0
           Conv2d-98          [-1, 128, 17, 17]          98,304
      BatchNorm2d-99          [-1, 128, 17, 17]             256
     BasicConv2d-100          [-1, 128, 17, 17]               0
          Conv2d-101          [-1, 128, 17, 17]         114,688
     BatchNorm2d-102          [-1, 128, 17, 17]             256
     BasicConv2d-103          [-1, 128, 17, 17]               0
          Conv2d-104          [-1, 192, 17, 17]         172,032
     BatchNorm2d-105          [-1, 192, 17, 17]             384
     BasicConv2d-106          [-1, 192, 17, 17]               0
          Conv2d-107          [-1, 128, 17, 17]          98,304
     BatchNorm2d-108          [-1, 128, 17, 17]             256
     BasicConv2d-109          [-1, 128, 17, 17]               0
          Conv2d-110          [-1, 128, 17, 17]         114,688
     BatchNorm2d-111          [-1, 128, 17, 17]             256
     BasicConv2d-112          [-1, 128, 17, 17]               0
          Conv2d-113          [-1, 128, 17, 17]         114,688
     BatchNorm2d-114          [-1, 128, 17, 17]             256
     BasicConv2d-115          [-1, 128, 17, 17]               0
          Conv2d-116          [-1, 128, 17, 17]         114,688
     BatchNorm2d-117          [-1, 128, 17, 17]             256
     BasicConv2d-118          [-1, 128, 17, 17]               0
          Conv2d-119          [-1, 192, 17, 17]         172,032
     BatchNorm2d-120          [-1, 192, 17, 17]             384
     BasicConv2d-121          [-1, 192, 17, 17]               0
          Conv2d-122          [-1, 192, 17, 17]         147,456
     BatchNorm2d-123          [-1, 192, 17, 17]             384
     BasicConv2d-124          [-1, 192, 17, 17]               0
      InceptionB-125          [-1, 768, 17, 17]               0
          Conv2d-126          [-1, 192, 17, 17]         147,456
     BatchNorm2d-127          [-1, 192, 17, 17]             384
     BasicConv2d-128          [-1, 192, 17, 17]               0
          Conv2d-129          [-1, 160, 17, 17]         122,880
     BatchNorm2d-130          [-1, 160, 17, 17]             320
     BasicConv2d-131          [-1, 160, 17, 17]               0
          Conv2d-132          [-1, 160, 17, 17]         179,200
     BatchNorm2d-133          [-1, 160, 17, 17]             320
     BasicConv2d-134          [-1, 160, 17, 17]               0
          Conv2d-135          [-1, 192, 17, 17]         215,040
     BatchNorm2d-136          [-1, 192, 17, 17]             384
     BasicConv2d-137          [-1, 192, 17, 17]               0
          Conv2d-138          [-1, 160, 17, 17]         122,880
     BatchNorm2d-139          [-1, 160, 17, 17]             320
     BasicConv2d-140          [-1, 160, 17, 17]               0
          Conv2d-141          [-1, 160, 17, 17]         179,200
     BatchNorm2d-142          [-1, 160, 17, 17]             320
     BasicConv2d-143          [-1, 160, 17, 17]               0
          Conv2d-144          [-1, 160, 17, 17]         179,200
     BatchNorm2d-145          [-1, 160, 17, 17]             320
     BasicConv2d-146          [-1, 160, 17, 17]               0
          Conv2d-147          [-1, 160, 17, 17]         179,200
     BatchNorm2d-148          [-1, 160, 17, 17]             320
     BasicConv2d-149          [-1, 160, 17, 17]               0
          Conv2d-150          [-1, 192, 17, 17]         215,040
     BatchNorm2d-151          [-1, 192, 17, 17]             384
     BasicConv2d-152          [-1, 192, 17, 17]               0
          Conv2d-153          [-1, 192, 17, 17]         147,456
     BatchNorm2d-154          [-1, 192, 17, 17]             384
     BasicConv2d-155          [-1, 192, 17, 17]               0
      InceptionB-156          [-1, 768, 17, 17]               0
          Conv2d-157          [-1, 192, 17, 17]         147,456
     BatchNorm2d-158          [-1, 192, 17, 17]             384
     BasicConv2d-159          [-1, 192, 17, 17]               0
          Conv2d-160          [-1, 160, 17, 17]         122,880
     BatchNorm2d-161          [-1, 160, 17, 17]             320
     BasicConv2d-162          [-1, 160, 17, 17]               0
          Conv2d-163          [-1, 160, 17, 17]         179,200
     BatchNorm2d-164          [-1, 160, 17, 17]             320
     BasicConv2d-165          [-1, 160, 17, 17]               0
          Conv2d-166          [-1, 192, 17, 17]         215,040
     BatchNorm2d-167          [-1, 192, 17, 17]             384
     BasicConv2d-168          [-1, 192, 17, 17]               0
          Conv2d-169          [-1, 160, 17, 17]         122,880
     BatchNorm2d-170          [-1, 160, 17, 17]             320
     BasicConv2d-171          [-1, 160, 17, 17]               0
          Conv2d-172          [-1, 160, 17, 17]         179,200
     BatchNorm2d-173          [-1, 160, 17, 17]             320
     BasicConv2d-174          [-1, 160, 17, 17]               0
          Conv2d-175          [-1, 160, 17, 17]         179,200
     BatchNorm2d-176          [-1, 160, 17, 17]             320
     BasicConv2d-177          [-1, 160, 17, 17]               0
          Conv2d-178          [-1, 160, 17, 17]         179,200
     BatchNorm2d-179          [-1, 160, 17, 17]             320
     BasicConv2d-180          [-1, 160, 17, 17]               0
          Conv2d-181          [-1, 192, 17, 17]         215,040
     BatchNorm2d-182          [-1, 192, 17, 17]             384
     BasicConv2d-183          [-1, 192, 17, 17]               0
          Conv2d-184          [-1, 192, 17, 17]         147,456
     BatchNorm2d-185          [-1, 192, 17, 17]             384
     BasicConv2d-186          [-1, 192, 17, 17]               0
      InceptionB-187          [-1, 768, 17, 17]               0
          Conv2d-188          [-1, 192, 17, 17]         147,456
     BatchNorm2d-189          [-1, 192, 17, 17]             384
     BasicConv2d-190          [-1, 192, 17, 17]               0
          Conv2d-191          [-1, 192, 17, 17]         147,456
     BatchNorm2d-192          [-1, 192, 17, 17]             384
     BasicConv2d-193          [-1, 192, 17, 17]               0
          Conv2d-194          [-1, 192, 17, 17]         258,048
     BatchNorm2d-195          [-1, 192, 17, 17]             384
     BasicConv2d-196          [-1, 192, 17, 17]               0
          Conv2d-197          [-1, 192, 17, 17]         258,048
     BatchNorm2d-198          [-1, 192, 17, 17]             384
     BasicConv2d-199          [-1, 192, 17, 17]               0
          Conv2d-200          [-1, 192, 17, 17]         147,456
     BatchNorm2d-201          [-1, 192, 17, 17]             384
     BasicConv2d-202          [-1, 192, 17, 17]               0
          Conv2d-203          [-1, 192, 17, 17]         258,048
     BatchNorm2d-204          [-1, 192, 17, 17]             384
     BasicConv2d-205          [-1, 192, 17, 17]               0
          Conv2d-206          [-1, 192, 17, 17]         258,048
     BatchNorm2d-207          [-1, 192, 17, 17]             384
     BasicConv2d-208          [-1, 192, 17, 17]               0
          Conv2d-209          [-1, 192, 17, 17]         258,048
     BatchNorm2d-210          [-1, 192, 17, 17]             384
     BasicConv2d-211          [-1, 192, 17, 17]               0
          Conv2d-212          [-1, 192, 17, 17]         258,048
     BatchNorm2d-213          [-1, 192, 17, 17]             384
     BasicConv2d-214          [-1, 192, 17, 17]               0
          Conv2d-215          [-1, 192, 17, 17]         147,456
     BatchNorm2d-216          [-1, 192, 17, 17]             384
     BasicConv2d-217          [-1, 192, 17, 17]               0
      InceptionB-218          [-1, 768, 17, 17]               0
          Conv2d-219          [-1, 192, 17, 17]         147,456
     BatchNorm2d-220          [-1, 192, 17, 17]             384
     BasicConv2d-221          [-1, 192, 17, 17]               0
          Conv2d-222            [-1, 320, 8, 8]         552,960
     BatchNorm2d-223            [-1, 320, 8, 8]             640
     BasicConv2d-224            [-1, 320, 8, 8]               0
          Conv2d-225          [-1, 192, 17, 17]         147,456
     BatchNorm2d-226          [-1, 192, 17, 17]             384
     BasicConv2d-227          [-1, 192, 17, 17]               0
          Conv2d-228          [-1, 192, 17, 17]         258,048
     BatchNorm2d-229          [-1, 192, 17, 17]             384
     BasicConv2d-230          [-1, 192, 17, 17]               0
          Conv2d-231          [-1, 192, 17, 17]         258,048
     BatchNorm2d-232          [-1, 192, 17, 17]             384
     BasicConv2d-233          [-1, 192, 17, 17]               0
          Conv2d-234            [-1, 192, 8, 8]         331,776
     BatchNorm2d-235            [-1, 192, 8, 8]             384
     BasicConv2d-236            [-1, 192, 8, 8]               0
      ReductionB-237           [-1, 1280, 8, 8]               0
          Conv2d-238            [-1, 320, 8, 8]         409,600
     BatchNorm2d-239            [-1, 320, 8, 8]             640
     BasicConv2d-240            [-1, 320, 8, 8]               0
          Conv2d-241            [-1, 384, 8, 8]         491,520
     BatchNorm2d-242            [-1, 384, 8, 8]             768
     BasicConv2d-243            [-1, 384, 8, 8]               0
          Conv2d-244            [-1, 384, 8, 8]         442,368
     BatchNorm2d-245            [-1, 384, 8, 8]             768
     BasicConv2d-246            [-1, 384, 8, 8]               0
          Conv2d-247            [-1, 384, 8, 8]         442,368
     BatchNorm2d-248            [-1, 384, 8, 8]             768
     BasicConv2d-249            [-1, 384, 8, 8]               0
          Conv2d-250            [-1, 448, 8, 8]         573,440
     BatchNorm2d-251            [-1, 448, 8, 8]             896
     BasicConv2d-252            [-1, 448, 8, 8]               0
          Conv2d-253            [-1, 384, 8, 8]       1,548,288
     BatchNorm2d-254            [-1, 384, 8, 8]             768
     BasicConv2d-255            [-1, 384, 8, 8]               0
          Conv2d-256            [-1, 384, 8, 8]         442,368
     BatchNorm2d-257            [-1, 384, 8, 8]             768
     BasicConv2d-258            [-1, 384, 8, 8]               0
          Conv2d-259            [-1, 384, 8, 8]         442,368
     BatchNorm2d-260            [-1, 384, 8, 8]             768
     BasicConv2d-261            [-1, 384, 8, 8]               0
          Conv2d-262            [-1, 192, 8, 8]         245,760
     BatchNorm2d-263            [-1, 192, 8, 8]             384
     BasicConv2d-264            [-1, 192, 8, 8]               0
      InceptionC-265           [-1, 2048, 8, 8]               0
          Conv2d-266            [-1, 320, 8, 8]         655,360
     BatchNorm2d-267            [-1, 320, 8, 8]             640
     BasicConv2d-268            [-1, 320, 8, 8]               0
          Conv2d-269            [-1, 384, 8, 8]         786,432
     BatchNorm2d-270            [-1, 384, 8, 8]             768
     BasicConv2d-271            [-1, 384, 8, 8]               0
          Conv2d-272            [-1, 384, 8, 8]         442,368
     BatchNorm2d-273            [-1, 384, 8, 8]             768
     BasicConv2d-274            [-1, 384, 8, 8]               0
          Conv2d-275            [-1, 384, 8, 8]         442,368
     BatchNorm2d-276            [-1, 384, 8, 8]             768
     BasicConv2d-277            [-1, 384, 8, 8]               0
          Conv2d-278            [-1, 448, 8, 8]         917,504
     BatchNorm2d-279            [-1, 448, 8, 8]             896
     BasicConv2d-280            [-1, 448, 8, 8]               0
          Conv2d-281            [-1, 384, 8, 8]       1,548,288
     BatchNorm2d-282            [-1, 384, 8, 8]             768
     BasicConv2d-283            [-1, 384, 8, 8]               0
          Conv2d-284            [-1, 384, 8, 8]         442,368
     BatchNorm2d-285            [-1, 384, 8, 8]             768
     BasicConv2d-286            [-1, 384, 8, 8]               0
          Conv2d-287            [-1, 384, 8, 8]         442,368
     BatchNorm2d-288            [-1, 384, 8, 8]             768
     BasicConv2d-289            [-1, 384, 8, 8]               0
          Conv2d-290            [-1, 192, 8, 8]         393,216
     BatchNorm2d-291            [-1, 192, 8, 8]             384
     BasicConv2d-292            [-1, 192, 8, 8]               0
      InceptionC-293           [-1, 2048, 8, 8]               0
          Linear-294                 [-1, 1000]       2,049,000
================================================================
Total params: 23,834,568
Trainable params: 23,834,568
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 1.02
Forward/backward pass size (MB): 224.12
Params size (MB): 90.92
Estimated Total Size (MB): 316.07
----------------------------------------------------------------

三、训练模型

1.设置超参数

python 复制代码
loss_fn = nn.CrossEntropyLoss()  ##创建损失函数
learn_rate = 1e-4    ## 学习率
opt = torch.optim.Adam(model.parameters(),lr=learn_rate, weight_decay=1e-4)   
scheduler = torch.optim.lr_scheduler.StepLR(opt, step_size=5, gamma=0.1)

2.编写训练函数

python 复制代码
## 训练循环
def train(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)      ## 训练集的大小,一共60000张图片
    num_batches = len(dataloader)       ## 批次数目, 1875(60000/32)
    
    train_loss, train_acc = 0, 0.       ## 初始化训练损失和正确率
    
    for X, y in dataloader:   ## 获取图片及其比标签
        X, y = X.to(device), y.to(device)
        
        ## 计算预测误差
        pred = model(X)               ## 网络输出
        loss = loss_fn(pred, y)       ## 计算网络输出和真实值之间的差距
        
        ## 反向传播
        optimizer.zero_grad()         ## grad属性归零
        loss.backward()               ## 反向传播
        optimizer.step()              ## 每一步自动更新
        
        ## 记录acc与loss
        train_acc += (pred.argmax(1) == y).type(torch.float).sum().item()
        train_loss += loss.item()
        
    train_acc /= size
    train_loss /= num_batches
    
    return train_acc, train_loss    

3.编写测试函数

python 复制代码
def test (dataloader, model, loss_fn):
    size = len(dataloader.dataset)   ## 测试集大小一共10000张图片
    num_batches = len(dataloader)    ## 批次数目,313(10000/32=312.5,向上取整)
    test_loss, test_acc = 0, 0
    
    ## 当不进行训练时,停止梯度更新,节省计算内存消耗
    with torch.no_grad():
        for imgs, target in dataloader:
            imgs, target = imgs.to(device), target.to(device)
            
            ## 计算loss
            target_pred = model(imgs)
            loss = loss_fn(target_pred, target)
            
            test_loss += loss.item()
            test_acc += (target_pred.argmax(1) == target).type(torch.float).sum().item()
            
        test_acc /= size
        test_loss /= num_batches
        
        return test_acc, test_loss
    

4.正式训练

python 复制代码
epochs = 20
train_loss = []
train_acc = []
test_loss = []
test_acc = []

for epoch in range(epochs):
    model.train()
    epoch_train_acc, epoch_train_loss = train(train_dl, model, loss_fn, opt)
    
    model.eval()
    epoch_test_acc, epoch_test_loss = test(test_dl, model, loss_fn)
    
    train_acc.append(epoch_train_acc)
    train_loss.append(epoch_train_loss)
    test_acc.append(epoch_test_acc)
    test_loss.append(epoch_test_loss)
    
    template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f}')
    print(template.format(epoch+1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss))
print('Done')
复制代码
Epoch: 1, Train_acc:71.8%, Train_loss:2.577, Test_acc:25.3%, Test_loss:6.160
Epoch: 2, Train_acc:86.0%, Train_loss:0.786, Test_acc:91.1%, Test_loss:0.296
Epoch: 3, Train_acc:90.4%, Train_loss:0.340, Test_acc:89.3%, Test_loss:0.372
Epoch: 4, Train_acc:90.2%, Train_loss:0.341, Test_acc:95.6%, Test_loss:0.169
Epoch: 5, Train_acc:91.1%, Train_loss:0.273, Test_acc:95.1%, Test_loss:0.135
Epoch: 6, Train_acc:93.1%, Train_loss:0.212, Test_acc:93.8%, Test_loss:0.217
Epoch: 7, Train_acc:91.4%, Train_loss:0.266, Test_acc:94.2%, Test_loss:0.145
Epoch: 8, Train_acc:93.4%, Train_loss:0.278, Test_acc:91.1%, Test_loss:0.252
Epoch: 9, Train_acc:90.9%, Train_loss:0.334, Test_acc:91.6%, Test_loss:0.204
Epoch:10, Train_acc:91.4%, Train_loss:0.339, Test_acc:88.9%, Test_loss:0.345
Epoch:11, Train_acc:94.2%, Train_loss:0.171, Test_acc:96.0%, Test_loss:0.105
Epoch:12, Train_acc:95.0%, Train_loss:0.166, Test_acc:95.6%, Test_loss:0.096
Epoch:13, Train_acc:95.6%, Train_loss:0.103, Test_acc:96.0%, Test_loss:0.119
Epoch:14, Train_acc:97.3%, Train_loss:0.190, Test_acc:94.7%, Test_loss:0.138
Epoch:15, Train_acc:94.6%, Train_loss:0.218, Test_acc:90.2%, Test_loss:0.242
Epoch:16, Train_acc:92.9%, Train_loss:0.189, Test_acc:96.9%, Test_loss:0.109
Epoch:17, Train_acc:95.6%, Train_loss:0.132, Test_acc:93.8%, Test_loss:0.116
Epoch:18, Train_acc:96.3%, Train_loss:0.123, Test_acc:96.9%, Test_loss:0.082
Epoch:19, Train_acc:96.9%, Train_loss:0.170, Test_acc:96.4%, Test_loss:0.085
Epoch:20, Train_acc:94.9%, Train_loss:0.190, Test_acc:96.4%, Test_loss:0.118
Done

四、结果可视化

python 复制代码
import matplotlib.pyplot as plt

# 隐藏警告
import warnings
warnings.filterwarnings("ignore")  ## 忽略警告信息
plt.rcParams['font.sans-serif'] = ['SimHei']  ## 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False   ## 用来正常显示负号
plt.rcParams['figure.dpi'] = 100 ## 分辨率

epochs_range = range(epochs)

plt.figure(figsize=(12, 3))
plt.subplot(1, 2, 1)

plt.plot(epochs_range, train_acc, label='Training Accuracy')
plt.plot(epochs_range, test_acc, label='Test Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_loss, label='Training Loss')
plt.plot(epochs_range, test_loss, label='Test Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

总结:

本周主要学习了Inception V3,了解到了该模型相对于Inception V1做出的改进,同时通过实践更加深入地了解到了Inception V3的结构。

相关推荐
江畔柳前堤8 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore9 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考10 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX11 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面12 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号12 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽12 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI12 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者14 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者14 小时前
【征程6】校准量化中HistogramObserver解析
算法