AI项目实战
项目案例
1. 图像分类项目
使用PyTorch实现图像分类系统。
# 项目结构
project/
├── data/
│ ├── train/
│ ├── val/
│ └── test/
├── models/
│ ├── model.py
│ └── utils.py
├── train.py
├── evaluate.py
└── predict.py
# 模型定义
import torch.nn as nn
class ImageClassifier(nn.Module):
def __init__(self, num_classes):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(64, 128, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(128, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
)
self.classifier = nn.Sequential(
nn.Linear(256 * 28 * 28, 512),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(512, num_classes),
)
def forward(self, x):
x = self.features(x)
x = x.view(x.size(0), -1)
x = self.classifier(x)
return x
# 训练脚本
def train(model, train_loader, criterion, optimizer, device):
model.train()
running_loss = 0.0
correct = 0
total = 0
for inputs, labels in train_loader:
inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
_, predicted = outputs.max(1)
total += labels.size(0)
correct += predicted.eq(labels).sum().item()
return running_loss / len(train_loader), 100. * correct / total2. 自然语言处理项目
使用Transformer实现文本分类系统。
# 项目结构
project/
├── data/
│ ├── raw/
│ └── processed/
├── models/
│ ├── transformer.py
│ └── tokenizer.py
├── train.py
├── evaluate.py
└── predict.py
# 模型定义
import torch.nn as nn
from transformers import BertModel
class TextClassifier(nn.Module):
def __init__(self, num_classes):
super().__init__()
self.bert = BertModel.from_pretrained('bert-base-uncased')
self.dropout = nn.Dropout(0.1)
self.classifier = nn.Linear(768, num_classes)
def forward(self, input_ids, attention_mask):
outputs = self.bert(
input_ids=input_ids,
attention_mask=attention_mask
)
pooled_output = outputs[1]
pooled_output = self.dropout(pooled_output)
logits = self.classifier(pooled_output)
return logits
# 训练脚本
def train(model, train_loader, criterion, optimizer, device):
model.train()
total_loss = 0
correct = 0
total = 0
for batch in train_loader:
input_ids = batch['input_ids'].to(device)
attention_mask = batch['attention_mask'].to(device)
labels = batch['labels'].to(device)
optimizer.zero_grad()
outputs = model(input_ids, attention_mask)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
total_loss += loss.item()
_, predicted = outputs.max(1)
total += labels.size(0)
correct += predicted.eq(labels).sum().item()
return total_loss / len(train_loader), 100. * correct / total3. 推荐系统项目
使用协同过滤实现推荐系统。
# 项目结构
project/
├── data/
│ ├── ratings.csv
│ └── items.csv
├── models/
│ ├── collaborative_filtering.py
│ └── evaluation.py
├── train.py
├── evaluate.py
└── recommend.py
# 模型定义
import torch.nn as nn
class CollaborativeFiltering(nn.Module):
def __init__(self, num_users, num_items, num_factors):
super().__init__()
self.user_factors = nn.Embedding(num_users, num_factors)
self.item_factors = nn.Embedding(num_items, num_factors)
# 初始化权重
nn.init.normal_(self.user_factors.weight, std=0.1)
nn.init.normal_(self.item_factors.weight, std=0.1)
def forward(self, user_ids, item_ids):
user_emb = self.user_factors(user_ids)
item_emb = self.item_factors(item_ids)
return (user_emb * item_emb).sum(dim=1)
# 训练脚本
def train(model, train_loader, criterion, optimizer, device):
model.train()
total_loss = 0
for user_ids, item_ids, ratings in train_loader:
user_ids = user_ids.to(device)
item_ids = item_ids.to(device)
ratings = ratings.float().to(device)
optimizer.zero_grad()
predictions = model(user_ids, item_ids)
loss = criterion(predictions, ratings)
loss.backward()
optimizer.step()
total_loss += loss.item()
return total_loss / len(train_loader)