SEO技术

SEO技术

Products

当前位置:首页 > SEO技术 >

如何找到信誉良好的菏泽网站制作服务?

96SEO 2026-02-20 10:18 0


解已经满天飞了但是本文给大家带来的是我在Seq2Seq思想上开发的一个模型和新的架构架构前面的文章已经说过很多次了其是专门为新手开发的而且为了方便大家使用只定义了一个文件方便大家复制粘贴架构功能包括结果可视化、支持单元预测、多元预测、模型拟合效果检测、预测未知数据、以及滚动长期预测功能。

如何找到信誉良好的菏泽网站制作服务?

Seq2Seq模型是一种处理序列数据的深度学习模型广泛用于机器翻译、语音识别和文本摘要等任务(也能用于时间序列)。

其核心思想是编码器-解码器。

需要注意得是本文的模型和结构均为自研在Seq2Seq的思想上进行了一定的扩展。

时间序列预测专栏基础知识数据分析机器学习深度学习Transformer创新模型

预测功能效果展示(不是测试集是预测未知数据所以图中没有对比的数据)-

损失截图(损失这里我先展示一个训练过程中的后面会自动生成损失图像)-

根据损失来看模型的拟合效果还是很好的但后面还是做了检验模型拟合效果的功能让大家真正的评估模型的效果。

测试集状况-

这个结构是我发这么多基础模型里效果最好的模型拟合和测试集表现均为最好。

一、本文介绍

Seq2SeqSequence-to-Sequence模型是一种处理序列数据的深度学习模型广泛用于机器翻译、语音识别和文本摘要等任务。

其核心思想是将一个序列如一句话转换成另一个序列这两个序列的长度可以不同。

编码器-解码器架构Seq2Seq模型通常由两部分组成编码器和解码器。

编码器负责读取并理解输入序列将其转换成一个固定长度的上下文向量context

vector。

解码器则利用这个上下文向量生成目标序列其实最核心的就是这个下面都是具体的应用了。

循环神经网络RNN在传统的Seq2Seq模型中编码器和解码器通常是循环神经网络如LSTM或GRU。

RNN可以处理不同长度的输入序列并在其隐藏层保持序列的状态信息。

3.注意力机制Attention注意力机制是后来引入Seq2Seq模型的一项重要改进。

它允许模型在生成每个目标词时“关注”输入序列的不同部分从而提高了模型处理长句子时的效果和准确性。

长短期记忆网络LSTM/门控循环单元GRU为了解决RNN中的长期依赖问题LSTM和GRU这样的网络结构被引入。

它们能更好地捕捉序列中的长期依赖关系。

个人总结我个人觉得Seq2Seq模型就像是学习语言的人。

首先通过“编码器”理解输入的句子然后用“解码器”来表达新的句子。

就像我们学外语时先理解一句话的意思再用自己的语言表达出来。

加上“注意力机制”模型还能更聪明地关注输入句子中最重要的部分就好比我们在听别人说话时会注意对方重点强调的内容。

2.1.1

通过上面我们知道Seq2Seq的主要核心思想是编码器和解码器Seq2Seq一开始被发明出来是用于一些本文处理的但是本文是时间序列领域的文章所以我主要讲解一下编码器-解码器在时间序列领域的应用大家需要注意的是这里的编码器和解码器和Transformer当中的还不一样是有着根本的区别的。

Seq2Seq模型的编码器和解码器如下工作

处理时间序列输入编码器接收时间序列数据例如过去几天的股票价格或气温记录。

这些数据通常是连续的数值。

特征提取通过RNN(本文是用的GRU类似于LSTM和RNN以后也会单独出文章)网络编码器可以捕捉时间序列的特征和内在模式。

RNN通过其时间递归结构有效地处理时间序列数据中的时序依赖关系。

上下文向量编码器输出一个上下文向量该向量是输入时间序列的压缩表示包含了对过去数据的理解和总结。

解码器在时间序列领域的作用是基于编码器提供的信息来预测未来的时间序列数据。

初始状态和输入解码器的初始状态通常由编码器的最终状态设置。

解码器的第一个输入可能是序列的最后一个观测值或特殊标记我设置为解码器的输入是编码器的最后一个输出因为我觉得这个状态的过去信息是最足的。

逐步预测在每个时间步解码器基于当前状态和前一步的预测输出或初始输入来生成下一个时间点的预测值。

迭代更新解码器的输出用于更新其状态并作为下一个时间步的输入。

这个过程在生成整个预测序列期间重复进行。

总结在时间序列领域Seq2Seq模型的编码器-解码器结构使其能够有效处理具有复杂时间依赖性的序列数据。

编码器学习并压缩历史数据的关键信息而解码器则利用这些信息来预测未来的趋势和模式。

2.1.2

下面的图是我编码器-解码器的结构图其中包含了编码器Encoder和解码器Decoder的具体实现细节需要注意的是这个图和本文模型无关这里举出来只是为了让大家对编码器和解码器的流程有一个更清晰的认知。

下面是对这个图示的详细解释

编码器部分左侧

vector转换为嵌入向量。

在此图中嵌入层将每个输入token转换为一个256维的向量。

GRU层门控循环单元Gated

UnitGRU是RNN的一种变体可以捕捉长期依赖关系同时缓解了传统RNN的梯度消失问题。

在此模型中每个时间步的GRU层接收前一时间步的隐藏状态和当前时间步的嵌入向量然后输出新的隐藏状态。

时间步t时间步是序列中的位置指示从t−2开始直至t0表示输入序列的处理进程。

位置标记Pos.

T这可能表示当前处理的token位于输入序列的最后一个位置意味着编码器即将完成对输入序列的处理。

解码器部分右侧

嵌入层解码器的嵌入层将一热编码的输出token转换为嵌入向量。

GRU层解码器的GRU层接收来自上一时间步的隐藏状态和当前时间步的嵌入向量或初始状态从编码器传来的上下文向量然后输出新的隐藏状态。

全连接层在每个时间步全连接层将GRU的输出转换为词汇表大小的向量这个向量包含了输出序列中下一个token的概率分布。

输出概率这是解码器产生的表示下一个可能输出token的概率分布。

时间步t在解码器部分时间步从t1开始直至tT1其中T可能表示目标序列的长度。

整个过程是这样的编码器读取输入序列的token并逐个更新其隐藏状态。

当编码器读取完所有的输入token后最后的隐藏状态ℎ0​被传递到解码器作为其初始状态。

解码器从一个特殊的SOS

token开始逐步生成输出序列的token。

在每一步解码器基于当前的隐藏状态和上一步产生的token预测下一个token直到生成EOS

概念部分的就讲这么多网上有很多概念理解的好博客大家有兴趣都可以自己查找看看本文是实战博客内容不多讲啦~

三、数据集介绍

本文是实战讲解文章上面主要是简单讲解了一下网络结构比较具体的流程还是很复杂的涉及到很多的数学计算下面我们来讲一讲模型的实战内容第一部分是我利用的数据集。

本文我们用到的数据集是ETTh1.csv该数据集是一个用于时间序列预测的电力负荷数据集它是

ETTh

数据内容该数据集通常包含有关电力系统的多种变量如电力负荷、价格、天气情况等。

这些变量可以用于预测未来的电力需求或价格。

时间范围和分辨率数据通常按小时或天记录涵盖了数月或数年的时间跨度。

具体的时间范围和分辨率可能会根据数据集的版本而异。

四、参数讲解

help模型持续更新)parser.add_argument(-window_size,

typeint,

pre_len)parser.add_argument(-pre_len,

typeint,

dataparser.add_argument(-shuffle,

actionstore_true,

help是否打乱数据加载器中的数据顺序)parser.add_argument(-data_path,

typestr,

help你的数据数据地址)parser.add_argument(-target,

typestr,

help你需要预测的特征列这个值会最后保存在csv文件里)parser.add_argument(-input_size,

typeint,

help你的特征个数不算时间那一列)parser.add_argument(-feature,

typestr,

learningparser.add_argument(-lr,

typefloat,

help学习率)parser.add_argument(-drop_out,

typefloat,

help随机丢弃概率,防止过拟合)parser.add_argument(-epochs,

typeint,

help训练轮次)parser.add_argument(-batch_size,

typeint,

help批次大小)parser.add_argument(-save_path,

typestr,

modelparser.add_argument(-hidden_size,

typeint,

help隐藏层单元数)parser.add_argument(-kernel_sizes,

typeint,

default3)parser.add_argument(-laryer_num,

typeint,

deviceparser.add_argument(-use_gpu,

typebool,

defaultTrue)parser.add_argument(-device,

typeint,

optionparser.add_argument(-train,

typebool,

defaultTrue)parser.add_argument(-test,

typebool,

defaultTrue)parser.add_argument(-predict,

typebool,

defaultTrue)parser.add_argument(-inspect_fit,

typebool,

defaultTrue)parser.add_argument(-lr-scheduler,

typebool,

为了大家方便理解文章中的参数设置我都用的中文所以大家应该能够更好的理解。

下面我在进行一遍讲解。

参数名称参数类型参数讲解1modelstr模型名称2window_sizeint时间窗口大小用多少条数据去预测未来的数据

pre_lenint预测多少条未来的数据4shufflestore_true是否打乱输入dataloader中的数据不是数据的顺序

data_pathstr你输入数据的地址6targetstr你想要预测的特征列

featurestr[M,

MS],多元预测多元,单元预测单元,多元预测单元9lrfloat学习率大小

drop_out

batch_sizeint批次大小13svae_pathstr模型的保存路径

hidden_sizeint隐藏层大小15kernel_sizeint卷积核大小

layer_numintlstm层数17use_gpubool是否使用GPU

deviceintGPU编号19trainbool是否进行训练

inspect_fitbool是否进行检验模型22lr_schdulerbool是否使用学习率计划

五、完整代码

复制粘贴到一个文件下并且按照上面的从参数讲解配置好参数即可运行~(极其适合新手和刚入门的读者)

import

torch.from_numpy(self.mean).type_as(data).to(data.device)

else

torch.from_numpy(self.std).type_as(data).to(data.device)

else

torch.from_numpy(self.mean).type_as(data).to(data.device)

else

torch.from_numpy(self.std).type_as(data).to(data.device)

else

使用Matplotlib绘制线图plt.figure()plt.figure(figsize(10,

5))plt.plot(data,

显示图例plt.legend([Loss])plt.show()class

__init__(self,

create_inout_sequences(input_data,

tw,

pre_len]inout_seq.append((train_seq,

train_label))return

StandardScaler()scaler.fit(true_data)train_data

true_data[int(0.3

scaler.transform(train_data)test_data_normalized

scaler.transform(test_data)valid_data_normalized

转化为深度学习模型需要的类型Tensortrain_data_normalized

torch.FloatTensor(train_data_normalized).to(device)test_data_normalized

torch.FloatTensor(test_data_normalized).to(device)valid_data_normalized

torch.FloatTensor(valid_data_normalized).to(device)#

create_inout_sequences(train_data_normalized,

train_window,

create_inout_sequences(test_data_normalized,

train_window,

create_inout_sequences(valid_data_normalized,

train_window,

TimeSeriesDataset(train_inout_seq)test_dataset

TimeSeriesDataset(test_inout_seq)valid_dataset

TimeSeriesDataset(valid_inout_seq)#

shuffleTrue,

drop_lastTrue)print(通过滑动窗口共有训练集数据,

转化为批次数据:,

len(train_loader))print(通过滑动窗口共有测试集数据,

len(test_inout_seq),

len(test_loader))print(通过滑动窗口共有验证集数据,

转化为批次数据:,

len(valid_loader))print(创建数据加载器完成)return

train_loader,

bidirectionalFalse):super().__init__()self.sequence_len

hidden_sizeself.input_feature_len

input_feature_lenself.num_layers

rnn_num_layersself.rnn_directions

bidirectional

nn.GRU(num_layersrnn_num_layers,input_sizeinput_feature_len,hidden_sizehidden_size,batch_firstTrue,bidirectionalbidirectional)def

forward(self,

3:input_seq.unsqueeze_(2)gru_out,

hidden

gru_out.view(input_seq.size(0),

self.sequence_len,

AttentionDecoderCell(nn.Module):def

__init__(self,

hidden_size):super().__init__()#

attention

prev_hidden)self.attention_linear

input_feature_len,

encoder_outputs)self.decoder_rnn_cell

nn.GRUCell(input_sizehidden_size,hidden_sizehidden_size,)self.out

forward(self,

F.softmax(self.attention_linear(attention_input),

dim-1).unsqueeze(1)attention_combine

encoder_output).squeeze(1)rnn_hidden

self.decoder_rnn_cell(attention_combine,

prev_hidden)output

EncoderDecoderWrapper(nn.Module):def

__init__(self,

teacher_forcing0.3):super().__init__()self.encoder

input_size,

AttentionDecoderCell(input_size,

output_size,

nn.Linear(input_size,output_size)def

__call__(self,

self.encoder(input_seq)prev_hidden

encoder_hiddenif

torch.cuda.is_available():outputs

input_seq.size(0),

self.decoder_cell(encoder_output,

prev_hidden,

torch.optim.Adam(model.parameters(),

lr0.005)epochs

train_loader:optimizer.zero_grad()y_pred

labels)single_loss.backward()optimizer.step()losss.append(single_loss.detach().cpu().numpy())tqdm.write(f\t

Epoch

len(losss)})results_loss.append(sum(losss)

len(losss))torch.save(model.state_dict(),

save_model.pth)time.sleep(0.1)#

valid_loss

保存模型print(f模型已保存,用时:{(time.time()

start_time)

min)plot_loss_data(results_loss)def

valid(model,

加载模型进行预测lstm_model.load_state_dict(torch.load(save_model.pth))lstm_model.eval()

评估模式losss

calculate_mae(pred.detach().numpy().cpu(),

np.array(labels.detach().cpu()))

MAE误差计算绝对值(预测值

真实值)losss.append(mae)print(验证集误差MAE:,

losss)return

modelmodel.load_state_dict(torch.load(save_model.pth))model.eval()

评估模式results

calculate_mae(pred.detach().cpu().numpy(),np.array(label.detach().cpu()))

MAE误差计算绝对值(预测值

scaler.inverse_transform(pred.detach().cpu().numpy())label

scaler.inverse_transform(label.detach().cpu().numpy())for

range(len(pred)):results.append(pred[i][-1])labels.append(label[i][-1])plt.figure(figsize(10,

5))print(测试集误差MAE:,

注意这里预测数据的起始x坐标是历史数据的最后一个点的x坐标plt.plot(results,

labelPrediction)#

modelmodel.load_state_dict(torch.load(save_model.pth))model.eval()

评估模式results

scaler.inverse_transform(pred.detach().cpu().numpy())label

scaler.inverse_transform(label.detach().cpu().numpy())for

range(len(pred)):results.append(pred[i][-1])labels.append(label[i][-1])plt.figure(figsize(10,

5))#

注意这里预测数据的起始x坐标是历史数据的最后一个点的x坐标plt.plot(results,

labelPrediction)#

state)plt.legend()plt.show()def

predict(model,

scaler.transform(df)tensor_pred

torch.FloatTensor(pre_data).to(device)tensor_pred

单次预测

modelmodel.load_state_dict(torch.load(save_model.pth))model.eval()

评估模式pred

scaler.inverse_transform(pred.detach().cpu().numpy())#

pred

range(history_length)plt.figure(figsize(10,

5))#

注意这里预测数据的起始x坐标是历史数据的最后一个点的x坐标plt.plot(prediction_x,

pred[:,

labelPrediction)plt.axvline(history_length

colorred)

argparse.ArgumentParser(descriptionTime

Series

forecast)parser.add_argument(-model,

typestr,

help模型持续更新)parser.add_argument(-window_size,

typeint,

pre_len)parser.add_argument(-pre_len,

typeint,

dataparser.add_argument(-shuffle,

actionstore_true,

help是否打乱数据加载器中的数据顺序)parser.add_argument(-data_path,

typestr,

help你的数据数据地址)parser.add_argument(-target,

typestr,

help你需要预测的特征列这个值会最后保存在csv文件里)parser.add_argument(-input_size,

typeint,

help你的特征个数不算时间那一列)parser.add_argument(-feature,

typestr,

learningparser.add_argument(-lr,

typefloat,

help学习率)parser.add_argument(-drop_out,

typefloat,

help随机丢弃概率,防止过拟合)parser.add_argument(-epochs,

typeint,

help训练轮次)parser.add_argument(-batch_size,

typeint,

help批次大小)parser.add_argument(-save_path,

typestr,

modelparser.add_argument(-hidden_size,

typeint,

help隐藏层单元数)parser.add_argument(-laryer_num,

typeint,

deviceparser.add_argument(-use_gpu,

typebool,

defaultTrue)parser.add_argument(-device,

typeint,

optionparser.add_argument(-train,

typebool,

defaultTrue)parser.add_argument(-test,

typebool,

defaultTrue)parser.add_argument(-predict,

typebool,

defaultTrue)parser.add_argument(-inspect_fit,

typebool,

defaultTrue)parser.add_argument(-lr-scheduler,

typebool,

实例化模型try:print(f开始初始化{args.model}模型)model

EncoderDecoderWrapper(args.input_size,

args.output_size,

args.window_size).to(device)print(f开始初始化{args.model}模型成功)except:print(f开始初始化{args.model}模型失败)#

训练模型if

args.train:print(f开始{args.model}模型训练)train(model,

args,

args.test:print(f开始{args.model}模型测试)test(model,

args,

args.inspect_fit:print(f开始检验{args.model}模型拟合情况)inspect_model_fit(model,

args,

args.predict:print(f预测未来{args.pre_len}条数据)predict(model,

args,

我们配置好所有参数之后就可以开始训练模型了根据我前面讲解的参数部分进行配置不懂得可以评论区留言。

七、预测结果

Seq2Seq(GRU)的预测效果图(这里我只预测了未来24个时间段的值为未来一天的预测值)-

7.2

同时我也可以将输出结果用csv文件保存但是功能还没有做我在另一篇informer的文章里实习了这个功能大家如果有需要可以评论区留言有时间我会移植过来最近一直在搞图像领域的文章因为时间序列看的人还是太少了。

另一篇文章链接-时间序列预测实战(十九)魔改Informer模型进行滚动长期预测科研版本结果可视化

将滚动预测结果生成了csv文件方便大家对比和评估以下是我生成的csv文件可以说是非常的直观。

7.4

(从下面的图片可以看出模型拟合的情况还行上一篇RNN的有一点过拟合了其实则会个表现还是很正常的)

八、全文总结

到此本文的正式分享内容就结束了在这里给大家推荐我的时间序列专栏本专栏目前为新开的平均质量分98分后期我会根据各种最新的前沿顶会进行论文复现也会对一些老的模型进行补充目前本专栏免费阅读(暂时大家尽早关注不迷路~)如果大家觉得本文帮助到你了订阅本专栏关注后续更多的更新~

专栏回顾

如果大家有不懂的也可以评论区留言一些报错什么的大家可以讨论讨论看到我也会给大家解答如何解决最后希望大家工作顺利学业有成



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback