上海虹口网站建设公司专业做高校网站群管理系统
2026/1/3 5:31:58 网站建设 项目流程
上海虹口网站建设公司,专业做高校网站群管理系统,国家企业信息公示系统(全国)官网,化工企业网站模板#x1f368; 本文为#x1f517;365天深度学习训练营中的学习记录博客 #x1f356; 原作者#xff1a;K同学啊 目录 一、 前期准备 1. 设置GPU 2. 导入数据 3. 显示图片 4. 划分数据集 二、构建简单的CNN网络 三、 训练模型 1. 设置超参数 2. 编写训练函数 3. …本文为365天深度学习训练营中的学习记录博客原作者K同学啊目录一、 前期准备1. 设置GPU2. 导入数据3. 显示图片4. 划分数据集二、构建简单的CNN网络三、 训练模型1. 设置超参数2. 编写训练函数3. 编写测试函数4. 正式训练四、 结果可视化五、 个人总结过拟合的确认方法解决方案1. 正则化措施2. 数据增强优化3. 批归一化(BN)应用4. 早停策略5. 动态学习率调整6. 优化器升级一、 前期准备1. 设置GPUimport torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, datasets import os,PIL,pathlib,random device torch.device(cuda if torch.cuda.is_available() else cpu) device2. 导入数据data_dir ./data/ data_dir pathlib.Path(data_dir) data_paths list(data_dir.glob(*)) classeNames [str(path).split(\\)[1] for path in data_paths] classeNames第一步使用pathlib.Path()函数将字符串类型的文件夹路径转换为pathlib.Path对象。第二步使用glob()方法获取data_dir路径下的所有文件路径并以列表形式存储在data_paths中。第三步通过split()函数对data_paths中的每个文件路径执行分割操作获得各个文件所属的类别名称并存储在classeNames中第四步打印classeNames列表显示每个文件所属的类别名称。3. 显示图片import matplotlib.pyplot as plt from PIL import Image # 指定图像文件夹路径 image_folder ./data/cloudy/ # 获取文件夹中的所有图像文件 image_files [f for f in os.listdir(image_folder) if f.endswith((.jpg, .png, .jpeg))] # 创建Matplotlib图像 fig, axes plt.subplots(3, 8, figsize(16, 6)) # 使用列表推导式加载和显示图像 for ax, img_file in zip(axes.flat, image_files): img_path os.path.join(image_folder, img_file) img Image.open(img_path) ax.imshow(img) ax.axis(off) # 显示图像 plt.tight_layout() plt.show()total_datadir ./data/ # 关于transforms.Compose的更多介绍可以参考https://blog.csdn.net/qq_38251616/article/details/124878863 train_transforms transforms.Compose([ transforms.Resize([224, 224]), # 将输入图片resize成统一尺寸 transforms.ToTensor(), # 将PIL Image或numpy.ndarray转换为tensor并归一化到[0,1]之间 transforms.Normalize( # 标准化处理--转换为标准正太分布高斯分布使模型更容易收敛 mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) # 其中 mean[0.485,0.456,0.406]与std[0.229,0.224,0.225] 从数据集中随机抽样计算得到的。 ]) total_data datasets.ImageFolder(total_datadir,transformtrain_transforms) total_data4. 划分数据集train_size int(0.8 * len(total_data)) test_size len(total_data) - train_size train_dataset, test_dataset torch.utils.data.random_split(total_data, [train_size, test_size]) train_dataset, test_dataset train_size,test_size batch_size 32 train_dl torch.utils.data.DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue) test_dl torch.utils.data.DataLoader(test_dataset, batch_sizebatch_size, shuffleTrue) for X, y in test_dl: print(Shape of X [N, C, H, W]: , X.shape) print(Shape of y: , y.shape, y.dtype) break二、构建简单的CNN网络import torch.nn.functional as F class Network_bn(nn.Module): def __init__(self): super(Network_bn, self).__init__() nn.Conv2d()函数 第一个参数in_channels是输入的channel数量 第二个参数out_channels是输出的channel数量 第三个参数kernel_size是卷积核大小 第四个参数stride是步长默认为1 第五个参数padding是填充大小默认为0 self.conv1 nn.Conv2d(in_channels3, out_channels12, kernel_size5, stride1, padding0) self.bn1 nn.BatchNorm2d(12) self.conv2 nn.Conv2d(in_channels12, out_channels12, kernel_size5, stride1, padding0) self.bn2 nn.BatchNorm2d(12) self.pool1 nn.MaxPool2d(2,2) self.conv4 nn.Conv2d(in_channels12, out_channels24, kernel_size5, stride1, padding0) self.bn4 nn.BatchNorm2d(24) self.conv5 nn.Conv2d(in_channels24, out_channels24, kernel_size5, stride1, padding0) self.bn5 nn.BatchNorm2d(24) self.pool2 nn.MaxPool2d(2,2) self.fc1 nn.Linear(24*50*50, len(classeNames)) def forward(self, x): x F.relu(self.bn1(self.conv1(x))) x F.relu(self.bn2(self.conv2(x))) x self.pool1(x) x F.relu(self.bn4(self.conv4(x))) x F.relu(self.bn5(self.conv5(x))) x self.pool2(x) x x.view(-1, 24*50*50) x self.fc1(x) return x device cuda if torch.cuda.is_available() else cpu print(Using {} device.format(device)) model Network_bn().to(device) model三、 训练模型1. 设置超参数loss_fn nn.CrossEntropyLoss() # 创建损失函数 learn_rate 1e-4 # 学习率 opt torch.optim.SGD(model.parameters(),lrlearn_rate)2. 编写训练函数# 训练循环 def train(dataloader, model, loss_fn, optimizer): size len(dataloader.dataset) # 训练集的大小一共60000张图片 num_batches len(dataloader) # 批次数目187560000/32 train_loss, train_acc 0, 0 # 初始化训练损失和正确率 for X, y in dataloader: # 获取图片及其标签 X, y X.to(device), y.to(device) # 计算预测误差 pred model(X) # 网络输出 loss loss_fn(pred, y) # 计算网络输出和真实值之间的差距targets为真实值计算二者差值即为损失 # 反向传播 optimizer.zero_grad() # grad属性归零 loss.backward() # 反向传播 optimizer.step() # 每一步自动更新 # 记录acc与loss train_acc (pred.argmax(1) y).type(torch.float).sum().item() train_loss loss.item() train_acc / size train_loss / num_batches return train_acc, train_loss3. 编写测试函数def test (dataloader, model, loss_fn): size len(dataloader.dataset) # 测试集的大小一共10000张图片 num_batches len(dataloader) # 批次数目31310000/32312.5向上取整 test_loss, test_acc 0, 0 # 当不进行训练时停止梯度更新节省计算内存消耗 with torch.no_grad(): for imgs, target in dataloader: imgs, target imgs.to(device), target.to(device) # 计算loss target_pred model(imgs) loss loss_fn(target_pred, target) test_loss loss.item() test_acc (target_pred.argmax(1) target).type(torch.float).sum().item() test_acc / size test_loss / num_batches return test_acc, test_loss4. 正式训练epochs 20 train_loss [] train_acc [] test_loss [] test_acc [] for epoch in range(epochs): model.train() epoch_train_acc, epoch_train_loss train(train_dl, model, loss_fn, opt) model.eval() epoch_test_acc, epoch_test_loss test(test_dl, model, loss_fn) train_acc.append(epoch_train_acc) train_loss.append(epoch_train_loss) test_acc.append(epoch_test_acc) test_loss.append(epoch_test_loss) template (Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%Test_loss:{:.3f}) print(template.format(epoch1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss)) print(Done)四、 结果可视化import matplotlib.pyplot as plt #隐藏警告 import warnings warnings.filterwarnings(ignore) #忽略警告信息 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号 plt.rcParams[figure.dpi] 100 #分辨率 from datetime import datetime current_time datetime.now() # 获取当前时间 epochs_range range(epochs) plt.figure(figsize(12, 3)) plt.subplot(1, 2, 1) plt.plot(epochs_range, train_acc, labelTraining Accuracy) plt.plot(epochs_range, test_acc, labelTest Accuracy) plt.legend(loclower right) plt.title(Training and Validation Accuracy) plt.xlabel(current_time) # 打卡请带上时间戳否则代码截图无效 plt.subplot(1, 2, 2) plt.plot(epochs_range, train_loss, labelTraining Loss) plt.plot(epochs_range, test_loss, labelTest Loss) plt.legend(locupper right) plt.title(Training and Validation Loss) plt.show()五、 个人总结过拟合的确认方法当模型出现疑似过拟合时可通过以下方法进一步确认增加训练轮次持续训练时若验证集准确率下降而损失上升则确认过拟合降低模型复杂度如减少全连接层或通道数后验证指标提升说明原模型过于复杂增强数据多样性添加数据增强后若验证指标改善表明原训练数据不足导致模型死记硬背解决方案1. 正则化措施Dropout在全连接层前添加nn.Dropout(0.5)通过随机丢弃神经元强制学习鲁棒特征L2正则化优化器中设置weight_decay1e-4抑制过大权重防止噪声拟合2. 数据增强优化方法使用torchvision.transforms实现随机裁剪、翻转、颜色变换等作用提升数据多样性促使模型学习通用特征而非样本细节增强泛化能力3. 批归一化(BN)应用原理对卷积层输出进行归一化处理均值≈0方差≈1后缩放平移优势稳定层间输入分布加速收敛并缓解梯度问题具有正则化效果类似mini-batch级数据增强4. 早停策略实施持续监控验证集准确率当性能不再提升超过patience轮次时终止训练价值防止过度拟合训练噪声节省计算资源自动获取最佳泛化模型5. 动态学习率调整机制当验证性能停滞时按因子如0.5降低学习率效益实现更精细的参数优化平缓的参数更新可降低过拟合风险6. 优化器升级改进方案将SGD替换为Adam优化器并配合权重衰减原因当前SGD学习率(1e-4)偏低导致收敛缓慢且缺乏动量和正则化支持

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询