5天学习计划 Pytorch实战 _ 第P6周:好莱坞明星识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客
🍦 参考文章:Pytorch实战 | 第P6周:好莱坞明星识别
🍖 原作者:K同学啊|接辅导、项目定制
🍺要求:保存训练过程中的最佳模型权重
调用官方的VGG-16网络框架
🍻拔高(可选):测试集准确率达到60%(难度有点大,但是这个过程可以学到不少)
手动搭建VGG-16网络框架
一、前期工作
本文为5天学习计划分享版,更完善的内容可在365天深度学习训练营中获取
我的环境:
- 语言环境:Python3.6.5
- 编译器:jupyter notebook
- 深度学习框架:TensorFlow2.4.1
- 显卡(GPU):NVIDIA GeForce RTX 3080
- 数据集:公众号(K同学啊)回复
DL+48
1. 设置GPU
如果使用的是CPU可以忽略这步
import torch
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision
from torchvision import transforms, datasetsimport os,PIL,pathlibdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")device
/home/liangjie/anaconda3/envs/newcdo/lib/python3.9/site-packages/tqdm/auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.htmlfrom .autonotebook import tqdm as notebook_tqdmdevice(type='cpu')
2. 导入数据
import os,PIL,random,pathlibdata_dir = '/48-data/'
data_dir = pathlib.Path(data_dir)data_paths = list(data_dir.glob('*'))classeNames = [str(path).split("/")[2] for path in data_paths]
classeNames
[]
data_dir = "./48-data/48-data/"data_dir = pathlib.Path(data_dir)
data_paths = list(data_dir.glob('*'))classeNames = [str(path).split("/")[2] for path in data_paths]
classeNames
['Angelina Jolie','Brad Pitt','Denzel Washington','Hugh Jackman','Jennifer Lawrence','Johnny Depp','Kate Winslet','Leonardo DiCaprio','Megan Fox','Natalie Portman','Nicole Kidman','Robert Downey Jr','Sandra Bullock','Scarlett Johansson','Tom Cruise','Tom Hanks','vgg16_weights_tf_dim_ordering_tf_kernels.h5','Will Smith']
3. 查看数据
image_count = len(list(data_dir.glob('*/*.jpg')))print("图片总数为:",image_count)
图片总数为: 1800
roses = list(data_dir.glob('Jennifer Lawrence/*.jpg'))
PIL.Image.open(str(roses[0]))
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0MZMZPkX-1676035802716)(output_11_0.png)]
# 关于transforms.Compose的更多介绍可以参考:https://blog.csdn.net/qq_38251616/article/details/124878863
train_transforms = transforms.Compose([transforms.Resize([224, 224]), # 将输入图片resize成统一尺寸# transforms.RandomHorizontalFlip(), # 随机水平翻转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("./48-data/48-data/",transform=train_transforms)
total_data
Dataset ImageFolderNumber of datapoints: 1800Root location: ./48-data/48-data/StandardTransform
Transform: Compose(Resize(size=[224, 224], interpolation=bilinear, max_size=None, antialias=None)ToTensor()Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]))
total_data.class_to_idx
{'Angelina Jolie': 0,'Brad Pitt': 1,'Denzel Washington': 2,'Hugh Jackman': 3,'Jennifer Lawrence': 4,'Johnny Depp': 5,'Kate Winslet': 6,'Leonardo DiCaprio': 7,'Megan Fox': 8,'Natalie Portman': 9,'Nicole Kidman': 10,'Robert Downey Jr': 11,'Sandra Bullock': 12,'Scarlett Johansson': 13,'Tom Cruise': 14,'Tom Hanks': 15,'Will Smith': 16}
4. 划分数据集
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
(,)
batch_size = 32train_dl = torch.utils.data.DataLoader(train_dataset,batch_size=batch_size,shuffle=True,num_workers=2)
test_dl = torch.utils.data.DataLoader(test_dataset,batch_size=batch_size,shuffle=True,num_workers=2)
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, 224, 224])
Shape of y: torch.Size([32]) torch.int64
二、调用官方的VGG-16模型
from torchvision.models.vgg import vgg16_bn,VGG16_BN_Weights
from torchvision.models.vgg import vgg16,VGG16_Weights
from torchvision.models.vgg import vgg19,VGG19_Weights
#from torchvision.models import vgg16device = "cuda" if torch.cuda.is_available() else "cpu"
print("Using {} device".format(device))# 加载预训练模型,并且对模型进行微调
#weights = VGG16_Weights.DEFAULT
#model = vgg16(weights=weights).to(device)
#model = vgg16().to(device)
#model = models.vgg16(pretrained = True).to(device) # 加载预训练的vgg16模型weights = VGG16_BN_Weights.DEFAULT
model = vgg16_bn(weights=weights).to(device)#weights = VGG19_Weights.DEFAULT
#model = vgg19(weights=weights).to(device)for param in model.parameters():param.requires_grad = False # 冻结模型的参数,这样子在训练的时候只训练最后一层的参数# 修改classifier模块的第6层(即:(6): Linear(in_features=4096, out_features=2, bias=True))
# 注意查看我们下方打印出来的模型
model.classifier._modules['6'] = nn.Linear(4096,len(classeNames)) # 修改vgg16模型中最后一层全连接层,输出目标类别个数
model.to(device)
model
Using cpu deviceDownloading: "https://download.pytorch.org/models/vgg16_bn-6c64b313.pth" to /home/usr/liangjie/.cache/torch/hub/checkpoints/vgg16_bn-6c64b313.pth
100%|██████████████████████████████████| 528M/528M [00:12<00:00, 44.8MB/s]VGG((features): Sequential((0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU(inplace=True)(3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(4): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(5): ReLU(inplace=True)(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(7): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(8): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(9): ReLU(inplace=True)(10): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(11): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(12): ReLU(inplace=True)(13): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(14): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(15): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(16): ReLU(inplace=True)(17): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(18): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(19): ReLU(inplace=True)(20): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(21): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(22): ReLU(inplace=True)(23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(24): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(25): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(26): ReLU(inplace=True)(27): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(28): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(29): ReLU(inplace=True)(30): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(31): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(32): ReLU(inplace=True)(33): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(34): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(35): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(36): ReLU(inplace=True)(37): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(38): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(39): ReLU(inplace=True)(40): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(41): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(42): ReLU(inplace=True)(43): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))(avgpool): AdaptiveAvgPool2d(output_size=(7, 7))(classifier): Sequential((0): Linear(in_features=25088, out_features=4096, bias=True)(1): ReLU(inplace=True)(2): Dropout(p=0.5, inplace=False)(3): Linear(in_features=4096, out_features=4096, bias=True)(4): ReLU(inplace=True)(5): Dropout(p=0.5, inplace=False)(6): Linear(in_features=4096, out_features=18, bias=True))
)
三、 训练模型
1. 训练循环
# 训练循环
def train(dataloader, model, loss_fn, optimizer):size = len(dataloader.dataset) # 训练集的大小num_batches = len(dataloader) # 批次数目, (size/batch_size,向上取整)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) # 计算网络输出和真实值之间的差距,targets为真实值,计算二者差值即为损失# 反向传播optimizer.zero_grad() # grad属性归零loss.backward() # 反向传播optimizer.step() # 每一步自动更新# 记录acc与losstrain_acc += (pred.argmax(1) == y).type(torch.float).sum().item()train_loss += loss.item()train_acc /= sizetrain_loss /= num_batchesreturn train_acc, train_loss
2. 编写测试函数
def test (dataloader, model, loss_fn):size = len(dataloader.dataset) # 测试集的大小num_batches = len(dataloader) # 批次数目, (size/batch_size,向上取整)test_loss, test_acc = 0, 0# 当不进行训练时,停止梯度更新,节省计算内存消耗with torch.no_grad():for imgs, target in dataloader:imgs, target = imgs.to(device), target.to(device)# 计算losstarget_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 /= sizetest_loss /= num_batchesreturn test_acc, test_loss
3. 设置动态学习率
# def adjust_learning_rate(optimizer, epoch, start_lr):
# # 每 2 个epoch衰减到原来的 0.98
# lr = start_lr * (0.92 ** (epoch // 2))
# for param_group in optimizer.param_groups:
# param_group['lr'] = lrlearn_rate = 1e-4 # 初始学习率
# optimizer = torch.optim.SGD(model.parameters(), lr=learn_rate)
✨调用官方动态学习率接口
与上面方法是等价的
# 调用官方动态学习率接口时使用
lambda1 = lambda epoch: 0.98 ** (epoch // 5)
optimizer = torch.optim.SGD(model.parameters(), lr=learn_rate)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda1) #选定调整方法
👉调用官方接口示例:
更多的官方动态学习率设置方式可参考:https://pytorch.org/docs/stable/optim.html
4、正式训练
import copyloss_fn = nn.CrossEntropyLoss() # 创建损失函数
epochs = 40train_loss = []
train_acc = []
test_loss = []
test_acc = []best_acc = 0 # 设置一个最佳准确率,作为最佳模型的判别指标for epoch in range(epochs): model.train()epoch_train_acc, epoch_train_loss = train(train_dl, model, loss_fn, optimizer)scheduler.step() # 更新学习率(调用官方动态学习率接口时使用)model.eval()epoch_test_acc, epoch_test_loss = test(test_dl, model, loss_fn)# 保存最佳模型到 best_modelif epoch_test_acc > best_acc:best_acc = epoch_test_accbest_model = copy.deepcopy(model)train_acc.append(epoch_train_acc)train_loss.append(epoch_train_loss)test_acc.append(epoch_test_acc)test_loss.append(epoch_test_loss)# 获取当前的学习率lr = optimizer.state_dict()['param_groups'][0]['lr']template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f}, Lr:{:.2E}')print(template.format(epoch+1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss, lr))# 保存最佳模型到文件中
PATH = './best_model.pth' # 保存的参数文件名
torch.save(model.state_dict(), PATH)print('Done')
Epoch: 1, Train_acc:7.3%, Train_loss:2.927, Test_acc:8.3%, Test_loss:2.915, Lr:1.00E-04
Epoch: 2, Train_acc:6.5%, Train_loss:2.925, Test_acc:9.4%, Test_loss:2.892, Lr:1.00E-04
Epoch: 3, Train_acc:9.0%, Train_loss:2.907, Test_acc:10.6%, Test_loss:2.876, Lr:1.00E-04
Epoch: 4, Train_acc:10.7%, Train_loss:2.882, Test_acc:10.8%, Test_loss:2.861, Lr:1.00E-04
Epoch: 5, Train_acc:10.8%, Train_loss:2.864, Test_acc:13.3%, Test_loss:2.844, Lr:9.80E-05
Epoch: 6, Train_acc:10.5%, Train_loss:2.848, Test_acc:13.1%, Test_loss:2.836, Lr:9.80E-05
Epoch: 7, Train_acc:12.6%, Train_loss:2.830, Test_acc:13.6%, Test_loss:2.807, Lr:9.80E-05
Epoch: 8, Train_acc:12.8%, Train_loss:2.825, Test_acc:13.6%, Test_loss:2.804, Lr:9.80E-05
Epoch: 9, Train_acc:13.3%, Train_loss:2.799, Test_acc:14.2%, Test_loss:2.792, Lr:9.80E-05
Epoch:10, Train_acc:14.9%, Train_loss:2.787, Test_acc:15.0%, Test_loss:2.773, Lr:9.60E-05
Epoch:11, Train_acc:14.8%, Train_loss:2.781, Test_acc:14.4%, Test_loss:2.765, Lr:9.60E-05
Epoch:12, Train_acc:15.7%, Train_loss:2.759, Test_acc:15.0%, Test_loss:2.754, Lr:9.60E-05
Epoch:13, Train_acc:13.9%, Train_loss:2.763, Test_acc:15.3%, Test_loss:2.737, Lr:9.60E-05
Epoch:14, Train_acc:16.2%, Train_loss:2.731, Test_acc:16.1%, Test_loss:2.739, Lr:9.60E-05
Epoch:15, Train_acc:16.9%, Train_loss:2.722, Test_acc:16.1%, Test_loss:2.721, Lr:9.41E-05
Epoch:16, Train_acc:15.2%, Train_loss:2.708, Test_acc:15.8%, Test_loss:2.704, Lr:9.41E-05
Epoch:17, Train_acc:16.6%, Train_loss:2.709, Test_acc:16.4%, Test_loss:2.710, Lr:9.41E-05
Epoch:18, Train_acc:17.1%, Train_loss:2.699, Test_acc:16.7%, Test_loss:2.704, Lr:9.41E-05
Epoch:19, Train_acc:17.7%, Train_loss:2.681, Test_acc:16.9%, Test_loss:2.684, Lr:9.41E-05
Epoch:20, Train_acc:18.1%, Train_loss:2.665, Test_acc:16.9%, Test_loss:2.674, Lr:9.22E-05
Epoch:21, Train_acc:17.6%, Train_loss:2.653, Test_acc:16.9%, Test_loss:2.660, Lr:9.22E-05
Epoch:22, Train_acc:19.0%, Train_loss:2.651, Test_acc:16.9%, Test_loss:2.645, Lr:9.22E-05
Epoch:23, Train_acc:18.9%, Train_loss:2.641, Test_acc:16.4%, Test_loss:2.637, Lr:9.22E-05
Epoch:24, Train_acc:18.5%, Train_loss:2.630, Test_acc:16.9%, Test_loss:2.640, Lr:9.22E-05
Epoch:25, Train_acc:18.7%, Train_loss:2.615, Test_acc:17.2%, Test_loss:2.629, Lr:9.04E-05
Epoch:26, Train_acc:20.9%, Train_loss:2.608, Test_acc:17.8%, Test_loss:2.623, Lr:9.04E-05
Epoch:27, Train_acc:19.1%, Train_loss:2.603, Test_acc:17.5%, Test_loss:2.619, Lr:9.04E-05
Epoch:28, Train_acc:19.9%, Train_loss:2.599, Test_acc:17.8%, Test_loss:2.582, Lr:9.04E-05
Epoch:29, Train_acc:21.2%, Train_loss:2.579, Test_acc:17.8%, Test_loss:2.601, Lr:9.04E-05
Epoch:30, Train_acc:20.8%, Train_loss:2.568, Test_acc:18.3%, Test_loss:2.588, Lr:8.86E-05
Epoch:31, Train_acc:19.2%, Train_loss:2.570, Test_acc:18.3%, Test_loss:2.589, Lr:8.86E-05
Epoch:32, Train_acc:21.5%, Train_loss:2.560, Test_acc:19.4%, Test_loss:2.563, Lr:8.86E-05
Epoch:33, Train_acc:21.0%, Train_loss:2.538, Test_acc:19.7%, Test_loss:2.563, Lr:8.86E-05
Epoch:34, Train_acc:23.0%, Train_loss:2.548, Test_acc:20.0%, Test_loss:2.558, Lr:8.86E-05
Epoch:35, Train_acc:23.1%, Train_loss:2.534, Test_acc:20.0%, Test_loss:2.551, Lr:8.68E-05
Epoch:36, Train_acc:22.2%, Train_loss:2.517, Test_acc:20.3%, Test_loss:2.552, Lr:8.68E-05
Epoch:37, Train_acc:22.8%, Train_loss:2.507, Test_acc:20.3%, Test_loss:2.531, Lr:8.68E-05
Epoch:38, Train_acc:22.4%, Train_loss:2.512, Test_acc:20.8%, Test_loss:2.533, Lr:8.68E-05
Epoch:39, Train_acc:22.8%, Train_loss:2.500, Test_acc:21.4%, Test_loss:2.523, Lr:8.68E-05
Epoch:40, Train_acc:23.8%, Train_loss:2.497, Test_acc:21.4%, Test_loss:2.504, Lr:8.51E-05
Done
四、结果可视化
1、Loss与Accuracy图
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()
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ER36XRrg-1676035802718)(output_34_1.png)]
2、指定图片进行预测
from PIL import Image classes = list(train_dataset.class_to_idx)def predict_one_image(image_path, model, transform, classes):test_img = Image.open(image_path).convert('RGB')plt.imshow(test_img) # 展示预测的图片test_img = transform(test_img)img = test_img.to(device).unsqueeze(0)model.eval()output = model(img)_,pred = torch.max(output,1)pred_class = classes[pred]print(f'预测结果是:{pred_class}')
# 预测训练集中的某张照片
predict_one_image(image_path='test/Modelwhale/deep learning/P6/48-data/Angelina Jolie/001_fe3347c0.jpg', model=model, transform=train_transforms, classes=classes)
3、模型评估
best_model.eval()
epoch_test_acc, epoch_test_loss = test(test_dl, best_model, loss_fn)
epoch_test_acc, epoch_test_loss
(0.21388888888888888, 2.5386801958084106)
# 查看是否与我们记录的最高准确率一致
epoch_test_acc
0.21388888888888888
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
