Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleHub
提交
fa68672a
P
PaddleHub
项目概览
PaddlePaddle
/
PaddleHub
大约 1 年 前同步成功
通知
280
Star
12117
Fork
2091
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
200
列表
看板
标记
里程碑
合并请求
4
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleHub
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
200
Issue
200
列表
看板
标记
里程碑
合并请求
4
合并请求
4
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
fa68672a
编写于
8月 02, 2019
作者:
Z
zhangxuefei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update text cls demo to adapted to ernie v2
上级
5edc2a6f
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
89 addition
and
22 deletion
+89
-22
demo/text-classification/predict.py
demo/text-classification/predict.py
+43
-10
demo/text-classification/run_classifier.sh
demo/text-classification/run_classifier.sh
+1
-0
demo/text-classification/run_predict.sh
demo/text-classification/run_predict.sh
+1
-1
demo/text-classification/text_classifier.py
demo/text-classification/text_classifier.py
+42
-11
paddlehub/reader/nlp_reader.py
paddlehub/reader/nlp_reader.py
+2
-0
未找到文件。
demo/text-classification/predict.py
浏览文件 @
fa68672a
...
@@ -29,12 +29,14 @@ import paddlehub as hub
...
@@ -29,12 +29,14 @@ import paddlehub as hub
# yapf: disable
# yapf: disable
parser
=
argparse
.
ArgumentParser
(
__doc__
)
parser
=
argparse
.
ArgumentParser
(
__doc__
)
parser
.
add_argument
(
"--checkpoint_dir"
,
type
=
str
,
default
=
None
,
help
=
"Directory to model checkpoint"
)
parser
.
add_argument
(
"--checkpoint_dir"
,
type
=
str
,
default
=
"ckpt_20190802182531"
,
help
=
"Directory to model checkpoint"
)
parser
.
add_argument
(
"--batch_size"
,
type
=
int
,
default
=
1
,
help
=
"Total examples' number in batch for training."
)
parser
.
add_argument
(
"--batch_size"
,
type
=
int
,
default
=
1
,
help
=
"Total examples' number in batch for training."
)
parser
.
add_argument
(
"--max_seq_len"
,
type
=
int
,
default
=
512
,
help
=
"Number of words of the longest seqence."
)
parser
.
add_argument
(
"--max_seq_len"
,
type
=
int
,
default
=
512
,
help
=
"Number of words of the longest seqence."
)
parser
.
add_argument
(
"--use_gpu"
,
type
=
ast
.
literal_eval
,
default
=
False
,
help
=
"Whether use GPU for finetuning, input should be True or False"
)
parser
.
add_argument
(
"--use_gpu"
,
type
=
ast
.
literal_eval
,
default
=
False
,
help
=
"Whether use GPU for finetuning, input should be True or False"
)
parser
.
add_argument
(
"--use_pyreader"
,
type
=
ast
.
literal_eval
,
default
=
False
,
help
=
"Whether use pyreader to feed data."
)
parser
.
add_argument
(
"--use_pyreader"
,
type
=
ast
.
literal_eval
,
default
=
False
,
help
=
"Whether use pyreader to feed data."
)
parser
.
add_argument
(
"--dataset"
,
type
=
str
,
default
=
"chnsenticorp"
,
help
=
"Directory to dataset"
)
parser
.
add_argument
(
"--dataset"
,
type
=
str
,
default
=
"chnsenticorp"
,
help
=
"The choice of dataset"
)
parser
.
add_argument
(
"--use_data_parallel"
,
type
=
ast
.
literal_eval
,
default
=
False
,
help
=
"Whether use data parallel."
)
parser
.
add_argument
(
"--use_taskid"
,
type
=
ast
.
literal_eval
,
default
=
False
,
help
=
"Whether to use taskid ,if yes to use ernie v2."
)
args
=
parser
.
parse_args
()
args
=
parser
.
parse_args
()
# yapf: enable.
# yapf: enable.
...
@@ -52,25 +54,46 @@ if __name__ == '__main__':
...
@@ -52,25 +54,46 @@ if __name__ == '__main__':
module
=
hub
.
Module
(
name
=
"ernie"
)
module
=
hub
.
Module
(
name
=
"ernie"
)
elif
args
.
dataset
.
lower
()
==
"mrpc"
:
elif
args
.
dataset
.
lower
()
==
"mrpc"
:
dataset
=
hub
.
dataset
.
GLUE
(
"MRPC"
)
dataset
=
hub
.
dataset
.
GLUE
(
"MRPC"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
()
==
"qqp"
:
elif
args
.
dataset
.
lower
()
==
"qqp"
:
dataset
=
hub
.
dataset
.
GLUE
(
"QQP"
)
dataset
=
hub
.
dataset
.
GLUE
(
"QQP"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
()
==
"sst-2"
:
elif
args
.
dataset
.
lower
()
==
"sst-2"
:
dataset
=
hub
.
dataset
.
GLUE
(
"SST-2"
)
dataset
=
hub
.
dataset
.
GLUE
(
"SST-2"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
()
==
"cola"
:
elif
args
.
dataset
.
lower
()
==
"cola"
:
dataset
=
hub
.
dataset
.
GLUE
(
"CoLA"
)
dataset
=
hub
.
dataset
.
GLUE
(
"CoLA"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
()
==
"qnli"
:
elif
args
.
dataset
.
lower
()
==
"qnli"
:
dataset
=
hub
.
dataset
.
GLUE
(
"QNLI"
)
dataset
=
hub
.
dataset
.
GLUE
(
"QNLI"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
()
==
"rte"
:
elif
args
.
dataset
.
lower
()
==
"rte"
:
dataset
=
hub
.
dataset
.
GLUE
(
"RTE"
)
dataset
=
hub
.
dataset
.
GLUE
(
"RTE"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
()
==
"mnli"
:
elif
args
.
dataset
.
lower
()
==
"mnli"
:
dataset
=
hub
.
dataset
.
GLUE
(
"MNLI"
)
dataset
=
hub
.
dataset
.
GLUE
(
"MNLI"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
().
startswith
(
"xnli"
):
elif
args
.
dataset
.
lower
().
startswith
(
"xnli"
):
dataset
=
hub
.
dataset
.
XNLI
(
language
=
args
.
dataset
.
lower
()[
-
2
:])
dataset
=
hub
.
dataset
.
XNLI
(
language
=
args
.
dataset
.
lower
()[
-
2
:])
module
=
hub
.
Module
(
name
=
"bert_multi_cased_L-12_H-768_A-12"
)
module
=
hub
.
Module
(
name
=
"bert_multi_cased_L-12_H-768_A-12"
)
...
@@ -82,7 +105,8 @@ if __name__ == '__main__':
...
@@ -82,7 +105,8 @@ if __name__ == '__main__':
reader
=
hub
.
reader
.
ClassifyReader
(
reader
=
hub
.
reader
.
ClassifyReader
(
dataset
=
dataset
,
dataset
=
dataset
,
vocab_path
=
module
.
get_vocab_path
(),
vocab_path
=
module
.
get_vocab_path
(),
max_seq_len
=
args
.
max_seq_len
)
max_seq_len
=
args
.
max_seq_len
,
use_task_id
=
args
.
use_taskid
)
# Construct transfer learning network
# Construct transfer learning network
# Use "pooled_output" for classification tasks on an entire sentence.
# Use "pooled_output" for classification tasks on an entire sentence.
...
@@ -98,6 +122,15 @@ if __name__ == '__main__':
...
@@ -98,6 +122,15 @@ if __name__ == '__main__':
inputs
[
"input_mask"
].
name
,
inputs
[
"input_mask"
].
name
,
]
]
if
args
.
use_taskid
:
feed_list
=
[
inputs
[
"input_ids"
].
name
,
inputs
[
"position_ids"
].
name
,
inputs
[
"segment_ids"
].
name
,
inputs
[
"input_mask"
].
name
,
inputs
[
"task_ids"
].
name
,
]
# Setup runing config for PaddleHub Finetune API
# Setup runing config for PaddleHub Finetune API
config
=
hub
.
RunConfig
(
config
=
hub
.
RunConfig
(
use_data_parallel
=
False
,
use_data_parallel
=
False
,
...
...
demo/text-classification/run_classifier.sh
浏览文件 @
fa68672a
...
@@ -26,3 +26,4 @@ python -u text_classifier.py \
...
@@ -26,3 +26,4 @@ python -u text_classifier.py \
--num_epoch
=
3
\
--num_epoch
=
3
\
--use_pyreader
=
True
\
--use_pyreader
=
True
\
--use_data_parallel
=
True
\
--use_data_parallel
=
True
\
--use_taskid
=
False
\
demo/text-classification/run_predict.sh
浏览文件 @
fa68672a
...
@@ -15,4 +15,4 @@ CKPT_DIR="./ckpt_${DATASET}"
...
@@ -15,4 +15,4 @@ CKPT_DIR="./ckpt_${DATASET}"
# sw: Swahili th: Thai tr: Turkish
# sw: Swahili th: Thai tr: Turkish
# ur: Urdu vi: Vietnamese zh: Chinese (Simplified)
# ur: Urdu vi: Vietnamese zh: Chinese (Simplified)
python
-u
predict.py
--checkpoint_dir
$CKPT_DIR
--max_seq_len
128
--use_gpu
False
--dataset
=
${
DATASET
}
python
-u
predict.py
--checkpoint_dir
$CKPT_DIR
--max_seq_len
128
--use_gpu
False
--dataset
=
${
DATASET
}
----use_taskid
False
demo/text-classification/text_classifier.py
浏览文件 @
fa68672a
...
@@ -22,17 +22,18 @@ import paddlehub as hub
...
@@ -22,17 +22,18 @@ import paddlehub as hub
# yapf: disable
# yapf: disable
parser
=
argparse
.
ArgumentParser
(
__doc__
)
parser
=
argparse
.
ArgumentParser
(
__doc__
)
parser
.
add_argument
(
"--num_epoch"
,
type
=
int
,
default
=
3
,
help
=
"Number of epoches for fine-tuning."
)
parser
.
add_argument
(
"--num_epoch"
,
type
=
int
,
default
=
3
,
help
=
"Number of epoches for fine-tuning."
)
parser
.
add_argument
(
"--use_gpu"
,
type
=
ast
.
literal_eval
,
default
=
Fals
e
,
help
=
"Whether use GPU for finetuning, input should be True or False"
)
parser
.
add_argument
(
"--use_gpu"
,
type
=
ast
.
literal_eval
,
default
=
Tru
e
,
help
=
"Whether use GPU for finetuning, input should be True or False"
)
parser
.
add_argument
(
"--dataset"
,
type
=
str
,
default
=
"chnsenticorp"
,
help
=
"
Directory to
dataset"
)
parser
.
add_argument
(
"--dataset"
,
type
=
str
,
default
=
"chnsenticorp"
,
help
=
"
The choice of
dataset"
)
parser
.
add_argument
(
"--learning_rate"
,
type
=
float
,
default
=
5e-5
,
help
=
"Learning rate used to train with warmup."
)
parser
.
add_argument
(
"--learning_rate"
,
type
=
float
,
default
=
5e-5
,
help
=
"Learning rate used to train with warmup."
)
parser
.
add_argument
(
"--weight_decay"
,
type
=
float
,
default
=
0.01
,
help
=
"Weight decay rate for L2 regularizer."
)
parser
.
add_argument
(
"--weight_decay"
,
type
=
float
,
default
=
0.01
,
help
=
"Weight decay rate for L2 regularizer."
)
parser
.
add_argument
(
"--warmup_proportion"
,
type
=
float
,
default
=
0.
0
,
help
=
"Warmup proportion params for warmup strategy"
)
parser
.
add_argument
(
"--warmup_proportion"
,
type
=
float
,
default
=
0.
1
,
help
=
"Warmup proportion params for warmup strategy"
)
parser
.
add_argument
(
"--data_dir"
,
type
=
str
,
default
=
None
,
help
=
"Path to training data."
)
parser
.
add_argument
(
"--data_dir"
,
type
=
str
,
default
=
None
,
help
=
"Path to training data."
)
parser
.
add_argument
(
"--checkpoint_dir"
,
type
=
str
,
default
=
None
,
help
=
"Directory to model checkpoint"
)
parser
.
add_argument
(
"--checkpoint_dir"
,
type
=
str
,
default
=
None
,
help
=
"Directory to model checkpoint"
)
parser
.
add_argument
(
"--max_seq_len"
,
type
=
int
,
default
=
512
,
help
=
"Number of words of the longest seqence."
)
parser
.
add_argument
(
"--max_seq_len"
,
type
=
int
,
default
=
512
,
help
=
"Number of words of the longest seqence."
)
parser
.
add_argument
(
"--batch_size"
,
type
=
int
,
default
=
32
,
help
=
"Total examples' number in batch for training."
)
parser
.
add_argument
(
"--batch_size"
,
type
=
int
,
default
=
32
,
help
=
"Total examples' number in batch for training."
)
parser
.
add_argument
(
"--use_pyreader"
,
type
=
ast
.
literal_eval
,
default
=
False
,
help
=
"Whether use pyreader to feed data."
)
parser
.
add_argument
(
"--use_pyreader"
,
type
=
ast
.
literal_eval
,
default
=
False
,
help
=
"Whether use pyreader to feed data."
)
parser
.
add_argument
(
"--use_data_parallel"
,
type
=
ast
.
literal_eval
,
default
=
False
,
help
=
"Whether use data parallel."
)
parser
.
add_argument
(
"--use_data_parallel"
,
type
=
ast
.
literal_eval
,
default
=
False
,
help
=
"Whether use data parallel."
)
parser
.
add_argument
(
"--use_taskid"
,
type
=
ast
.
literal_eval
,
default
=
False
,
help
=
"Whether to use taskid ,if yes to use ernie v2."
)
args
=
parser
.
parse_args
()
args
=
parser
.
parse_args
()
# yapf: enable.
# yapf: enable.
...
@@ -50,25 +51,46 @@ if __name__ == '__main__':
...
@@ -50,25 +51,46 @@ if __name__ == '__main__':
module
=
hub
.
Module
(
name
=
"ernie"
)
module
=
hub
.
Module
(
name
=
"ernie"
)
elif
args
.
dataset
.
lower
()
==
"mrpc"
:
elif
args
.
dataset
.
lower
()
==
"mrpc"
:
dataset
=
hub
.
dataset
.
GLUE
(
"MRPC"
)
dataset
=
hub
.
dataset
.
GLUE
(
"MRPC"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
()
==
"qqp"
:
elif
args
.
dataset
.
lower
()
==
"qqp"
:
dataset
=
hub
.
dataset
.
GLUE
(
"QQP"
)
dataset
=
hub
.
dataset
.
GLUE
(
"QQP"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
()
==
"sst-2"
:
elif
args
.
dataset
.
lower
()
==
"sst-2"
:
dataset
=
hub
.
dataset
.
GLUE
(
"SST-2"
)
dataset
=
hub
.
dataset
.
GLUE
(
"SST-2"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
()
==
"cola"
:
elif
args
.
dataset
.
lower
()
==
"cola"
:
dataset
=
hub
.
dataset
.
GLUE
(
"CoLA"
)
dataset
=
hub
.
dataset
.
GLUE
(
"CoLA"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
()
==
"qnli"
:
elif
args
.
dataset
.
lower
()
==
"qnli"
:
dataset
=
hub
.
dataset
.
GLUE
(
"QNLI"
)
dataset
=
hub
.
dataset
.
GLUE
(
"QNLI"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
()
==
"rte"
:
elif
args
.
dataset
.
lower
()
==
"rte"
:
dataset
=
hub
.
dataset
.
GLUE
(
"RTE"
)
dataset
=
hub
.
dataset
.
GLUE
(
"RTE"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
()
==
"mnli"
:
elif
args
.
dataset
.
lower
()
==
"mnli"
:
dataset
=
hub
.
dataset
.
GLUE
(
"MNLI"
)
dataset
=
hub
.
dataset
.
GLUE
(
"MNLI"
)
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
if
args
.
use_taskid
:
module
=
hub
.
Module
(
name
=
"ernie_v2_eng_base"
)
else
:
module
=
hub
.
Module
(
name
=
"bert_uncased_L-12_H-768_A-12"
)
elif
args
.
dataset
.
lower
().
startswith
(
"xnli"
):
elif
args
.
dataset
.
lower
().
startswith
(
"xnli"
):
dataset
=
hub
.
dataset
.
XNLI
(
language
=
args
.
dataset
.
lower
()[
-
2
:])
dataset
=
hub
.
dataset
.
XNLI
(
language
=
args
.
dataset
.
lower
()[
-
2
:])
module
=
hub
.
Module
(
name
=
"bert_multi_cased_L-12_H-768_A-12"
)
module
=
hub
.
Module
(
name
=
"bert_multi_cased_L-12_H-768_A-12"
)
...
@@ -80,7 +102,8 @@ if __name__ == '__main__':
...
@@ -80,7 +102,8 @@ if __name__ == '__main__':
reader
=
hub
.
reader
.
ClassifyReader
(
reader
=
hub
.
reader
.
ClassifyReader
(
dataset
=
dataset
,
dataset
=
dataset
,
vocab_path
=
module
.
get_vocab_path
(),
vocab_path
=
module
.
get_vocab_path
(),
max_seq_len
=
args
.
max_seq_len
)
max_seq_len
=
args
.
max_seq_len
,
use_task_id
=
args
.
use_taskid
)
# Construct transfer learning network
# Construct transfer learning network
# Use "pooled_output" for classification tasks on an entire sentence.
# Use "pooled_output" for classification tasks on an entire sentence.
...
@@ -96,6 +119,14 @@ if __name__ == '__main__':
...
@@ -96,6 +119,14 @@ if __name__ == '__main__':
inputs
[
"input_mask"
].
name
,
inputs
[
"input_mask"
].
name
,
]
]
if
args
.
use_taskid
:
feed_list
=
[
inputs
[
"input_ids"
].
name
,
inputs
[
"position_ids"
].
name
,
inputs
[
"segment_ids"
].
name
,
inputs
[
"input_mask"
].
name
,
inputs
[
"task_ids"
].
name
,
]
# Select finetune strategy, setup config and finetune
# Select finetune strategy, setup config and finetune
strategy
=
hub
.
AdamWeightDecayStrategy
(
strategy
=
hub
.
AdamWeightDecayStrategy
(
weight_decay
=
args
.
weight_decay
,
weight_decay
=
args
.
weight_decay
,
...
...
paddlehub/reader/nlp_reader.py
浏览文件 @
fa68672a
...
@@ -332,6 +332,8 @@ class ClassifyReader(BaseReader):
...
@@ -332,6 +332,8 @@ class ClassifyReader(BaseReader):
]
]
if
self
.
use_task_id
:
if
self
.
use_task_id
:
padded_task_ids
=
np
.
ones_like
(
padded_token_ids
,
dtype
=
"int64"
)
*
self
.
task_id
return_list
=
[
return_list
=
[
padded_token_ids
,
padded_position_ids
,
padded_text_type_ids
,
padded_token_ids
,
padded_position_ids
,
padded_text_type_ids
,
input_mask
,
padded_task_ids
input_mask
,
padded_task_ids
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录