0

0

科大讯飞-人脸关键点检测挑战赛:进阶思路预训练模型 MAE 1.2

P粉084495128

P粉084495128

发布时间:2025-07-31 10:40:04

|

673人浏览过

|

来源于php中文网

原创

该内容为一场人脸关键点检测竞赛的解决方案。使用5千张带标注的人脸图像训练模型,识别4个关键点。采用ResNet18模型,调整输入层和输出层适配单通道图像及8个坐标值。通过数据扩增、K折交叉验证训练多模型,最终集成预测,以MAE评估性能,提升检测精度。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

科大讯飞-人脸关键点检测挑战赛:进阶思路预训练模型 mae 1.2 - php中文网

赛题介绍

人脸识别是基于人的面部特征信息进行身份识别的一种生物识别技术,金融和安防是目前人脸识别应用最广泛的两个领域。人脸关键点是人脸识别中的关键技术。人脸关键点检测需要识别出人脸的指定位置坐标,例如眉毛、眼睛、鼻子、嘴巴和脸部轮廓等位置坐标等。

科大讯飞-人脸关键点检测挑战赛:进阶思路预训练模型 MAE 1.2 - php中文网        

赛事任务

给定人脸图像,找到4个人脸关键点,赛题任务可以视为一个关键点检测问题。

  • 训练集:5千张人脸图像,并且给定了具体的人脸关键点标注。

  • 测试集:约2千张人脸图像,需要选手识别出具体的关键点位置。

数据说明

赛题数据由训练集和测试集组成,train.csv为训练集标注数据,train.npy和test.npy为训练集图片和测试集图片,可以使用numpy.load进行读取。

Bolt.new
Bolt.new

Bolt.new是一个免费的AI全栈开发工具

下载

train.csv的信息为左眼坐标、右眼坐标、鼻子坐标和嘴巴坐标,总共8个点。

left_eye_center_x,left_eye_center_y,right_eye_center_x,right_eye_center_y,nose_tip_x,nose_tip_y,mouth_center_bottom_lip_x,mouth_center_bottom_lip_y66.3423640449,38.5236134831,28.9308404494,35.5777725843,49.256844943800004,68.2759550562,47.783946067399995,85.361582022568.9126037736,31.409116981100002,29.652226415100003,33.0280754717,51.913358490600004,48.408452830200005,50.6988679245,79.574037735868.7089943925,40.371149158899996,27.1308201869,40.9406803738,44.5025226168,69.9884859813,45.9264269159,86.2210093458

       

评审规则

本次竞赛的评价标准回归MAE进行评价,数值越小性能更优,最高分为0。评估代码参考:

from sklearn.metrics import mean_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_absolute_error(y_true, y_pred)

   

In [1]
!echo y | unzip -O CP936 /home/aistudio/data/data117050/人脸关键点检测挑战赛_数据集.zip!mv 人脸关键点检测挑战赛_数据集/* ./
!echo y | unzip test.npy.zip!echo y | unzip train.npy.zip
       
Archive:  /home/aistudio/data/data117050/人脸关键点检测挑战赛_数据集.zip
  inflating: 人脸关键点检测挑战赛_数据集/sample_submit.csv  
  inflating: 人脸关键点检测挑战赛_数据集/test.npy.zip  
  inflating: 人脸关键点检测挑战赛_数据集/train.csv  
  inflating: 人脸关键点检测挑战赛_数据集/train.npy.zip  
Archive:  test.npy.zip
replace test.npy? [y]es, [n]o, [A]ll, [N]one, [r]ename:   inflating: test.npy                
Archive:  train.npy.zip
replace train.npy? [y]es, [n]o, [A]ll, [N]one, [r]ename:   inflating: train.npy
       
In [2]
!pip install qudida scikit-image albumentations --no-deps
       
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: qudida in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (0.0.4)
Requirement already satisfied: scikit-image in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (0.18.3)
Requirement already satisfied: albumentations in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (1.1.0)
       
  • train.csv:存储的是八个关键点的坐标。
  • train.npy:训练集图像
  • test.npy:测试集图像
In [3]
import pandas as pdimport numpy as npimport warnings 
warnings.filterwarnings("ignore")

%pylab inline# 读取数据集标注train_df = pd.read_csv('train.csv')
train_df = train_df.fillna(48)
train_df.head()
       
Populating the interactive namespace from numpy and matplotlib
       
   left_eye_center_x  left_eye_center_y  right_eye_center_x  \
0          66.342364          38.523613           28.930840   
1          68.912604          31.409117           29.652226   
2          68.708994          40.371149           27.130820   
3          65.334176          35.471878           29.366461   
4          68.634857          29.999486           31.094571   

   right_eye_center_y  nose_tip_x  nose_tip_y  mouth_center_bottom_lip_x  \
0           35.577773   49.256845   68.275955                  47.783946   
1           33.028075   51.913358   48.408453                  50.698868   
2           40.940680   44.502523   69.988486                  45.926427   
3           37.767684   50.411373   64.934767                  50.028780   
4           29.616429   50.247429   51.450857                  47.948571   

   mouth_center_bottom_lip_y  
0                  85.361582  
1                  79.574038  
2                  86.221009  
3                  74.883241  
4                  84.394286
               
In [4]
# 读取图片,整理为npy格式train_img = np.load('train.npy')
test_img = np.load('test.npy')# 图像数据通道转换train_img = np.transpose(train_img, [2, 0, 1])
train_img = train_img.reshape(-1, 1, 96, 96)

test_img = np.transpose(test_img, [2, 0, 1])
test_img = test_img.reshape(-1, 1, 96, 96)print(train_img.shape, test_img.shape)
       
(5000, 1, 96, 96) (2049, 1, 96, 96)
       

步骤1:加载预训练模型

In [5]
import paddlefrom paddle.vision.models import resnet18# 构建模型,这里直接修改预训练模型网络结构def make_model():
    model = resnet18(pretrained=True)
    model.conv1 = paddle.nn.Conv2D(1, 64, kernel_size=[7, 7], stride=[2, 2], padding=3, data_format='NCHW')
    model.fc = paddle.nn.Linear(512, 8)    return model

model = make_model()
x = paddle.rand([1, 1, 224, 224])
out = model(x)print(out.shape)
       
W1117 14:26:05.379549 15030 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.0, Runtime API Version: 10.1
W1117 14:26:05.384275 15030 device_context.cc:465] device: 0, cuDNN Version: 7.6.
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
       
[1, 8]
       

步骤2:定义数据扩增

In [6]
%pylab inline
idx = 400xy = train_df.iloc[idx].values.reshape(-1, 2)
plt.scatter(xy[:1, 0], xy[:1, 1])
plt.imshow(train_img[idx, 0, :, :], cmap='gray')
       
Populating the interactive namespace from numpy and matplotlib
       
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2349: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  if isinstance(obj, collections.Iterator):
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2366: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  return list(data) if isinstance(data, collections.MappingView) else data
       
<matplotlib.image.AxesImage at 0x7f8000047ad0>
               
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:425: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
  a_min = np.asscalar(a_min.astype(scaled_dtype))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:426: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
  a_max = np.asscalar(a_max.astype(scaled_dtype))
       
<Figure size 432x288 with 1 Axes>
               
In [7]
import albumentations as A# 数据扩增方法,需要考虑到关键点的变换transform = A.Compose(
    [A.HorizontalFlip(p=1)], 
    keypoint_params=A.KeypointParams(format='xy')
)

transformed = transform(image=train_img[idx, 0, :, :], keypoints=xy)
transformed['keypoints'] = np.array(transformed['keypoints'])

plt.scatter(transformed['keypoints'][1, 0], transformed['keypoints'][1, 1])
plt.imshow(transformed['image'], cmap='gray')
       
<matplotlib.image.AxesImage at 0x7f7e9b4cdc10>
               
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:425: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
  a_min = np.asscalar(a_min.astype(scaled_dtype))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:426: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
  a_max = np.asscalar(a_max.astype(scaled_dtype))
       
<Figure size 432x288 with 1 Axes>
               

步骤3:定义数据集

In [8]
from paddle.io import DataLoader, Datasetfrom PIL import Image# 自定义数据集class MyDataset(Dataset):
    def __init__(self, img, keypoint, train=True):
        super(MyDataset, self).__init__()
        self.img = img
        self.keypoint = keypoint
        self.train = train

        self.transform = A.Compose([
            A.Resize(96, 96),
        ])        
        # 关键点数据扩增
        self.transform1 = A.Compose([
            A.Resize(96, 96),
            A.HorizontalFlip(p=1),
            A.RandomContrast(p=1),
            A.RandomBrightnessContrast(p=1)
        ], keypoint_params=A.KeypointParams(format='xy'))

        self.transform2 = A.Compose([
            A.Blur(p=0.5),
            A.RandomBrightnessContrast(p=0.5),
            A.RandomContrast(p=0.5),
            A.Resize(96, 96),
        ], keypoint_params=A.KeypointParams(format='xy'))    
    def __getitem__(self, index):

        # 下面代码为关键点数据扩增具体处理步骤
        # 为增加模型精度,这里有2中数据扩增方法
        if self.train:
            rnd = np.random.randint(10)            if rnd > 5:
                img = self.transform1(image=self.img[index, 0, :, :].astype(np.uint8), 
                                     keypoints=self.keypoint[index].reshape(-1, 2))
                xy = img['keypoints']
                img = img['image'].astype(np.float32)/255
                xy = np.array(xy).astype(np.float32)
                xy = xy[[1, 0, 2, 3]]            else:
                img = self.transform2(image=self.img[index, 0, :, :].astype(np.uint8), 
                                     keypoints=self.keypoint[index].reshape(-1, 2))
                xy = img['keypoints']
                img = img['image'].astype(np.float32)/255
                xy = np.array(xy).astype(np.float32)            
            return img.reshape(1, 96, 96), paddle.to_tensor(xy.flatten() / 96)        else:
            img = Image.fromarray(self.img[index, 0, :, :])
            img = np.asarray(img).astype(np.float32)/255
            return img.reshape(1, 96, 96), self.keypoint[index] / 96.0


    def __len__(self):
        return len(self.keypoint)# 训练集train_dataset = MyDataset(
    train_img[:-500, :, :, :], 
    train_df.values[:-500].astype(np.float32),    True)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)# 验证集val_dataset = MyDataset(
    train_img[-500:, :, :, :], 
    train_df.values[-500:].astype(np.float32),    False)
val_loader = DataLoader(val_dataset, batch_size=64, shuffle=False)# 测试集test_dataset = MyDataset(
    test_img[:, :, :], 
    np.zeros((test_img.shape[0], 8)),    False)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)
   

步骤4:单折模型训练

In [9]
# 定义损失函数和评价函数optimizer = paddle.optimizer.Adam(parameters=model.parameters(), learning_rate=0.005)
criterion = paddle.nn.L1Loss(reduction='mean')from sklearn.metrics import mean_absolute_errorfor epoch in range(0, 20):
    Train_Loss, Val_Loss = [], []
    Train_MAE, Val_MAE = [], []    # 模型训练
    model.train()    for i, (x, y) in enumerate(train_loader):
        pred = model(x)

        loss = criterion(pred, y)
        Train_Loss.append(loss.item())
        loss.backward()
        optimizer.step()
        optimizer.clear_grad()
        Train_MAE.append(mean_absolute_error(y.numpy(), pred.numpy()) * 96)    
    # 模型预测
    model.eval()    for i, (x, y) in enumerate(val_loader):
        pred = model(x)
        loss = criterion(pred, y)
        Val_Loss.append(loss.item())
        Val_MAE.append(mean_absolute_error(y.numpy(), pred.numpy()) * 96)    
    if epoch % 1 == 0:        print(f'\nEpoch: {epoch}')        print(f'Loss {np.mean(Train_Loss):3.5f}/{np.mean(Val_Loss):3.5f} MAE {np.mean(Train_MAE):3.5f}/{np.mean(Val_MAE):3.5f}')
       
Epoch: 0
Loss 0.37203/0.11440 MAE 35.71535/10.98286

Epoch: 1
Loss 0.09795/0.06849 MAE 9.40349/6.57502

Epoch: 2
Loss 0.07905/0.05564 MAE 7.58880/5.34112

Epoch: 3
Loss 0.07309/0.05452 MAE 7.01674/5.23387

Epoch: 4
Loss 0.06922/0.07734 MAE 6.64545/7.42501

Epoch: 5
Loss 0.05536/0.05599 MAE 5.31448/5.37539

Epoch: 6
Loss 0.06123/0.04331 MAE 5.87844/4.15806

Epoch: 7
Loss 0.05611/0.04777 MAE 5.38680/4.58609

Epoch: 8
Loss 0.05519/0.06417 MAE 5.29804/6.16067

Epoch: 9
Loss 0.05200/0.06752 MAE 4.99160/6.48194

Epoch: 10
Loss 0.05854/0.05403 MAE 5.61967/5.18692

Epoch: 11
Loss 0.05658/0.29385 MAE 5.43145/28.20921

Epoch: 12
Loss 0.05763/0.03205 MAE 5.53287/3.07668

Epoch: 13
Loss 0.05338/3.77058 MAE 5.12412425/361.97535

Epoch: 14
Loss 0.06302/0.04331 MAE 6.04996/4.15809

Epoch: 15
Loss 0.05038/0.04483 MAE 4.83634/4.30353

Epoch: 16
Loss 0.05369/0.06514 MAE 5.15467/6.25333

Epoch: 17
Loss 0.04897/0.04639 MAE 4.70134/4.45311

Epoch: 18
Loss 0.05506/0.21816 MAE 5.28606/20.94297

Epoch: 19
Loss 0.06594/0.04694 MAE 6.32994/4.50641
       
In [10]
# 测试集预测def make_predict(model, loader):
    model.eval()
    predict_list = []    for i, (x, y) in enumerate(loader):
        pred = model(x)
        predict_list.append(pred.numpy())    return np.vstack(predict_list)

test_pred = make_predict(model, test_loader) * 96
   
In [11]
len(train_loader)
       
71
               
In [12]
# 测试集可视化idx = 42xy = test_pred[idx, :].reshape(-1, 2)
plt.scatter(xy[:, 0], xy[:, 1], c='r')
plt.imshow(test_img[idx, 0, :, :], cmap='gray')
       
<matplotlib.image.AxesImage at 0x7f7e99c14cd0>
               
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:425: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
  a_min = np.asscalar(a_min.astype(scaled_dtype))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:426: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
  a_max = np.asscalar(a_max.astype(scaled_dtype))
       
<Figure size 432x288 with 1 Axes>
               

步骤5:多折模型训练

In [13]
from sklearn.model_selection import KFold

kf = KFold(n_splits=6)# 多折训练for idx, (train_idx, val_idx) in enumerate(kf.split(train_img, train_img)):    
    # 每折训练集
    train_dataset = MyDataset(
        train_img[train_idx, :, :, :], 
        train_df.values[train_idx].astype(np.float32),        True
    )
    train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)    # 每折验证集
    val_dataset = MyDataset(
        train_img[val_idx, :, :, :], 
        train_df.values[val_idx].astype(np.float32),        False
    )
    val_loader = DataLoader(val_dataset, batch_size=64, shuffle=False)

    test_dataset = MyDataset(
        test_img[:, :, :], 
        np.zeros((test_img.shape[0], 8)),        False
    )
    test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

    model = make_model()
    optimizer = paddle.optimizer.Adam(parameters=model.parameters(), learning_rate=0.005)
    criterion = paddle.nn.MSELoss(reduction='mean')    # 模型训练
    best_mae = 1000
    from sklearn.metrics import mean_absolute_error    for epoch in range(0, 20):
        Train_Loss, Val_Loss = [], []
        Train_MAE, Val_MAE = [], []

        model.train()        for i, (x, y) in enumerate(train_loader):
            pred = model(x)

            loss = criterion(pred, y)
            Train_Loss.append(loss.item())
            loss.backward()
            optimizer.step()
            optimizer.clear_grad()
            Train_MAE.append(mean_absolute_error(y.numpy(), pred.numpy()) * 96)
        
        model.eval()        for i, (x, y) in enumerate(val_loader):
            pred = model(x)
            loss = criterion(pred, y)
            Val_Loss.append(loss.item())
            Val_MAE.append(mean_absolute_error(y.numpy(), pred.numpy()) * 96)    
        if best_mae > np.mean(Val_MAE):
            paddle.save(model.state_dict(), f"model_{idx}.pdparams")        print(f'\nFold {idx+1} Epoch: {epoch}')        print(f'Loss {np.mean(Train_Loss):3.5f}/{np.mean(Val_Loss):3.5f} MAE {np.mean(Train_MAE):3.5f}/{np.mean(Val_MAE):3.5f}')
       
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
       
Fold 1 Epoch: 0
Loss 0.94416/0.00426 MAE 32.61103/4.72619

Fold 1 Epoch: 1
Loss 0.00349/0.00295 MAE 4.24089/3.74488

Fold 1 Epoch: 2
Loss 0.00319/0.00343 MAE 4.02212/4.33141

Fold 1 Epoch: 3
Loss 0.00337/0.00321 MAE 4.12612/4.13233

Fold 1 Epoch: 4
Loss 0.00335/0.00331 MAE 4.11586/4.12983

Fold 1 Epoch: 5
Loss 0.00331/0.00242 MAE 4.12359/3.43066

Fold 1 Epoch: 6
Loss 0.00284/0.00223 MAE 3.74762/3.20836

Fold 1 Epoch: 7
Loss 0.00304/0.00358 MAE 3.94653/4.48110

Fold 1 Epoch: 8
Loss 0.00309/0.00267 MAE 3.93305/3.63162

Fold 1 Epoch: 9
Loss 0.00294/0.00307 MAE 3.81775/4.06164

Fold 1 Epoch: 10
Loss 0.00328/0.00261 MAE 4.04670/3.56259

Fold 1 Epoch: 11
Loss 0.00288/0.00282 MAE 3.73693/3.61342

Fold 1 Epoch: 12
Loss 0.00333/0.00359 MAE 4.13195/4.32717

Fold 1 Epoch: 13
Loss 0.00287/0.00659 MAE 3.75797/5.60564

Fold 1 Epoch: 14
Loss 0.00339/0.00453 MAE 4.15032/4.86328

Fold 1 Epoch: 15
Loss 0.00353/0.00345 MAE 4.10001/3.99001

Fold 1 Epoch: 16
Loss 0.00307/0.00788 MAE 3.90741/6.40011

Fold 1 Epoch: 17
Loss 0.00310/0.00469 MAE 3.91649/5.00629

Fold 1 Epoch: 18
Loss 0.00318/0.00310 MAE 3.98748/3.99643

Fold 1 Epoch: 19
Loss 0.00331/0.00519 MAE 4.05921/4.83937
       
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
       
Fold 2 Epoch: 0
Loss 0.89342/0.01459 MAE 33.90798/8.50453

Fold 2 Epoch: 1
Loss 0.00967/0.01136 MAE 6.48405/8.91911

Fold 2 Epoch: 2
Loss 0.00762/0.00588 MAE 6.04389/5.51903

Fold 2 Epoch: 3
Loss 0.00479/0.00574 MAE 4.56526/5.39814

Fold 2 Epoch: 4
Loss 0.00441/0.00274 MAE 4.38107/3.75544

Fold 2 Epoch: 5
Loss 0.00375/0.00717 MAE 3.94084/6.64185

Fold 2 Epoch: 6
Loss 0.00503/0.00264 MAE 4.61859/3.44157

Fold 2 Epoch: 7
Loss 0.00340/0.00275 MAE 3.60434/3.67714

Fold 2 Epoch: 8
Loss 0.00367/0.00371 MAE 3.68822/4.48952

Fold 2 Epoch: 9
Loss 0.00342/0.00277 MAE 3.76756/3.29718

Fold 2 Epoch: 10
Loss 0.00452/0.00296 MAE 3.90251/3.59065

Fold 2 Epoch: 11
Loss 0.00386/0.00302 MAE 3.70734/3.85156

Fold 2 Epoch: 12
Loss 0.00408/0.00510 MAE 3.85178/4.45351

Fold 2 Epoch: 13
Loss 0.00499/0.00455 MAE 3.99566/4.02180

Fold 2 Epoch: 14
Loss 0.00450/0.00469 MAE 3.78992/4.03149

Fold 2 Epoch: 15
Loss 0.00554/0.00272 MAE 3.99448/3.45180

Fold 2 Epoch: 16
Loss 0.00457/0.00518 MAE 3.86668/4.97044

Fold 2 Epoch: 17
Loss 0.00441/0.00487 MAE 4.12124124/5.17729

Fold 2 Epoch: 18
Loss 0.00441/0.00375 MAE 4.32277/3.95233

Fold 2 Epoch: 19
Loss 0.00430/0.00609 MAE 4.03132/5.22334
       
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
       
Fold 3 Epoch: 0
Loss 0.86947/0.00410 MAE 29.16706/4.85964

Fold 3 Epoch: 1
Loss 0.00321/0.00250 MAE 4.00056/3.50814

Fold 3 Epoch: 2
Loss 0.00297/0.00398 MAE 3.83083/4.34380

Fold 3 Epoch: 3
Loss 0.00311/0.00372 MAE 3.87553/4.51552

Fold 3 Epoch: 4
Loss 0.00281/0.00264 MAE 3.71402/3.64536

Fold 3 Epoch: 5
Loss 0.00287/0.00243 MAE 3.75822/3.52269

Fold 3 Epoch: 6
Loss 0.00272/0.00330 MAE 3.63198/4.33096

Fold 3 Epoch: 7
Loss 0.00293/0.00365 MAE 3.79156/4.50453

Fold 3 Epoch: 8
Loss 0.00314/0.00350 MAE 3.89145/4.27802

Fold 3 Epoch: 9
Loss 0.00312/0.00320 MAE 3.94531/4.05098

Fold 3 Epoch: 10
Loss 0.00284/0.00602 MAE 3.72679/5.85368

Fold 3 Epoch: 11
Loss 0.00328/0.00340 MAE 3.99917/4.22787

Fold 3 Epoch: 12
Loss 0.00309/0.00563 MAE 3.93031/4.72741

Fold 3 Epoch: 13
Loss 0.00316/0.00429 MAE 3.91007/4.63886

Fold 3 Epoch: 14
Loss 0.00315/0.00721 MAE 3.92436/6.64559

Fold 3 Epoch: 15
Loss 0.00361/0.00663 MAE 4.15742/6.57676

Fold 3 Epoch: 16
Loss 0.00410/0.00581 MAE 4.51585/5.81121

Fold 3 Epoch: 17
Loss 0.00341/0.01221 MAE 4.08997/7.85437

Fold 3 Epoch: 18
Loss 0.00451/0.00557 MAE 4.74087/5.32913

Fold 3 Epoch: 19
Loss 0.00360/0.00419 MAE 4.24454/4.55999
       
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
       
Fold 4 Epoch: 0
Loss 0.85392/0.00368 MAE 32.96611/4.24245

Fold 4 Epoch: 1
Loss 0.00256/0.00277 MAE 3.46177/3.51331

Fold 4 Epoch: 2
Loss 0.00221/0.00202 MAE 3.17338/2.95567

Fold 4 Epoch: 3
Loss 0.00214/0.00304 MAE 3.10563/3.88381

Fold 4 Epoch: 4
Loss 0.00219/0.00233 MAE 3.16203/3.24165

Fold 4 Epoch: 5
Loss 0.00242/0.00257 MAE 3.35008/3.49035

Fold 4 Epoch: 6
Loss 0.00221/0.00203 MAE 3.20184/3.08044

Fold 4 Epoch: 7
Loss 0.00224/0.00191 MAE 3.21450/2.89856

Fold 4 Epoch: 8
Loss 0.00233/0.00359 MAE 3.27101/4.44508

Fold 4 Epoch: 9
Loss 0.00273/0.00342 MAE 3.56527/4.12814

Fold 4 Epoch: 10
Loss 0.00281/0.00290 MAE 3.67255/3.80147

Fold 4 Epoch: 11
Loss 0.00312/0.00324 MAE 3.91060/4.08256

Fold 4 Epoch: 12
Loss 0.00271/0.00222 MAE 3.55698/3.34696

Fold 4 Epoch: 13
Loss 0.00263/0.00498 MAE 3.54320/5.23288

Fold 4 Epoch: 14
Loss 0.00311/0.00403 MAE 3.89002/4.00476

Fold 4 Epoch: 15
Loss 0.00251/0.00276 MAE 3.47477/3.81179

Fold 4 Epoch: 16
Loss 0.00334/0.00247 MAE 4.04915/3.55583

Fold 4 Epoch: 17
Loss 0.00271/0.00490 MAE 3.76235/5.47203

Fold 4 Epoch: 18
Loss 0.00329/0.00277 MAE 3.96554/3.80042

Fold 4 Epoch: 19
Loss 0.00273/0.00291 MAE 3.72141/4.05549
       
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
       
Fold 5 Epoch: 0
Loss 0.85670/0.00696 MAE 29.43666/4.68126

Fold 5 Epoch: 1
Loss 0.00806/0.02447 MAE 6.22143/12.01605

Fold 5 Epoch: 2
Loss 0.00842/0.00421 MAE 6.22863/4.50202

Fold 5 Epoch: 3
Loss 0.00348/0.00344 MAE 4.06411/4.23032

Fold 5 Epoch: 4
Loss 0.00327/0.00425 MAE 4.00236/4.06088

Fold 5 Epoch: 5
Loss 0.00315/0.00437 MAE 3.88867/4.45807

Fold 5 Epoch: 6
Loss 0.00306/0.00372 MAE 3.80572/3.98706

Fold 5 Epoch: 7
Loss 0.00300/0.00607 MAE 3.75447/5.70704

Fold 5 Epoch: 8
Loss 0.00292/0.00473 MAE 3.68646/4.21410

Fold 5 Epoch: 9
Loss 0.00291/0.00299 MAE 3.61322/3.81180

Fold 5 Epoch: 10
Loss 0.00281/0.00635 MAE 3.58025/5.52059

Fold 5 Epoch: 11
Loss 0.00317/0.00308 MAE 3.78247/3.53311

Fold 5 Epoch: 12
Loss 0.00280/0.00840 MAE 3.58892/4.92759

Fold 5 Epoch: 13
Loss 0.00343/0.00341 MAE 3.79564/3.84999

Fold 5 Epoch: 14
Loss 0.00303/0.00385 MAE 3.62843/3.90398

Fold 5 Epoch: 15
Loss 0.00297/0.00771 MAE 3.63470/5.68825

Fold 5 Epoch: 16
Loss 0.00326/0.00447 MAE 3.75003/4.07704

Fold 5 Epoch: 17
Loss 0.00298/0.00583 MAE 3.66024/4.84518

Fold 5 Epoch: 18
Loss 0.00341/0.01341 MAE 3.89222/6.48514

Fold 5 Epoch: 19
Loss 0.00414/0.00561 MAE 4.12554/4.13227
       
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
       
Fold 6 Epoch: 0
Loss 0.86576/0.00339 MAE 30.12522/3.75524

Fold 6 Epoch: 1
Loss 0.01023/0.01223 MAE 6.79863/7.76517

Fold 6 Epoch: 2
Loss 0.00999/0.01130 MAE 7.03156/8.91614

Fold 6 Epoch: 3
Loss 0.00465/0.00230 MAE 4.86728/3.18715

Fold 6 Epoch: 4
Loss 0.00305/0.00539 MAE 3.86714/5.73368

Fold 6 Epoch: 5
Loss 0.00382/0.00243 MAE 4.43198/3.19708

Fold 6 Epoch: 6
Loss 0.00313/0.00766 MAE 3.91390/6.50056

Fold 6 Epoch: 7
Loss 0.00475/0.01015 MAE 4.94451/7.25125

Fold 6 Epoch: 8
Loss 0.00412/0.00246 MAE 4.52522/3.28646

Fold 6 Epoch: 9
Loss 0.00320/0.00284 MAE 3.93136/3.65408

Fold 6 Epoch: 10
Loss 0.00341/0.00302 MAE 3.97897/3.36249

Fold 6 Epoch: 11
Loss 0.00318/0.00353 MAE 3.75167/4.01775

Fold 6 Epoch: 12
Loss 0.00298/0.00281 MAE 3.71133/3.68553

Fold 6 Epoch: 13
Loss 0.00345/0.00428 MAE 3.89888/4.79099

Fold 6 Epoch: 14
Loss 0.00347/0.00558 MAE 3.93133/5.30763

Fold 6 Epoch: 15
Loss 0.00317/0.00307 MAE 3.80316/3.69749

Fold 6 Epoch: 16
Loss 0.00333/0.00299 MAE 3.76026/3.53186

Fold 6 Epoch: 17
Loss 0.00305/0.00340 MAE 3.65101/4.14215

Fold 6 Epoch: 18
Loss 0.00285/0.00335 MAE 3.62495/3.77899

Fold 6 Epoch: 19
Loss 0.00361/0.00384 MAE 3.81460/4.27685
       

步骤6:多折预测集成

In [14]
test_pred = np.zeros((test_img.shape[0], 8))# 加载多折模型进行预测for idx in range(6):
    model = make_model()

    layer_state_dict = paddle.load(f"model_{idx}.pdparams")
    model.set_state_dict(layer_state_dict)
    model.eval()
    test_pred += make_predict(model, test_loader) * 96test_pred /= 6
       
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
INFO:paddle.utils.download:unique_endpoints {''}
INFO:paddle.utils.download:File /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams md5 checking...
INFO:paddle.utils.download:Found /home/aistudio/.cache/paddle/hapi/weights/resnet18.pdparams
       
In [15]
idx = 42xy = test_pred[idx, :].reshape(-1, 2)
plt.scatter(xy[:, 0], xy[:, 1], c='r')
plt.imshow(test_img[idx, 0, :, :], cmap='gray')
       
<matplotlib.image.AxesImage at 0x7f7e98a3fe50>
               
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:425: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
  a_min = np.asscalar(a_min.astype(scaled_dtype))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:426: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
  a_max = np.asscalar(a_max.astype(scaled_dtype))
       
<Figure size 432x288 with 1 Axes>
               

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

246

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

34

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号