lstm除了序贯模型还有什么

lstm除了序贯模型还有什么,第1张

Model式模型

1、lstm包含Model式模型和序贯模型。

2、Model式模型可以同时分阶段输入变量,分阶段输出想要的模型。

3、是函数式模型的简略版,为最简单的线性、从头到尾的结构顺序,不分叉。

当使用Python + LSTM进行训练时,特征数量过大可能会导致梯度爆炸问题。这时有以下几种方法来处理这个问题:

1 梯度裁剪:梯度裁剪可以限制梯度的范围,避免梯度爆炸。这个方法可以在每一次训练迭代中修改优化器的`clipvalue`或`clipnorm`参数,以控制梯度的大小。

2 权重约束:权重约束可以限制权重的范围,也可以避免网络产生和学习出类似的特征。在使用LSTM网络时,可以通过kernel、recurrent_kernel和bias进行约束。

3 数据归一化:特征之间的差异过大也会导致LSTM网络训练梯度爆炸。因此,在训练之前需要对数据进行归一化处理。可以使用标准化方法或缩放方法来归一化数据。

4 减少特征数量:如果出现梯度爆炸问题,可以考虑减少特征数量。可以采用一些常见的特征选择方法如PCA(主成分分析),或者单独使用Feature-Packing+Bottleneck Method进一步提取特征。

5 LSTM网络结构优化:在LSTM网络结构的优化中,可以在每个时刻将所有时刻的信息相加,以减少梯度爆炸的影响。也可以考虑添加dropout层和batch normalization层。

总结来说,处理LSTM网络特征数量过大的梯度爆炸问题,可以采用梯度裁剪、权重约束、数据归一化、减少特征数量和优化LSTM网络结构等方法来解决。需要根据具体的情况选择合适的方法来应对梯度爆炸的问题。

希望能够帮到您!

一、参考目录:

官方文档

Stateful LSTM in Keras  (必读圣经)

案例灵感来自此GitHub

Stateful and Stateless LSTM for Time Series Forecasting with Python  (这篇可以看完本文再看)

二、官方文档简介

stateful: Boolean (default False) If True, the last state for each sample at index i in a batch will be used as initial state for the sample of index i in the following batch 

使 RNN 具有状态意味着每批样品的状态将被重新用作下一批样品的初始状态。

注意,此处的状态表示的是原论文公式里的c,h,即LSTM特有的一些记忆参数,并非w权重。

当使用有状态 RNN 时,假定:

所有的批次都有相同数量的样本

如果x1和x2是连续批次的样本,则x2[i]是x1[i]的后续序列,对于每个i

要在 RNN 中使用状态,你需要:

通过将batch_size参数传递给模型的第一层来显式指定你正在使用的批大小。例如,对于10个时间步长的32样本的batch,每个时间步长具有16个特征,batch_size = 32

在RNN层中设置stateful = True

在调用fit()时指定shuffle = False

有点绕,我给翻译翻译

假设Timestep=5,batch_size=2

X1和X2就是连续的两个批次,X2[i]是X1[i]的后续序列,也就是说,床前明月光后面是疑是地上霜

光的状态会传递到疑作为初始状态,也就是用光输出的(h, c)来初始化疑的(h, c)

那就不难理解为什么“所有的批次都有相同数量的样本”,如果不同批次的样本数不同,那上一批次传过来的(h, c)将没人接手

进而,Keras文档说用stateful需要指定batch_size也没毛病,不指定的话,Keras默认容忍最后一个批次样本数不同。例如,samples=9,batch_szie=2,那么默认分成5批,最后一批只有1个样本

下一个问题,shuffle

shuffle = True会在每个epoch开始之前打乱 训练集 数据顺序,使用stateful LSTM肯定要设置shuffle = False,不然光可能传给汗不就乱套了

三、疑问解答:

将一个很长的序列(例如时间序列)分成小序列来构建我的输入矩阵。那LSTM网络会发现我这些小序列之间的关联依赖吗?

不会,除非你使用 stateful LSTM 。大多数问题使用stateless LSTM即可解决,所以如果你想使用stateful LSTM,请确保自己是真的需要它。在stateless时,长期记忆网络并不意味着你的LSTM将记住之前batch的内容。

在Keras中stateless LSTM中的stateless指的是

注意,此文所说的stateful是指的在Keras中特有的,是batch之间的记忆cell状态传递。而非说的是LSTM论文模型中表示那些记忆门,遗忘门,c,h等等在同一sequence中不同timesteps时间步之间的状态传递。

假定我们的输入X是一个三维矩阵,shape = (nb_samples, timesteps, input_dim),每一个row代表一个sample,每个sample都是一个sequence小序列。X[i]表示输入矩阵中第i个sample。步长啥的我们先不用管。

当我们在默认状态stateless下,Keras会在训练每个sequence小序列(=sample)开始时,将LSTM网络中的记忆状态参数reset初始化(指的是c,h而并非权重w),即调用modelreset_states()。

为啥stateless LSTM每次训练都要初始化记忆参数

因为Keras在训练时会默认地shuffle samples,所以导致sequence之间的依赖性消失,sample和sample之间就没有时序关系,顺序被打乱,这时记忆参数在batch、小序列之间进行传递就没意义了,所以Keras要把记忆参数初始化。

那stateful LSTM到底怎么传递记忆参数?

首先要明确一点,LSTM作为有记忆的网络,它的有记忆指的是在一个sequence中,记忆在不同的timesteps中传播。举个例子,就是你有一篇文章X,分解,然后把每个句子作为一个sample训练对象(sequence),X[i]就代表一句话,而一句话里的每个word各自代表一个timestep时间步,LSTM的有记忆即指的是在一句话里,X[i][0]第一个单词(时间步)的信息可以被记忆,传递到第5个单词(时间步)X[i][5]中。

而我们突然觉得,这还远远不够,因为句子和句子之间没有任何的记忆啊,假设文章一共1000句话,我们想预测出第1001句是什么,不想丢弃前1000句里的一些时序性特征(stateless时这1000句训练时会被打乱,时序性特征丢失)。那么,stateful LSTM就可以做到。

在stateful = True 时,我们要在fit中手动使得shuffle = False。随后,在X[i](表示输入矩阵中第i个sample)这个小序列训练完之后,Keras会将将训练完的记忆参数传递给X[i+bs](表示第i+bs个sample),作为其初始的记忆参数。bs = batch_size。这样一来,我们的记忆参数就能顺利地在sample和sample之间传递,X[i+nbs]也能知道X[i]的信息。

用可以更好地展示,如下图,蓝色箭头就代表了记忆参数的传递,如果stateful = False,则没有这些蓝色箭头。

stateful LSTM中为何一定要提供batch_size参数?

我们可以发现,记忆参数(state)是在每个batch对应的位置跳跃着传播的,所以batch_size参数至关重要,在stateful lstm层中必须提供。

那stateful时,对权重参数w有影响吗?

我们上面所说的一切记忆参数都是LSTM模型的特有记忆c,h参数,和权重参数w没有任何关系。无论是stateful还是stateless,都是在模型接受一个batch后,计算每个sequence的输出,然后平均它们的梯度,反向传播更新所有的各种参数。

四、总结

如果你还是不理解,没关系,简单的说:

stateful LSTM:能让模型学习到你输入的samples之间的时序特征,适合一些长序列的预测,哪个sample在前,那个sample在后对模型是有影响的。

stateless LSTM:输入samples后,默认就会shuffle,可以说是每个sample独立,之间无前后关系,适合输入一些没有关系的样本。

如果你还是不理解,没关系……举个例子:

stateful LSTM:我想根据一篇1000句的文章预测第1001句,每一句是一个sample。我会选用stateful,因为这文章里的1000句是有前后关联的,是有时序的特征的,我不想丢弃这个特征。利用这个时序性能让第一句的特征传递到我们预测的第1001句。(batch_size = 10时)

stateless LSTM:我想训练LSTM自动写诗句,我想训练1000首诗,每一首是一个sample,我会选用stateless LSTM,因为这1000首诗是独立的,不存在关联,哪怕打乱它们的顺序,对于模型训练来说也没区别。

中公教育联合中科院专家打造的深度学习分八个阶段进行学习:

第一阶段AI概述及前沿应用成果介绍

深度学习的最新应用成果

单层/深度学习与机器学习

人工智能的关系及发展简

第二阶段神经网络原理及TensorFlow实战

梯度下降优化方法

前馈神经网络的基本结构和训练过程

反向传播算法

TensorFlow开发环境安装

“计算图”编程模型

深度学习中图像识别的操作原理

第三阶段循环神经网络原理及项目实战

语言模型及词嵌入

词嵌入的学习过程

循环神经网络的基本结构

时间序列反向传播算法

长短时记忆网络(LSTM)的基本结构

LSTM实现语言模型

第四阶段生成式对抗网络原理及项目实战

生成式对抗网络(GAN)的基本结构和原理

GAN的训练过程

GAN用于生成的实现

第五阶段深度学习的分布式处理及项目实战

多GPU并行实现

分布式并行的环境搭建

分布式并行实现

第六阶段深度强化学习及项目实战

强化学习介绍

智能体Agent的深度决策机制(上)

智能体Agent的深度决策机制(中)

智能体Agent的深度决策机制(下)

第七阶段车牌识别项目实战

数据集介绍及项目需求分析

OpenCV库介绍及车牌定位

车牌定位

车牌识别

学员项目案例评讲

第八阶段深度学习前沿技术简介

深度学习前沿技术简介

元学习

迁移学习等

详情查看深度学习。

一、一般处理流程

语料获取 -> 文本预处理 -> 特征工程 -> 特征选择

1、语料获取

即需要处理的数据及用于模型训练的语料。

数据源可能来自网上爬取、资料积累、语料转换、OCR转换等,格式可能比较混乱。需要将url、时间、符号等无意义内容去除,留下质量相对较高的非结构化数据。

2、文本预处理

将含杂质、无序、不标准的自然语言文本转化为规则、易处理、标准的结构化文本。

①处理标点符号

可通过正则判定、现有工具(zhon包)等方式筛选清理标点符号。

②分词

将连续的自然语言文本,切分成具有语义合理性和完整性的词汇序列的过程。

一般看来英文较容易可通过空格符号分词,中文相对复杂,参考结巴分词、盘古分词、Ansj等工具。

常见的分词算法有:基于字符串匹配的分词方法、基于理解的分词方法、基于统计的分词方法和基于规则的分词方法,每种方法下面对应许多具体的算法。

③词性标注

为自然语言文本中的每个词汇赋予一个词性的过程,如名词、动词、副词等。可以把每个单词(和它周围的一些额外的单词用于上下文)输入预先训练的词性分类模型。

常用隐马尔科夫模型、N 元模型、决策树

④stop word

英文中含大量 a、the、and,中文含大量 的、是、了、啊,这些语气词、助词没有明显的实际意义,反而容易造成识别偏差,可适当进行过滤。

⑤词形还原

偏向于英文中,单数/复数,主动/被动,现在进行时/过去时/将来时等,还原为原型。

⑥统计词频

因为一些频率过高/过低的词是无效的,对模型帮助很小,还会被当做噪声,做个词频统计用于停用词表。

⑦给单词赋予id

给每一个单词一个id,用于构建词典,并将原来的句子替换成id的表现形式

⑧依存句法分析

通过分析句子中词与词之间的依存关系,从而捕捉到词语的句法结构信息(如主谓、动宾、定中等结构关系),并使用树状结构来表示句子的句法结构信息(如主谓宾、定状补等)。

3、特征工程

做完语料预处理之后,接下来需要考虑如何把分词之后的字和词语表示成计算机能够计算的类型。

如果要计算我们至少需要把中文分词的字符串转换成数字,确切的说应该是数学中的向量。有两种常用的表示模型分别是词袋模型和词向量。

①词向量

词向量是将字、词语转换成向量矩阵的计算模型。目前为止最常用的词表示方法是 One-hot,这种方法把每个词表示为一个很长的向量。

②词袋模型

即不考虑词语原本在句子中的顺序,直接将每一个词语或者符号统一放置在一个集合(如 list),然后按照计数的方式对出现的次数进行统计。统计词频这只是最基本的方式,TF-IDF 是词袋模型的一个经典用法。

常用的表示模型有:词袋模型(Bag of Word, BOW),比如:TF-IDF 算法;词向量,比如 one-hot 算法、word2vec 算法等。

4、特征选择

在文本挖掘相关问题中,特征工程也是必不可少的。在一个实际问题中,构造好的特征向量,是要选择合适的、表达能力强的特征。

举个自然语言处理中的例子来说,我们想衡量like这个词的极性(正向情感还是负向情感)。我们可以预先挑选一些正向情感的词,比如good。然后我们算like跟good的PMI,用到点互信息PMI这个指标来衡量两个事物之间的相关性。

特征选择是一个很有挑战的过程,更多的依赖于经验和专业知识,并且有很多现成的算法来进行特征的选择。目前,常见的特征选择方法主要有 DF、 MI、 IG、 CHI、WLLR、WFO 六种。

5、模型训练

在特征向量选择好了以后,接下来要做的事情是根据应用需求来训练模型,我们使用不同的模型,传统的有监督和无监督等机器学习模型,如 KNN、SVM、Naive Bayes、决策树、GBDT、K-means 等模型;深度学习模型比如 CNN、RNN、LSTM、 Seq2Seq、FastText、TextCNN 等。这些模型在分类、聚类、神经序列、情感分析等应用中都会用到。

当选择好模型后,则进行模型训练,其中包括了模型微调等。在模型训练的过程中要注意由于在训练集上表现很好,但在测试集上表现很差的过拟合问题以及模型不能很好地拟合数据的欠拟合问题。同时,也要防止出现梯度消失和梯度爆炸问题。

6、模型评估

在机器学习、数据挖掘、推荐系统完成建模之后,需要对模型的效果做评价。模型的评价指标主要有:错误率、精准度、准确率、召回率、F1 值、ROC 曲线、AUC 曲线等。

7、投产上线

模型的投产上线方式主要有两种:一种是线下训练模型,然后将模型进行线上部署提供服务;另一种是在线训练模型,在线训练完成后将模型 pickle 持久化,提供对外服务。

三、NLP应用方向

1、命名实体识别

指识别自然语言文本中具有特定意义的实体,主要包括人名、地名、机构名、时间日期等。

传统机器学习算法主要有HMM和CRF,深度学习常用QRNN、LSTM,当前主流的是基于bert的NER。

2、情感分析

文本情感分析和观点挖掘(Sentiment Analysis),又称意见挖掘(Opinion Mining)是自然语言处理领域的一个重要研究方向。简单而言,是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。

情感分析技术可以分为两类,一类是基于机器学习的方法,通过大量有标注、无标注的主观语料,使用统计机器学习算法,通过提取特征,进行文本情感分析。另一类是基于情感词典的方法,根据情感词典所提供的词的情感极性(正向、负向),从而进行不同粒度的(词语、短语、属性、句子、篇章)下的文本情感分析。

3、文章标签

文章标签是利用机器学习算法,对文章进行文字和语义的分析后,提取出若干个重要的词或者短语(关键短语)。关键短语是NLP基础的算法模块,有了关键短语,能为后续的搜索、推荐等更高级的应用提供有力的抓手。

适用场景:1、个性化推荐:通过对文章的标签计算,结合用户画像,精准的对用户进行个性化推荐;2、话题聚合:根据文章计算的标签,聚合相同标签的文章,便于用户对同一话题的文章进行全方位的信息阅读;3、搜索:使用中心词可以对query进行相似度计算、聚类、改写等,可以用于搜索相关性计算。

4、案件串并

①信息抽取

运用实体抽取、关系抽取,从案情中抽取关键信息,如从警情中可以抽取报警人项目、报警人电话、案发地址等信息

②实体对齐

相同的实体在不同的案情中会有不同的表述,会给串并带来困难。可针对地址、人名、组织名进行对齐处理。

③文本聚类

对于关键片段类信息,无法像实体那样对齐,需要借助文本聚类技术进行关联。

④构建图谱

将信息抽取结果存入图谱。每个警情id对应一个节点,实体、属性、关键片段作为节点,对齐的实体、同一类的文本存为同一个节点。

除了来自于从警情中抽取的信息,还可以将其他警务系统中存在的结构化数据导入(如来自户籍信息的人物关系),从而丰富图谱。

⑤图谱检索

完成以上工作,即完成了案件串并的必要基础建设,接下来通过图谱的查询功能自动完成案件的串并。首先需要设定串并的条件,案件串并的条件在警务实战中已有很多的积累,如“具有相似的作案手段”,又如“相似作案手段,嫌疑人有共同联系人”,只需要将这些条件用图谱查询语言表达出来。

RNN模型的基础结构是单元,其中比较常见的有LSTM单元,GRU单元等,它们充当了RNN模型中的基础结构部分。使用单元搭建出来的RNN模型会有更好的拟合效果。

LSTM单元与GRU单元是RNN模型中最常见的单元,其内容由输入门、忘记门、和输出门三种结构组合而成。

LSTM单元与GRU单元的作用几乎相同,唯一不同的是:

相比之下,使用GRU单元会更加简单。

QRNN(Quasi-Recurrent Neural Networks) 单元是一种RNN模型的基础单元,它比LSTM单元速度更快。

QRNN单元发表于2016年。它使用卷积操作替代传统的循环结构,其网络结构介于RNN与CNN之间。

QRNN内部的卷积结构可以将序列数据以矩阵方式同时运算,不再像循环结构那样必须按照序列顺序依次计算。其以并行的运算方式取代了串行,提升了运算速度。在训练时,卷积结构也要比循环结构的效果更加稳定。

在实际应用中,QRNN 单元可以与RNN模型中的现有单元随意替换。

了解更多,可以参考论文:

Quasi-Recurrent Neural Networks

SRU单元是RNN模型的基础单元,它的作用与QRNN单元类似,也是对LSTM单元在速度方面进行了提升。

LSTM单元必须要将样本按照序列顺序一个个地进行运算,才能够输出结果。这种运算方式使得单元无法在多台机器并行计算的环境中发挥最大的作用。

SRU单元被发表于2017年。它保留LSTM单元的循环结构,通过调整运算先后顺序的方式(把矩阵乘法放在串行循环外,把相乘的再相加的运算放在串行循环内)提升了运算速度。

若需要研究SRU单元更深层次理论,可以参考如下论文:

Simple Recurrent Units for Highly Parallelizable Recurrence

关于函数tfcontribrnnSRUCell 的更多使用方法,可以参照官方帮助文档。

https://wwwtensorfloworg/api_docs/python/tf/contrib/rnn/SRUCell

注:需要科学上网

github可以参考:

https://githubcom/tensorflow/tensorflow/blob/r115/tensorflow/contrib/rnn/python/ops/rnn_cellpy#L2738-L2816

传统文本处理任务的方法中一般将TF-IDF向量作为特征输入。显而易见,这样的表示实际上丢失了输入的文本序列中每个单词的顺序。在神经网络的建模过程中,一般的前馈神经网络,如卷积神经网络,通常接受一个定长的向量作为输入。卷积神经网络对文本数据建模时,输入变长的字符串或者单词串,然后通过滑动窗口加池化的方式将原先的输入转换成一个固定长度的向量表示,这样做可以捕捉到原文本中的一些局部特征,但是两个单词之间的长距离依赖关系还是很难被学习到。

循环神经网络却能很好地处理文本数据变长并且有序的输入序列。它模拟了人阅读一篇文章的顺序,从前到后阅读文章中的每一个单词,将前面阅读到的有用信息编码到状态变量中去,从而拥有了一定的记忆能力,可以更好地理解之后的文本。

其网络结构如下图所示:

由图可见,t是时刻,x是输入层,s是隐藏层,o是输出层,矩阵W就是隐藏层上一次的值作为这一次的输入的权重。

如果反复把式 2 带入到式 1,将得到:

其中f和g为激活函数,U为输入层到隐含层的权重矩阵,W为隐含层从上一时刻到下一时刻状态转移的权重矩阵。在文本分类任务中,f可以选取Tanh函数或者ReLU函数,g可以采用Softmax函数。

通过最小化损失误差(即输出的y与真实类别之间的距离),我们可以不断训练网络,使得得到的循环神经网络可以准确地预测文本所属的类别,达到分类目的。相比于卷积神经网络等前馈神经网络,循环神经网络由于具备对序列顺序信息的刻画能力,往往能得到更准确的结果。

RNN的训练算法为:BPTT

BPTT的基本原理和BP算法是一样的,同样是三步:

1前向计算每个神经元的输出值;

2反向计算每个神经元的误差项值,它是误差函数E对神经元j的加权输入的偏导数;

3计算每个权重的梯度。

最后再用随机梯度下降算法更新权重。

具体参考: https://wwwjianshucom/p/39a99c88a565

最后由链式法则得到下面以雅可比矩阵来表达的每个权重的梯度:

由于预测的误差是沿着神经网络的每一层反向传播的,因此当雅克比矩阵的最大特征值大于1时,随着离输出越来越远,每层的梯度大小会呈指数增长,导致梯度爆炸;反之,若雅克比矩阵的最大特征值小于1,梯度的大小会呈指数缩小,产生梯度消失。对于普通的前馈网络来说,梯度消失意味着无法通过加深网络层次来改善神经网络的预测效果,因为无论如何加深网络,只有靠近输出的若干层才真正起到学习的作用。 这使得循环神经网络模型很难学习到输入序列中的长距离依赖关系

关于RNN梯度下降的详细推导可以参考: https://zhuanlanzhihucom/p/44163528

梯度爆炸的问题可以通过梯度裁剪来缓解,即当梯度的范式大于某个给定值时,对梯度进行等比收缩。而梯度消失问题相对比较棘手,需要对模型本身进行改进。深度残差网络是对前馈神经网络的改进,通过残差学习的方式缓解了梯度消失的现象,从而使得我们能够学习到更深层的网络表示;而对于循环神经网络来说,长短时记忆模型及其变种门控循环单元等模型通过加入门控机制,很大程度上弥补了梯度消失所带来的损失。

LSTM的网络机构图如下所示:

与传统的循环神经网络相比,LSTM仍然是基于xt和ht−1来计算ht,只不过对内部的结构进行了更加精心的设计,加入了输入门it 、遗忘门ft以及输出门ot三个门和一个内部记忆单元ct。输入门控制当前计算的新状态以多大程度更新到记忆单元中;遗忘门控制前一步记忆单元中的信息有多大程度被遗忘掉;输出门控制当前的输出有多大程度上取决于当前的记忆单元。

在经典的LSTM模型中,第t层的更新计算公式为

其中it是通过输入xt和上一步的隐含层输出ht−1进行线性变换,再经过激活函数σ得到的。输入门it的结果是向量,其中每个元素是0到1之间的实数,用于控制各维度流过阀门的信息量;Wi 、Ui两个矩阵和向量bi为输入门的参数,是在训练过程中需要学习得到的。遗忘门ft和输出门ot的计算方式与输入门类似,它们有各自的参数W、U和b。与传统的循环神经网络不同的是,从上一个记忆单元的状态ct−1到当前的状态ct的转移不一定完全取决于激活函数计算得到的状态,还由输入门和遗忘门来共同控制。

在一个训练好的网络中,当输入的序列中没有重要信息时,LSTM的遗忘门的值接近于1,输入门的值接近于0,此时过去的记忆会被保存,从而实现了长期记忆功能;当输入的序列中出现了重要的信息时,LSTM应当把其存入记忆中,此时其输入门的值会接近于1;当输入的序列中出现了重要信息,且该信息意味着之前的记忆不再重要时,输入门的值接近1,而遗忘门的值接近于0,这样旧的记忆被遗忘,新的重要信息被记忆。经过这样的设计,整个网络更容易学习到序列之间的长期依赖。

GRU是在LSTM上进行简化而得到的,GRU的网络结构如下所示:

Zt代表更新门,更新门的作用类似于LSTM中的遗忘门和输入门,它能决定要丢弃哪些信息和要添加哪些新信息。

Rt代表重置门,重置门用于决定丢弃先前信息的程度。

要注意的是,h只是一个变量,因此在每个时刻,包括最后的线性组合,h都是在用以前的自己和当前的备选答案更新自己。举例来说,这一个变量好比一杯酒,每次我们要把一部分酒倒出去,并把倒出去的酒和新加入的原料混合,然后在倒回来,这里的reset控制的就是要倒出去的,并且混合好之后再倒回来的酒的比例,而update控制的则是用多大的比例混合新原料和倒出来的之前调制好的酒。同理,也可以以此理解LSTM,LSTM的遗忘门功能上和reset相似,而输入门与update相似,不同之处在于LSTM还控制了当前状态的exposure,也就是输出门的功能,这是GRU所没有的。

1百面机器学习

2 https://zhuanlanzhihucom/p/45649187

3 https://wwwjianshucom/p/39a99c88a565

欢迎分享,转载请注明来源:浪漫分享网

原文地址:https://hunlipic.com/qinggan/7894414.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-09-07
下一篇2023-09-07

发表评论

登录后才能评论

评论列表(0条)

    保存