96SEO 2026-02-19 17:16 0
数据导入及处理部分本次数据导入没有使用torchvision自带的数据集需要将原始数据进行处理包括数据导入查看数据分类情况定义transforms进行数据类型转换等操作。

划分数据集划定训练集测试集后再使用torch.utils.data中的DataLoader()分别加载上一步处理好的训练及测试数据查看批处理维度.
设置超参数在这之前需要定义损失函数学习率动态学习率以及根据学习率定义优化器例如SGD随机梯度下降用来在训练中更新参数最小化损失函数。
定义训练函数函数的传入的参数有四个分别是设置好的DataLoader(),定义好的模型损失函数优化器。
函数内部初始化损失准确率为0接着开始循环使用DataLoader()获取一个批次的数据对这个批次的数据带入模型得到预测值然后使用损失函数计算得到损失值。
接下来就是进行反向传播以及使用优化器优化参数梯度清零放在反向传播之前或者是使用优化器优化之后都是可以的一般是默认放在反向传播之前。
定义测试函数函数传入的参数相比训练函数少了优化器只需传入设置好的DataLoader(),定义好的模型损失函数。
此外除了处理批次数据时无需再设置梯度清零、返向传播以及优化器优化参数其余部分均和训练函数保持一致。
训练过程定义训练次数有几次就使用整个数据集进行几次训练初始化四个空list分别存储每次训练及测试的准确率及损失。
使用model.train()开启训练模式调用训练函数得到准确率及损失。
使用model.eval()将模型设置为评估模式调用测试函数得到准确率及损失。
接着就是将得到的训练及测试的准确率及损失存储到相应list中并合并打印出来得到每一次整体训练后的准确率及损失。
model.load_state_dict(torch.load(‘model.pth’))
需要改进优化的地方在保证整体流程没有问题的情况下继续细化细节研究比如一些函数的原理及作用如何提升训练集准确率等问题。
warningswarnings.filterwarnings(ignore)
忽略警告信息plt.rcParams[font.sans-serif]
plt.rcParams[axes.unicode_minus]
transforms.Compose([transforms.Resize([224,224]),
将输入图片resize成统一尺寸transforms.RandomHorizontalFlip(),
装换为tensor,并归一化到[0,1]之间transforms.Normalize(
mean[0.485,0.456,0.406]与std[0.229,0.224,0.225]
transforms.Compose([transforms.Resize([224,224]),transforms.ToTensor(),transforms.Normalize(mean
datasets.ImageFolder(./data/bird_photos/,transform
./data/bird_photos/StandardTransform
antialiasTrue)RandomHorizontalFlip(p0.5)ToTensor()Normalize(mean[0.485,
0.225]))total_data.class_to_idx{Bananaquit:
train_sizetrain_dataset,test_dataset
torch.utils.data.random_split(total_data,[train_size,test_size])
train_dataset,test_dataset(torch.utils.data.dataset.Subset
0x23b545994b0,torch.utils.data.dataset.Subset
torch.utils.data.DataLoader(train_dataset,batch_size
torch.utils.data.DataLoader(test_dataset,batch_size
nn.BatchNorm2d(filters1)self.conv2
nn.BatchNorm2d(filters2)self.conv3
nn.BatchNorm2d(filters3)self.shortcut
nn.Sequential(nn.Conv2d(in_channels,
stridestrides),nn.BatchNorm2d(filters3))def
F.relu(self.bn1(self.conv1(x)))x
F.relu(self.bn2(self.conv2(x)))x
num_classes1000):super(ResNet50,
strides)layers.append(ConvBlock(in_channels,
blocks):layers.append(ConvBlock(in_channels,
F.relu(self.bn1(self.conv1(x)))x
model.to(device)ResNet50((pad):
track_running_statsTrue)(maxpool):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
track_running_statsTrue)(conv2):
track_running_statsTrue)(conv3):
track_running_statsTrue)(shortcut):
AdaptiveAvgPool2d(output_size(1,
adjust_learning_rate(optimizer,epoch,start_lr):
torch.optim.Adam(model.parameters(),lrlearn_rate)#
nn.CrossEntropyLoss()learn_rate
epoch:(0.92**(epoch//2))optimizer
torch.optim.Adam(model.parameters(),lr
torch.optim.lr_scheduler.LambdaLR(optimizer,lr_lambdalambda1)
train(dataloader,model,loss_fn,optimizer):size
反向传播optimizer.zero_grad()loss.backward()optimizer.step()#
(pred.argmax(1)y).type(torch.float).sum().item()train_loss
test(dataloader,model,loss_fn):size
len(dataloader.dataset)num_batches
len(dataloader)test_acc,test_loss
(pred.argmax(1)y).type(torch.float).sum().item()test_loss
adjust_learning_rate(optimizer,epoch,learn_rate)model.train()epoch_train_acc,epoch_train_loss
train(train_dl,model,loss_fn,optimizer)scheduler.step()
更新学习率——调用官方动态学习率时使用model.eval()epoch_test_acc,epoch_test_loss
copy.deepcopy(model)train_acc.append(epoch_train_acc)train_loss.append(epoch_train_loss)test_acc.append(epoch_test_acc)test_loss.append(epoch_test_loss)#
optimizer.state_dict()[param_groups][0][lr]template
(Epoch:{:2d},Train_acc:{:.1f}%,Train_loss:{:.3f},Test_acc:{:.1f}%,Test_loss:{:.3f},Lr:{:.2E})print(template.format(epoch1,epoch_train_acc*100,epoch_train_loss,epoch_test_acc*100,epoch_test_loss,lr))print(Done)Epoch:
1,Train_acc:35.4%,Train_loss:3.431,Test_acc:23.9%,Test_loss:3.033,Lr:1.00E-04
2,Train_acc:69.2%,Train_loss:0.899,Test_acc:26.5%,Test_loss:3.017,Lr:9.20E-05
3,Train_acc:74.1%,Train_loss:0.652,Test_acc:59.3%,Test_loss:1.278,Lr:9.20E-05
4,Train_acc:78.3%,Train_loss:0.587,Test_acc:67.3%,Test_loss:1.353,Lr:8.46E-05
5,Train_acc:82.5%,Train_loss:0.521,Test_acc:75.2%,Test_loss:0.829,Lr:8.46E-05
6,Train_acc:86.3%,Train_loss:0.433,Test_acc:66.4%,Test_loss:1.308,Lr:7.79E-05
7,Train_acc:90.3%,Train_loss:0.340,Test_acc:67.3%,Test_loss:1.600,Lr:7.79E-05
8,Train_acc:89.2%,Train_loss:0.374,Test_acc:71.7%,Test_loss:1.014,Lr:7.16E-05
9,Train_acc:88.7%,Train_loss:0.305,Test_acc:77.0%,Test_loss:0.841,Lr:7.16E-05
Epoch:10,Train_acc:90.7%,Train_loss:0.309,Test_acc:79.6%,Test_loss:1.094,Lr:6.59E-05
Epoch:11,Train_acc:91.8%,Train_loss:0.318,Test_acc:72.6%,Test_loss:0.976,Lr:6.59E-05
Epoch:12,Train_acc:93.6%,Train_loss:0.243,Test_acc:73.5%,Test_loss:1.209,Lr:6.06E-05
Epoch:13,Train_acc:94.7%,Train_loss:0.159,Test_acc:71.7%,Test_loss:0.947,Lr:6.06E-05
Epoch:14,Train_acc:98.0%,Train_loss:0.076,Test_acc:80.5%,Test_loss:0.707,Lr:5.58E-05
Epoch:15,Train_acc:97.8%,Train_loss:0.083,Test_acc:79.6%,Test_loss:0.923,Lr:5.58E-05
Epoch:16,Train_acc:98.2%,Train_loss:0.059,Test_acc:82.3%,Test_loss:0.650,Lr:5.13E-05
Epoch:17,Train_acc:98.5%,Train_loss:0.072,Test_acc:76.1%,Test_loss:0.828,Lr:5.13E-05
Epoch:18,Train_acc:98.0%,Train_loss:0.175,Test_acc:78.8%,Test_loss:0.834,Lr:4.72E-05
Epoch:19,Train_acc:94.2%,Train_loss:0.173,Test_acc:61.9%,Test_loss:2.606,Lr:4.72E-05
Epoch:20,Train_acc:96.2%,Train_loss:0.123,Test_acc:77.9%,Test_loss:0.959,Lr:4.34E-05
Epoch:21,Train_acc:96.5%,Train_loss:0.166,Test_acc:76.1%,Test_loss:1.266,Lr:4.34E-05
Epoch:22,Train_acc:96.9%,Train_loss:0.196,Test_acc:85.0%,Test_loss:0.698,Lr:4.00E-05
Epoch:23,Train_acc:98.7%,Train_loss:0.082,Test_acc:82.3%,Test_loss:0.626,Lr:4.00E-05
Epoch:24,Train_acc:96.0%,Train_loss:0.136,Test_acc:81.4%,Test_loss:0.805,Lr:3.68E-05
Epoch:25,Train_acc:98.5%,Train_loss:0.101,Test_acc:83.2%,Test_loss:0.576,Lr:3.68E-05
Epoch:26,Train_acc:98.5%,Train_loss:0.062,Test_acc:80.5%,Test_loss:0.597,Lr:3.38E-05
Epoch:27,Train_acc:99.6%,Train_loss:0.039,Test_acc:83.2%,Test_loss:0.574,Lr:3.38E-05
Epoch:28,Train_acc:99.3%,Train_loss:0.080,Test_acc:85.0%,Test_loss:0.758,Lr:3.11E-05
Epoch:29,Train_acc:99.6%,Train_loss:0.059,Test_acc:84.1%,Test_loss:0.608,Lr:3.11E-05
Epoch:30,Train_acc:98.9%,Train_loss:0.054,Test_acc:82.3%,Test_loss:0.753,Lr:2.86E-05
Epoch:31,Train_acc:98.9%,Train_loss:0.035,Test_acc:83.2%,Test_loss:0.617,Lr:2.86E-05
Epoch:32,Train_acc:98.7%,Train_loss:0.046,Test_acc:78.8%,Test_loss:0.847,Lr:2.63E-05
Epoch:33,Train_acc:98.9%,Train_loss:0.028,Test_acc:82.3%,Test_loss:0.746,Lr:2.63E-05
Epoch:34,Train_acc:99.6%,Train_loss:0.032,Test_acc:79.6%,Test_loss:0.629,Lr:2.42E-05
Epoch:35,Train_acc:99.3%,Train_loss:0.027,Test_acc:82.3%,Test_loss:0.597,Lr:2.42E-05
Epoch:36,Train_acc:99.6%,Train_loss:0.029,Test_acc:87.6%,Test_loss:0.488,Lr:2.23E-05
Epoch:37,Train_acc:99.6%,Train_loss:0.026,Test_acc:87.6%,Test_loss:0.552,Lr:2.23E-05
Epoch:38,Train_acc:99.1%,Train_loss:0.029,Test_acc:79.6%,Test_loss:0.572,Lr:2.05E-05
Epoch:39,Train_acc:99.8%,Train_loss:0.107,Test_acc:84.1%,Test_loss:0.704,Lr:2.05E-05
Epoch:40,Train_acc:99.1%,Train_loss:0.094,Test_acc:76.1%,Test_loss:0.772,Lr:1.89E-05
range(epochs)plt.figure(figsize
plt.plot(epochs_range,train_acc,label
plt.plot(epochs_range,test_acc,label
plt.plot(epochs_range,train_loss,label
plt.plot(epochs_range,test_loss,label
torch.save(model.state_dict(),./模型参数/J1_resnet50_model_state_dict.pth)
定义官方vgg16模型用来加载参数best_model.load_state_dict(torch.load(./模型参数/J1_resnet50_model_state_dict.pth))
list(total_data.class_to_idx)def
predict_one_image(image_path,model,transform,classes):test_img
Image.open(image_path).convert(RGB)#
test_img.to(device).unsqueeze(0)model.eval()output
classes[pred]print(f预测结果是:{pred_class})#
predict_one_image(image_path./data/bird_photos/Bananaquit/007.jpg,model
预测结果是:Bananaquitclasses[Bananaquit,
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback