You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MLP-Mixer基于自定义数据集训练时如何保存模型用于测试

PyTorch中MLP-Mixer模型的保存与加载方法

一、训练完成后保存模型

这里提供两种常用的保存方案:

  • 方案1:仅保存模型权重(推荐)
    该方案生成的文件体积小、兼容性强,不会受模型定义位置变动的影响,训练全部轮次完成后执行如下代码即可:
# 仅保存权重参数
torch.save(mixer_model.state_dict(), "mlp_mixer_weights.pth")

# 如果需要保存训练断点(方便后续恢复训练),可以保存为字典格式
torch.save({
    "epoch": epoch,
    "model_state_dict": mixer_model.state_dict(),
    "optimizer_state_dict": optimizer.state_dict(),
    "loss": current_loss,
}, "mlp_mixer_checkpoint.pth")
  • 方案2:保存完整模型
    该方案无需在加载时重新定义模型结构,但要求加载环境中的MLPMixer类定义和保存时完全一致,否则会报错:
torch.save(mixer_model, "mlp_mixer_full.pth")

二、补全现有训练逻辑提示

你当前的代码还缺少损失函数、优化器、反向传播等核心训练逻辑,可参考如下代码补全后再执行保存操作:

if __name__ == '__main__':
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    dataset = customDataset()
    train_loader = DataLoader(dataset,batch_size=8,shuffle=True) # 可自行调整batch_size大小

    mixer_model = MLPMixer(in_channels=3, 
        image_size=416, 
        patch_size=16, 
        num_classes=2,
        dim=512, 
        depth=8, 
        token_dim=256, 
        channel_dim=2048).to(device)

    # 定义损失函数和优化器
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(mixer_model.parameters(), lr=1e-4)
    num_epochs = 20 # 可根据训练效果调整训练轮次

    # 训练循环
    for epoch in range(num_epochs):
        mixer_model.train()
        running_loss = 0.0
        for i, data in enumerate(train_loader,0):
            inputs, labels = data
            inputs = inputs.to(device).float()
            labels = labels.to(device).squeeze() # 适配交叉熵损失的维度要求
            optimizer.zero_grad()
            outputs = mixer_model(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
            running_loss += loss.item()
        print(f"Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(train_loader):.4f}")
    
    # 训练完成后保存模型
    torch.save(mixer_model.state_dict(), "mlp_mixer_weights.pth")

三、加载模型用于测试

对应上面两种保存方案,加载方式分别如下:

对应方案1(仅存权重)的加载方法

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 先实例化和训练时参数完全一致的模型
mixer_model = MLPMixer(in_channels=3, 
    image_size=416, 
    patch_size=16, 
    num_classes=2,
    dim=512, 
    depth=8, 
    token_dim=256, 
    channel_dim=2048)
# 加载权重,GPU训练的模型要在CPU上加载时添加map_location参数即可
mixer_model.load_state_dict(torch.load("mlp_mixer_weights.pth", map_location=device))
mixer_model = mixer_model.to(device)
mixer_model.eval() # 切换为评估模式,关闭dropout等训练专属逻辑

对应方案2(存完整模型)的加载方法

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
mixer_model = torch.load("mlp_mixer_full.pth", map_location=device)
mixer_model.eval()

四、单张图像测试示例

import cv2
import torch

def predict_image(img_path, model, device):
    class_map = {0: "dogs", 1: "cats"}
    img_dim = (416, 416)
    # 预处理图像,和训练时的预处理逻辑保持一致
    img = cv2.imread(img_path)
    img = cv2.resize(img, img_dim)
    img_tensor = torch.from_numpy(img).permute(2, 0, 1).float()
    img_tensor = img_tensor.unsqueeze(0).to(device) # 添加batch维度
    
    with torch.no_grad(): # 关闭梯度计算,加快推理速度、节省显存
        output = model(img_tensor)
    pred_class_id = torch.argmax(output, dim=1).item()
    return class_map[pred_class_id]

# 调用示例
print(predict_image("test_img.jpg", mixer_model, device))

内容的提问来源于stack exchange,提问作者Simplicity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 01:15:03