【零基础入门 PyTorch:实现食物图片分类任务】

在计算机视觉领域,图像分类是最基础也是最核心的任务之一。食物图片分类作为图像分类的典型应用场景,不仅可以用于智能点餐、饮食推荐等实际业务,也是初学者学习深度学习框架的绝佳练手项目。

本文将从零开始,使用 PyTorch 框架完整实现一个食物图片分类系统。整个过程涵盖数据预处理、自定义数据集构建、CNN 模型搭建、模型训练与评估等核心环节,代码通俗易懂,步骤清晰,即使是刚接触 PyTorch 的初学者也能轻松跟上。

步骤 1:环境准备与基础配置

python 复制代码
import os
import numpy as np
import torch
import warnings

# 过滤torchvision.io的图像扩展警告,避免无关警告干扰
warnings.filterwarnings("ignore", message="Failed to load image Python extension")

warnings:过滤掉 PyTorch 加载图像扩展时的无关警告,提升代码运行体验

步骤 2:生成数据集索引文件

在训练模型前,我们需要先整理数据集的文件路径和对应的标签,生成train.txttest.txt文件,方便后续读取数据。

遍历指定的数据集目录,将每个图片的完整路径和对应的类别标签(用类别目录的索引表示)写入 txt 文件,格式为:图片路径 类别标签。

python 复制代码
def train_test_file(root, dir):
    """
    生成训练/测试集的索引文件(文件路径 + 标签)
    :param root: 数据集根目录
    :param dir: 子目录名称(train/test)
    """
    # 以UTF-8编码创建txt文件
    file_txt = open(dir + '.txt', 'w', encoding='utf-8')
    # 拼接完整的数据集路径
    path = os.path.join(root, dir)
    
    for roots, directories, files in os.walk(path):
        # 记录一级子目录(即不同食物类别)
        if len(directories) != 0:
            dirs = directories
        else:
            # 拆分当前路径,获取当前类别名称
            now_dir = roots.split('\\')
            # 遍历当前类别下的所有图片文件
            for file in files:
                # 拼接完整的图片路径
                path_1 = os.path.join(roots, file)
                print(path_1)
                # 写入文件路径和对应的类别标签(类别索引)
                file_txt.write(path_1 + ' ' + str(dirs.index(now_dir[-1])) + '\n')
    file_txt.close()

# 数据集根目录(请根据自己的实际路径修改)
root = r'.\食物分类\food_dataset'
train_dir = 'train'
test_dir = 'test'

# 生成训练集和测试集的索引文件
train_test_file(root, train_dir)
train_test_file(root, test_dir)
  • os.walk(path):递归遍历指定目录下的所有文件和子目录;
  • dirs.index(now_dir[-1]):将食物类别名称转换为数字标签(如 "薯条" 对应索引 0,"汉堡" 对应索引 1 等);
  • open(..., encoding='utf-8'):指定 UTF-8 编码,避免中文路径出现乱码。

步骤 3:图像预处理与数据增强配置

使用 PyTorch 的torchvision.transforms进行图像预处理,统一图像尺寸并转换为张量格式,为模型输入做准备。对输入的图片进行标准化处理。确保所有图片尺寸一致,并且格式符合 PyTorch 模型的输入要求。

python 复制代码
from torchvision import transforms as tfs
from PIL import Image

# 定义图像预处理/数据增强策略
data_transforms = {
    'trainda':  # 训练集预处理
        tfs.Compose([
            tfs.Resize([256, 256]),  # 统一调整为256x256尺寸
            tfs.ToTensor(),  # 转换为张量(0-1范围)
        ]),
    'valid':  # 测试集预处理(与训练集保持一致)
        tfs.Compose([
            tfs.Resize([256, 256]),
            tfs.ToTensor(),
        ])
}
  • tfs.Resize([256, 256]):将任意尺寸的图片调整为 256x256,保证输入维度统一;
  • tfs.ToTensor():将 PIL 图像转换为 PyTorch 张量,同时将像素值从 0-255 归一化到 0-1。

步骤 4:自定义 Dataset 类加载数据

PyTorch 提供了Dataset抽象类,我们需要继承它并实现自定义的数据集加载类,用于读取步骤 2 生成的索引文件,并加载对应的图片和标签。

python 复制代码
from torch.utils.data import Dataset, DataLoader
import pandas as pd

class food_dataset(Dataset):
    """自定义食物图片数据集类"""
    def __init__(self, file_path, transform=None):
        """
        初始化函数
        :param file_path: 索引文件路径(train.txt/test.txt)
        :param transform: 图像预处理函数
        """
        self.file_path = file_path
        self.imgs = []  # 存储图片路径
        self.labels = []  # 存储对应标签
        self.transform = transform
        
        # 读取索引文件
        with open(self.file_path, 'r', encoding='utf-8') as f:
            # 按行读取并拆分路径和标签
            samples = [x.strip().split(' ') for x in f.readlines() if x.strip()]
            for img_path, label in samples:
                self.imgs.append(img_path)
                self.labels.append(label)

    def __len__(self):
        """返回数据集总长度"""
        return len(self.imgs)

    def __getitem__(self, idx):
        """根据索引获取单张图片和标签"""
        try:
            # 打开图片并转换为RGB格式(避免灰度图等格式问题)
            image = Image.open(self.imgs[idx]).convert('RGB')
        except:
            # 捕获图片加载异常,方便调试
            print(f"图片加载失败:{self.imgs[idx]}")
            return None, None
        
        # 应用预处理变换
        if self.transform:
            image = self.transform(image)

        # 将标签转换为张量(int64类型,适配交叉熵损失)
        label = self.labels[idx]
        label = torch.from_numpy(np.array(label, dtype=np.int64))
        return image, label

# 实例化训练集和测试集
training_data = food_dataset(file_path='./train.txt', transform=data_transforms['trainda'])
test_data = food_dataset(file_path='./test.txt', transform=data_transforms['valid'])

# 创建数据加载器(按批次加载数据)
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)  # 训练集打乱顺序
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)  # 测试集可选打乱

实现自定义数据集类,完成图片路径读取、图片加载、标签转换等操作,并通过DataLoader实现批量加载和数据打乱,提升训练效率。

init:读取索引文件,解析图片路径和标签并存储;

len:返回数据集的总样本数,是Dataset类的必要实现;

getitem:根据索引加载单张图片和对应标签,支持预处理变换,并处理图片加载异常;

DataLoader:将数据集按batch_size=64拆分,shuffle=True表示每个 epoch 打乱数据顺序,提升模型泛化能力。

步骤 5:搭建 CNN 卷积神经网络模型

卷积神经网络(CNN)是处理图像分类任务的经典模型,我们基于 PyTorch 搭建一个简单的 CNN 模型,用于食物图片分类。搭建一个包含 3 层卷积和 1 层全连接的 CNN 模型,实现从图像特征提取到类别预测的完整流程。

python 复制代码
import torch.nn as nn

class CNN(nn.Module):
    """自定义CNN模型"""
    def __init__(self):
        super(CNN, self).__init__()
        # 第一层卷积:3通道输入→16通道输出,5x5卷积核,步长1,填充2
        self.conv1 = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=16, kernel_size=5, stride=1, padding=2),
            nn.ReLU(),  # 激活函数
            nn.MaxPool2d(2),  # 池化层:2x2下采样
        )
        # 第二层卷积:16通道→32通道,包含两层卷积+池化
        self.conv2 = nn.Sequential(
            nn.Conv2d(16, 32, 5, 1, 2),
            nn.ReLU(),
            nn.Conv2d(32, 32, 5, 1, 2),
            nn.ReLU(),
            nn.MaxPool2d(2),
        )
        # 第三层卷积:32通道→128通道
        self.conv3 = nn.Sequential(
            nn.Conv2d(32, 128, 5, 1, 2),
            nn.ReLU(),
        )
        # 全连接层:128*64*64→20(20类食物分类)
        self.out = nn.Linear(128 * 64 * 64, 20)

    def forward(self, x):
        """前向传播"""
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        # 展平:将多维特征图转换为一维向量
        x = x.view(x.size(0), -1)
        # 全连接层输出
        output = self.out(x)
        return output

# 选择训练设备(GPU优先)
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using {device} device")

# 实例化模型并移至指定设备
model = CNN().to(device)
print(model)
  • nn.Conv2d:卷积层,用于提取图像的空间特征,参数说明:
    • in_channels:输入通道数(RGB 图片为 3);
    • out_channels:输出通道数(卷积核数量);
    • kernel_size:卷积核大小;
    • stride:步长;
    • padding:填充,保证卷积后尺寸不变;
  • nn.ReLU:激活函数,引入非线性,提升模型表达能力;
  • nn.MaxPool2d:池化层,下采样减少参数数量,防止过拟合;
  • x.view(x.size(0), -1):将卷积输出的多维特征展平为一维,适配全连接层输入;
  • nn.Linear(128 * 64 * 64, 20):全连接层,将特征映射到 20 个类别(根据实际食物类别数调整);
  • model.to(device):将模型移至 GPU/CPU,加速训练。

步骤 6:定义训练和测试函数

实现模型的训练逻辑和测试逻辑,分别完成参数更新和模型性能评估。

6.1 训练函数

遍历训练数据集,完成前向传播、损失计算、反向传播和参数更新,实现模型的训练过程

python 复制代码
def trainda(dataloader, model, loss_fn, optimizer):
    """
    模型训练函数
    :param dataloader: 训练数据加载器
    :param model: 待训练模型
    :param loss_fn: 损失函数
    :param optimizer: 优化器
    """
    model.train()  # 切换为训练模式
    batch_size_num = 1  # 批次计数器
    
    for X, y in dataloader:
        # 将数据移至指定设备
        X, y = X.to(device), y.to(device)
        
        # 前向传播:预测结果
        pred = model.forward(X)
        # 计算损失
        loss = loss_fn(pred, y)
        
        # 反向传播与参数更新
        optimizer.zero_grad()  # 梯度清零(避免累积)
        loss.backward()  # 反向传播计算梯度
        optimizer.step()  # 更新模型参数
        
        # 打印批次损失
        loss = loss.item()
        if batch_size_num % 1 == 0:
            print(f"loss:{loss:>7f} [number:{batch_size_num}]")
        batch_size_num += 1

model.train():将模型切换为训练模式(启用 Dropout、BatchNorm 等训练层);

model.forward(X):前向传播,输入数据得到预测结果;

loss_fn(pred, y):计算预测值与真实标签的损失;

optimizer.zero_grad():清空梯度,避免不同批次梯度累积;

loss.backward():反向传播,计算各参数的梯度;

optimizer.step():根据梯度更新模型参数。

6.2 测试函数

在测试集上评估模型性能,计算准确率和平均损失,验证模型的泛化能力。

python 复制代码
def testda(dataloader, model, loss_fn):
    """
    模型测试函数
    :param dataloader: 测试数据加载器
    :param model: 训练好的模型
    :param loss_fn: 损失函数
    """
    # 获取数据集大小和批次数量
    size = len(dataloader.dataset)
    num_batches = len(dataloader)
    
    model.eval()  # 切换为评估模式
    test_loss, correct = 0, 0  # 初始化总损失和正确数
    
    # 关闭梯度计算(节省内存,加速推理)
    with torch.no_grad():
        for X, y in dataloader:
            X, y = X.to(device), y.to(device)
            pred = model.forward(X)
            
            # 累加损失和正确数
            test_loss += loss_fn(pred, y).item()
            correct += (pred.argmax(1) == y).type(torch.float).sum().item()
    
    # 计算平均损失和准确率
    test_loss /= num_batches
    correct /= size
    
    # 打印测试结果
    print(f"Test result: \n Accuracy: {(100 * correct)}%, Avg loss: {test_loss}")

model.eval():切换为评估模式(关闭 Dropout、BatchNorm 等训练层);

torch.no_grad():上下文管理器,关闭梯度计算,减少内存占用;

pred.argmax(1):取预测结果中概率最大的类别索引;

(pred.argmax(1) == y).type(torch.float).sum().item():计算正确预测的样本数

步骤 7:模型训练与评估

配置损失函数、优化器,设置训练轮数,执行训练和测试流程。设置训练超参数,执行多轮训练,并在训练完成后评估模型在测试集上的性能。

python 复制代码
# 定义损失函数(交叉熵损失,适用于多分类)
loss_fn = nn.CrossEntropyLoss()
# 定义优化器(Adam优化器,学习率0.001)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 训练轮数
epochs = 10
for t in range(epochs):
    print(f"Epoch {t + 1}\n-------------------------------")
    # 训练模型
    trainda(train_dataloader, model, loss_fn, optimizer)

# 训练完成后测试模型
testda(test_dataloader, model, loss_fn)
print("Done!")
  • nn.CrossEntropyLoss():交叉熵损失函数,是多分类任务的标准损失函数;
  • torch.optim.Adam:Adam 优化器,结合了动量和自适应学习率,收敛速度快;
  • epochs = 10:训练 10 轮,可根据实际效果调整;
  • 每轮训练完成后(本例中注释了轮次测试),最终在测试集上评估模型性能。

运行结果:

bash 复制代码
C:\Users\Dell\AppData\Local\Programs\Python\Python39\python.exe D:\software\Pycharm\卷积神经\神经网络图片分类.py 
.\食物分类\food_dataset\train\八宝粥\img_八宝粥罐_22.jpeg
.\食物分类\food_dataset\train\八宝粥\img_八宝粥罐_29.jpeg
.\食物分类\food_dataset\train\八宝粥\img_八宝粥罐_65.jpeg
.\食物分类\food_dataset\train\八宝粥\img_八宝粥罐_68.jpeg
.\食物分类\food_dataset\train\八宝粥\img_八宝粥罐_84.jpeg
.\食物分类\food_dataset\train\八宝粥\img_八宝粥罐_98.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_103.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_13.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_136.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_142.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_163.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_174.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_191.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_209.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_238.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_30.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_34.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_42.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_44.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_57.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_81.jpeg
.\食物分类\food_dataset\train\哈密瓜\img_水果_92.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_104.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_105.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_116.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_12.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_13.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_143.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_155.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_179.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_209.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_21.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_226.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_238.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_265.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_50.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_51.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_55.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_60.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_62.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_66.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_8.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_88.jpeg
.\食物分类\food_dataset\train\圣女果\img_圣女果_99.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_117.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_142.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_17.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_202.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_22.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_224.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_229.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_248.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_253.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_262.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_286.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_297.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_38.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_39.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_47.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_7.jpeg
.\食物分类\food_dataset\train\巴旦木\img_巴旦木_74.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_1.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_123.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_127.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_134.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_170.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_193.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_2.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_206.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_208.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_244.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_270.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_3.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_53.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_65.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_66.jpeg
.\食物分类\food_dataset\train\板栗\img_坚果_88.jpeg
.\食物分类\food_dataset\train\板栗\无标题.png
.\食物分类\food_dataset\train\汉堡\img_汉堡_109.jpeg
.\食物分类\food_dataset\train\汉堡\img_汉堡_130.jpeg
.\食物分类\food_dataset\train\汉堡\img_汉堡_200.jpeg
.\食物分类\food_dataset\train\汉堡\img_汉堡_201.jpeg
.\食物分类\food_dataset\train\汉堡\img_汉堡_205.jpeg
.\食物分类\food_dataset\train\汉堡\img_汉堡_60.jpeg
.\食物分类\food_dataset\train\汉堡\img_汉堡_77.jpeg
.\食物分类\food_dataset\train\火龙果\img_火龙果_117.jpeg
.\食物分类\food_dataset\train\火龙果\img_火龙果_139.jpeg
.\食物分类\food_dataset\train\火龙果\img_火龙果_140.jpeg
.\食物分类\food_dataset\train\火龙果\img_火龙果_153.jpeg
.\食物分类\food_dataset\train\火龙果\img_火龙果_158.jpeg
.\食物分类\food_dataset\train\火龙果\img_火龙果_181.jpeg
.\食物分类\food_dataset\train\火龙果\img_火龙果_189.jpeg
.\食物分类\food_dataset\train\火龙果\img_火龙果_222.jpeg
.\食物分类\food_dataset\train\火龙果\img_火龙果_46.jpeg
.\食物分类\food_dataset\train\炸鸡\img_炸鸡_150.jpeg
.\食物分类\food_dataset\train\炸鸡\img_炸鸡_154.jpeg
.\食物分类\food_dataset\train\炸鸡\img_炸鸡_170.jpeg
.\食物分类\food_dataset\train\炸鸡\img_炸鸡_57.jpeg
.\食物分类\food_dataset\train\炸鸡\img_炸鸡_65.jpeg
.\食物分类\food_dataset\train\炸鸡\img_炸鸡_89.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_100.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_112.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_117.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_123.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_128.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_159.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_162.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_166.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_187.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_24.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_32.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_4.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_42.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_44.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_50.jpeg
.\食物分类\food_dataset\train\瓜子\img_瓜子_87.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_10.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_115.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_136.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_143.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_15.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_165.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_17.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_195.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_201.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_228.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_3.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_33.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_7.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_81.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_83.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_89.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_91.jpeg
.\食物分类\food_dataset\train\生肉\img_澳洲牛肉_92.jpeg
.\食物分类\food_dataset\train\白萝卜\img_白萝卜_119.jpeg
.\食物分类\food_dataset\train\白萝卜\img_白萝卜_124.jpeg
.\食物分类\food_dataset\train\白萝卜\img_白萝卜_175.jpeg
.\食物分类\food_dataset\train\白萝卜\img_白萝卜_192.jpeg
.\食物分类\food_dataset\train\白萝卜\img_白萝卜_209.jpeg
.\食物分类\food_dataset\train\白萝卜\img_白萝卜_45.jpeg
.\食物分类\food_dataset\train\白萝卜\img_白萝卜_71.jpeg
.\食物分类\food_dataset\train\白萝卜\img_白萝卜_80.jpeg
.\食物分类\food_dataset\train\白萝卜\img_白萝卜_98.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_10.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_100.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_102.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_106.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_109.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_116.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_121.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_123.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_125.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_141.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_16.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_22.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_24.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_32.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_36.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_52.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_53.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_56.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_6.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_82.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_86.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_89.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_92.jpeg
.\食物分类\food_dataset\train\胡萝卜\img_胡萝卜_99.jpeg
.\食物分类\food_dataset\train\草莓\img_草莓_113.jpeg
.\食物分类\food_dataset\train\草莓\img_草莓_190.jpeg
.\食物分类\food_dataset\train\草莓\img_草莓_194.jpeg
.\食物分类\food_dataset\train\草莓\img_草莓_252.jpeg
.\食物分类\food_dataset\train\菠萝\img_菠萝_25.jpeg
.\食物分类\food_dataset\train\菠萝\img_菠萝_55.jpeg
.\食物分类\food_dataset\train\菠萝\img_菠萝_62.jpeg
.\食物分类\food_dataset\train\菠萝\img_菠萝_67.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_104.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_144.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_156.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_161.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_164.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_166.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_19.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_200.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_220.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_3.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_32.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_35.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_36.png
.\食物分类\food_dataset\train\薯条\img_薯条_44.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_68.jpeg
.\食物分类\food_dataset\train\薯条\img_薯条_69.jpeg
.\食物分类\food_dataset\train\蛋\img_白煮蛋壳_100.jpeg
.\食物分类\food_dataset\train\蛋\img_白煮蛋壳_97.jpeg
.\食物分类\food_dataset\train\蛋\img_茶叶蛋_137.jpeg
.\食物分类\food_dataset\train\蛋\img_茶叶蛋_39.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_102.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_109.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_114.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_118.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_134.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_139.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_161.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_165.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_168.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_17.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_176.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_180.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_200.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_215.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_223.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_231.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_233.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_250.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_261.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_268.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_273.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_280.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_283.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_290.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_33.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_41.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_42.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_51.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_62.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_76.jpeg
.\食物分类\food_dataset\train\蛋挞\img_蛋挞_86.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_112.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_113.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_114.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_130.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_132.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_133.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_140.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_152.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_155.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_180.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_198.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_30.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_40.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_5.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_60.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_82.jpeg
.\食物分类\food_dataset\train\青菜\img_菠菜_88.jpeg
.\食物分类\food_dataset\train\骨肉相连\img_骨肉相连_101.jpeg
.\食物分类\food_dataset\train\骨肉相连\img_骨肉相连_173.jpeg
.\食物分类\food_dataset\train\骨肉相连\img_骨肉相连_185.jpeg
.\食物分类\food_dataset\train\骨肉相连\img_骨肉相连_240.jpeg
.\食物分类\food_dataset\train\骨肉相连\img_骨肉相连_267.jpeg
.\食物分类\food_dataset\train\骨肉相连\img_骨肉相连_38.jpeg
.\食物分类\food_dataset\train\骨肉相连\img_骨肉相连_73.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_114.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_118.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_140.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_148.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_15.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_174.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_181.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_186.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_197.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_20.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_200.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_23.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_238.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_241.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_248.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_256.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_262.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_29.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_308.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_38.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_40.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_52.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_54.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_89.jpeg
.\食物分类\food_dataset\train\鸡翅\img_鸡翅_93.jpeg
.\食物分类\food_dataset\test\八宝粥\img_八宝粥罐_81.jpeg
.\食物分类\food_dataset\test\哈密瓜\img_水果_254.jpeg
.\食物分类\food_dataset\test\哈密瓜\img_水果_278.jpeg
.\食物分类\food_dataset\test\圣女果\img_圣女果_275.jpeg
.\食物分类\food_dataset\test\圣女果\img_圣女果_278.jpeg
.\食物分类\food_dataset\test\巴旦木\img_巴旦木_108.jpeg
.\食物分类\food_dataset\test\巴旦木\img_巴旦木_87.jpeg
.\食物分类\food_dataset\test\巴旦木\img_巴旦木_90.jpeg
.\食物分类\food_dataset\test\板栗\img_坚果_281.jpeg
.\食物分类\food_dataset\test\板栗\img_坚果_292.jpeg
.\食物分类\food_dataset\test\汉堡\img_汉堡_235.jpeg
.\食物分类\food_dataset\test\汉堡\img_汉堡_307.jpeg
.\食物分类\food_dataset\test\火龙果\img_火龙果_235.jpeg
.\食物分类\food_dataset\test\火龙果\img_火龙果_243.jpeg
.\食物分类\food_dataset\test\炸鸡\img_炸鸡_205.jpeg
.\食物分类\food_dataset\test\炸鸡\img_炸鸡_254.jpeg
.\食物分类\food_dataset\test\瓜子\img_瓜子_196.jpeg
.\食物分类\food_dataset\test\瓜子\img_瓜子_212.jpeg
.\食物分类\food_dataset\test\生肉\img_澳洲牛肉_235.jpeg
.\食物分类\food_dataset\test\生肉\img_澳洲牛肉_276.jpeg
.\食物分类\food_dataset\test\白萝卜\img_白萝卜_210.jpeg
.\食物分类\food_dataset\test\白萝卜\img_白萝卜_228.jpeg
.\食物分类\food_dataset\test\胡萝卜\img_胡萝卜_146.jpeg
.\食物分类\food_dataset\test\胡萝卜\img_胡萝卜_153.jpeg
.\食物分类\food_dataset\test\草莓\img_草莓_190.jpeg
.\食物分类\food_dataset\test\菠萝\img_菠萝_83.jpeg
.\食物分类\food_dataset\test\菠萝\img_菠萝_98.jpeg
.\食物分类\food_dataset\test\薯条\img_薯条_222.jpeg
.\食物分类\food_dataset\test\薯条\img_薯条_293.jpeg
.\食物分类\food_dataset\test\蛋\img_茶叶蛋_143.jpeg
.\食物分类\food_dataset\test\蛋挞\img_蛋挞_305.jpeg
.\食物分类\food_dataset\test\蛋挞\img_蛋挞_326.jpeg
.\食物分类\food_dataset\test\蛋挞\img_蛋挞_346.jpeg
.\食物分类\food_dataset\test\青菜\img_菠菜_206.jpeg
.\食物分类\food_dataset\test\青菜\img_菠菜_226.jpeg
.\食物分类\food_dataset\test\骨肉相连\img_骨肉相连_324.jpeg
.\食物分类\food_dataset\test\骨肉相连\img_骨肉相连_331.jpeg
.\食物分类\food_dataset\test\鸡翅\img_鸡翅_311.jpeg
.\食物分类\food_dataset\test\鸡翅\img_鸡翅_335.jpeg
Using cuda device
CNN(
  (conv1): Sequential(
    (0): Conv2d(3, 16, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (1): ReLU()
    (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (conv2): Sequential(
    (0): Conv2d(16, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (1): ReLU()
    (2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (3): ReLU()
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (conv3): Sequential(
    (0): Conv2d(32, 128, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (1): ReLU()
  )
  (out): Linear(in_features=524288, out_features=20, bias=True)
)
Epoch 1
-------------------------------
Epoch 2
-------------------------------
Epoch 3
-------------------------------
Epoch 4
-------------------------------
Epoch 5
-------------------------------
Epoch 6
-------------------------------
Epoch 7
-------------------------------
Epoch 8
-------------------------------
Epoch 9
-------------------------------
Epoch 10
-------------------------------
loss:3.000914 [number:1]
loss:5.884387 [number:2]
loss:3.348123 [number:3]
loss:3.199209 [number:4]
loss:2.949087 [number:5]
Done!
Test result: 
 Accuracy: 7.6923076923076925%, Avg loss: 2.9709115028381348
相关推荐
科技快报2 小时前
华为发布AI数据平台,重塑数据基座,加速企业AI应用落地
大数据·人工智能·华为
智塑未来2 小时前
哪些GEO服务商有自研AI监测工具?2026年AI品牌监测平台深度对比
人工智能
红茶川2 小时前
[ExecuTorch 系列] 3. 导出自定义的大语言模型
pytorch·ai·语言模型·端侧ai
PengShuaiD52 小时前
【AI编码】用ChatGPT基于Whisper+ffmpeg实现一个根据视频字幕执行自动化裁剪本地小工具
人工智能·chatgpt·ffmpeg·whisper
特立独行的猫a2 小时前
从 AI 助手到现实世界操作系统:OpenClaw + Matter 的智能硬件控制架构设计
人工智能·架构·智能硬件·matter协议·openclaw
喵手2 小时前
Python爬虫实战:从天气抓取到机器学习预测气温!
爬虫·python·机器学习·爬虫实战·预测气温·零基础python爬虫教学·天气采集
广州赛远2 小时前
Nachi_EZ03_喷砂机器人防护服使用指南_详解与避坑
人工智能
WWZZ20252 小时前
具身智能入门Isaac Sim——机器人设置-初级设计轮式机器人2
人工智能·机器人·大模型·强化学习·具身智能·四足·人形
战族狼魂2 小时前
ChatGPT史诗级更新:Codex + OpenClaw(小龙虾)
人工智能·chatgpt