# 小型AI项目入门:用Python和PyTorch实现图像分类


背景介绍

在人工智能领域,图像分类是常见且关键的应用场景。本项目旨在帮助开发者掌握数据预处理、模型训练与评估的核心知识,通过实际操作实现图像分类任务。项目采用Python和PyTorch框架,支持本地环境运行,提供直观的输入输出示例。

思路分析

本项目围绕图像数据的处理与分类目标展开,分为三个核心模块:
1. 数据读取与预处理:使用PyTorch读取图像数据,对特征进行标准化处理
2. 模型构建与训练:采用全连接网络(Fully Connected Neural Network)进行分类
3. 结果输出与评估:通过PyTorch的accuracy评估模型性能

整个流程包括数据准备、特征提取、模型训练、模型评估和结果输出,确保项目从基础到高级逐步完善。

代码实现

import torch
import torchvision
import numpy as np

# 1. 数据准备  
# 假设使用预处理后的数据集  
images_path = "images_sample"  # 替换为实际数据路径
feature_path = "features_samples"  # 替换为实际特征文件路径

# 加载数据  
def load_data(path):
    data_dir = path + "/data"
    images = []
    features = []

    for filename in os.listdir(data_dir):
        if filename.endswith(".jpg"):
            img = Image.open(os.path.join(data_dir, filename))
            images.append(img)

        if not filename.endswith(".txt"):
            features.append(np.loadtxt(os.path.join(feature_path, filename), delimiter=" "))

    # 标签处理  
    labels = np.zeros((len(images), 3))
    for i, label in enumerate(images):  
        labels[i, 0] = 0
        labels[i, 1] = 1
        labels[i, 2] = 2

    return images, labels, features

# 读取数据  
images, labels, features = load_data(images_path)

# 2. 特征处理  
def preprocess_features(images, features):
    # 加载特征数据  
    features_train = np.loadtxt(features, delimiter=" ")

    # 特征标准化  
    scaled_features = (features_train - np.mean(features_train, axis=0)) / np.std(features_train, axis=0)

    # 与图像进行归一化  
    normalized_images = (images - images.mean(axis=0)) / images.std(axis=0)

    return scaled_features, normalized_images

# 3. 模型训练与评估  
def train_model(network, features_train, labels, epochs=100):
    # 定义损失函数与优化器  
    loss_fn = torch.nn.MSELoss()
    optimizer = torch.optim.Adam(network.parameters(), lr=0.01)

    # 训练循环  
    for epoch in range(epochs):
        optimizer.zero_grad()
        outputs = network(features_train)
        loss = loss_fn(outputs, labels)
        loss.backward()
        optimizer.step()
        if epoch % 10 == 0:
            print(f"Epoch {epoch+1}: Loss - {loss.item():.4f}")

    # 评估模型  
    accuracy = torch.nn.functional.accuracy_score(labels, outputs.argmax(-1))
    accuracy_tensor = accuracy.item()
    return accuracy_tensor

# 4. 分类结果输出  
def predict_and_output(images, labels, model, features, features_train):
    # 分类预测  
    outputs = model(features_train)

    # 输出结果  
    result = predictions.argmax(-1)
    result_tensor = result.item()

    print("分类结果:", result_tensor)
    print("分类结果图:")
    fig, ax = plt.subplots(1, 1, figsize=(6, 4))
    ax.imshow(images[result_tensor])
    ax.set_title(f"分类结果 {result_tensor}")
    plt.show()

# 示例数据  
X, y = load_data(features_path)

# 构造模型  
class ImageClassifier(nn.Module):
    def __init__(self):
        super(ImageClassifier, self).__init__()
        self.fc = nn.Linear(3, 3)

    def forward(self, x):
        return self.fc(x)

# 训练模型  
model = ImageClassifier()
accuracy = train_model(model, X, y, epochs=50)

# 输出结果  
predict_and_output(X, y, model, X, X[:, 0, 1])

总结

本项目通过Python和PyTorch框架,实现了图像分类任务的完整流程。
1. 数据预处理:通过标准化和归一化处理特征数据
2. 模型训练:利用Adam优化器训练全连接网络
3. 结果输出:可视化分类结果并评估模型性能

项目可在1~3天内完成,重点掌握数据结构与数据预处理、模型训练与评估等核心知识。实际开发中可结合实际数据集进行调整,确保模型的准确性和泛化能力。