96SEO 2026-02-19 11:50 8
件夹GoogleNet并在里面建立data_set文件夹用来保存数据集在data_set文件夹下创建新文件夹flower_data点击链接下载花分类数据集https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz会下载一个压缩包将它解压到flower_data文件夹下执行split_data.py脚本自动将数据集划分成训练集train和验证集val。

如果文件夹存在则先删除原文件夹在重新创建rmtree(file_path)os.makedirs(file_path)def
os.path.exists(origin_flower_path),
exist..format(origin_flower_path)flower_class
os.listdir(origin_flower_path)if
os.path.isdir(os.path.join(origin_flower_path,
建立每个类别对应的文件夹mk_file(os.path.join(train_root,
建立每个类别对应的文件夹mk_file(os.path.join(val_root,
os.path.join(origin_flower_path,
__main__:main()之后会在文件夹下生成train和val数据集到此完成了数据集的准备。
新建model.py参照GoogleNet的网络结构和pytorch官方给出的代码对代码进行略微的修改即可在他的代码里首先定义了三个类BasicConv2d、Inception、InceptionAux即基础卷积、Inception模块、辅助分类器三个部分接着定义了GoogleNet类对上述三个类进行调用完成前向传播。
True):super(GoogLeNet,self).__init__()self.aux_logits
#自适应平均池化下采样对于任意尺寸的特征向量都得到1*1特征矩阵self.dropout
nn.Linear):torch.nn.init.trunc_normal_(m.weight,
nn.BatchNorm2d):nn.init.constant_(m.weight,
nn.Sequential(BasicConv2d(in_channels,
nn.Sequential(BasicConv2d(in_channels,
kernel_size1),BasicConv2d(ch5x5red,
nn.Sequential(nn.MaxPool2d(kernel_size3,
ceil_modeTrue),BasicConv2d(in_channels,
num_classes):super(InceptionAux,
self).__init__()self.averagePool
完成网络的定义之后可以单独执行一下这个文件用来验证网络定义的是否正确。
如果可以正确输出就没问题。
首先定义一个字典用于用于对train和val进行预处理包括裁剪成224*224大小训练集随机水平翻转一般验证集不需要此操作转换成张量图像归一化。
然后利用DataLoader模块加载数据集并设置batch_size为32同时设置数据加载器的工作进程数nw加快速度。
transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize((0.5,
transforms.Compose([transforms.Resize((224,
224)),transforms.ToTensor(),transforms.Normalize((0.5,
datasets.ImageFolder(rootos.path.join(image_path,
train),transformdata_transform[train])validate_dataset
datasets.ImageFolder(rootos.path.join(image_path,
transformdata_transform[val])nw
torch.utils.data.DataLoader(train_dataset,
torch.utils.data.DataLoader(validate_dataset,
len(validate_dataset)print(fusing
将训练数据集的类别标签转换为字典格式并将其写入名为class_indices.json的文件中。
从train_dataset中获取类别标签到索引的映射关系存储在flower_list变量中。
使用列表推导式将flower_list中的键值对反转得到一个新的字典cla_dict其中键是原始类别标签值是对应的索引。
使用json.dumps()函数将cla_dict转换为JSON格式的字符串设置缩进为4个空格。
使用with
open()语句以写入模式打开名为class_indices.json的文件并将JSON字符串写入文件。
从训练集中获取类别标签到索引的映射关系存储在flower_list变量flower_list
使用列表推导式将flower_list中的键值对反转得到一个新的字典cla_dictcla_dict
file将cla_dict转换为JSON格式的字符串json_str
json_file:json_file.write(json_str)
首先定义网络对象net传入要分类的类别数为5使用辅助分类器并初始化权重在这里训练30轮并使用train_bar
filesys.stdout)来可视化训练进度条loss计算采用了GoogleNet原论文的方法进行加权计算之后再进行反向传播和参数更新;同时每一轮训练完成都要进行学习率更新之后开始对验证集进行计算精确度完成后保存模型。
init_weightsTrue)net.to(device)loss_function
torch.optim.lr_scheduler.StepLR(optimizer,
dataoptimizer.zero_grad()logits,
0.3loss.backward()optimizer.step()#
val_labels.to(device)).sum().item()val_accurate
val_accuratetorch.save(net,./googleNet.pth)print(Finished
transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize((0.5,
transforms.Compose([transforms.Resize((224,
224)),transforms.ToTensor(),transforms.Normalize((0.5,
datasets.ImageFolder(rootos.path.join(image_path,
train),transformdata_transform[train])validate_dataset
datasets.ImageFolder(rootos.path.join(image_path,
transformdata_transform[val])nw
torch.utils.data.DataLoader(train_dataset,
torch.utils.data.DataLoader(validate_dataset,
len(validate_dataset)print(fusing
从训练集中获取类别标签到索引的映射关系存储在flower_list变量flower_list
使用列表推导式将flower_list中的键值对反转得到一个新的字典cla_dictcla_dict
file将cla_dict转换为JSON格式的字符串json_str
json_file:json_file.write(json_str)如果要使用官方的预训练权重注意是将权重载入官方的模型不是我们自己实现的模型官方的模型中使用了bn层以及改了一些参数不能混用import
torchvision.models.googlenet(num_classes5)model_dict
https://download.pytorch.org/models/googlenet-1378be20.pthpretrain_model
torch.load(googlenet.pth)del_list
del_list}model_dict.update(pretrain_dict)net.load_state_dict(model_dict)net
init_weightsTrue)net.to(device)loss_function
torch.optim.lr_scheduler.StepLR(optimizer,
dataoptimizer.zero_grad()logits,
0.3loss.backward()optimizer.step()#
val_labels.to(device)).sum().item()val_accurate
val_accuratetorch.save(net,./googleNet.pth)print(Finished
新建一个predict.py文件用于预测将输入图像处理后转换成张量格式img
transforms.Compose([transforms.Resize((224,
224)),transforms.ToTensor(),transforms.Normalize((0.5,
Image.open(./2678588376_6ca64a4a54_n.jpg)plt.imshow(img)#
aux_logitsFalse).to(device)modeltorch.load(/home/lm/GoogleNet/googleNet.pth)model.eval()with
torch.squeeze(model(img.to(device))).cpu()predict
torch.argmax(predict).numpy()print_result
{class_indict[str(predict_class)]}
{predict[predict_class].numpy():.3}plt.title(print_result)for
range(len(predict)):print(fclass:
{predict[i].numpy():.3})plt.show()if
modeltorch.load(/home/lm/GoogleNet/googleNet.pth)
opset_version11)将生成的onnx文件导入这样的可视化清晰了许多
发现去掉学习率更新会提高准确率从70%提升到83%因此把train.py里面对应部分删掉。
https://pan.baidu.com/s/1FGcGwrNAZZSEocPORD3bZg
作为专业的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