基于seq2seq的对联生成
对联,是汉族传统文化之一,是写在纸、布上或刻在竹子、木头、柱子上的对偶语句。对联对仗工整,平仄协调,是一字一音的汉语独特的艺术形式,是中国传统文化瑰宝。这里,我们将根据上联,自动写下联。这是一个典型的序列到序列(sequence2sequence, seq2seq)建模的场景,编码器-解码器(Encoder-Decoder)框架是解决seq2seq问题的经典方法,它能够将一个任意长度的源序列转换成另一个任意长度的目标序列:编码阶段将整个源序列编码成一个向量,解码阶段通过最大化预测序列概率,从中解码出整个目标序列。编码和解码的过程通常都使用RNN实现。图1:encoder-decoder示意图这里的Encoder采用LSTM,Decoder采用带有attention机制的LSTM。图2:带有attention机制的encoder-decoder示意图我们将以对联的上联作为Encoder的输出,下联作为Decoder的输入,训练模型。AI Studio平台后续会默认安装PaddleNLP,在此之前可使用如下命令安装。In [1]
!pip install paddlenlp==2.0.0rc12 -i https://pypi.org/simple
Requirement already satisfied: paddlenlp==2.0.0rc12 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (2.0.0rc12)
Requirement already satisfied: seqeval in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlenlp==2.0.0rc12) (1.2.2)
Requirement already satisfied: h5py in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlenlp==2.0.0rc12) (2.9.0)
Requirement already satisfied: jieba in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlenlp==2.0.0rc12) (0.42.1)
Requirement already satisfied: colorlog in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlenlp==2.0.0rc12) (4.1.0)
Requirement already satisfied: colorama in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlenlp==2.0.0rc12) (0.4.4)
Requirement already satisfied: visualdl in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlenlp==2.0.0rc12) (2.1.1)
Requirement already satisfied: scikit-learn>=0.21.3 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from seqeval->paddlenlp==2.0.0rc12) (0.22.1)
Requirement already satisfied: numpy>=1.14.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from seqeval->paddlenlp==2.0.0rc12) (1.16.4)
Requirement already satisfied: six in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from h5py->paddlenlp==2.0.0rc12) (1.15.0)
Requirement already satisfied: Pillow>=7.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl->paddlenlp==2.0.0rc12) (7.1.2)
Requirement already satisfied: flake8>=3.7.9 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl->paddlenlp==2.0.0rc12) (3.8.2)
Requirement already satisfied: Flask-Babel>=1.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl->paddlenlp==2.0.0rc12) (1.0.0)
Requirement already satisfied: pre-commit in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl->paddlenlp==2.0.0rc12) (1.21.0)
Requirement already satisfied: requests in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl->paddlenlp==2.0.0rc12) (2.22.0)
Requirement already satisfied: flask>=1.1.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl->paddlenlp==2.0.0rc12) (1.1.1)
Requirement already satisfied: shellcheck-py in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl->paddlenlp==2.0.0rc12) (0.7.1.1)
Requirement already satisfied: bce-python-sdk in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl->paddlenlp==2.0.0rc12) (0.8.53)
Requirement already satisfied: protobuf>=3.11.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl->paddlenlp==2.0.0rc12) (3.14.0)
Requirement already satisfied: scipy>=0.17.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from scikit-learn>=0.21.3->seqeval->paddlenlp==2.0.0rc12) (1.3.0)
Requirement already satisfied: joblib>=0.11 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from scikit-learn>=0.21.3->seqeval->paddlenlp==2.0.0rc12) (0.14.1)
Requirement already satisfied: importlib-metadata; python_version < "3.8" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8>=3.7.9->visualdl->paddlenlp==2.0.0rc12) (0.23)
Requirement already satisfied: pycodestyle<2.7.0,>=2.6.0a1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8>=3.7.9->visualdl->paddlenlp==2.0.0rc12) (2.6.0)
Requirement already satisfied: pyflakes<2.3.0,>=2.2.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8>=3.7.9->visualdl->paddlenlp==2.0.0rc12) (2.2.0)
Requirement already satisfied: mccabe<0.7.0,>=0.6.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8>=3.7.9->visualdl->paddlenlp==2.0.0rc12) (0.6.1)
Requirement already satisfied: pytz in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from Flask-Babel>=1.0.0->visualdl->paddlenlp==2.0.0rc12) (2019.3)
Requirement already satisfied: Babel>=2.3 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from Flask-Babel>=1.0.0->visualdl->paddlenlp==2.0.0rc12) (2.8.0)
Requirement already satisfied: Jinja2>=2.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from Flask-Babel>=1.0.0->visualdl->paddlenlp==2.0.0rc12) (2.10.1)
Requirement already satisfied: identify>=1.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl->paddlenlp==2.0.0rc12) (1.4.10)
Requirement already satisfied: cfgv>=2.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl->paddlenlp==2.0.0rc12) (2.0.1)
Requirement already satisfied: virtualenv>=15.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl->paddlenlp==2.0.0rc12) (16.7.9)
Requirement already satisfied: nodeenv>=0.11.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl->paddlenlp==2.0.0rc12) (1.3.4)
Requirement already satisfied: pyyaml in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl->paddlenlp==2.0.0rc12) (5.1.2)
Requirement already satisfied: aspy.yaml in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl->paddlenlp==2.0.0rc12) (1.3.0)
Requirement already satisfied: toml in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl->paddlenlp==2.0.0rc12) (0.10.0)
Requirement already satisfied: idna<2.9,>=2.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests->visualdl->paddlenlp==2.0.0rc12) (2.8)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests->visualdl->paddlenlp==2.0.0rc12) (1.25.6)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests->visualdl->paddlenlp==2.0.0rc12) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests->visualdl->paddlenlp==2.0.0rc12) (2019.9.11)
Requirement already satisfied: click>=5.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flask>=1.1.1->visualdl->paddlenlp==2.0.0rc12) (7.0)
Requirement already satisfied: itsdangerous>=0.24 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flask>=1.1.1->visualdl->paddlenlp==2.0.0rc12) (1.1.0)
Requirement already satisfied: Werkzeug>=0.15 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flask>=1.1.1->visualdl->paddlenlp==2.0.0rc12) (0.16.0)
Requirement already satisfied: future>=0.6.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from bce-python-sdk->visualdl->paddlenlp==2.0.0rc12) (0.18.0)
Requirement already satisfied: pycryptodome>=3.8.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from bce-python-sdk->visualdl->paddlenlp==2.0.0rc12) (3.9.9)
Requirement already satisfied: zipp>=0.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from importlib-metadata; python_version < "3.8"->flake8>=3.7.9->visualdl->paddlenlp==2.0.0rc12) (0.6.0)
Requirement already satisfied: MarkupSafe>=0.23 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from Jinja2>=2.5->Flask-Babel>=1.0.0->visualdl->paddlenlp==2.0.0rc12) (1.1.1)
Requirement already satisfied: more-itertools in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from zipp>=0.5->importlib-metadata; python_version < "3.8"->flake8>=3.7.9->visualdl->paddlenlp==2.0.0rc12) (7.2.0)
In [2]
import paddlenlp
paddlenlp.__version__
'2.0.0rc12'
In [3]
import io
import osfrom functools import partialimport numpy as npimport paddle
import paddle.nn as nn
import paddle.nn.functional as F
from paddlenlp.data import Vocab, Pad
from paddlenlp.metrics import Perplexity
from paddlenlp.datasets import load_dataset
数据部分
数据集介绍
采用开源的对联数据集couplet-clean-dataset,该数据集过滤了 couplet-dataset中的低俗、敏感内容。这个数据集包含70w多条训练样本,1000条验证样本和1000条测试样本。下面列出一些训练集中对联样例:上联:晚风摇树树还挺   下联:晨露润花花更红上联:愿景天成无墨迹  下联:万方乐奏有于阗上联:丹枫江冷人初去  下联:绿柳堤新燕复来上联:闲来野钓人稀处  下联:兴起高歌酒醉中加载数据集
paddlenlp中提供多个常见数据集,包括这里的对联数据集Couplet。对联数据集分为上联(the first line)和下联(the second line)获取数据集可以调用paddlenlp.datasets.load_dataset,传入splits ("train", "dev", "test"),即可获取对应的train_ds, dev_ds, test_ds。其中train_ds为训练集,用于模型训练; dev_ds为开发集,也称验证集,用于模型参数调优;test_ds为测试集,用于评估算法的性能,但不会根据测试集上的表现再去调整模型或参数。
调用map()函数,对数据集进行指定操作。In [4]
train_ds, test_ds = load_dataset('couplet', splits=('train', 'test'))
2021-03-11 10:46:17,316 - INFO - unique_endpoints {''}
2021-03-11 10:46:17,317 - INFO - Downloading couplet.tar.gz from https://paddlenlp.bj.bcebos.com/datasets/couplet.tar.gz
100%|██████████| 21421/21421 [00:00<00:00, 51680.74it/s]
2021-03-11 10:46:17,809 - INFO - File /home/aistudio/.paddlenlp/datasets/Couplet/couplet.tar.gz md5 checking...
2021-03-11 10:46:17,861 - INFO - Decompressing /home/aistudio/.paddlenlp/datasets/Couplet/couplet.tar.gz...
来看看数据集有多大,长什么样:In [5]
print (len(train_ds), len(test_ds))
for i in range(5):print (train_ds[i])print ('\n')
for i in range(5):print (test_ds[i])
702594 999
{'first': '晚\x02风\x02摇\x02树\x02树\x02还\x02挺', 'second': '晨\x02露\x02润\x02花\x02花\x02更\x02红'}
{'first': '愿\x02景\x02天\x02成\x02无\x02墨\x02迹', 'second': '万\x02方\x02乐\x02奏\x02有\x02于\x02阗'}
{'first': '丹\x02枫\x02江\x02冷\x02人\x02初\x02去', 'second': '绿\x02柳\x02堤\x02新\x02燕\x02复\x02来'}
{'first': '闲\x02来\x02野\x02钓\x02人\x02稀\x02处', 'second': '兴\x02起\x02高\x02歌\x02酒\x02醉\x02中'}
{'first': '投\x02石\x02向\x02天\x02跟\x02命\x02斗', 'second': '闭\x02门\x02问\x02卷\x02与\x02时\x02争'}{'first': '心\x02尘\x02须\x02自\x02扫', 'second': '意\x02念\x02总\x02虚\x02空'}
{'first': '碧\x02涧\x02飞\x02泉\x02山\x02笑\x02语', 'second': '惊\x02涛\x02啸\x02海\x02浪\x02呼\x02声'}
{'first': '即\x02景\x02即\x02心\x02无\x02机\x02不\x02被', 'second': '非\x02空\x02非\x02色\x02有\x02感\x02灵\x02通'}
{'first': '袋\x02鼓\x02黎\x02民\x02乐', 'second': '粮\x02丰\x02社\x02稷\x02安'}
{'first': '相\x02通\x02心\x02意\x02何\x02须\x02语', 'second': '难\x02解\x02情\x02丝\x02不\x02用\x02说'}
In [6]
vocab = Vocab.load_vocabulary(**train_ds.vocab_info)
trg_idx2word = vocab.idx_to_token
vocab_size = len(vocab)pad_id = vocab[vocab.eos_token]
bos_id = vocab[vocab.bos_token]
eos_id = vocab[vocab.eos_token]
print (pad_id, bos_id, eos_id)
2 1 2
将数据集文本转成id
想将数据集文本转成id,需要实现一个convert_example函数,然后传入map函数,用map将带有文本的数据集转成带id的数据集。图3:token-to-id示意图In [7]
def convert_example(example, vocab):pad_id = vocab[vocab.eos_token]bos_id = vocab[vocab.bos_token]eos_id = vocab[vocab.eos_token]source = [bos_id] + vocab.to_indices(example['first'].split('\x02')) + [eos_id]target = [bos_id] + vocab.to_indices(example['second'].split('\x02')) + [eos_id]return source, targettrans_func = partial(convert_example, vocab=vocab)
train_ds = train_ds.map(trans_func, lazy=False)
test_ds = test_ds.map(trans_func, lazy=False)
构造dataloder
使用paddle.io.DataLoader来创建训练和预测时所需要的DataLoader对象。paddle.io.DataLoader返回一个迭代器,该迭代器根据batch_sampler指定的顺序迭代返回dataset数据。支持单进程或多进程加载数据,快!接收如下重要参数:batch_sampler:批采样器实例,用于在paddle.io.DataLoader 中迭代式获取mini-batch的样本下标数组,数组长度与 batch_size 一致。
collate_fn:指定如何将样本列表组合为mini-batch数据。传给它参数需要是一个callable对象,需要实现对组建的batch的处理逻辑,并返回每个batch的数据。在这里传入的是prepare_input函数,对产生的数据进行pad操作,并返回实际长度等。
PaddleNLP提供了许多NLP任务中,用于数据处理、组batch数据的相关API。API   简介
paddlenlp.data.Stack  堆叠N个具有相同shape的输入数据来构建一个batch
paddlenlp.data.Pad    将长度不同的多个句子padding到统一长度,取N个输入数据中的最大长度
paddlenlp.data.Tuple  将多个batchify函数包装在一起
更多数据处理操作详见: https://github.com/PaddlePaddle/PaddleNLP/blob/develop/docs/data.mdIn [8]
def create_data_loader(dataset):data_loader = paddle.io.DataLoader(dataset,batch_sampler=None,batch_size = batch_size,collate_fn=partial(prepare_input, pad_id=pad_id))return data_loaderdef prepare_input(insts, pad_id):src, src_length = Pad(pad_val=pad_id, ret_length=True)([inst[0] for inst in insts])tgt, tgt_length = Pad(pad_val=pad_id, ret_length=True)([inst[1] for inst in insts])tgt_mask = (tgt[:, :-1] != pad_id).astype(paddle.get_default_dtype())return src, src_length, tgt[:, :-1], tgt[:, 1:, np.newaxis], tgt_mask
In [9]
device = "gpu" # or cpu
device = paddle.set_device(device)batch_size = 128
num_layers = 2
dropout = 0.2
hidden_size =256
max_grad_norm = 5.0
learning_rate = 0.001
max_epoch = 20
model_path = './couplet_models'
log_freq = 200# Define dataloader
train_loader = create_data_loader(train_ds)
test_loader = create_data_loader(test_ds)print(len(train_ds), len(train_loader), batch_size)
# 702594 5490 1285490个batchfor i in train_loader:print (len(i))for ind, each in enumerate(i):print (ind, each.shape)break
702594 5490 128
5
0 [128, 18]
1 [128]
2 [128, 17]
3 [128, 17, 1]
4 [128, 17]
模型部分
下图是带有Attention的Seq2Seq模型结构。下面我们分别定义网络的每个部分,最后构建Seq2Seq主网络。图5:带有attention机制的encoder-decoder原理示意图定义Encoder
Encoder部分非常简单,可以直接利用PaddlePaddle2.0提供的RNN系列API的nn.LSTM。nn.Embedding:该接口用于构建 Embedding 的一个可调用对象,根据输入的size (vocab_size, embedding_dim)自动构造一个二维embedding矩阵,用于table-lookup。查表过程如下:图5:token-to-id & 查表获取向量示意图nn.LSTM:提供序列,得到encoder_output和encoder_state。
参数:
input_size (int) 输入的大小。
hidden_size (int) - 隐藏状态大小。
num_layers (int,可选) - 网络层数。默认为1。
direction (str,可选) - 网络迭代方向,可设置为forward或bidirect(或bidirectional)。默认为forward。
time_major (bool,可选) - 指定input的第一个维度是否是time steps。默认为False。
dropout (float,可选) - dropout概率,指的是出第一层外每层输入时的dropout概率。默认为0。
https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/layer/rnn/LSTM_cn.html输出:outputs (Tensor) - 输出,由前向和后向cell的输出拼接得到。如果time_major为True,则Tensor的形状为[time_steps,batch_size,num_directions * hidden_size],如果time_major为False,则Tensor的形状为[batch_size,time_steps,num_directions * hidden_size],当direction设置为bidirectional时,num_directions等于2,否则等于1。final_states (tuple) - 最终状态,一个包含h和c的元组。形状为[num_lauers * num_directions, batch_size, hidden_size],当direction设置为bidirectional时,num_directions等于2,否则等于1。In [10]
class Seq2SeqEncoder(nn.Layer):def __init__(self, vocab_size, embed_dim, hidden_size, num_layers):super(Seq2SeqEncoder, self).__init__()self.embedder = nn.Embedding(vocab_size, embed_dim)self.lstm = nn.LSTM(input_size=embed_dim,hidden_size=hidden_size,num_layers=num_layers,dropout=0.2 if num_layers > 1 else 0.)def forward(self, sequence, sequence_length):inputs = self.embedder(sequence)encoder_output, encoder_state = self.lstm(inputs, sequence_length=sequence_length)# encoder_output [128, 18, 256]  [batch_size, time_steps, hidden_size]# encoder_state (tuple) - 最终状态,一个包含h和c的元组。 [2, 128, 256] [2, 128, 256] [num_layers * num_directions, batch_size, hidden_size]return encoder_output, encoder_state
定义Decoder
定义AttentionLayer
nn.Linear线性变换层传入2个参数
in_features (int) – 线性变换层输入单元的数目。
out_features (int) – 线性变换层输出单元的数目。paddle.matmul用于计算两个Tensor的乘积,遵循完整的广播规则,关于广播规则,请参考广播 (broadcasting) 。 并且其行为与 numpy.matmul 一致。
x (Tensor) : 输入变量,类型为 Tensor,数据类型为float32, float64。
y (Tensor) : 输入变量,类型为 Tensor,数据类型为float32, float64。
transpose_x (bool,可选) : 相乘前是否转置 x,默认值为False。
transpose_y (bool,可选) : 相乘前是否转置 y,默认值为False。paddle.unsqueeze用于向输入Tensor的Shape中一个或多个位置(axis)插入尺寸为1的维度paddle.add逐元素相加算子,输入 x 与输入 y 逐元素相加,并将各个位置的输出元素保存到返回结果中。输入 x 与输入 y 必须可以广播为相同形状。In [11]
class AttentionLayer(nn.Layer):def __init__(self, hidden_size):super(AttentionLayer, self).__init__()self.input_proj = nn.Linear(hidden_size, hidden_size)self.output_proj = nn.Linear(hidden_size + hidden_size, hidden_size)def forward(self, hidden, encoder_output, encoder_padding_mask):encoder_output = self.input_proj(encoder_output)attn_scores = paddle.matmul(paddle.unsqueeze(hidden, [1]), encoder_output, transpose_y=True)# print('attention score', attn_scores.shape) #[128, 1, 18]if encoder_padding_mask is not None:attn_scores = paddle.add(attn_scores, encoder_padding_mask)attn_scores = F.softmax(attn_scores)attn_out = paddle.squeeze(paddle.matmul(attn_scores, encoder_output), [1])# print('1 attn_out', attn_out.shape) #[128, 256]attn_out = paddle.concat([attn_out, hidden], 1)# print('2 attn_out', attn_out.shape) #[128, 512]attn_out = self.output_proj(attn_out)# print('3 attn_out', attn_out.shape) #[128, 256]return attn_out
定义Seq2SeqDecoderCell
由于Decoder部分是带有attention的LSTM,我们不能复用nn.LSTM,所以需要定义Seq2SeqDecoderCellnn.LayerList 用于保存子层列表,它包含的子层将被正确地注册和添加。列表中的子层可以像常规python列表一样被索引。这里添加了num_layers=2层lstm。
In [12]
class Seq2SeqDecoderCell(nn.RNNCellBase):def __init__(self, num_layers, input_size, hidden_size):super(Seq2SeqDecoderCell, self).__init__()self.dropout = nn.Dropout(0.2)self.lstm_cells = nn.LayerList([nn.LSTMCell(input_size=input_size + hidden_size if i == 0 else hidden_size,hidden_size=hidden_size) for i in range(num_layers)])self.attention_layer = AttentionLayer(hidden_size)def forward(self,step_input,states,encoder_output,encoder_padding_mask=None):lstm_states, input_feed = statesnew_lstm_states = []step_input = paddle.concat([step_input, input_feed], 1)for i, lstm_cell in enumerate(self.lstm_cells):out, new_lstm_state = lstm_cell(step_input, lstm_states[i])step_input = self.dropout(out)new_lstm_states.append(new_lstm_state)out = self.attention_layer(step_input, encoder_output,encoder_padding_mask)return out, [new_lstm_states, out]
定义Seq2SeqDecoder
有了Seq2SeqDecoderCell,就可以构建Seq2SeqDecoder了paddle.nn.RNN 该OP是循环神经网络(RNN)的封装,将输入的Cell封装为一个循环神经网络。它能够重复执行 cell.forward() 直到遍历完input中的所有Tensor。
cell (RNNCellBase) - RNNCellBase类的一个实例。
In [13]
class Seq2SeqDecoder(nn.Layer):def __init__(self, vocab_size, embed_dim, hidden_size, num_layers):super(Seq2SeqDecoder, self).__init__()self.embedder = nn.Embedding(vocab_size, embed_dim)self.lstm_attention = nn.RNN(Seq2SeqDecoderCell(num_layers, embed_dim, hidden_size))self.output_layer = nn.Linear(hidden_size, vocab_size)def forward(self, trg, decoder_initial_states, encoder_output,encoder_padding_mask):inputs = self.embedder(trg)decoder_output, _ = self.lstm_attention(inputs,initial_states=decoder_initial_states,encoder_output=encoder_output,encoder_padding_mask=encoder_padding_mask)predict = self.output_layer(decoder_output)return predict
构建主网络Seq2SeqAttnModel
Encoder和Decoder定义好之后,网络就可以构建起来了In [14]
class Seq2SeqAttnModel(nn.Layer):def __init__(self, vocab_size, embed_dim, hidden_size, num_layers,eos_id=1):super(Seq2SeqAttnModel, self).__init__()self.hidden_size = hidden_sizeself.eos_id = eos_idself.num_layers = num_layersself.INF = 1e9self.encoder = Seq2SeqEncoder(vocab_size, embed_dim, hidden_size,num_layers)self.decoder = Seq2SeqDecoder(vocab_size, embed_dim, hidden_size,num_layers)def forward(self, src, src_length, trg):# encoder_output 各时刻的输出h# encoder_final_state 最后时刻的输出h,和记忆信号cencoder_output, encoder_final_state = self.encoder(src, src_length)print('encoder_output shape', encoder_output.shape)  #  [128, 18, 256]  [batch_size,time_steps,hidden_size]print('encoder_final_states shape', encoder_final_state[0].shape, encoder_final_state[1].shape) #[2, 128, 256] [2, 128, 256] [num_lauers * num_directions, batch_size, hidden_size]# Transfer shape of encoder_final_states to [num_layers, 2, batch_size, hidden_size]???encoder_final_states = [(encoder_final_state[0][i], encoder_final_state[1][i])for i in range(self.num_layers)]print('encoder_final_states shape', encoder_final_states[0][0].shape, encoder_final_states[0][1].shape) #[128, 256] [128, 256]# Construct decoder initial states: use input_feed and the shape is# [[h,c] * num_layers, input_feed], consistent with Seq2SeqDecoderCell.statesdecoder_initial_states = [encoder_final_states,self.decoder.lstm_attention.cell.get_initial_states(batch_ref=encoder_output, shape=[self.hidden_size])]# Build attention mask to avoid paying attention on padddingssrc_mask = (src != self.eos_id).astype(paddle.get_default_dtype())print ('src_mask shape', src_mask.shape)  #[128, 18]print(src_mask[0, :])encoder_padding_mask = (src_mask - 1.0) * self.INFprint ('encoder_padding_mask', encoder_padding_mask.shape)  #[128, 18]print(encoder_padding_mask[0, :])encoder_padding_mask = paddle.unsqueeze(encoder_padding_mask, [1])print('encoder_padding_mask', encoder_padding_mask.shape)  #[128, 1, 18]predict = self.decoder(trg, decoder_initial_states, encoder_output,encoder_padding_mask)print('predict', predict.shape)   #[128, 17, 7931]return predict
定义损失函数
这里使用的是交叉熵损失函数,我们需要将padding位置的loss置为0,因此需要在损失函数中引入trg_mask参数,由于PaddlePaddle框架提供的paddle.nn.CrossEntropyLoss不能接受trg_mask参数,因此在这里需要重新定义:In [15]
class CrossEntropyCriterion(nn.Layer):def __init__(self):super(CrossEntropyCriterion, self).__init__()def forward(self, predict, label, trg_mask):cost = F.softmax_with_cross_entropy(logits=predict, label=label, soft_label=False)cost = paddle.squeeze(cost, axis=[2])masked_cost = cost * trg_maskbatch_mean_cost = paddle.mean(masked_cost, axis=[0])seq_cost = paddle.sum(batch_mean_cost)return seq_cost
执行过程
训练过程
使用高层API执行训练,需要调用prepare和fit函数。在prepare函数中,配置优化器、损失函数,以及评价指标。其中评价指标使用的是PaddleNLP提供的困惑度计算API paddlenlp.metrics.Perplexity。如果你安装了VisualDL,可以在fit中添加一个callbacks参数使用VisualDL观测你的训练过程,如下:model.fit(train_data=train_loader,epochs=max_epoch,eval_freq=1,save_freq=1,save_dir=model_path,log_freq=log_freq,callbacks=[paddle.callbacks.VisualDL('./log')])
在这里,由于对联生成任务没有明确的评价指标,因此,可以在保存的多个模型中,通过人工评判生成结果选择最好的模型。本项目中,为了便于演示,已经将训练好的模型参数载入模型,并省略了训练过程。读者自己实验的时候,可以尝试自行修改超参数,调用下面被注释掉的fit函数,重新进行训练。如果读者想要在更短的时间内得到效果不错的模型,可以使用预训练模型技术,例如《预训练模型ERNIE-GEN自动写诗》项目为大家展示了如何利用预训练的生成模型进行训练。In [16]
model = paddle.Model(Seq2SeqAttnModel(vocab_size, hidden_size, hidden_size,num_layers, pad_id))optimizer = paddle.optimizer.Adam(learning_rate=learning_rate, parameters=model.parameters())
ppl_metric = Perplexity()
model.prepare(optimizer, CrossEntropyCriterion(), ppl_metric)# model.fit(train_data=train_loader,
#             epochs=max_epoch,
#             eval_freq=1,
#             save_freq=1,
#             save_dir=model_path,
#             log_freq=log_freq)
模型预测
定义预测网络Seq2SeqAttnInferModel
预测网络继承上面的主网络Seq2SeqAttnModel,定义子类Seq2SeqAttnInferModelIn [17]
class Seq2SeqAttnInferModel(Seq2SeqAttnModel):def __init__(self,vocab_size,embed_dim,hidden_size,num_layers,bos_id=0,eos_id=1,beam_size=4,max_out_len=256):self.bos_id = bos_idself.beam_size = beam_sizeself.max_out_len = max_out_lenself.num_layers = num_layerssuper(Seq2SeqAttnInferModel, self).__init__(vocab_size, embed_dim, hidden_size, num_layers, eos_id)# Dynamic decoder for inferenceself.beam_search_decoder = nn.BeamSearchDecoder(self.decoder.lstm_attention.cell,start_token=bos_id,end_token=eos_id,beam_size=beam_size,embedding_fn=self.decoder.embedder,output_fn=self.decoder.output_layer)def forward(self, src, src_length):encoder_output, encoder_final_state = self.encoder(src, src_length)encoder_final_state = [(encoder_final_state[0][i], encoder_final_state[1][i])for i in range(self.num_layers)]# Initial decoder initial statesdecoder_initial_states = [encoder_final_state,self.decoder.lstm_attention.cell.get_initial_states(batch_ref=encoder_output, shape=[self.hidden_size])]# Build attention mask to avoid paying attention on paddingssrc_mask = (src != self.eos_id).astype(paddle.get_default_dtype())encoder_padding_mask = (src_mask - 1.0) * self.INFencoder_padding_mask = paddle.unsqueeze(encoder_padding_mask, [1])# Tile the batch dimension with beam_sizeencoder_output = nn.BeamSearchDecoder.tile_beam_merge_with_batch(encoder_output, self.beam_size)encoder_padding_mask = nn.BeamSearchDecoder.tile_beam_merge_with_batch(encoder_padding_mask, self.beam_size)# Dynamic decoding with beam searchseq_output, _ = nn.dynamic_decode(decoder=self.beam_search_decoder,inits=decoder_initial_states,max_step_num=self.max_out_len,encoder_output=encoder_output,encoder_padding_mask=encoder_padding_mask)return seq_output
解码部分
接下来对我们的任务选择beam search解码方式,可以指定beam_size为10。In [18]
def post_process_seq(seq, bos_idx, eos_idx, output_bos=False, output_eos=False):"""Post-process the decoded sequence."""eos_pos = len(seq) - 1for i, idx in enumerate(seq):if idx == eos_idx:eos_pos = ibreakseq = [idx for idx in seq[:eos_pos + 1]if (output_bos or idx != bos_idx) and (output_eos or idx != eos_idx)]return seq
In [19]
beam_size = 10
model = paddle.Model(Seq2SeqAttnInferModel(vocab_size,hidden_size,hidden_size,num_layers,bos_id=bos_id,eos_id=eos_id,beam_size=beam_size,max_out_len=256))model.prepare()
在预测之前,我们需要将训练好的模型参数load进预测网络,之后我们就可以根据对联的上联,生成对联的下联啦!In [20]
model.load('couplet_models/model_18')
In [21]
idx = 0
for data in test_loader():inputs = data[:2]finished_seq = model.predict_batch(inputs=list(inputs))[0]finished_seq = finished_seq[:, :, np.newaxis] if len(finished_seq.shape) == 2 else finished_seqfinished_seq = np.transpose(finished_seq, [0, 2, 1])for ins in finished_seq:for beam in ins:id_list = post_process_seq(beam, bos_id, eos_id)word_list_f = [trg_idx2word[id] for id in test_ds[idx][0]][1:-1]word_list_s = [trg_idx2word[id] for id in id_list]sequence = "上联: "+"".join(word_list_f)+"\t下联: "+"".join(word_list_s) + "\n"print(sequence)idx += 1break
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/layers/utils.py:77: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop workingreturn (isinstance(seq, collections.Sequence) and
上联: 心尘须自扫   下联: 世事不由人上联: 碧涧飞泉山笑语    下联: 青山叠翠鸟谈天上联: 即景即心无机不被 下联: 有情有意有意相随上联: 袋鼓黎民乐   下联: 胸怀社稷安上联: 相通心意何须语    下联: 不解情怀不必言上联: 促公义一身正气  下联: 保民生两袖清风上联: 重建黉宫犹忆院中曾起凤  下联: 弘扬国粹更期天下再腾龙上联: 落字不从奇巧胜  下联: 行文自有古今同上联: 拂水柳丝撩碎月  下联: 落花花影醉清风上联: 千载长城历尽沧桑烽火连绵留胜迹  下联: 万年大业历经坎坷英雄浩荡展雄风上联: 核能火箭穿空跃  下联: 气定神州逐梦飞上联: 正道不衰书不朽  下联: 清风常在德无穷上联: 月倚高楼风送爽  下联: 花开小院雪添香上联: 联网怡情寻妙语  下联: 春风得意送佳音上联: 项羽吹风真霸气  下联: 刘伶煮酒忒精神上联: 税企展宏图促小康圆梦   下联: 民生兴伟业兴大业兴邦上联: 几字箴言德养清廉贪养腐   下联: 一腔热血情融诚信爱扶贫上联: 歌摇香雾鬟朱唇浅破桃花萼 下联: 画卷春风韵翠袖轻摇杨柳枝上联: 积德累仁远矣一本水木  下联: 高山流水长哉千古风流上联: 花言巧语迷心窍   下联: 月色清风入梦乡上联: 执杖空山风问道  下联: 弹琴古寺月知音上联: 叹亘古英雄欲铸和平刀泣血 下联: 看今朝壮志更添华夏志凌云上联: 一盘蒸出三湘韵 下联: 四海迎来四海春上联: 良辰美景三春绿  下联: 明月清风一夜香上联: 秦岭修行淮水斩蛟万民拥戴歌千载  下联: 东风浩荡春风化雨百业兴隆颂九州上联: 结友还应诚以待  下联: 修身不必俭而勤上联: 放大肚皮容难事  下联: 放开眼界见真情上联: 长篙撑破烟波绿  下联: 短笛吹开雨露红上联: 几句五言诗便教胜地生辉王郎载誉  下联: 千年千古史犹记春风化雨桃李芬芳上联: 风乱诗文期断句  下联: 月移花影惹残花上联: 一捧清凉半瓢月  下联: 半窗寂寞满江红上联: 关注民生服务民生保障民生兴国祚  下联: 弘扬国粹弘扬国粹和谐社会富民生上联: 书香醉倒窗前月  下联: 月色迷离梦里人上联: 楼高不碍闲云渡  下联: 路远何妨野鹤归上联: 以汤沃雪 下联: 临水流云上联: 紫燕携春来探我 下联: 红梅傲雪去迎宾上联: 崖悬风雨骤    下联: 月落月光寒上联: 白石清江留月影    下联: 清风明月醉花香上联: 流金时节云霞展梦 下联: 大地春秋桃李争春上联: 打趣不识趣自讨没趣   下联: 求真务求真何必求真上联: 最宜词客题襟结对赏花来杏岭  下联: 更有诗人醉酒邀朋邀月醉诗心上联: 名山不必高千仞    下联: 大海何须纳百川上联: 共赋新诗发宫徵  下联: 不将名字负春秋上联: 体健神怡晚景好  下联: 风和日丽晚霞红上联: 好书好读直须读  下联: 好事难求不必求上联: 马驰和县康庄道  下联: 羊跃祥云锦绣春上联: 舟泊寒汀惊雁字  下联: 月临古寺悟禅机上联: 卖菜上京经上蔡  下联: 寻春故里醉桃花上联: 谁解清泉低语意  下联: 我知明月近人心上联: 朝登剑阁云随马  下联: 风过泸州带酒香上联: 低吟浅唱一纸风流字句   下联: 浅唱轻歌几弦寂寞弦弦上联: 戏中文文中戏看戏看文各得雅趣    下联: 天上人地天下知音知音都是知音上联: 先贤圣哲书中坐   下联: 后辈英雄笔下行上联: 尚义崇文法治护航中国梦  下联: 崇文尚武文明铺锦上河图上联: 公平端起水一碗  下联: 正气正直风满怀上联: 一山胜概华表高标犹见硕儒题柱句  下联: 千古文章清风明月更闻雏凤振龙声上联: 天临暮晚余辉灿  下联: 风过泸州带酒香上联: 岁月悠悠绿水微澜帆影梦  下联: 江山漫漫红尘不染雁声情上联: 香山一染深秋色  下联: 绿水长流碧水情上联: 无事聊天能咋地  下联: 有情对月可当家上联: 快马加鞭妃子笑  下联: 春风得意美人来上联: 夏至荷塘香两岸  下联: 春分柳岸绿千畴上联: 芳草绿阳关塞上春风入户  下联: 清风明月渡江边月色盈窗上联: 致富思源跟党走  下联: 脱贫致富为民生上联: 欣然入梦抱书睡  下联: 何必登楼赏月眠上联: 诗赖境奇赢感动  下联: 心随心静悟禅机上联: 栀子牵牛犁熟地  下联: 莲花吐蕊吐香香上联: 廿载相交成知己  下联: 千秋不朽著文章上联: 润    下联: 修上联: 设帏遇芳辰百岁期颐刚一半   下联: 簪缨逢盛世千秋俎豆祀千秋上联: 波光云影满目葱茏谁道人间无胜地 下联: 鸟语花香一帘幽梦我知天下有知音上联: 眸中映月心如镜  下联: 笔下生花气若虹上联: 何事营生闲来写幅青山卖  下联: 此情入世静坐读书明月来上联: 学海钩深毫挥具见三长足  下联: 书山登绝顶放开怀一片天上联: 女子千金一笑贵  下联: 人生万事两相宜上联: 柏叶为铭椒花献瑞 下联: 芝兰在抱芝草生香上联: 众佛群灵光圣地 下联: 众生一念证菩提上联: 乡愁何处解    下联: 故事几时休上联: 清池荷试墨  下联: 碧水柳含情上联: 既近浅流安笔砚    下联: 欲将直气定乾坤上联: 日丽萱闱祝无量寿 下联: 月明桂殿祝有余龄上联: 一地残红风拾起 下联: 半窗疏影月窥来上联: 白塔有情泪弹翠岛三生梦  下联: 红尘无恙心系苍生一片心上联: 霜华浓似雪    下联: 冰雪冷如冰上联: 小子听之濯足濯缨借自取    下联: 高僧悟也修身养性即如来上联: 踏雪寻梅句    下联: 寻春觅柳诗上联: 无水不清一鉴尽传云外意    下联: 有山皆洗千秋不染世间尘上联: 拜竹为师一生常对虚心客  下联: 寻梅作伴半世每逢知己人上联: 眄晓日朝霞祥光万里苍茫外 下联: 对清风明月明月千秋寂寞中上联: 忠孝节义萃于一门间披南宋伤心史 下联: 忠孝忠孝昭其千载后继东方继往开上联: 一枕云山观自在  下联: 半窗竹影任逍遥上联: 秀丽堂皇延好客  下联: 和谐社会庆新春上联: 配偶   下联: 交朋上联: 故事含章吐曜清明一曲千秋醉 下联: 春风得意流光溢彩千秋万代兴上联: 仁和信义安民清心自律查风纪  下联: 诚信文明治国富国强民奔小康上联: 一言难尽同窗梦    下联: 半世不知两鬓秋上联: 酒高好看东篱菊  下联: 月老难寻北斗星上联: 百味溢琴弦几许青春流淌  下联: 千秋留笔墨千秋翰墨芬芳上联: 惜有花开人去后  下联: 愁无月落梦来时上联: 满月可观仙子泪  下联: 清风不负故人情上联: 月遮白雪夜织女  下联: 风过泸州带酒香上联: 兰舟野渡逍遥梦  下联: 明月清风自在诗上联: 带俏含羞梅弄雪  下联: 乘风破浪浪淘沙上联: 何去何从须看红包厚度   下联: 不来不见莫言白发多情上联: 梅花三弄风和雨   下联: 柳絮一飞雨顺风上联: 绿蚁杯中物    下联: 红尘梦里人上联: 胜友如云赞壮丽名楼重光故郡  下联: 高朋似海赞英雄伟业永耀神州上联: 画栋雕梁门启千般风物秀    下联: 琼楼玉宇梦圆万里画图新上联: 牛车行马路    下联: 骏马跃龙门上联: 半夏当归熟地总比生地好    下联: 千秋不老高山流水上天高上联: 走兽   下联: 飞禽上联: 青山不改三贤赋   下联: 碧水长流四海歌上联: 拈雁字韵山风敢问醉处   下联: 把酒诗情月色不知愁时上联: 栈道连云引无数英雄豪杰登天摘月   下联: 春风化雨催万千豪杰英雄壮志凌云上联: 梦里情人情里梦  下联: 杯中月色梦中人上联: 文明古国励精图治新崛起  下联: 和谐社会勤劳致富大腾飞上联: 话旧老翁漫忆当年骑马马  下联: 情归故里遥思往日驾龙舟上联: 花香常绕笔    下联: 鸟语总关情上联: 凭本领冲冠  下联: 靠科学创新上联: 无欲自然心似水    下联: 有情何必梦如烟上联: 脉脉人千里念两处风情万重烟水   下联: 幽幽梦一帘思一帘梦梦几度春秋上联: 千朵红莲三里水   下联: 一轮皓月一轮星上联: 尽夜观灯夜夜夜灯灯不夜  下联: 临晨听雨声声声鼓鼓长鸣上联: 嘉施利根动力再接再厉   下联: 展宏图展宏图如画如诗上联: 绸缎满天风带走   下联: 琴弦一曲月携来上联: 鞠松陶令宅    下联: 垂柳侍郎家上联: 感恩观世界  下联: 济世度人生上联: 淇淋藏雪柜  下联: 趵突淌冰泉上联: 科学绘就民生景    下联: 勤俭浇开幸福花上联: 佛道参茶参造化  下联: 禅心悟道悟禅机上联: 清风远播凤城爱  下联: 明月长留天井红上联: 菡萏开花吐艳   下联: 蜻蜓点水含情上联: 读书需用意 下联: 处世要修身上联: 无聊友    下联: 有瘾人上联: 春花桃叶渡    下联: 秋月桂花香上联: 一钩小月斜檐角    下联: 两袖清风入画中上联: 李李桃桃香一苑  下联: 梅兰竹菊韵千秋上联: 谁人能解落花梦  下联: 哪个可知流水情上联: 善报恶报迟报速报终须有报 下联: 天知地知我知我知何谓无知上联: 记得与君花下别 下联: 不知何处水中央上联: 春风送暖催花艳  下联: 旭日迎新映日红上联: 林深路险人难越  下联: 海阔天空志不移上联: 兽王不敌群虫搏  下联: 牛鬼何须众鸟鸣上联: 敞大关门平垭口  下联: 开新路路上层楼上联: 过隧道不得超车  下联: 过关关关关关关上联: 老来渐得湖山味  下联: 老去方知岁月情上联: 老了还难说真话  下联: 新来未必见真情上联: 天人合一新城市  下联: 日月同辉大地天上联: 树发孙枝方茂盛  下联: 花开果果更繁荣上联: 缘枝摘果和风伴  下联: 梦笔生花细雨随上联: 血肉筑长城八年悲壮铭千古 下联: 锤镰开盛世万里江山耀九州上联: 一径飞花寻旧梦 下联: 两行雁字寄新愁上联: 与尔同销万古   下联: 同君共享千秋上联: 明文传素志 下联: 大笔写春秋上联: 苍苔路熟僧归寺    下联: 红叶楼高月满楼上联: 一帘卷走清风夜  下联: 两袖清来明月天上联: 蓝天绿地山川美  下联: 绿水青山日月新上联: 清思似水洞察秋毫策已决  下联: 正气如山气冲霄汉展雄姿上联: 宝篆焚香留睡鸭  下联: 清风拂槛送归鸿上联: 飞花一径随风袅  下联: 落叶千山伴月眠上联: 动守其时静随其势不倚不偏循本位  下联: 安居此处安得安居安居乐业享安康上联: 弹琴又为相思梦  下联: 把酒还吟寂寞诗上联: 郑知县描竹临傲骨 下联: 陈美人泼墨写春秋上联: 妙质因风剪   下联: 真情似水流上联: 登梅喜鹊开春运    下联: 踏雪梅花报福音上联: 金人汉满皆兄弟  下联: 天下人和是弟兄上联: 巴人兴吃火锅鸭  下联: 老鬼出山山水鸡上联: 文艺迎春春风激发正能量  下联: 楹联贺岁喜气盈门新画图上联: 奥运福娃喜迎天下客    下联: 神州奥运喜报世间春上联: 四面晴光对屏障    下联: 一江春水向东流上联: 春雨读花信    下联: 秋风扫草原上联: 称胡师督辫军光绪班班可仿   下联: 夺冠军营销战功勋处处如何上联: 口技演员说鸟话 下联: 神州大业展鸿图上联: 庙堂雨露何关我  下联: 山水风流自在人上联: 走金光道擎特色旗鹿洼崛起前程远  下联: 奔富路路拓新程路龙马腾飞骏业兴上联: 秋风琴瑟弹高调  下联: 冬雪梅花伴暗香上联: 久坐深窗听花跌落 下联: 曾经沧海看月沉浮上联: 社稷言称将相  下联: 江山气壮神州上联: 有热情何须三把火  下联: 无杂念不必一身轻上联: 大梁凌霄云浩荡 下联: 高山仰岳日辉煌上联: 钟声嘹亮感恩亿万勤劳客  下联: 瑞气氤氲喜气千千幸福人上联: 员树出天 下联: 天地成地上联: 拂镜羞温峤   下联: 垂帘静倚窗上联: 松翠自洁梅雅无争百里悬冰春在望    下联: 花香扑面花香溢彩千年流韵梦生香上联: 滚动新闻反复念  下联: 风流旧事总关情上联: 今年逢狗 下联: 昨日逢猪上联: 雾里群峰如有约 下联: 云中一月似无眠上联: 收缩天地穿越时空千载戏文千载梦  下联: 传递古今传承古今万年功业万年春上联: 同仇抗日歌才子且为战士  下联: 克己捐躯颂英雄还是英雄上联: 墨香如酒千层浪  下联: 墨韵似诗万卷诗上联: 半世情怀敲案问  下联: 一蓑烟雨任平生上联: 瞻大贵大雄诵大悲顿生大觉 下联: 念慈悲慈善念慈念普度众生上联: 二三鸟语消春困 下联: 一片冰心在玉壶上联: 风梳柳髻青丝乱  下联: 雨润桃腮粉面娇上联: 成败不由人惟求尽力    下联: 死生皆自己但愿无忧上联: 爱国重家君子义    下联: 修身养性圣贤心上联: 云移月伴难留步  下联: 日丽风和不动心上联: 归山已绝沧桑泪  下联: 逝水难留岁月痕上联: 万里海涛千卷画  下联: 一江春水一湖诗上联: 百年紫木固根基回望陈门进士    下联: 万里青山如画本展望锦绣前程上联: 风华减去谁留住    下联: 岁月添来我自来上联: 望赤壁流丹问谁挥梦笔皴红苗寨   下联: 看青山焕彩看我挥毫书写绿诗篇上联: 福娃盛邀五洲客   下联: 宝鸡欢唱万户春上联: 久知鹄自飞新得  下联: 常见龙能起大来上联: 我曾置盏邀明月  下联: 谁与拈花问落花上联: 彰一代君臣表率  下联: 仰千秋俎豆馨香上联: 枝繁叶茂拔萃精英拟决策  下联: 国富民强扬鞭骏马奋腾飞上联: 勤志有为千般陶冶终成器  下联: 勤劳无限万种芬芳总是春上联: 亦静不哗听涓滴天来甘露  下联: 亦真亦幻见沧桑世外桃源上联: 打胡说  下联: 刮肚搜上联: 长街扫落三秋叶  下联: 短笛吹开一剪梅上联: 不懂古文编白话  下联: 常闻新曲奏清音上联: 往来不少响各客  下联: 生死何妨说是非上联: 风云乍向怀中起  下联: 岁月常从梦里来上联: 摇橹荡舟寻美境  下联: 挥毫泼墨写华章上联: 漫天瑞雪千山秀  下联: 遍地春风万里香上联: 改革革出万亩粮田田聚宝  下联: 科学发展千家事业业增辉上联: 劈疯癫营造精神蓝天绿地  下联: 治病病保持保障绿水青山上联: 小妹东坡留佛印  下联: 高僧西子悟禅机上联: 赞荷文创基业枝荣本固昌万代    下联: 赞桃李育桃李果硕果丰誉千秋上联: 酒烈风高山路远望君珍重    下联: 月圆花好月光高照我婵娟上联: 沐八载春风艺花吐艳今朝多异彩   下联: 兴千秋伟业联苑增辉此日尽奇香上联: 入口已然年味道   下联: 回头不见旧风情上联: 围炉夜话新醅酒  下联: 把盏晨钟旧鼓声上联: 春风一顾山花笑  下联: 秋雨几时柳絮飞上联: 雾花水月清心逸  下联: 冰雪冰霜白骨精上联: 飞雪片片凝瑞   下联: 落花声声唤春上联: 东风乍喜还沧海   下联: 紫燕初裁又剪春上联: 桃花窥镜珠江羞红两岸   下联: 燕子裁春锦绣喜绿千畴上联: 高者顶天不霸道   下联: 大夫拔地莫欺天上联: 草木蒙茸露湿青皋闲数鹭峰泛舟待月 下联: 山峦叠翠风来碧水静听渔歌唱晚听涛上联: 瑞兆千秋骏业  下联: 春回万里春光上联: 月半举杯圆月下   下联: 风中吹笛落花间上联: 庠序百年为大本  下联: 英雄千古仰高风上联: 推杯换盏频交手  下联: 拍马溜须总动心上联: 悲歌动地 下联: 喜气盈门上联: 随水逝泪成行落花空散去 下联: 随风飘梦入梦流水自生来上联: 牛肚   下联: 马蹄上联: 狡诈    下联: 愚公上联: 植竹培兰修心养性  下联: 栽花种竹养性修身上联: 天地间日星河岳正气   下联: 山河里日月日月光华上联: 常常喝常常醉常常喝醉 下联: 多多多多少多多多少多上联: 似水流年闲愁万种何人会   下联: 如烟往事旧梦千重哪个知上联: 一起同尊泽后土苍天共弘道脉    下联: 百年共仰光前天大地同仰灵光上联: 承厚重人文千古徽风排闼入   下联: 展宏图气象万家春色入怀来上联: 强弓射透百步杨 下联: 大笔写出千年文上联: 常思灯下老妈影  下联: 不见人间老子心上联: 春风绿染千家树  下联: 旭日红燃万户门上联: 香阁春回风送暖  下联: 寒窗夜静月生凉上联: 一竿竹影横窗乱  下联: 十里荷香扑面香上联: 冲一盏清茶细品前尘往事  下联: 看千年老酒闲斟往事沧桑上联: 梦筑中华全民追梦 下联: 春回大地大地飞歌上联: 精做郇阳地道家常思乡菜 下联: 闲游宝岛人间客醉醉乡人上联: 风调雨顺百花艳  下联: 国泰民安万事兴上联: 庭竹不收帘影去  下联: 梅花犹带雪香来上联: 近梅已是三分雅  下联: 临水方知一脉香上联: 城开山日早    下联: 鸟啭鸟声甜上联: 春夜疏帘邀月影    下联: 秋风小院惹花香上联: 一生老病死    下联: 千古古风流上联: 水白如冰粉藕如弯饼圆如月   下联: 山青似画图山似画图画似诗上联: 欢天喜地笑迎乖兔宝贝  下联: 乐地乐天乐奏好猫哆哩上联: 杜门远万马兵尘海上引年仙枣大    下联: 孔子长千年俎豆山中留俎豆馨香上联: 红丝穿露珠帘冷   下联: 紫燕穿云玉指凉上联: 访山问水知音渺  下联: 踏雪寻梅雅韵悠上联: 万里长江华夏文明扬海外  下联: 千秋大业神州伟业耀中华上联: 兄及弟矣式相好矣无相尤矣 下联: 夫之子也有所谓乎有所谓乎上联: 韬光养晦风云独秀潇湘竹 下联: 反腐倡廉日月长辉舜尧天上联: 风清月白闲鸥鹭  下联: 日丽花红醉蝶蜂上联: 千里目  下联: 万年春上联: 燕唱山歌催嫩绿  下联: 莺歌燕舞唤春红上联: 猪八戒扮姑娘好歹不像   下联: 鼠百年谋大计输赢难得上联: 石洞流甘露 下联: 山泉洗俗尘上联: 山能醉意常流韵    下联: 水可怡情总动情上联: 新朋老友夸廉吏  下联: 美酒佳肴赞美人上联: 并蒂花开连理树  下联: 并蒂蒂开并蒂花上联: 秋河曙耿耿    下联: 夜雨夜凄凄上联: 云连瀑布悬岩秀    下联: 风过泸州带酒香上联: 济水自清河自浊  下联: 江山如画水长流上联: 利害当头操守见  下联: 风云在上任行行上联: 道路畅通车如流水 下联: 佛光普照佛即菩提上联: 檐雨连珠难剪断 下联: 秋风入梦不回头上联: 统一齐民心民心连两岸   下联: 同心协力力国力振千秋上联: 民常有德犹多福   下联: 国是无忧不少忧上联: 宴罢兰亭留墨宝  下联: 风来柳榭醉花香上联: 搅出新纹鱼共舞  下联: 搅浑浊水月相随上联: 五岳德高儒释道  下联: 千秋功伟武功勋上联: 打草寻山勤动手  下联: 乘风破浪正当头上联: 千年余庆千秋颂  下联: 万里长城万代兴上联: 最喜老头无赖   下联: 不知大梦难圆上联: 满心眷恋情荡荡   下联: 一梦缠绵梦悠悠上联: 社会和谐担于肩上 下联: 人民富裕乐在心中上联: 宝墨寄闲情紫洞清歌听一曲鱼游春水    下联: 清风传雅韵清风明月看千年龙跃龙门上联: 八一高歌万里长城担日月 下联: 千秋大业千秋伟业铸辉煌上联: 对月吟须浮白醉  下联: 临风把酒醉红尘上联: 应法闻鸡起舞   下联: 为民跃马扬鞭上联: 笛弄梅花五岭三山飘瑞雪   下联: 风吹柳絮一江一水荡春潮上联: 与月交心知照顾  下联: 随风入梦觉相思上联: 鹏程万里身须健  下联: 骏业千秋气自雄上联: 古道经年无信使  下联: 高山流水有知音上联: 穿云海两肩担水  下联: 破雾天一手遮天上联: 愁情由曲解    下联: 爱意自天然上联: 平天湖上赏明月    下联: 杏花村里品清香上联: 烟雨雾绕江心岛  下联: 日月星辉海角天上联: 一生功过盖棺定  下联: 半世沧桑世事空上联: 负手云烟流水高山闲自在  下联: 放怀风月清风明月乐逍遥上联: 每感言轻难表意  下联: 常思正直不关心上联: 平天湖上嫦娥舒广袖    下联: 杏花村里蝴蝶舞春风上联: 敬业乐群疏导源头活水 下联: 求真务实弘扬正气清风上联: 无所不通无所事   下联: 不知难得有知音上联: 风烛何堪空落泪  下联: 梅花未必枉凝眉上联: 浇科学水挥智慧锄韶华七秩同文曲  下联: 育李培桃育桃李育李李千秋大业篇上联: 欲学狂人发酵芝麻捕风捉影求轰动  下联: 不知老鬼出山山水擒虎捉刀富富强上联: 采一篮童年往事  下联: 赊几分月色闲情上联: 灵地棉湖镇    下联: 青山碧水环上联: 山巅茶场散清馨松竹瀑泉美   下联: 门外春风化雨露桃花春意浓上联: 春蚕又吐新茧把人生画卷织成美锦 下联: 蜡炬将燃旧情将梦想文章铸就丰碑上联: 客来把酒花间醉  下联: 风过泸州梦里香上联: 枕上轻寒窗外雨  下联: 枕边寂寞梦中人上联: 闹井   下联: 喧天上联: 马蹄奋起追欧美   下联: 羊角顶开揽月光上联: 字到无锋称极品  下联: 情于有意是真情上联: 执掌三铡刀诚彰正义    下联: 挥毫一蜕纸不负春秋上联: 英雄不问出处 下联: 儿女难得糊涂上联: 见也难别也难形如彩凤双飞翼 下联: 闻之乐乐之乐天下神龙一啸风上联: 勤俭生富贵  下联: 勤劳致富强上联: 慢赏好书如品酒    下联: 闲吟佳句似吟诗上联: 伴随经史同游古  下联: 共赏春秋共读书上联: 梅子流酸怜苦李  下联: 梅花傲雪傲寒梅上联: 岁前事真仿佛   下联: 天上人不如神上联: 归去来兮见放魂萦三户地   下联: 归来去矣何堪梦断一江秋上联: 岳色河声韵满京畿盛象宏开中国画  下联: 山光水色花香燕赵春风浩荡大江潮上联: 凝心总把锤镰举  下联: 放眼常将梦想飞上联: 乡村六秩恍如隔世 下联: 岁月千秋恰似当时上联: 喜庆三春红我容颜莫过新天美酒  下联: 欣逢五福喜咱梦想能成大地欢歌上联: 德政归心燕舞秦川祥气绕   下联: 春风得意莺歌燕岭紫气腾上联: 四朝长乐老    下联: 千古古风流上联: 古月光明新世界    下联: 春风浩荡旧乾坤上联: 古域春光六旬伟业逾千载  下联: 中华骏业万里宏图壮九州上联: 溪声流入砚    下联: 月色碾成诗上联: 鸟雀交鸣诗有韵    下联: 莺莺婉转曲无声上联: 老了流年无悲无喜 下联: 时来往事有梦有香上联: 门通小径连芳草 下联: 风过泸州带酒香上联: 嫁得潘家郎有水有田有米  下联: 迎来女子女无男无女无男上联: 往事淘空将身独许这般月  下联: 相思寄尽把酒相邀那段情上联: 走基层听民声向下扎根接地气    下联: 创大业兴国运中华崛起展雄风上联: 嘉树来西域凤翥龙翔十里市城添秀色   下联: 祥云起东风龙腾虎跃九州大地焕新颜上联: 盛世抒怀笔舞云龙同作赋 下联: 春风得意诗吟雅韵共吟诗上联: 杨柳小腰难把握  下联: 桃花依旧笑春风上联: 衣沾月色如霜洗  下联: 袖拂清风似水流上联: 中秋醉也二婆挥泪砸三少  下联: 大地悲哉一女伤心泣几人上联: 松桧老依云外地  下联: 楼台深锁洞中天上联: 时绎古书以明古义 下联: 人登高阁而上高楼上联: 论语无平调   下联: 文章有古风上联: 柳色常随春意绿    下联: 梅香总伴腊梅香上联: 人兴财旺年年好  下联: 日丽风和处处春上联: 文化添新拳石喷泉堪驻足  下联: 人文焕彩心潮逐浪更扬帆上联: 夜色难留君去意  下联: 春风不度我归心上联: 乡书一字千金贵  下联: 老酒三杯万事休上联: 星斗满天难比月  下联: 风云一路不如云上联: 归处不知风几度  下联: 归时已觉月三更上联: 忍性吞气茹苦饮痛 下联: 披肝沥胆忠肝义胆上联: 各有千秋兄弟三人相继去 下联: 相期一日江山一统共争先上联: 瘦月斜眯千涧水  下联: 清风漫卷万山云上联: 知春雨滴藏金地  下联: 晓夏风吹绽玉花上联: 秋灯千点雨    下联: 雁字几行诗上联: 明花许我三分色    下联: 明月谁人一段情上联: 韵流青史丹樨在  下联: 风过泸州带酒香上联: 苍海扬波高歌始祖恩深似海 下联: 青山耸翠大展宏图志壮如山上联: 烟柳斜阳归去东南余半壁 下联: 桃花流水归来春夏第一枝上联: 一朝飞雪满天字  下联: 几度流云遍地诗上联: 杨柳多情笑问春风桃李事  下联: 桃花依旧笑看明月水云心上联: 新月如钩钩起心田多少事  下联: 春风似剪裁成梦幻几分愁上联: 龙陪旭日观奇景  下联: 蛇伴春风入画图上联: 一亭诗韵夸儿孝  下联: 两袖清风赞子孙上联: 灵羊奉献兴邦硕果 下联: 骏马奔腾富国宏图上联: 卓越超群德达三江通四海 下联: 达观致远文明四海耀千秋上联: 抚石可辨文章影  下联: 挥笔能书翰墨香上联: 红桃笑破胭脂口  下联: 绿柳轻摇翡翠裙上联: 室陋几曾输月色  下联: 人闲何处觅花香上联: 舍经难顿悟未上此楼永与佛天离咫尺 下联: 修道可修行无边彼岸长随法雨洗尘心上联: 春风已过斜阳道 下联: 明月还临明月楼上联: 数遍千官无所事  下联: 几多万事有知音上联: 四面荷花三面柳于泉城润色 下联: 万家灯火万家灯照梦想成真上联: 嫁女婚男百年合 下联: 结婚婚姻四海同上联: 人在征途满园春色谁关注  下联: 情牵故里一片冰心我自由上联: 厨艺高超工境界  下联: 匠心巧妙妙文章上联: 踏浪归来风雨江湖犹识我  下联: 登楼望远江山山水不知年上联: 落纸云烟凝往事  下联: 挥毫笔墨写新篇上联: 艺苑腾蛟圣域方收硕果   下联: 联坛跃马神州更上层楼上联: 歧路    下联: 长江上联: 鹊飞疑是银河渡   下联: 雁去疑为玉簟秋上联: 创业创新天下道源新故事  下联: 承前启后世间遗产大文章上联: 红尘信似云霞聚  下联: 青史犹如日月长上联: 燕舞新年喜    下联: 莺歌盛世春上联: 红绿青黄黑白皆都有  下联: 红红绿绿红红各样红上联: 祥光烁破千生病    下联: 瑞气迎来万里春上联: 灵似甘霖解口渴  下联: 心如明月照人心上联: 清风拂面迷人意  下联: 明月盈怀醉客心上联: 欲邀我佛来执意催山起祥云莲开宝座 下联: 不染尘嚣去修身养性修善果我悟禅机上联: 千篇一律无新意 下联: 万古千秋有古风上联: 法乃国纲行廉反腐一身胆  下联: 德为民本治国安邦两袖风上联: 书中便晓人间事  下联: 笔下方知世上情上联: 坐拥湖山淡看利名鹤子梅妻仙是我  下联: 卧听风月闲听风雨松风竹韵月为邻上联: 寂寞溪边客    下联: 相思陌上人上联: 湖中玉镜邀明月    下联: 岭上青山伴夕阳上联: 两井水何奇活人济世苍天鉴 下联: 九州山不老壮志凌云白鹤飞上联: 拾级上天都赏景健身臂展青松迎奥运    下联: 登峰登绝顶登高极目胸怀赤县展雄风上联: 三门组稿紫燕编排采撷春光镶版面 下联: 四海蜚声金鸡报晓迎来喜气满人间上联: 窑火旺千秋光耀中华美誉长随丝路远 下联: 城乡兴百业兴隆大业宏图大展画图新上联: 竹篙桂楫飞如箭 下联: 铢襻香腰巧似珠上联: 新岁新景新气象  下联: 好风好雨好风光上联: 促寿   下联: 延年上联: 青春无价没人卖   下联: 岁月有情有酒浇上联: 知我法随缘不生执念    下联: 悟禅心自悟即是修行上联: 墨笔狂书龙飞凤舞出神韵    下联: 联花怒放蝶舞蜂飞入画图上联: 茂星环月天重笑  下联: 明月清风夜未央上联: 一片春云凝紫气  下联: 满园秋色染红霞上联: 葡萄架下斟新酒  下联: 橄榄枝头唱大风上联: 清江一盏多情月  下联: 明月千秋有意人上联: 贺新春换新居心花怒放   下联: 迎盛世兴骏业骏业兴隆上联: 股逢牛市套方解   下联: 脚踏马鞍车上行上联: 死生今忽异    下联: 死死自生悲上联: 云锁山门关俗客    下联: 月临水榭洗尘心上联: 花香难果腹    下联: 月色不关心上联: 淡了红尘淡了往事我心谁洗   下联: 抛开俗念抛却尘缘梦幻我来上联: 平安竹报全家庆 下联: 幸福花开满院春上联: 盛世添筹娱晚景  下联: 高山流水遇知音上联: 纵览古今中外千年史    下联: 纵观天地人间一片天上联: 润物滋春甘作雨    下联: 修身养性乐为天上联: 苦口婆心是佛   下联: 清风明月为人上联: 长大知才须有用   下联: 少年学问要无求上联: 及此春初因时游目 下联: 与时俱进自有知音上联: 求真务实锤炼工匠精神助力调转促 下联: 利国利民利民家庭幸福安居乐升平上联: 日丽鲜花含淑气  下联: 风和紫燕舞春风上联: 时时灵气时时趣  下联: 处处风情处处春上联: 鹏起抗英捐热血  下联: 龙腾盛世展雄风上联: 眼皮打架不如去  下联: 眉眼看穿无奈何上联: 拜佛许下千钧愿  下联: 读书读书一卷书上联: 乐有诗书墙上挂  下联: 乐无日月水中捞上联: 清廉简约护州政  下联: 正气清廉民族魂上联: 钟高密地灵官居著作    下联: 鼓高高天地帝业传承上联: 野火烧不尽  下联: 春风吹得来上联: 杯水可容天上月    下联: 春风不度世间花上联: 宝鸡报晓十五年看创新绘出和谐画  下联: 金凤朝阳万千里喜发展绘成富裕图上联: 生日星光晃晃   下联: 死年月色朦胧上联: 香雪无声自好色   下联: 春风有意总关情上联: 上海自来水来自海上    下联: 南山东阿阿阿阿胶胶上联: 立志增才饱含昌珏千滴汗    下联: 修身致富勤奋骅骝一片天上联: 今生缘尽无相欠  下联: 来世相逢不再来上联: 螺尖蚌扁鳖甲圆满盘皆壳  下联: 凤尾凰雏凤翅飞一翅齐毛上联: 未把萤虫当蜡烛  下联: 常将雁字作文章上联: 得意春风莫忘我  下联: 无心明月不知年上联: 长天待我舒鹏翼  下联: 大地回春入马蹄上联: 凭栏望月佳人泪尽关山远  下联: 把酒临风故友情深岁月长上联: 秋翻枫页谁为画  下联: 月落荷塘我作诗上联: 一夜春风千岭翠  下联: 满山秋色满山红上联: 泄柳   下联: 舂薪上联: 周报传八卦 下联: 文章耀九州上联: 一亭风月冷  下联: 两岸水云闲上联: 桃红残雪尽  下联: 柳绿暖风来上联: 江清随月老  下联: 海阔任风狂上联: 千秋扬正气  下联: 万里荡春风上联: 一亭风雨过  下联: 千古古今传上联: 科技兴邦旧岁已添三道喜    下联: 勤劳致富新年更上一层楼上联: 年来惆怅还依旧  下联: 风过泸州带酒香上联: 一叶归帆天际远  下联: 千帆破浪水中央上联: 道德文章都入理  下联: 文章笔墨总关情上联: 一宵大雨蛙声乱  下联: 半夜清风燕影斜上联: 叽哩咕噜怪话   下联: 汪汪汪汪真情上联: 细雨梦回鸡塞远   下联: 春风春暖马蹄香上联: 春风不解花间语  下联: 明月难知梦里人上联: 上下五千年龙族问天华夏煌煌谁肇造 下联: 纵横八万里人文蔚起神州熠熠我争先上联: 先锋奋击除倭寇 下联: 大业宏开振国威上联: 龙荣半世千秋贵  下联: 蛇舞三春万里香上联: 解粽筵开老翁半日斟蒲酒  下联: 寻梅酒醉稚子一庭摘菊诗上联: 门迎紫气铺天福  下联: 户纳春风入画图上联: 云开雾散 下联: 电闪雷鸣上联: 藏书集画展艺施才巧手掀开新世界 下联: 泼墨挥毫挥毫泼墨丹心写就大文章上联: 浮云窥海月    下联: 明月照天心上联: 寸阴宁越度  下联: 寸草不争荣上联: 莫让光阴如水逝    下联: 休将岁月似风流上联: 水秀山青花容月貌 下联: 花香鸟语鸟语花香上联: 我劝天公重抖擞 下联: 谁怜月老再团圆上联: 日序班头如候补  下联: 春风拂面似花开上联: 喜逢盛世频增寿  下联: 欢庆新年喜报春上联: 玉笛约春峰染翠  下联: 金樽邀月酒飘香上联: 云梦八千里    下联: 风情一万年上联: 圣代即今多雨露    下联: 名山何处有烟霞上联: 花影云拖地    下联: 月光月照天上联: 家中自有春秋韵    下联: 笔下常留岁月痕上联: 乌有   下联: 黄无上联: 心头苇荡笔底牧歌风华十秩弘联韵   下联: 笔下风流笔端墨韵锦绣千秋绘画图上联: 欲静憎蝉噪    下联: 方知喜鹊鸣上联: 春信千家传紫燕    下联: 花香万里绽红花上联: 槐花落尽无心事  下联: 柳絮飞空有意思上联: 赏松风格学竹虚心藏梅傲骨真君子  下联: 敬业精神培桃育李继往开来大丈夫上联: 涑水欢歌桃醉杜康三千岁月 下联: 瑶山焕彩燕飞燕赵一派春光上联: 欲穷千里宏观目 下联: 不负一生大爱心上联: 饮酒花间酒散花间花亦醉  下联: 吟诗月下风流月下月犹寒上联: 磊成三块石    下联: 风过一重山上联: 栉风沐雨人生路    下联: 戴月披星世界观上联: 山中宰相南朝典  下联: 门外仙人北国风上联: 前浪陈江缺后浪  下联: 高山流水遇知音上联: 心能转物 下联: 志可凌云上联: 古狗  下联: 新人上联: 姥姥    下联: 公公上联: 书中自出千钟粟取之有道   下联: 笔下难求万卷书得者无忧上联: 桃红李白妃子醉  下联: 柳绿花红美人娇上联: 对月梳妆青丝钩角挂    下联: 临风把盏红袖画眉开上联: 信手拈来神笔已臻诗境妙    下联: 随心放下神州更上画堂高上联: 一杯相送花辞去  下联: 两袖清风月照来上联: 无缝对接华阳喜逢日月同辉 下联: 万象更新大地春到春夏秋冬上联: 先声传喜讯有幸居楼多年愿望一朝遂    下联: 大业展宏图无忧处世万里欣逢百业兴上联: 岩乃山下石   下联: 山如水中山上联: 廉启新章正气敢教风气爽    下联: 德扬正气清风不让党旗红上联: 风定秋千闲卧月  下联: 月明夜半静敲诗上联: 笔有深情耕月夜  下联: 心无俗虑洗尘心上联: 端午万村包粽子  下联: 元宵一夜挂灯花上联: 花落一窗诗串起  下联: 月圆半夜梦随来上联: 刘剑胆  下联: 李文心上联: 口齿不清常跑调  下联: 嘴巴巴肉好揩油上联: 鸟语花香有声有色三春景  下联: 花香鸟语无语无声四季歌上联: 一对手纹启一宗始祖    下联: 两行文字传万代宗师上联: 伏枥雄心在  下联: 扬鞭壮志坚上联: 云边路绕秋山色    下联: 月下花开春水香上联: 星淡月明天气派  下联: 风和日丽地精神上联: 翠竹黄花皆佛性  下联: 清风明月是禅心上联: 按经济规律发展经济    下联: 以经济经济和谐社会上联: 寒梅已作东风信    下联: 明月还为北斗星上联: 大火焚林真够呛  下联: 小桥流水不糊涂上联: 星斗满天无月亮  下联: 春风遍地有花香上联: 依诗咏对须遵格  下联: 对酒当歌不厌烦上联: 林间鸟奏笙簧月  下联: 陌上花开蝶恋花上联: 济世良方除病患  下联: 修身正道济民生上联: 锐气千年盈北海  下联: 雄心万里壮南疆上联: 寨外涓溪流我泪  下联: 门前紫燕舞春风上联: 风一动千般变化  下联: 月半轮万里乾坤上联: 青山昨夜风吹过  下联: 碧水今宵月照来上联: 作后学津梁藜照年年旧梦未抛天禄阁 下联: 为先生典范读书代代高风不负栋梁材上联: 闲云拂岫时舒展 下联: 明月临窗每觊觎上联: 挥笔如剑倚麓山豪气干云揽月去   下联: 挥毫似刀挥铁马豪情壮志踏云来上联: 执镫引缰扶农跃上千里马   下联: 乘风破浪破浪冲开一片天上联: 桃呈福寿李呈喜  下联: 梅吐芬芳李贺春上联: 应虎步春声和风带雨谁施泽 下联: 为龙腾盛世盛世扬帆我领航上联: 独览群峰高低不论皆平视 下联: 常思大道远近无争尽远观上联: 塔影梅香山色千般秀    下联: 山光水色湖光万里春上联: 春雨依然有意绿    下联: 桃花依旧笑颜红上联: 双龙曾献瑞    下联: 百鸟不争春上联: 表面 下联: 开心上联: 业内富者者又者者者富者   下联: 家中家家家家家家家家家上联: 心为业本 下联: 德是人才上联: 扇转非为己   下联: 杯空不是人上联: 云石足勾留稔知清气源山野   下联: 江山须造就明察古今论古今上联: 卓荦岂共红尘误 下联: 达人何必白云归上联: 民安国泰三春送暖三农活  下联: 政善人和万象更新百业兴上联: 睡前添一笔    下联: 醉后醉三杯上联: 环球通讯   下联: 大地回春上联: 登宝塔品中山松醪庆贺民强国富  下联: 登高楼看大地春色迎来国泰民安上联: 鸟语空山惊寂寞   下联: 花香小院惹相思上联: 生发灵可医疗毛病 下联: 死生命能医疗病灾上联: 对连错 下联: 联对联上联: 松下下棋寻子路  下联: 月中中箭有嫦娥上联: 柳枕湖边鱼戏月  下联: 梅开岭上鸟争春上联: 山色泉声涵静照  下联: 松风竹韵入清流上联: 清明尘世清明景  下联: 雨露风情淡雅情上联: 魔日逆天曾使樱花泣血   下联: 春风得意不教柳絮伤心上联: 纵横笔下三千意   下联: 俯仰胸中万仞峰上联: 盛世春临小康在望喜听农家储百万  下联: 小康福满大有无边欣看大业耀千秋上联: 源浊难见流清水  下联: 望重方知望远山上联: 一波情浪涌平湖  下联: 满目春光入画图上联: 箬笠红尘外    下联: 瑶琴绿绮中上联: 望路烟霞外  下联: 登山日月中上联: 奇文共欣赏偶尔重温陶令句   下联: 佳句同吟咏何须再诵谢公诗上联: 花香一盏收浓淡 下联: 月色半窗照浅深上联: 新月初悬没线银钩能钓海  下联: 清风乍起无声玉笛可吹箫PaddleNLP更多教程
使用seq2vec模块进行句子情感分析
使用预训练模型ERNIE优化情感分析
使用BiGRU-CRF模型完成快递单信息抽取
使用预训练模型ERNIE优化快递单信息抽取
使用预训练模型ERNIE-GEN实现智能写诗
使用TCN网络完成新冠疫情病例数预测
使用预训练模型完成阅读理解
自定义数据集实现文本多分类任务

『NLP经典项目集』05:新年到,飞桨带你对对联相关推荐

  1. 『NLP经典项目集』10:使用预训练模型优化快递单信息抽取

    使用PaddleNLP语义预训练模型ERNIE完成快递单信息抽取 注意本项目代码需要使用GPU环境来运行:命名实体识别是NLP中一项非常基础的任务,是信息提取.问答系统.句法分析.机器翻译等众多NLP ...

  2. 『NLP经典项目集』08: 使用预训练模型完成阅读理解

    基于BERT预训练模型的阅读理解任务 阅读理解是自然语言处理中的一个重要的任务,最常见的数据集是单篇章.抽取式阅读理解数据集.具体的任务定义为:对于一个给定的问题q和一个篇章p,根据篇章内容,给出该问 ...

  3. 『NLP经典项目集』06: 使用预训练模型ERNIE-GEN自动写诗

    使用PaddleNLP预训练模型ERNIE-GEN生成诗歌 诗歌,是中国文化的瑰宝,它饱含作者的思想感情与丰富的想象,语言凝练而形象性强,具有鲜明的节奏,和谐的音韵,富于音乐美.诗歌语句一般分行排列, ...

  4. 『深度学习项目四』基于ResNet101人脸特征点检测

    相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别 [深度学习项目二]卷积神经网络LeNet实现minst数字识别 [深度学习项目三]ResNet50多分类任务[十二生肖分类] 『深度 ...

  5. Day03『NLP打卡营』实践课3:使用预训练模型实现快递单信息抽取

    Day03 词法分析作业辅导 本教程旨在辅导同学如何完成 AI Studio课程--『NLP打卡营』实践课3:使用预训练模型实现快递单信息抽取 课后作业. 1. 更换预训练模型 在PaddleNLP ...

  6. day01『NLP打卡营』实践课1:词向量应用演示

    Day01 词向量作业辅导 本教程旨在辅导同学如何完成 AI Studio课程--『NLP打卡营』实践课1:词向量应用展示 课后作业. 1. 选择词向量预训练模型 在PaddleNLP 中文Embed ...

  7. 『NLP打卡营』实践课5:文本情感分析

    『NLP直播课』Day 5:情感分析预训练模型SKEP 本项目将详细全面介绍情感分析任务的两种子任务,句子级情感分析和目标级情感分析. 同时演示如何使用情感分析预训练模型SKEP完成以上两种任务,详细 ...

  8. 『NLP打卡营』实践课6:机器阅读理解

    基于预训练模型的机器阅读理解 阅读理解是检索问答系统中的重要组成部分,最常见的数据集是单篇章.抽取式阅读理解数据集. 该示例展示了如何使用PaddleNLP快速实现基于预训练模型的机器阅读理解任务. ...

  9. 飞桨社区项目PaddleMM正式进入木兰开源社区进行孵化

    12月6日,PaddleMM在木兰开源社区TOC评审会上投票通过.按照章程,PaddleMM最终准入木兰开源社区进行孵化.木兰社区提供2名项目导师进行后续指导,飞桨也将一如既往为项目提供技术支持.欢迎 ...

最新文章

  1. RabbitMQ的消费限流
  2. win10计算机拒绝访问,教你win10系统c盘拒绝访问怎么办
  3. python引用大数据,Python 3 UDF
  4. 一个低级错误引发Netty编码解码中文异常
  5. hdu4560 不错的建图,二分最大流
  6. 手写单隐层神经网络_鸢尾花分类(matlab实现)
  7. Create new SAP DDL view and click finish in wizard
  8. springboot扫描组件_springboot多模块包扫描问题的解决方法
  9. Android之通过ContentResolver获取手机图片和视频的路径和生成缩略图和缩略图路径
  10. Axis2搭建WebService服务
  11. DUTCTF 201x RE20
  12. 庆祝喜提13337000编号,我悄悄把老板的Windows命令行设置成了这样
  13. Python自动化开发从浅入深-进阶(socketServer)
  14. 德乐Derler T-1series 120G SSD固态硬盘不认盘修复/开卡一例(SM2258XT主控),SM2259XT2可参考
  15. JAVA 配合 Vue前台,完成中文、拼音全拼、拼音首字母检索
  16. 品胜WPR003N、WMB001N刷Openwrt
  17. 国际抗疫数据分析脚本
  18. python中quadratic,Python: Using CVXOPT for quadratic programming
  19. 负载均衡器ribbon和LoadBalancer
  20. 强化学习、行为心理学和成瘾机制

热门文章

  1. 这个世界上最重要的人是你自己
  2. MySQL导入官方数据库world防踩坑完全操作
  3. javascript 语法
  4. Openstack Horizon 可插拔Panels 和 Groups
  5. python安装库命令
  6. 第一行代码十一章:(基于位置的服务) 3C-58-C2-5D-F8-FE
  7. 魔众图床系统 v1.0.0 简单的私有化图床系统
  8. 616学习记录之PHP
  9. 使用VIVADO中的MIG控制DDR3(AXI接口)三——DDR3简介
  10. for循环和forEach详解