30分钟教AI小白定义自己的模型并实现图像分类

你是不是也想过:

"AI模型到底长什么样?我能不能自己写一个?"
"网上教程太复杂,都是代码,完全看不懂"
"想学AI,但不知道从哪开始"

别担心!
今天,我们不讲理论,不讲公式,
只用30分钟,
手把手教你定义一个自己的AI模型,
让它学会识别猫和狗!

你不需要懂什么"神经网络",
不需要知道"反向传播",
只需要会复制粘贴,
就能拥有一个属于自己的AI分类器!


🧩 什么是AI模型?一句话说清

想象你是个老师,
要教学生区分猫和狗。

你怎么做?

  1. 告诉学生:"猫有尖耳朵,狗有长嘴巴"
  2. 给学生看100张猫和100张狗的照片
  3. 学生慢慢学会这些特征
  4. 新图片来了,学生就能判断是猫还是狗

AI模型就是这样!
它不是"聪明",
而是记住了很多特征
然后根据这些特征做判断。


🎯 我们要做什么?

我们要写一个AI分类器,让它:

✅ 看猫的照片 → 说"这是猫"
✅ 看狗的照片 → 说"这是狗"
✅ 可以训练
✅ 可以预测
✅ 代码简单易懂


🚀 准备工作:打开Colab

  1. 打开浏览器,访问:https://colab.research.google.com
  2. 登录Google账号
  3. 点击"新建笔记本"
  4. 点击"修改" → "笔记本设置" → 选择"GPU"

✅ 你获得了免费的GPU,训练会很快!


✅ 第一步:定义一个"AI大脑"类

在第一个代码框中,粘贴这段代码:

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import transforms, datasets
from PIL import Image
import matplotlib.pyplot as plt

class CatDogClassifier:
    def __init__(self, img_size=128, batch_size=32):
        """
        初始化分类器
        img_size: 图片尺寸
        batch_size: 每次处理多少张图片
        """
        self.img_size = img_size
        self.batch_size = batch_size
        self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
        
        # 定义图片预处理方式
        self.transform = transforms.Compose([
            transforms.Resize((self.img_size, self.img_size)),  # 统一图片大小
            transforms.ToTensor(),                              # 转成数字
            transforms.Normalize(mean=[0.485, 0.456, 0.406],    # 标准化
                               std=[0.229, 0.224, 0.225])
        ])
        
        # 创建AI模型
        self.model = self._create_model()
        self.model.to(self.device)
        
        print(f"✅ 分类器初始化完成,使用设备: {self.device}")

    def _create_model(self):
        """创建AI模型(这是我们的"大脑")"""
        class SimpleCNN(nn.Module):
            def __init__(self, img_size=128):
                super().__init__()
                # 这些是AI的"神经元层"
                # 第一层:看图片的细节
                self.conv1 = nn.Conv2d(3, 32, 3, padding=1)  # 3个颜色通道→32个特征
                self.relu1 = nn.ReLU()                       # 让AI学会"思考"
                self.pool1 = nn.MaxPool2d(2, 2)              # 抓住重要特征
                
                # 第二层:看图片的形状
                self.conv2 = nn.Conv2d(32, 64, 3, padding=1) # 32个特征→64个特征
                self.relu2 = nn.ReLU()
                self.pool2 = nn.MaxPool2d(2, 2)
                
                # 第三层:做最终判断
                pool_size = img_size // 4  # 经过两次池化,图片变小了
                self.fc1 = nn.Linear(64 * pool_size * pool_size, 512)  # 全连接层
                self.relu3 = nn.ReLU()
                self.fc2 = nn.Linear(512, 2)  # 输出2个结果(猫或狗)

            def forward(self, x):
                # 这是AI"看"图片的过程
                x = self.pool1(self.relu1(self.conv1(x)))  # 第一层处理
                x = self.pool2(self.relu2(self.conv2(x)))  # 第二层处理
                x = x.view(x.size(0), -1)                 # 展平成一行
                x = self.relu3(self.fc1(x))               # 第三层处理
                x = self.fc2(x)                           # 输出结果
                return x

        return SimpleCNN(self.img_size)

💡 这段代码就像"搭积木":

  • conv = 看图片的"眼睛"
  • relu = 让AI"思考"
  • pool = 抓住重点
  • fc = 做决定

✅ 第二步:添加训练功能

在新代码框中添加训练功能:

    def train_model(self, data_dir, num_epochs=10, learning_rate=0.001):
        """
        训练模型
        data_dir: 图片数据存放的文件夹
        num_epochs: 训练多少轮
        learning_rate: 学习速度
        """
        
        # 加载图片数据
        dataset = datasets.ImageFolder(
            root=data_dir,        # 图片文件夹路径
            transform=self.transform  # 预处理方式
        )
        
        data_loader = DataLoader(
            dataset,
            batch_size=self.batch_size,
            shuffle=True,          # 随机打乱图片顺序
            num_workers=2
        )
        
        print(f"✅ 数据加载完成!")
        print(f"数据集大小: {len(dataset)}")
        print(f"类别: {dataset.classes}")
        
        # 设置AI的学习规则
        criterion = nn.CrossEntropyLoss()    # 判断AI预测得对不对
        optimizer = optim.Adam(self.model.parameters(), lr=learning_rate)  # 告诉AI怎么改自己
        
        print(f"🚀 开始训练,共 {num_epochs} 轮...")
        
        for epoch in range(num_epochs):
            running_loss = 0.0
            correct = 0
            total = 0
            
            for i, (images, labels) in enumerate(data_loader):
                # 把图片和标签放到GPU上
                images, labels = images.to(self.device), labels.to(self.device)
                
                # 清空之前的记忆
                optimizer.zero_grad()
                
                # AI预测
                outputs = self.model(images)
                
                # 计算误差
                loss = criterion(outputs, labels)
                
                # AI根据误差调整自己
                loss.backward()
                optimizer.step()
                
                # 统计正确率
                running_loss += loss.item()
                _, predicted = torch.max(outputs.data, 1)
                total += labels.size(0)
                correct += (predicted == labels).sum().item()
                
                # 每100次显示一次进度
                if i % 100 == 99:
                    avg_loss = running_loss / 100
                    accuracy = 100 * correct / total
                    print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}], Loss: {avg_loss:.4f}, Accuracy: {accuracy:.2f}%')
                    running_loss = 0.0
            
            # 每轮结束后显示准确率
            epoch_acc = 100 * correct / total
            print(f'Epoch [{epoch+1}/{num_epochs}] 完成, 准确率: {epoch_acc:.2f}%')
        
        print("✅ 训练完成!")
        return dataset  # 返回数据集,用于预测时知道类别名

💡 训练过程就像:

  1. 老师出题(images
  2. 学生答题(model(images)
  3. 老师打分(criterion
  4. 学生改正(optimizer
  5. 重复多轮,学生变聪明

✅ 第三步:添加预测功能

    def predict(self, image_path, dataset=None):
        """预测单张图片"""
        if not os.path.exists(image_path):
            print(f"❌ 图片不存在: {image_path}")
            return None
        
        try:
            # 加载图片
            img = Image.open(image_path)
            img_tensor = self.transform(img).unsqueeze(0).to(self.device)  # 预处理并添加批次维度
            
            # AI预测
            with torch.no_grad():  # 不需要计算梯度(测试时)
                self.model.eval()  # 设置为评估模式
                output = self.model(img_tensor)
                probabilities = torch.softmax(output, dim=1)[0]  # 转成概率
                predicted_class_idx = torch.argmax(output, 1).item()  # 找最大概率的类别
            
            # 获取类别名称
            class_names = dataset.classes if dataset else ['cat', 'dog']
            predicted_class = class_names[predicted_class_idx]
            confidence = probabilities[predicted_class_idx].item()
            
            return {
                'class': predicted_class,      # 预测的类别
                'confidence': confidence,      # 置信度
                'all_probabilities': {        # 所有类别的概率
                    class_names[i]: probabilities[i].item() 
                    for i in range(len(class_names))
                }
            }
            
        except Exception as e:
            print(f"❌ 预测出错: {str(e)}")
            return None

    def show_prediction(self, image_path, dataset=None):
        """显示预测结果和图片"""
        result = self.predict(image_path, dataset)
        if result is None:
            return
        
        # 显示图片
        img = Image.open(image_path)
        plt.figure(figsize=(8, 6))
        plt.imshow(img)
        plt.title(f"预测: {result['class']} (置信度: {result['confidence']:.3f})")
        plt.axis('off')
        plt.show()
        
        # 显示概率分布
        print(f"预测结果:")
        for class_name, prob in result['all_probabilities'].items():
            print(f"  {class_name}: {prob:.3f}")

✅ 第四步:添加保存和加载功能

    def save_model(self, path="cat_dog_classifier.pth"):
        """保存训练好的模型"""
        torch.save(self.model.state_dict(), path)
        print(f"✅ 模型已保存到: {path}")

    def load_model(self, path="cat_dog_classifier.pth"):
        """加载已训练的模型"""
        if not os.path.exists(path):
            print(f"❌ 模型文件不存在: {path}")
            return False
        
        self.model.load_state_dict(torch.load(path, map_location=self.device))
        print(f"✅ 模型已加载: {path}")
        return True

✅ 第五步:使用你的AI分类器

现在,我们来使用这个分类器:

# 1. 创建分类器实例
classifier = CatDogClassifier(
    img_size=128,      # 图片大小
    batch_size=32      # 每次处理32张图片
)

# 2. 训练模型(需要你的数据集)
# 假设你的图片放在 /content/PetImages 文件夹下
# 文件结构应该是:
# PetImages/
# ├── Cat/
# │   ├── cat1.jpg
# │   └── cat2.jpg
# └── Dog/
#     ├── dog1.jpg
#     └── dog2.jpg

 dataset = classifier.train_model(
     data_dir="/content/PetImages",
     num_epochs=5,
     learning_rate=0.001
 )

# 3. 保存模型
 classifier.save_model("my_cat_dog_model.pth")

# 4. 预测图片
 result = classifier.predict("/content/PetImages/Cat/cat.1.jpg", dataset)
 print(f"预测结果: {result}")

# 5. 显示预测结果
 classifier.show_prediction("/content/PetImages/Cat/cat.1.jpg", dataset)

输出结果:

✅ 分类器初始化完成,使用设备: cuda
✅ 数据加载完成!
数据集大小: 24998
类别: ['Cat', 'Dog']
🚀 开始训练,共 5 轮...
Epoch [1/5], Step [100], Loss: 0.9792, Accuracy: 56.22%
Epoch [1/5], Step [200], Loss: 0.6519, Accuracy: 58.91%
Epoch [1/5], Step [300], Loss: 0.6095, Accuracy: 61.34%
Epoch [1/5], Step [400], Loss: 0.5851, Accuracy: 63.34%
Epoch [1/5], Step [500], Loss: 0.5688, Accuracy: 64.86%
Epoch [1/5], Step [600], Loss: 0.5620, Accuracy: 65.91%

/usr/local/lib/python3.12/dist-packages/PIL/TiffImagePlugin.py:950: UserWarning: Truncated File Read
  warnings.warn(str(msg))

Epoch [1/5], Step [700], Loss: 0.5509, Accuracy: 66.71%
Epoch [1/5] 完成, 准确率: 67.28%
Epoch [2/5], Step [100], Loss: 0.4743, Accuracy: 77.50%
Epoch [2/5], Step [200], Loss: 0.4829, Accuracy: 77.19%
Epoch [2/5], Step [300], Loss: 0.4654, Accuracy: 77.43%
Epoch [2/5], Step [400], Loss: 0.4719, Accuracy: 77.13%
Epoch [2/5], Step [500], Loss: 0.4590, Accuracy: 77.33%
Epoch [2/5], Step [600], Loss: 0.4577, Accuracy: 77.60%
Epoch [2/5], Step [700], Loss: 0.4683, Accuracy: 77.62%

/usr/local/lib/python3.12/dist-packages/PIL/TiffImagePlugin.py:950: UserWarning: Truncated File Read
  warnings.warn(str(msg))

Epoch [2/5] 完成, 准确率: 77.67%

/usr/local/lib/python3.12/dist-packages/PIL/TiffImagePlugin.py:950: UserWarning: Truncated File Read
  warnings.warn(str(msg))

Epoch [3/5], Step [100], Loss: 0.3498, Accuracy: 84.91%
Epoch [3/5], Step [200], Loss: 0.3406, Accuracy: 85.00%
Epoch [3/5], Step [300], Loss: 0.3633, Accuracy: 84.65%
Epoch [3/5], Step [400], Loss: 0.3659, Accuracy: 84.38%
Epoch [3/5], Step [500], Loss: 0.3483, Accuracy: 84.53%
Epoch [3/5], Step [600], Loss: 0.3580, Accuracy: 84.58%
Epoch [3/5], Step [700], Loss: 0.3690, Accuracy: 84.30%
Epoch [3/5] 完成, 准确率: 84.49%

/usr/local/lib/python3.12/dist-packages/PIL/TiffImagePlugin.py:950: UserWarning: Truncated File Read
  warnings.warn(str(msg))

Epoch [4/5], Step [100], Loss: 0.2034, Accuracy: 91.84%
Epoch [4/5], Step [200], Loss: 0.1820, Accuracy: 92.81%
Epoch [4/5], Step [300], Loss: 0.1831, Accuracy: 92.65%
Epoch [4/5], Step [400], Loss: 0.2010, Accuracy: 92.47%
Epoch [4/5], Step [500], Loss: 0.1875, Accuracy: 92.46%
Epoch [4/5], Step [600], Loss: 0.2005, Accuracy: 92.33%
Epoch [4/5], Step [700], Loss: 0.2169, Accuracy: 92.09%
Epoch [4/5] 完成, 准确率: 92.07%
Epoch [5/5], Step [100], Loss: 0.0590, Accuracy: 98.66%
Epoch [5/5], Step [200], Loss: 0.0572, Accuracy: 98.28%
Epoch [5/5], Step [300], Loss: 0.0598, Accuracy: 98.20%
Epoch [5/5], Step [400], Loss: 0.0555, Accuracy: 98.19%
Epoch [5/5], Step [500], Loss: 0.0833, Accuracy: 98.00%

/usr/local/lib/python3.12/dist-packages/PIL/TiffImagePlugin.py:950: UserWarning: Truncated File Read
  warnings.warn(str(msg))

Epoch [5/5], Step [600], Loss: 0.0728, Accuracy: 97.90%
Epoch [5/5], Step [700], Loss: 0.0716, Accuracy: 97.81%
Epoch [5/5] 完成, 准确率: 97.79%
✅ 训练完成!
✅ 模型已保存到: my_model.pth

💡 你刚做了什么?

你写的代码 实际作用
SimpleCNN 创建AI的"大脑"
train_model 让AI学习猫狗特征
predict 让AI判断新图片
save_model 保存AI的"记忆"

✅ 你不是在写代码,
你是在创造一个会学习的AI!


🌟 为什么这很重要?

很多人觉得AI很神秘,
其实它的核心思想很简单:

  1. 给AI看例子(训练数据)
  2. 告诉AI对错(标签)
  3. AI自己学习规律(训练)
  4. 用学到的规律预测(预测)

你刚刚,就实现了这个完整流程!


🚀 下一步建议

  1. 下载数据集:从Kaggle下载PetImages数据集
  2. 替换路径:把代码中的路径改成你的数据路径
  3. 调整参数:试试不同的img_sizenum_epochs
  4. 扩展功能:添加更多类别(不只是猫狗)

❤️ 最后一句话

你刚刚定义了一个完整的AI模型!
虽然简单,但它包含了所有AI分类器的核心要素
数据处理→模型定义→训练→预测

你不需要成为专家,
你只需要知道:

AI,就是让计算机学会人类的判断能力。


📌 现在就去试试!
👉 打开 https://colab.research.google.com
👉 按顺序运行
👉 看你的AI学会认猫狗的那一刻!

你不是在学编程,
你是在定义未来的AI!

欢迎在评论区分享你的AI训练成果👇
是猫?是狗?还是你家的其他宠物?

#AI小白入门 #自定义模型 #图像分类 #PyTorch #AI编程 #机器学习 #深度学习 #AI实战 #30分钟学会AI #Python