打卡Day51
day43的时候我们安排大家对自己找的数据集用简单cnn训练,现在可以尝试下借助这几天的知识来实现精度的进一步提高
Kaggle图像分类与可视化方案
一、数据准备(修改 src/data/preprocessing.py )
# ... existing code ...
def create_dataloader(data_path, batch_size=32):transform = transforms.Compose([transforms.Resize((256, 256)),transforms.RandomHorizontalFlip(),transforms.RandomRotation(15), # 新增数据增强transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])dataset = datasets.ImageFolder(data_path, transform=transform)return DataLoader(dataset, batch_size=batch_size, shuffle=True)
二、高效CNN模型(修改 src/models/train.py )
from efficientnet_pytorch import EfficientNet # 需安装 pip install efficientnet-pytorchclass CustomEfficientNet(nn.Module):def __init__(self, num_classes):super().__init__()self.base = EfficientNet.from_pretrained('efficientnet-b3')self.classifier = nn.Sequential(nn.Dropout(0.5),nn.Linear(1536, num_classes))def forward(self, x):features = self.base.extract_features(x)return self.classifier(nn.functional.adaptive_avg_pool2d(features, 1).squeeze())
三、Grad-CAM可视化(新增 src/visualization/gradcam.py )
class GradCAM:def __init__(self, model, target_layer):self.model = model.eval()self.target_layer = target_layerself.activations = []self.gradients = []target_layer.register_forward_hook(self.save_activation)target_layer.register_backward_hook(self.save_gradient)def save_activation(self, module, input, output):self.activations.append(output)def save_gradient(self, module, grad_input, grad_output):self.gradients.append(grad_output[0])def generate(self, input_img, class_idx=None):# ... 完整实现见项目文件 ...