AlexNet是2012年的经典网络结构,日常实验这个模型基本就能满足需求。本人,十分偏爱这个网络模型,也许是上了岁数吧,老年人比较怀旧。文章下面介绍如何使用Pytorch来实现网络模型的精调,续上一篇博文实现基于AlexNet的蜜蜂和蚂蚁的分类,数据集下载和数据的预处理参见上一篇博文。
实现迁移学习之前,首先我们读取一下Pytorch封装的AlexNet所包含的网络结构:read_AlexNet_structure.py
import torchvision.models as models
# 导入Pytorch所封装的AlexNet模型
model = models.alexnet(pretrained=True)
# model.features存储的是网络模型的前半部分
# 即卷积层与池化层部分
model_features = list(model.features.children())
for feature in model_features:
print (feature)
# model.classifier存储的是模型的后半部分
# 即全连接层部分
model_classifier = list(model.classifier.children())
for classifier in model_classifier:
print (classifier)
前半部分的网络结构:
后半部分的网络结构:
定义网络结构,实现基于AlexNet的精调,finetune_with_AlexNet.py。
from __future__ import print_function, division
import torch
import torch.nn as nn
from torch.optim import lr_scheduler
from torchvision import datasets, models, transforms
import time
import os
import copy
# 是否使用gpu运算
use_gpu = torch.cuda.is_available()
# 数据预处理
data_transforms = {
'train': transforms.Compose([
# 随机在图像上裁剪出224*224大小的图像
transforms.RandomResizedCrop(224),
# 将图像随机翻转
transforms.RandomHorizontalFlip(),
# 将图像数据,转换为网络训练所需的tensor向量
transforms.ToTensor(),
# 图像归一化处理
# 个人理解,前面是3个通道的均值,后面是3个通道的方差
transforms.Normalize([0.485, 0.456, 0.406], [