importssl# 导入SSL库,用于处理HTTPS请求importurllib.request# 导入urllib库,用于发送HTTP请求和处理响应# 解决macOS上的SSL证书验证问题ssl._create_default_https_context = ssl._create_unverified_contextimporttorch# 导入PyTorch库,用于深度学习模型的构建和训练importtorch.nnasnn# 导入PyTorch的神经网络模块,用于构建CNN模型importtorch.optimasoptim# 导入PyTorch的优化器模块,用于更新模型权重fromtorchvisionimportdatasets, transforms# 导入PyTorch的图像数据集和转换模块,用于加载和预处理数据fromtorch.utils.dataimportDataLoader# 导入PyTorch的DataLoader模块,用于批量加载数据集fromPILimportImage# 导入PIL库,用于加载和处理图像文件importnumpyasnp # 导入NumPy库,用于数据处理importos# 导入os库,用于文件路径操作# ===================== 1. 数据预处理与加载 =====================# 图像归一化、转张量transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5))])# 检查数据文件是否已存在,避免重复下载data_path ='./data/cifar-10-batches-py'download_flag =notos.path.exists(data_path)# 如果数据文件不存在,则下载# 加载CIFAR10训练/测试集, 并进行归一化处理,转换为张量,下载到本地train_set = datasets.CIFAR10(root='./data', train=True, download=download_flag, transform=transform)# 训练集test_set = datasets.CIFAR10(root='./data', train=False, download=download_flag, transform=transform)# 测试集train_loader = DataLoader(train_set, batch_size=64, shuffle=True)# 训练集数据加载器test_loader = DataLoader(test_set, batch_size=64, shuffle=False)# 测试集数据加载器# 10个类别标签,用于可视化预测结果classes = ('plane 飞机','car 轿车','bird 鸟','cat 猫','deer 鹿', 'dog 狗','frog 青蛙','horse 马','ship 船舶','truck 货车')# ===================== 2. 简易CNN网络主干 =====================classCifarCNN(nn.Module):# 定义CIFAR10 CNN模型 def__init__(self):# 初始化模型 super().__init__() # 特征提取模块:卷积+激活+池化 self.conv_stack = nn.Sequential( # 第一层卷积:输入3通道(RGB),输出16个卷积核,3×3卷积核,padding保持尺寸 nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2), # 尺寸减半 32→16 # 第二层卷积,用途是提取更复杂的特征,32个卷积核,3×3卷积核,padding保持尺寸 nn.Conv2d(16,32, kernel_size=3, padding=1),# 输入16,输出32,3×3卷积核,padding保持尺寸 nn.ReLU(),# 激活函数 nn.MaxPool2d(2,2) # 16→8,尺寸减半 ) # 分类全连接层,输入32*8*8,输出128个神经元,128个神经元 self.fc_stack = nn.Sequential( nn.Linear(32*8*8,128),# 输入32*8*8,输出128个神经元 nn.ReLU(),# 激活函数 nn.Linear(128,10) # 输出10类得分 ) defforward(self, x):# 前向传播函数 x =self.conv_stack(x)# 特征提取模块 x = torch.flatten(x, start_dim=1) # 批量维度保留,其余展平 out =self.fc_stack(x)# 分类全连接层 returnout# 返回分类得分# ===================== 3. 模型、损失、优化器初始化 =====================device = torch.device("cuda"iftorch.cuda.is_available()else"cpu")# 选择设备,优先使用GPUmodel = CifarCNN().to(device)# 初始化模型并移动到设备# 分类任务使用交叉熵损失loss_fn = nn.CrossEntropyLoss()# SGD优化器optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)# 初始化优化器# ===================== 4. 训练循环 =====================epochs =10# 训练轮数forepochinrange(epochs):# 遍历训练轮数 running_loss =0.0# 初始化损失为0 model.train() # 训练模式 forbatch_idx, (imgs, labels)inenumerate(train_loader):# 遍历训练集数据 imgs, labels = imgs.to(device), labels.to(device)# 转换为张量并移动到设备 # 前向传播 outputs = model(imgs)# 前向传播 loss = loss_fn(outputs, labels)# 计算损失 # 反向传播更新参数 optimizer.zero_grad()# 清空梯度 loss.backward()# 反向传播 optimizer.step()# 更新参数 running_loss += loss.item()# 累加损失 ifbatch_idx %200==199:# 每200批打印损失 print(f"Epoch[{epoch+1}/{epochs}], Batch[{batch_idx+1}], Loss:{running_loss/200:.3f}") running_loss =0.0# 重置损失 # 每轮结束测试准确率 model.eval()# 测试模式 correct = total =0# 初始化正确预测数和总样本数为0 withtorch.no_grad(): # 测试不计算梯度,节省显存 forimgs, labelsintest_loader:# 遍历测试集数据 imgs, labels = imgs.to(device), labels.to(device)# 转换为张量并移动到设备 outputs = model(imgs)# 前向传播 _, pred = torch.max(outputs.data,1)# 取得分最高的类别 total += labels.size(0)# 累加样本数 correct += (pred == labels).sum().item()# 累加正确预测数 print(f"Epoch{epoch+1}测试集准确率:{100* correct / total:.2f}%
")print("训练完成!")# ===================== 5. 使用模型进行单张图片识别 =====================defpredict_image(model, image_path, device): """加载单张图片并进行预测""" # 图像预处理(与训练时一致) transform = transforms.Compose([ transforms.Resize((32,32)), # CIFAR10图片尺寸为32x32 transforms.ToTensor(), transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5)) ]) # 加载并预处理图片 image = Image.open(image_path).convert('RGB') image_tensor = transform(image).unsqueeze(0).to(device) # 增加batch维度 # 预测 model.eval()# 测试模式 withtorch.no_grad():# 测试不计算梯度,节省显存 outputs = model(image_tensor)# 前向传播 probabilities = torch.nn.functional.softmax(outputs, dim=1)# 计算类别概率 _, predicted = torch.max(outputs,1)# 取得分最高的类别 confidence, predicted = torch.max(probabilities,1)# 取置信度最高的类别 predicted_class = classes[predicted.item()]# 获取预测类别 confidence_score = confidence.item()# 获取置信度 returnpredicted_class, confidence_score# 返回预测类别和置信度# 识别像示例:使用训练好的模型进行预测print("
"+"="*50)print("开始模型推理测试...")print("="*50)# 方式:单张图片预测示例(取消注释以下代码并替换图片路径即可使用)# 单张图片预测示例test_image_path ="test1.jpg"# 替换为实际图片路径try: pred_class, conf = predict_image(model, test_image_path, device) print(f"图片{test_image_path}的预测结果:") print(f" 类别:{pred_class}") print(f" 置信度:{conf:.4f}")exceptExceptionase: print(f"单张图片预测失败:{e}")print("
百香果AI山海实验室:训练模型识别图片任务完成!")
Epoch[1/10], Batch[200], Loss: 2.046Epoch[1/10], Batch[400], Loss: 1.621Epoch[1/10], Batch[600], Loss: 1.421Epoch 1 测试集准确率: 54.25%
Epoch[2/10], Batch[200], Loss: 1.241Epoch[2/10], Batch[400], Loss: 1.169Epoch[2/10], Batch[600], Loss: 1.135Epoch 2 测试集准确率: 62.20%
Epoch[3/10], Batch[200], Loss: 0.978Epoch[3/10], Batch[400], Loss: 0.970Epoch[3/10], Batch[600], Loss: 0.939Epoch 3 测试集准确率: 65.40%
Epoch[4/10], Batch[200], Loss: 0.828Epoch[4/10], Batch[400], Loss: 0.831Epoch[4/10], Batch[600], Loss: 0.806Epoch 4 测试集准确率: 68.50%
Epoch[5/10], Batch[200], Loss: 0.704Epoch[5/10], Batch[400], Loss: 0.731Epoch[5/10], Batch[600], Loss: 0.733Epoch 5 测试集准确率: 69.91%
Epoch[6/10], Batch[200], Loss: 0.617Epoch[6/10], Batch[400], Loss: 0.638Epoch[6/10], Batch[600], Loss: 0.616Epoch 6 测试集准确率: 69.21%
Epoch[7/10], Batch[200], Loss: 0.501Epoch[7/10], Batch[400], Loss: 0.525Epoch[7/10], Batch[600], Loss: 0.563Epoch 7 测试集准确率: 71.08%
Epoch[8/10], Batch[200], Loss: 0.420Epoch[8/10], Batch[400], Loss: 0.457Epoch[8/10], Batch[600], Loss: 0.462Epoch 8 测试集准确率: 70.97%
Epoch[9/10], Batch[200], Loss: 0.339Epoch[9/10], Batch[400], Loss: 0.368Epoch[9/10], Batch[600], Loss: 0.412Epoch 9 测试集准确率: 70.53%
Epoch[10/10], Batch[200], Loss: 0.260Epoch[10/10], Batch[400], Loss: 0.299Epoch[10/10], Batch[600], Loss: 0.334Epoch 10 测试集准确率: 70.07%
训练完成!
=============================开始模型推理测试…=============================图片 test1.jpg 的预测结果: 类别: bird 鸟 置信度: 0.9968
百香果AI山海实验室:训练模型识别图片任务完成!

