深度学习 06 — VGG 算法 PyToch 实现人脸识别

🍨 本文为[🔗365天深度学习训练营]中的学习记录博客

🍖 原作者:[K同学啊]​​​​​​​

一、 前期准备

1. 设置GPU

如果设备上支持GPU就使用GPU,否则使用CPU

import torch
import torchvision 
import torch.nn as nn 
import PIL, os, pathlib, warnings
from torchvision import datasets

import torchvision.transforms as transforms

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

 2.导入数据

import os, pathlib, warnings, random

data_dir = "data"
data_dir = pathlib.Path(data_dir)

data_paths = list(data_dir.glob('*'))
classeNames =[str(path).split('/')[1] for path in data_paths]
classeNames 
['Robert Downey Jr',
 'Brad Pitt',
 'Leonardo DiCaprio',
 'Jennifer Lawrence',
 'Tom Cruise',
 'Hugh Jackman',
 'Angelina Jolie',
 'Johnny Depp',
 'Tom Hanks',
 'Denzel Washington',
 'Kate Winslet',
 'Scarlett Johansson',
 'Will Smith',
 'Natalie Portman',
 'Nicole Kidman',
 'Sandra Bullock',
 'Megan Fox']
train_transforms = transforms.Compose([
    transforms.Resize([224,224]),
    transforms.ToTensor(),
    transforms.Normalize(
        mean = [0.485,0.456,0.406],
        std = [0.229,0.224,0.225])
])

total_data = datasets.ImageFolder("./data",transform=train_transforms)
total_data

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}

3.划分数据集

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 = 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)
for X ,y in test_dl:
    print("Shape of X [N,C,H,W]: ",X.shape)
    print("Shape of y : ",y.shape)
    break

二、调用官方的VGG-16模型

VGG-16(Visual Geometry Group-16)是由牛津大学视觉几何组(Visual Geometry Group)提出的一种深度卷积神经网络架构,用于图像分类和对象识别任务。VGG-16在2014年被提出,是VGG系列中的一种。VGG-16之所以备受关注,是因为它在ImageNet图像识别竞赛中取得了很好的成绩,展示了其在大规模图像识别任务中的有效性。

以下是VGG-16的主要特点:

  1. 深度:VGG-16由16个卷积层和3个全连接层组成,因此具有相对较深的网络结构。这种深度有助于网络学习到更加抽象和复杂的特征。 
  2. 卷积层的设计:VGG-16的卷积层全部采用3x3的卷积核和步长为1的卷积操作,同时在卷积层之后都接有ReLU激活函数。这种设计的好处在于,通过堆叠多个较小的卷积核,可以提高网络的非线性建模能力,同时减少了参数数量,从而降低了过拟合的风险。 
  3. 池化层:在卷积层之后,VGG-16使用最大池化层来减少特征图的空间尺寸,帮助提取更加显著的特征并减少计算量。 
  4. 全连接层:VGG-16在卷积层之后接有3个全连接层,最后一个全连接层输出与类别数相对应的向量,用于进行分类。 

VGG-16结构说明:

  • 13个卷积层(Convolutional Layer),分别用blockX_convX表示;
  • 3个全连接层(Fully connected Layer),用classifier表示;
  • 5个池化层(Pool layer)。

VGG-16包含了16个隐藏层(13个卷积层和3个全连接层),故称为VGG-16

 

from torchvision.models import vgg16

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

print(f'Using {device} device')
#加载预训练模型,并且对模型进行微调
model = vgg16(pretrained = True).to(device)# 加载预训练的vgg16模型

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

VGG(
  (features): Sequential(
    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (3): ReLU(inplace=True)
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (6): ReLU(inplace=True)
    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (8): ReLU(inplace=True)
    (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (11): ReLU(inplace=True)
    (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (13): ReLU(inplace=True)
    (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (15): ReLU(inplace=True)
    (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (18): ReLU(inplace=True)
    (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (20): ReLU(inplace=True)
    (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (22): ReLU(inplace=True)
    (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (25): ReLU(inplace=True)
    (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (27): ReLU(inplace=True)
    (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (29): ReLU(inplace=True)
    (30): 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=17, bias=True)
  )
)

三、训练模型

1.编写训练模型 

def train( dataloader,model,loss_fn,optimizer):
    size = len(dataloader.dataset)
    num_batches = len(dataloader)

    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()#每一步自动更新

        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
    

2.编写测试函数

def test(dataloader,model,loss_fn):
    size = len(dataloader.dataset)
    num_batches = len(dataloader)

    test_loss, test_acc = 0,0

    with torch.no_grad():
        for imgs, target in dataloader:
            imgs, target = imgs.to(device),target.to(device)
            
            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
        

3.设置动态学习率

def adjust_learning_rate(optimizer,epoch,start_lr):
    lr = start_lr* (0.92 ** (epoch//2))
    for param_group in optimizer.param_groups:
        param_group["lr"] = lr

start_lr = 1e-4
optimizer = torch.optim.SGD(model.parameters(),lr=start_lr)
#调用官方动态学习率接口
lambda1 = lambda epoch: 0.92** (epoch //4)
optimizer = torch.optim.SGD(model.parameters(),lr = learn_rate)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimzier,lr_lambda=lambda1)

 4.正式训练

import copy

loss_fn = nn.CrossEntropyLoss()

epochs = 40

train_acc = []
train_loss = []
test_acc = []
test_loss = []

best_acc = 0
for epoch in range(epochs):
    adjust_learning_rate(optimizer,epoch,start_lr)

    model.train()

    epoch_train_acc, epoch_train_loss = train(train_dl,model,loss_fn,optimizer)

    model.eval()
    epoch_test_acc,epoch_test_loss = test(test_dl,model,loss_fn)
    if epoch_test_acc > best_acc:
        best_acc = epoch_test_acc
        best_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))

print('Done')
Epoch: 1, Train_acc:6.7%, Train_loss:2.916, Test_acc:6.7%, Test_loss:2.853, Lr:1.00E-04
Epoch: 2, Train_acc:7.6%, Train_loss:2.879, Test_acc:7.8%, Test_loss:2.816, Lr:1.00E-04
Epoch: 3, Train_acc:8.7%, Train_loss:2.854, Test_acc:10.6%, Test_loss:2.790, Lr:9.20E-05
Epoch: 4, Train_acc:8.3%, Train_loss:2.839, Test_acc:12.5%, Test_loss:2.770, Lr:9.20E-05
Epoch: 5, Train_acc:10.4%, Train_loss:2.802, Test_acc:13.3%, Test_loss:2.740, Lr:8.46E-05
Epoch: 6, Train_acc:11.2%, Train_loss:2.764, Test_acc:14.2%, Test_loss:2.724, Lr:8.46E-05
Epoch: 7, Train_acc:10.8%, Train_loss:2.759, Test_acc:14.2%, Test_loss:2.707, Lr:7.79E-05
Epoch: 8, Train_acc:12.1%, Train_loss:2.765, Test_acc:13.1%, Test_loss:2.690, Lr:7.79E-05
Epoch: 9, Train_acc:13.5%, Train_loss:2.728, Test_acc:13.6%, Test_loss:2.681, Lr:7.16E-05
Epoch:10, Train_acc:13.5%, Train_loss:2.707, Test_acc:14.4%, Test_loss:2.672, Lr:7.16E-05
Epoch:11, Train_acc:13.7%, Train_loss:2.698, Test_acc:14.4%, Test_loss:2.663, Lr:6.59E-05
Epoch:12, Train_acc:12.8%, Train_loss:2.696, Test_acc:14.7%, Test_loss:2.654, Lr:6.59E-05
Epoch:13, Train_acc:14.0%, Train_loss:2.696, Test_acc:15.0%, Test_loss:2.648, Lr:6.06E-05
Epoch:14, Train_acc:14.4%, Train_loss:2.656, Test_acc:15.0%, Test_loss:2.631, Lr:6.06E-05
Epoch:15, Train_acc:14.7%, Train_loss:2.659, Test_acc:15.6%, Test_loss:2.627, Lr:5.58E-05
Epoch:16, Train_acc:13.8%, Train_loss:2.648, Test_acc:15.3%, Test_loss:2.598, Lr:5.58E-05
Epoch:17, Train_acc:14.4%, Train_loss:2.640, Test_acc:15.3%, Test_loss:2.603, Lr:5.13E-05
Epoch:18, Train_acc:14.9%, Train_loss:2.620, Test_acc:15.3%, Test_loss:2.599, Lr:5.13E-05
Epoch:19, Train_acc:15.2%, Train_loss:2.615, Test_acc:15.3%, Test_loss:2.593, Lr:4.72E-05
Epoch:20, Train_acc:16.0%, Train_loss:2.600, Test_acc:15.3%, Test_loss:2.594, Lr:4.72E-05
Epoch:21, Train_acc:15.6%, Train_loss:2.621, Test_acc:15.3%, Test_loss:2.584, Lr:4.34E-05
Epoch:22, Train_acc:14.1%, Train_loss:2.609, Test_acc:15.3%, Test_loss:2.586, Lr:4.34E-05
Epoch:23, Train_acc:15.3%, Train_loss:2.597, Test_acc:15.3%, Test_loss:2.584, Lr:4.00E-05
Epoch:24, Train_acc:16.7%, Train_loss:2.591, Test_acc:15.3%, Test_loss:2.571, Lr:4.00E-05
Epoch:25, Train_acc:16.9%, Train_loss:2.593, Test_acc:15.3%, Test_loss:2.557, Lr:3.68E-05
Epoch:26, Train_acc:15.6%, Train_loss:2.596, Test_acc:15.6%, Test_loss:2.561, Lr:3.68E-05
Epoch:27, Train_acc:15.6%, Train_loss:2.596, Test_acc:15.6%, Test_loss:2.570, Lr:3.38E-05
Epoch:28, Train_acc:16.0%, Train_loss:2.574, Test_acc:15.6%, Test_loss:2.558, Lr:3.38E-05
Epoch:29, Train_acc:17.2%, Train_loss:2.557, Test_acc:15.6%, Test_loss:2.543, Lr:3.11E-05
Epoch:30, Train_acc:18.1%, Train_loss:2.555, Test_acc:15.6%, Test_loss:2.550, Lr:3.11E-05
Epoch:31, Train_acc:17.5%, Train_loss:2.550, Test_acc:15.8%, Test_loss:2.538, Lr:2.86E-05
Epoch:32, Train_acc:17.6%, Train_loss:2.554, Test_acc:15.8%, Test_loss:2.530, Lr:2.86E-05
Epoch:33, Train_acc:17.4%, Train_loss:2.543, Test_acc:15.8%, Test_loss:2.536, Lr:2.63E-05
Epoch:34, Train_acc:18.1%, Train_loss:2.549, Test_acc:15.8%, Test_loss:2.531, Lr:2.63E-05
Epoch:35, Train_acc:15.9%, Train_loss:2.553, Test_acc:15.8%, Test_loss:2.515, Lr:2.42E-05
Epoch:36, Train_acc:16.9%, Train_loss:2.547, Test_acc:16.1%, Test_loss:2.524, Lr:2.42E-05
Epoch:37, Train_acc:16.7%, Train_loss:2.548, Test_acc:15.8%, Test_loss:2.516, Lr:2.23E-05
Epoch:38, Train_acc:17.6%, Train_loss:2.537, Test_acc:16.1%, Test_loss:2.524, Lr:2.23E-05
Epoch:39, Train_acc:17.7%, Train_loss:2.527, Test_acc:16.1%, Test_loss:2.517, Lr:2.05E-05
Epoch:40, Train_acc:16.4%, Train_loss:2.534, Test_acc:16.1%, Test_loss:2.514, Lr:2.05E-05

四、结果可视化

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 Accuracy')
plt.plot(epochs_range,test_loss,label='Test Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Loss')
plt.show()

2.指定图片进行预测

from PIL import Image

classes = list(total_data.class_to_idx)

def predict_one_image(image_path,model,transform,classes):
    test_image = Image.open(image_path).convert('RGB')

   
    plt.show(test_image)
    test_image = transform(test_image)
    img = test_image.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='./data/Angelina Jolie/001_fe3347c0.jpg',model=model,transform=train_transforms,classes=classes)

 3.模型评估

 五、个人总结

在本次实战中,主要学习Vgg16 网络结构的组成部分以及网络参数,但是在整个训练的过程中,模型表现的不是很好最高的test_acc 在16.1%以至于在指定预测图片时预测失败。

更改参数将优化器SGD更改为Adam 再次训练下面是训练过程中变化

 

预测结果:Angelina Jolie 

 在更改完优化器之后,模型的表现有了很大进步test_acc最高达到了41.1%指定但还没有达到实战测试集准确率的要求

更改初始学习率为1.5 并增加epoch 次数

        Epoch: 1, Train_acc:20.9%, Train_loss:575.922, Test_acc:28.3%, Test_loss:365.763, Lr:1.50E+00
		Epoch: 2, Train_acc:34.3%, Train_loss:467.888, Test_acc:26.4%, Test_loss:401.650, Lr:1.50E+00
		Epoch: 3, Train_acc:41.7%, Train_loss:431.524, Test_acc:38.6%, Test_loss:325.496, Lr:1.38E+00
		Epoch: 4, Train_acc:41.7%, Train_loss:446.953, Test_acc:33.3%, Test_loss:496.364, Lr:1.38E+00
		Epoch: 5, Train_acc:48.4%, Train_loss:399.028, Test_acc:37.5%, Test_loss:407.026, Lr:1.27E+00
		Epoch: 6, Train_acc:52.4%, Train_loss:388.247, Test_acc:42.2%, Test_loss:378.893, Lr:1.27E+00
		Epoch: 7, Train_acc:52.4%, Train_loss:377.559, Test_acc:40.0%, Test_loss:401.215, Lr:1.17E+00
		Epoch: 8, Train_acc:53.4%, Train_loss:368.183, Test_acc:40.8%, Test_loss:384.509, Lr:1.17E+00
		Epoch: 9, Train_acc:53.4%, Train_loss:365.307, Test_acc:42.8%, Test_loss:396.013, Lr:1.07E+00
		Epoch:10, Train_acc:55.2%, Train_loss:350.748, Test_acc:41.4%, Test_loss:428.332, Lr:1.07E+00
		Epoch:11, Train_acc:58.3%, Train_loss:344.587, Test_acc:41.1%, Test_loss:467.244, Lr:9.89E-01
		Epoch:12, Train_acc:59.0%, Train_loss:325.402, Test_acc:41.4%, Test_loss:416.905, Lr:9.89E-01
		Epoch:13, Train_acc:59.6%, Train_loss:330.772, Test_acc:42.2%, Test_loss:478.612, Lr:9.10E-01
		Epoch:14, Train_acc:60.0%, Train_loss:331.145, Test_acc:41.1%, Test_loss:455.810, Lr:9.10E-01
		Epoch:15, Train_acc:64.0%, Train_loss:256.217, Test_acc:44.2%, Test_loss:483.922, Lr:8.37E-01
		Epoch:16, Train_acc:62.4%, Train_loss:285.570, Test_acc:48.1%, Test_loss:420.824, Lr:8.37E-01
		Epoch:17, Train_acc:64.7%, Train_loss:265.459, Test_acc:45.0%, Test_loss:440.225, Lr:7.70E-01
		Epoch:18, Train_acc:66.5%, Train_loss:255.883, Test_acc:43.3%, Test_loss:496.751, Lr:7.70E-01
		Epoch:19, Train_acc:64.9%, Train_loss:262.010, Test_acc:43.9%, Test_loss:457.924, Lr:7.08E-01
		Epoch:20, Train_acc:66.0%, Train_loss:250.392, Test_acc:42.5%, Test_loss:520.675, Lr:7.08E-01
		Epoch:21, Train_acc:66.9%, Train_loss:244.626, Test_acc:43.9%, Test_loss:446.395, Lr:6.52E-01
		Epoch:22, Train_acc:67.4%, Train_loss:237.543, Test_acc:45.3%, Test_loss:439.068, Lr:6.52E-01
		Epoch:23, Train_acc:67.9%, Train_loss:233.148, Test_acc:44.4%, Test_loss:464.862, Lr:5.99E-01
		Epoch:24, Train_acc:67.2%, Train_loss:249.844, Test_acc:46.7%, Test_loss:469.783, Lr:5.99E-01
		Epoch:25, Train_acc:71.7%, Train_loss:206.887, Test_acc:46.9%, Test_loss:473.792, Lr:5.51E-01
		Epoch:26, Train_acc:70.9%, Train_loss:207.709, Test_acc:43.9%, Test_loss:432.867, Lr:5.51E-01
		Epoch:27, Train_acc:71.2%, Train_loss:195.462, Test_acc:46.7%, Test_loss:456.010, Lr:5.07E-01
		Epoch:28, Train_acc:71.8%, Train_loss:192.576, Test_acc:45.8%, Test_loss:464.668, Lr:5.07E-01
		Epoch:29, Train_acc:71.9%, Train_loss:176.019, Test_acc:50.3%, Test_loss:409.153, Lr:4.67E-01
		Epoch:30, Train_acc:72.0%, Train_loss:196.592, Test_acc:48.3%, Test_loss:425.270, Lr:4.67E-01
		Epoch:31, Train_acc:71.4%, Train_loss:182.458, Test_acc:47.5%, Test_loss:426.613, Lr:4.29E-01
		Epoch:32, Train_acc:72.0%, Train_loss:172.622, Test_acc:49.2%, Test_loss:421.888, Lr:4.29E-01
		Epoch:33, Train_acc:73.6%, Train_loss:175.606, Test_acc:46.7%, Test_loss:414.485, Lr:3.95E-01
		Epoch:34, Train_acc:74.2%, Train_loss:167.895, Test_acc:46.4%, Test_loss:408.843, Lr:3.95E-01
		Epoch:35, Train_acc:75.8%, Train_loss:148.233, Test_acc:47.2%, Test_loss:443.957, Lr:3.63E-01
		Epoch:36, Train_acc:73.6%, Train_loss:166.622, Test_acc:46.9%, Test_loss:437.096, Lr:3.63E-01
		Epoch:37, Train_acc:74.4%, Train_loss:160.391, Test_acc:46.7%, Test_loss:424.060, Lr:3.34E-01
		Epoch:38, Train_acc:73.0%, Train_loss:181.560, Test_acc:47.5%, Test_loss:408.414, Lr:3.34E-01
		Epoch:39, Train_acc:74.9%, Train_loss:162.634, Test_acc:51.4%, Test_loss:408.263, Lr:3.08E-01
		Epoch:40, Train_acc:74.9%, Train_loss:155.642, Test_acc:48.9%, Test_loss:420.067, Lr:3.08E-01
		Epoch:41, Train_acc:76.7%, Train_loss:142.470, Test_acc:48.1%, Test_loss:422.047, Lr:2.83E-01
		Epoch:42, Train_acc:74.9%, Train_loss:148.504, Test_acc:46.9%, Test_loss:400.454, Lr:2.83E-01
		Epoch:43, Train_acc:76.8%, Train_loss:133.604, Test_acc:46.9%, Test_loss:451.091, Lr:2.60E-01
		Epoch:44, Train_acc:75.6%, Train_loss:151.245, Test_acc:46.7%, Test_loss:393.242, Lr:2.60E-01
		Epoch:45, Train_acc:76.0%, Train_loss:134.574, Test_acc:48.1%, Test_loss:365.224, Lr:2.40E-01
		Epoch:46, Train_acc:77.2%, Train_loss:144.469, Test_acc:49.7%, Test_loss:386.555, Lr:2.40E-01
		Epoch:47, Train_acc:76.9%, Train_loss:137.106, Test_acc:47.2%, Test_loss:391.518, Lr:2.20E-01
		Epoch:48, Train_acc:76.5%, Train_loss:135.680, Test_acc:49.4%, Test_loss:376.219, Lr:2.20E-01
		Epoch:49, Train_acc:77.4%, Train_loss:127.854, Test_acc:48.3%, Test_loss:371.291, Lr:2.03E-01
		Epoch:50, Train_acc:79.4%, Train_loss:119.382, Test_acc:47.8%, Test_loss:404.348, Lr:2.03E-01
		Epoch:51, Train_acc:78.3%, Train_loss:119.582, Test_acc:48.3%, Test_loss:405.559, Lr:1.87E-01
		Epoch:52, Train_acc:77.5%, Train_loss:120.911, Test_acc:46.7%, Test_loss:392.094, Lr:1.87E-01
		Epoch:53, Train_acc:79.4%, Train_loss:106.500, Test_acc:47.8%, Test_loss:413.349, Lr:1.72E-01
		Epoch:54, Train_acc:76.0%, Train_loss:123.710, Test_acc:49.7%, Test_loss:425.194, Lr:1.72E-01
		Epoch:55, Train_acc:77.4%, Train_loss:125.460, Test_acc:49.2%, Test_loss:391.667, Lr:1.58E-01
		Epoch:56, Train_acc:78.9%, Train_loss:112.271, Test_acc:49.2%, Test_loss:385.217, Lr:1.58E-01
		Epoch:57, Train_acc:78.4%, Train_loss:120.161, Test_acc:49.7%, Test_loss:377.026, Lr:1.45E-01
		Epoch:58, Train_acc:79.0%, Train_loss:99.286, Test_acc:46.9%, Test_loss:409.233, Lr:1.45E-01
		Epoch:59, Train_acc:81.2%, Train_loss:98.583, Test_acc:49.2%, Test_loss:396.102, Lr:1.34E-01
		Epoch:60, Train_acc:78.8%, Train_loss:111.317, Test_acc:50.3%, Test_loss:378.100, Lr:1.34E-01
		Done

 在最后一次调参中,虽然模型表现又有了进步,但是将初始学习率是不推荐的因为这会导致

  • 梯度爆炸:更新的步长太大,参数可能会越过最优点,导致损失函数值迅速增加。
  • 训练不稳定:模型的权重更新过大,可能在潜在的最小值附近震荡,无法收敛到最小值点。
  • 收敛失败:模型完全无法收敛到合理的解。

继续更改学习率为1e-3并将动态学习率衰减频率改为每四个epoch下降一次,test_acc最高达到了54.2%

 本次实战经过多次尝试都没有达到预期准确度,但还是有其他方法可以提高准确度比如在Vgg 模型里添加注意力机制来提高准确度

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch在人脸识别中的运用非常广泛。下面是一些PyTorch在人脸识别中的常见应用: 1. 人脸检测:PyTorch提供了一些强大的预训练模型,如SSD和YOLO,可以用于检测图像中的人脸位置。这些模型可以通过在大规模数据集上进行训练来实现高准确率和实时性能。 2. 人脸特征提取:在人脸识别中,通常需要将人脸图像转换为具有表征性的特征向量。PyTorch提供了许多预训练的卷积神经网络(CNN)模型,如ResNet、VGG和Inception等,可以用于从人脸图像中提取深度特征。 3. 人脸识别:通过使用深度学习模型和特征匹配算法,PyTorch可以实现高精度的人脸识别。例如,使用Siamese网络或Triplet Loss来训练一个能够学习人脸特征之间相似度的模型,然后根据这些特征进行人脸匹配和识别。 4. 人脸属性分析:PyTorch可以用于分析人脸图像中的属性信息,如年龄、性别、表情等。通过训练一个分类模型,可以根据人脸图像来预测这些属性。 5. 人脸生成和重建:PyTorch可以用于生成逼真的人脸图像或重建缺失的人脸图像。通过使用生成对抗网络(GAN)或变分自编码器(VAE)等模型,可以学习人脸图像的分布,并生成新的人脸图像。 总之,PyTorch提供了丰富的工具和库,可以帮助开发者在人脸识别任务中构建和训练深度学习模型。它的灵活性和易用性使得研究人员和开发者能够快速迭代和实现各种人脸识别算法和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值