【学习笔记】Pytorch深度学习-权值初始化

【学习笔记】Pytorch深度学习-权值初始化

前面学习了搭建网络模型的各个层级与结构,想要训练得到1个良好的网络模型,正确的权值初始化方法可以加快模型的收敛,相反,不恰当的权值初始化可能导致梯度爆炸或消失,最终导致模型无法训练。因此,本节主要从3方面来分析了解权值初始化:(1)分析不恰当的权值初始化是如何引发梯度消失与爆炸的?(2)学习常用的Xavier与Kaiming权值初始化方法;(3)学习Pytorch中10种权值初始化方法。

梯度爆炸和消失

一、理论


图1 3层全连接网络与其对应的计算图

根据计算图,列写出计算图的前向传播计算公式,关注第2个隐藏层权值矩阵   W 2 \ W_2  W2 的梯度如何求取?


要求   W 2 \ W_2  W2 权值矩阵的梯度,从上述求解过程中可以看出,   H 1 \ H_1  H1是上一层神经元的输出值,   W 2 \ W_2  W2 的梯度依赖于上一层的输出:①如果   H 1 \ H_1  H1输出值非常小,趋近于0,那么   W 2 \ W_2  W2 的梯度也就趋于0,从而导致梯度消失;②同理,如果   H 1 \ H_1  H1输出值非常大,趋近于无穷大,   W 2 \ W_2  W2 的梯度也就趋于无穷大,从而导致梯度爆炸。一旦发生梯度爆炸或消失,就会引发模型无法训练的问题。

结论:
从公式求导(求梯度)的角度,要避免梯度消失和爆炸的产生,就要严格控制网络输出层(输出值)的尺度范围,也就是要求每一层网络的输出值不能太大或者太小。

二、实验
(1)实验1——引发梯度爆炸,出现nan现象
代码分析:
这里采用layer_nums=100层全连接网络,每一层神经元个数为neural_num=256,输入数据batch_size=16,构建MLP模型。
(1)init 函数:采用Modulelist和列表生成式,通过for循环,循环构建网络层;又由于Modulelist不能自动前向传播,因此将构建好的Modulelist赋值给linear属性;
(2)forward函数:模型模块Modulelist构建好后,拼接子模块在forward中实现前向传播,只需要利用for循环依次从linear中获取每个全连接层,对全连接层实现前向传播,就可以返回输出值x。
(3)initialize初始化:对每一个模块进行for循环判断是否为线性层linear,如果是,采用标准正态分布(0均值、1标准差)对权值   W \ W  W 进行初始化。
构建好全连接网络后,再构建1个0均值、1标准差的随机输入input,然后输入进net中观察其输出output

class MLP(nn.Module):
    def __init__(self, neural_num, layers):
        super(MLP, self).__init__()
        self.linears = nn.ModuleList([nn.Linear(neural_num, neural_num, bias=False) for i in range(layers)])
        self.neural_num = neural_num

    def forward(self, x):
        for (i, linear) in enumerate(self.linears):
            x = linear(x)
            
        return x

    def initialize(self):
        for m in self.modules():
            if isinstance(m, nn.Linear):
                nn.init.normal_(m.weight.data)  # normal: mean=0, std=1

flag = 1
if flag:
    layer_nums = 100
    neural_nums = 256
    batch_size = 16

    net = MLP(neural_nums, layer_nums)
    net.initialize()

    inputs = torch.randn((batch_size, neural_nums))  # normal: mean=0, std=1

    output = net(inputs)
    print(output)

实验结果


图2 模型采用0均值、1标准差初始化方法的输出结果

结果表明:
Output的每一个值都为nan即数据非常大或者非常小,已经超出了当前精度可表示的范围。

结果分析:
到forward中观察,什么时候数据变化到了nan,这里采用标准差来衡量数据的尺度范围。
打印网络每一层的标准差std,设置判断if,判断x的标准差为nan时,模型停止向前传播。

 def forward(self, x):
        for (i, linear) in enumerate(self.linears):
            x = linear(x)
            x = torch.relu(x)

            print("layer:{}, std:{}".format(i, x.std()))
            if torch.isnan(x.std()):
                print("output is nan in {} layers".format(i))
                break

        return x

实验结果



图3 模型输出结果

结果表明:
从实验结果可以看出,第31层数据的标准差出现了nan,std可能已经达到   1 0 38 \ 10 ^{38}  1038   1 0 39 \ 10 ^{39}  1039;就数据tensor而言,出现了非常大或者非常小的数据即正无穷inf或负无穷-inf,再向前传播,当前精度已经无法表示非常大或者非常小的数据。就标准差而言,std逐层变大,从15.95到256.623再到4107.245…

结果分析:为什么出现了nan现象?以及如何抑制nan出现?
下面根据公式推导分析,为什么模型网络输出层的标准差会逐层变大?


图4 标准差变大的结果分析

抑制nan现象出现:由图4所示,得到1个重要结论,想要控制网络层输出值尺度不变,始终为1,那么有:
D ( H ) = n ∗ D ( X ) ∗ D ( W ) = n ∗ 1 ∗ [ ? ] = 1   D(H)=n*D(X)*D(W)=n*1*[ ? ]=1\, D(H)=nD(X)D(W)=n1[?]=1

D ( W ) = [ ? ] = 1 n   , s t d ( W ) = 1 n D(W)=[ ? ]=\frac{1}{n}\, , std(W)=\sqrt{\frac{1}{n}}\quad D(W)=[?]=n1std(W)=n1
(2)实验2:保持网络层输出值尺度不变的初始化
采用0均值,标准差为 1 n \sqrt{\frac{1}{n}} \quad n1 的分布初始化权值 W W W,再观察网络层输出值标准差的特点。

 def initialize(self):
        for m in self.modules():
            if isinstance(m, nn.Linear):
                 nn.init.normal_(m.weight.data, std=np.sqrt(1/self.neural_num))    ## normal: mean=0, std=1/n

实验结果:


图5 重新初始化后输出结果

结果表明:
根据输出结果可以看出,每层数据标准差都能维持在1左右,采用恰当的权值初始化方法可以实现多层全连接网络输出值尺度维持在一定范围内。 通过以上实例,我们知道需要保持每个网络层输出数据的方差为1,但目前还未考虑激活函数的存在,下面学习具有激活函数的权值初始化。

Xavier和Kaiming方法

一、Xavier初始化

实验:具有激活函数的权值初始化—引发梯度消失

    def forward(self, x):
        for (i, linear) in enumerate(self.linears):
            x = linear(x)
            x = torch.tanh(x)
在forward中,每个linear后进行1个tanh()激活函数

            print("layer:{}, std:{}".format(i, x.std()))
            if torch.isnan(x.std()):
                print("output is nan in {} layers".format(i))
                break

        return x

实验结果:


图6 具有激活函数的权值初始化输出结果

结果表明: 看到网络层输出值的标准差随着网络层的前向传播变得越来越小,说明网络层输出数据变得越来越小,从而导致梯度消失。

针对以上具有激活函数权值初始化的问题,2010年Xavier详细探讨了具有激活函数应该如何进行初始化。文献中,结合 “方差一致性原则:要求每个网络层输出值的方差为1”,同时针对饱和激活函数sigmoid、Tanh激活函数进行了分析。

Xavier初始化
1、理论
通过 《Understanding the diffculty of training deep feedforward nerual networks》 文章中的公式推导, 权值的方差 D ( W ) D(W) D(W)满足如下公式:其中,   n i \ n_i  ni为输入层神经元个数,   n i + 1 \ n_{i+1}  ni+1为输出层神经元个数,下式是同时考虑了前向传播和反向传播的数据尺度问题得到的:
  n i ∗ D ( W ) = 1   , n i + 1 ∗ D ( W ) = 1 \ n_i*D(W)=1\, , n_{i+1}*D(W)=1  niD(W)=1,ni+1D(W)=1

⇒ D ( W ) = 2 n i + n i + 1 \Rightarrow D(W)=\frac{2}{n_i +n_{i+1}} D(W)=ni+ni+12

通常,Xavier采用均匀分布,下面推导均匀分布的上、下限。因为采用0均值,因此,分布的上下限是对称关系   W ∼ U [ − a , a ] \ {W\sim U[-a ,a]}  WU[a,a]
  D ( W ) = ( − a − a ) 2 12 = 2 a 2 12 = a 2 3 \ D(W)=\frac{(-a-a)^2}{12}=\frac{2a^2}{12}=\frac{a^2}{3}  D(W)=12(aa)2=122a2=3a2
上下联立:   D ( W ) = a 2 3 = 2 n i + n i + 1 \ D(W)=\frac{a^2}{3}=\frac{2}{n_i +n_{i+1}}  D(W)=3a2=ni+ni+12,解得:   a = 6 n i + n i + 1 \ a=\frac{\sqrt{6}}{\sqrt {n_i+n_{i+1}}}  a=ni+ni+1 6
因此,权值分布的上、下限为:
  W ∼ U [ − 6 n i + n i + 1 , 6 n i + n i + 1 ] \ {W\sim U[-\frac{\sqrt{6}}{\sqrt {n_i+n_{i+1}}} ,\frac{\sqrt{6}}{\sqrt {n_i+n_{i+1}}}]}  WU[ni+ni+1 6 ,ni+ni+1 6 ]
2、验证实验
①手动计算,采用Xavier对权值进行初始化再观察网络层的输出。

def initialize(self):
        for m in self.modules():
            if isinstance(m, nn.Linear):
#计算a的数值大小(由于本例中输入和输出神经元个数相同,所以同值)
                a = np.sqrt(6 / (self.neural_num + self.neural_num))  
#利用Pytorch的内置函数calculate_gain计算tanh增益
                tanh_gain = nn.init.calculate_gain('tanh')
                a *= tanh_gain
#利用上、下限对权值进行均匀分布初始化
                nn.init.uniform_(m.weight.data, -a, a)

实验结果:


图7 Xavier权值初始化输出结果
采用Xavier初始化后,输出结果基本控制在了0.65左右。

②Pytorch中提供了Xavier,对权值进行初始化,观察与手动计算的输出结果有无区别。

    def initialize(self):
        for m in self.modules():
            if isinstance(m, nn.Linear):
                 nn.init.xavier_uniform_(m.weight.data, gain=tanh_gain)

实验结果:


图8 Pytorch中Xavier权值初始化输出结果

该结果印证了Pytorch提供的Xavier初始化方法与手动计算均匀分布上、下限的Xavier初始化方法基本相同,没有太大区别。虽然2010年针对饱和激活函数提出了有效初始化方法,但是在2010年Alexnet出现以后,非饱和激活函数被广泛使用,Xavier针对非饱和激活函数不再适用。

Kaiming初始化
1、理论
针对这一问题,2015年何恺明等人发表 《Delving deep into rectifiers:Surpassing human-level performance on ImageNet classification》 提出了解决方法,在文中同样遵循方差一致性原则:保持数据尺度维持在恰当范围,即让每个输出层方差为1,针对ReLU激活函数(及其变种)。
通过公式推导,权值的方差 D ( W ) D(W) D(W)满足如下公式,其中,   n i \ n_i  ni为输入层神经元个数:
  D ( W ) = 2 n i \ D(W)=\frac{2}{n_i}  D(W)=ni2
进一步,针对ReLU的变种(即负半轴存在斜率)权值的方差 D ( W ) D(W) D(W)有,a为负半轴的斜率
  D ( W ) = 2 ( 1 + a 2 ) ∗ n i \ D(W)=\frac{2}{(1+a^2)*n_i}  D(W)=1+a2ni2
因此,权值矩阵 s t d ( W ) std(W) std(W)有:
  s t d ( W ) = 2 ( 1 + a 2 ) ∗ n i \ std(W)=\sqrt\frac{2}{(1+a^2)*n_i}  std(W)=1+a2ni2

2、验证实验
下面通过上述公式对权值 W W W进行初始化,观察网络层的输出。
①手动计算的Kaiming初始化方法

def initialize(self):
        for m in self.modules():
            if isinstance(m, nn.Linear):
                 nn.init.normal_(m.weight.data, std=np.sqrt(2 / self.neural_num))

②Pytorch中提供的Kaiming初始化方法

def initialize(self):
        for m in self.modules():
            if isinstance(m, nn.Linear):
                nn.init.kaiming_normal_(m.weight.data)

常用的初始化方法

不良的权值初始化会引起输出层输出值过大、过小从而引起梯度爆炸或消失,导致模型无法训练的问题。为避免这一问题,要控制网络层输出值的尺度范围,使每一个网络层输出值的方差尽量为1,不让方差过大或者过小。
Pytorch提供的10大初始化方法:
1、Xavier均匀分布
2、Xavier标准正态分布

3、Kaiming均匀分布
4、Kaiming标准正态分布

5、均匀分布
6、正态分布
7、常数分布

8、正交矩阵初始化
9、单位矩阵初始化
10、稀疏矩阵初始化
无论选择哪一种初始化方法都需要遵循方差一致性原则。

实验——函数 “calculate_gain方差变化尺度

nn.init.calculate_gain
主要功能:计算激活函数的方差变化尺度
主要参数:nonlinearity-激活函数名称
param:激活函数的参数,如Leaky ReLU的negative_slop

  c a l c u l a t e g a i n = 输 入 数 据 的 方 差 经 过 激 活 函 数 后 输 出 数 据 的 方 差 \ calculate gain=\frac{输入数据的方差}{经过激活函数后输出数据的方差}  calculategain=
① 手动计算输入输出增益gain

       x = torch.randn(10000)
    out = torch.tanh(x)

    gain = x.std() / out.std()
    print('gain:{}'.format(gain))

② Pytorch中提供求增益gain

       x = torch.randn(10000)
    out = torch.tanh(x)

    tanh_gain = nn.init.calculate_gain('tanh')
    print('tanh_gain in PyTorch:', tanh_gain)

图9 手动计算、Pytorch计算激活函数增益

对于0均值、1标准差的数据x经过tanh后,标准差会减小约1.6倍。

又青。
关注 关注
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
pytorch学习笔记九:权值初始化
Dear_learner的博客
02-21 2250
一、概念 权值初始化是指在网络模型训练之前,对各节点的权值和偏置初始化的过程,正确的初始化会加快模型的收敛,从而加快模型的训练速度,而不恰当的初始化可能会导致梯度消失或梯度爆炸,最终导致模型无法训练。 如上图所示的一个基本的CNN网络结构,数据在网络结构中流动时,会有如下的公式(默认没有偏置): 在反向传播的过程中,由于是复合函数的求导,根据链式求导法则,会有两组导数,一个是损失函数Cost对Z的导数,一个是损失函数对W的导数, 1、损失函数关于状态Z的梯度: 2、损失函数关于W的梯度: 可以看出,
简单粗暴PyTorch权值初始化方法与重要性
qq_36642243的博客
08-15 664
权值初始化一、梯度消失与爆炸二、Xavier方法与Kaiming方法三、常用初始化方法 一、梯度消失与爆炸 不恰当的权值初始化,可能带来梯度消失与爆炸。 H2=H1∗W2ΔW2=∂Loss∂W2=∂Loss∂out∗∂out∂H2∗∂H2∂w2=∂Loss∂out∗∂out∂H2∗H1\begin{aligned} \mathrm{H}_{2}=& \mathrm{H}_{1} * \mathrm{W}_{2} \\ \Delta \mathrm{W}_{2} &=\frac{\parti
梯度下降权值更新图解
09-22
关于神经网络 梯度下降的公式推导,资料来自中文维基百科:反向传播算法。这里对其进行了图解。发现还是维基比较好,原来一开始看英文版的反向传播算法,最后公式纠结了老半天,估计是错的吧,但是中文版的公式却很好理解,奇怪为啥会不一样。
BP网络权值调公式推导(梯度下降算法推导)
Strive_LiJiaLe的博客
03-30 1446
最近学习神经网络时,看到调整权值时,对下图公式5.23不是很清楚,搞不懂为什么ε要对w求偏导数,看了很多权值调整的博客也没有细讲其推论,都是只给出下图中的这些公式。 经过翻阅书籍终于找到了,5.23这个公式是如何得来的。 这要从梯度下降算法推导来理解: 首先看一下梯度的定义: 看不懂也没关系,只要认识梯度的符号▽ 请看下面的推导过程: 可以发现5.19和5.23很相似,就可以将5.19的推论应用到5.23来理解。 5.19:对x的变化更新,通过f(x)对x的导数(梯度)来描述。再乘以学习率。 5.23
深度学习- 2.10 Xavier方法与kaiming方法(HE初始化
最新发布
weixin_43186779的博客
03-21 1445
尽管Xavier初始化能够在Sigmoid和tanh激活函数叠加的神经网络中起到一定的效果,但由于ReLU激活函数属于非饱和类激活函数,并不会出现类似Sigmoid和tanh激活函数使用过程中可能存在的梯度消失或梯度爆炸问题,反而因为ReLU激活函数的不饱和特性,ReLU激活函数的叠加极有可能出现神经元活性消失的问题,很明显,该类问题无法通过Xavier初始化解决。对于参数初始化计算过程,最重要的是确定参数的方差,如果是正态分布,由于均值是0,因此可以快速确定其分布,而如果是均匀分布,则可通过。
PyTorch权值初始化的十种方法
weixin_36670529的博客
05-13 2323
pytorch在torch.nn.init中提供了常用的初始化方法函数,这里简单介绍,方便查询使用。 介绍分两部分: 1. Xavier,kaiming系列; 2. 其他方法分布 Xavier初始化方法,论文在《Understanding the difficulty of training deep feedforward neural networks》 公式推导是从“方差一致性”出...
深度学习修炼(一)线性分类器 | 权值理解、支撑向量机损失、梯度下降算法通俗理解
专注于人工智能的算法与应用
02-20 1492
神经网络基础笔记,线性分类器以及最初的一些损失函数,优化算法等
Pytorch深度学习-权值初始化
qq_43263543的博客
03-20 966
前面学习了搭建网络模型的各个层级与结构,想要训练得到1个良好的网络模型,正确的权值初始化方法可以加快模型的收敛,相反,不恰当的权值初始化可能导致梯度爆炸或消失,最终导致模型无法训练。因此,本节主要从3方面来分析了解权值初始化:(1)分析不恰当的权值初始化是如何引发梯度消失与爆炸的?(2)学习常用的Xavier与Kaiming权值初始化方法;(3)学习Pytorch中10种权值初始化方法。 梯度爆炸和消失 一、理论 图1 3层全连接网络与其对应的计算图 根据计算图,列写出计算图的前向传播计算公式,关注第2个
pytorch学习--权值初始化
abcdrachel的博客
11-05 1565
正确的权值初始化可以加快模型的收敛,不恰当的初始化会引发梯度消失和爆炸 梯度消失与爆炸 不恰当初始化如何引起梯度消失和爆炸的: 下面是三层的全连接网络,我们来看第二个隐藏权值梯度是如何求取的 X 如果,则,从而导致了梯度消失; 如果,则,从而导致了梯度爆炸。 一旦引发...
Pytorch总结八之深度学习计算(1)模型构造,参数访问、初始化和共享
yohnyang的博客
09-20 1046
Pytorch总结八之深度学习计算(1)模型构造,参数访问、初始化和共享
深度学习PyTorch入门实战教程-网盘链接和密码-永久有效-详细教程
06-11
这是一套深度学习PyTorch入门实战教程,适合学习深度学习的学者和PyTorch学习者,由于视频比较大只能通过网盘分享,上传的文件里是网盘链接和密码。章节包括以下内容:01 介绍;02 深度学习初见;03 基础张量操作...
PyTorch深度学习Hotel-ID打击人口贩卖》脚本
09-20
案例文章链接 https://datayang.blog.csdn.net/article/details/126819153 https://datayang.blog.csdn.net/article/details/126819968 https://datayang.blog.csdn.net/article/details/126820458
动手学深度学习-pytorch-源代码
04-14
动手学深度学习-pytorch-源代码
pytorch-CycleGAN-and-pix2pix-master
04-25
pytorch-CycleGAN-and-pix2pix-master的一个代码
PyTorch深度学习-Anaconda和PyTorch安装
07-21
Anaconda3-2023.07-0-Windows-x86_64
PyTorch学习笔记:针对一个网络的权重初始化方法
一颗胡萝卜的秘密基地
01-24 1222
# 针对一个网络的权重初始化方法 import torch import torch.nn as nn ## 建立一个测试网络 class TestNet(nn.Module): def __init__(self): super(TestNet, self).__init__() self.conv1 = nn.Conv2d(3, 16, 3) self.hidden = nn.Sequential( nn.Linear.
理解网络权重初始化Pytorch
码农1479的博客
04-07 1935
利用线性代数和概率基础知识理解神经网络权重初始化方法。
神经网络权重初始化代码 init.kaiming_uniform_
XU_MAN_的博客
01-24 1015
https://blog.csdn.net/qq_41917697/article/details/116033589
PyTorch深度学习-数据处理
05-27
PyTorch是一个用于深度学习的开源框架,它提供了一组工具和接口,使得我们可以轻松地进行模型训练、预测和部署。在PyTorch中,数据处理是深度学习应用的重要部分之一。 PyTorch中的数据处理主要涉及以下几个方面: ...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 【复习笔记】电分-第六章-同步发电机的数学模型及电力系统静态、暂态稳定性分析 6086
  • 【学习笔记】Pytorch深度学习—优化器(一) 4167
  • 【复习笔记】电分-第三章-电力系统潮流分析与计算 3863
  • 【复习笔记】电分-第四章-电力系统有功功率和频率调整 3350
  • 【学习笔记】Pytorch深度学习-网络层之池化层、线性层、激活函数层 2870

分类专栏

  • 电力系统分析 付费 9篇
  • 电网络 付费 2篇
  • CVbaseline论文精读 3篇
  • 工作笔记
  • 继电保护原理

最新评论

  • 【数据集】各类绝缘子、鸟巢及防震锤数据集汇总

    weixin_48481935: 您好,请问有防震锤之类的输电线路的小目标的数据集吗

  • 【数据集】各类绝缘子、鸟巢及防震锤数据集汇总

    又青。: 私信购买

  • 【数据集】各类绝缘子、鸟巢及防震锤数据集汇总

    2301_81986799: 你好 防震锤数据集

  • 【数据集】各类绝缘子、鸟巢及防震锤数据集汇总

    shmingszt: 您好,数据集怎么得

  • 【数据集】各类绝缘子、鸟巢及防震锤数据集汇总

    2301_81595911: 私信你了

大家在看

  • 【聚星文社】用Midjourney批量制作小说推文视频,最强MJ推文工具!
  • C++:特殊类设计和四种类型转换 1640
  • Nginx+Tomcat负载均衡、动静分离集群
  • 计算机网络7——网络安全4 防火墙和入侵检测 563
  • 【因果推断python】15_工具变量1

最新文章

  • 【数据集】各类绝缘子、鸟巢及防震锤数据集汇总
  • 【深度学习CV-baseline】GoogleNet-更深的卷积神经网络
  • 【复习笔记】电网络-第2章-网络图论基本理论
2022年13篇
2021年2篇
2020年15篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又青。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司菏泽网络营销哪家好哈密关键词按天扣费报价忻州百度标王哪家好通辽seo排名报价海南营销型网站建设报价南宁百度网站优化排名价格济南网络推广报价沈阳百度关键词包年推广开封网站优化推广报价汕头关键词排名公司沧州模板推广哪家好咸宁百度seo公司鹤岗seo价格丹竹头网站改版多少钱娄底企业网站建设报价海西模板网站建设公司济宁建网站价格白银百度seo公司衡水SEO按天计费多少钱果洛网页制作哪家好惠州百度竞价包年推广多少钱大丰网站推广方案报价六安网站制作设计公司湘西网站推广多少钱益阳网站改版价格自贡SEO按天收费哪家好大浪网站搜索优化哪家好遂宁企业网站设计价格宝安企业网站设计公司张家口seo网站优化报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化