30分钟教AI小白定义自己的模型并实现图像分类
你是不是也想过:
"AI模型到底长什么样?我能不能自己写一个?"
"网上教程太复杂,都是代码,完全看不懂"
"想学AI,但不知道从哪开始"
别担心!
今天,我们不讲理论,不讲公式,
只用30分钟,
手把手教你定义一个自己的AI模型,
让它学会识别猫和狗!
你不需要懂什么"神经网络",
不需要知道"反向传播",
只需要会复制粘贴,
就能拥有一个属于自己的AI分类器!
🧩 什么是AI模型?一句话说清
想象你是个老师,
要教学生区分猫和狗。
你怎么做?
- 告诉学生:"猫有尖耳朵,狗有长嘴巴"
- 给学生看100张猫和100张狗的照片
- 学生慢慢学会这些特征
- 新图片来了,学生就能判断是猫还是狗
AI模型就是这样!
它不是"聪明",
而是记住了很多特征,
然后根据这些特征做判断。
🎯 我们要做什么?
我们要写一个AI分类器,让它:
✅ 看猫的照片 → 说"这是猫"
✅ 看狗的照片 → 说"这是狗"
✅ 可以训练
✅ 可以预测
✅ 代码简单易懂
🚀 准备工作:打开Colab
- 打开浏览器,访问:https://colab.research.google.com
- 登录Google账号
- 点击"新建笔记本"
- 点击"修改" → "笔记本设置" → 选择"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 # 返回数据集,用于预测时知道类别名
💡 训练过程就像:
- 老师出题(
images)- 学生答题(
model(images))- 老师打分(
criterion)- 学生改正(
optimizer)- 重复多轮,学生变聪明
✅ 第三步:添加预测功能
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很神秘,
其实它的核心思想很简单:
- 给AI看例子(训练数据)
- 告诉AI对错(标签)
- AI自己学习规律(训练)
- 用学到的规律预测(预测)
你刚刚,就实现了这个完整流程!
🚀 下一步建议
- 下载数据集:从Kaggle下载PetImages数据集
- 替换路径:把代码中的路径改成你的数据路径
- 调整参数:试试不同的
img_size和num_epochs - 扩展功能:添加更多类别(不只是猫狗)
❤️ 最后一句话
你刚刚定义了一个完整的AI模型!
虽然简单,但它包含了所有AI分类器的核心要素:
数据处理→模型定义→训练→预测
你不需要成为专家,
你只需要知道:
AI,就是让计算机学会人类的判断能力。
📌 现在就去试试!
👉 打开 https://colab.research.google.com
👉 按顺序运行
👉 看你的AI学会认猫狗的那一刻!
你不是在学编程,
你是在定义未来的AI!
欢迎在评论区分享你的AI训练成果👇
是猫?是狗?还是你家的其他宠物?
#AI小白入门 #自定义模型 #图像分类 #PyTorch #AI编程 #机器学习 #深度学习 #AI实战 #30分钟学会AI #Python