Paddle paddle1.5版本 lstm 数据输出的size不对

6jygbczu  于 2022-04-21  发布在  Java
关注(0)|答案(9)|浏览(340)

为使您的问题得到快速解决,在建立Issue前,请您先通过如下方式搜索是否有相似问题:【搜索issue关键字】【使用labels筛选】【官方文档】

  • 标题:lstm输出的size不对
  • 版本、环境信息:

   1)PaddlePaddle版本:1.5.1

  • 模型信息

   lstm https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/api_cn/layers_cn/nn_cn.html
ernie

  • 复现信息:
  • 问题描述:

代码片段
def seq_from_ernie(
args,
src_ids,
position_ids,
sentence_ids,
task_ids,
input_mask,
config,
use_fp16,
):
"""cls_from_ernie"""
ernie = ErnieModel(
src_ids=src_ids,
position_ids=position_ids,
sentence_ids=sentence_ids,
task_ids=task_ids,
input_mask=input_mask,
config=config,
use_fp16=use_fp16,
)
seq_feats = ernie.get_sequence_output()
'''
seq_feats = fluid.layers.dropout(
x=seq_feats,
dropout_prob=0.1,
dropout_implementation="upscale_in_train",
)
'''
return seq_feats

if is_classify:
pyreader = fluid.layers.py_reader(
capacity=50,
shapes=[
[-1, args.max_seq_len, 1], [-1, args.max_seq_len, 1],
[-1, args.max_seq_len, 1], [-1, args.max_seq_len, 1],
[-1, args.max_seq_len, 1],
[-1, args.max_seq_len, 1], [-1, args.max_seq_len, 1],
[-1, args.max_seq_len, 1], [-1, args.max_seq_len, 1],
[-1, args.max_seq_len, 1],
#[-1, args.max_seq_len, 1], [-1, args.max_seq_len, 1],
#[-1, args.max_seq_len, 1], [-1, args.max_seq_len, 1],
#[-1, args.max_seq_len, 1],
[-1, 1],
[-1, 1],
[-1, 1],
],
dtypes=[
'int64', 'int64', 'int64', 'int64', 'float32',
'int64', 'int64', 'int64', 'int64', 'float32',
#'int64', 'int64', 'int64', 'int64', 'float32',
'int64',
'int64',
'int64',
],
lod_levels=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
name=task_name + "_" + pyreader_name,
use_double_buffer=True,
)

(
src_ids_1, sent_ids_1, pos_ids_1, task_ids_1, input_mask_1,
src_ids_2, sent_ids_2, pos_ids_2, task_ids_2, input_mask_2,
#src_ids_3, sent_ids_3, pos_ids_3, task_ids_3, input_mask_3,
labels,
types,
qids,
) = fluid.layers.read_file(pyreader)

seq_feats_query = seq_from_ernie(
args,
src_ids=src_ids_1,
position_ids=pos_ids_1,
sentence_ids=sent_ids_1,
task_ids=task_ids_1,
input_mask=input_mask_1,
config=ernie_config,
use_fp16=args.use_fp16,
)

seq_feats_left = seq_from_ernie(
args,
src_ids=src_ids_2,
position_ids=pos_ids_2,
sentence_ids=sent_ids_2,
task_ids=task_ids_2,
input_mask=input_mask_2,
config=ernie_config,
use_fp16=args.use_fp16,
)
seq_feats_query = fluid.layers.transpose(seq_feats_query,[1,0,2])
seq_feats_left = fluid.layers.transpose(seq_feats_left,[1,0,2])
print('seq_feats_query',seq_feats_query)
num_layers,batch_size,hidden_size,max_len = 1,32,64,128
query_init_h = fluid.layers.fill_constant( [num_layers, batch_size, hidden_size], 'float32', 0.0 )
query_init_c = fluid.layers.fill_constant( [num_layers, batch_size, hidden_size], 'float32', 0.0 )
query_rnn_out, query_last_h, query_last_c = fluid.layers.lstm(
seq_feats_query,
query_init_h,query_init_c,max_len, hidden_size, num_layers,
is_bidirec=True
)
print('query_rnn_out',query_rnn_out)
print('seq_feats_left',seq_feats_left)
left_init_h = fluid.layers.fill_constant( [num_layers, batch_size, hidden_size], 'float32', 0.0 )
left_init_c = fluid.layers.fill_constant( [num_layers, batch_size, hidden_size], 'float32', 0.0 )
left_rnn_out, left_last_h, left_last_c = fluid.layers.lstm(
seq_feats_left,
left_init_h,left_init_c,max_len, hidden_size, num_layers,
is_bidirec=True
)
#query_rnn_out = fluid.layers.transpose(query_rnn_out,[1,0,2])
#left_rnn_out = fluid.layers.transpose(left_rnn_out,[1,0,2])
print('left_rnn_out',left_rnn_out)
说下整个过程,先用ernie get_sequence_output 获得整个序列每个位置的向量(768维),然后过lstm,输出按理来说的维度应该是预设的hidden_size2,然而事实不是这样的。
输入数据 第三个分量是原始的dimension 768
seq_feats_query name: "transpose_96.tmp_0"
2020-09-02 13:42:55 type {
2020-09-02 13:42:55 type: LOD_TENSOR
2020-09-02 13:42:55 lod_tensor {
2020-09-02 13:42:55 tensor {
2020-09-02 13:42:55 data_type: FP32
2020-09-02 13:42:55 dims: 128
2020-09-02 13:42:55 dims: -1
2020-09-02 13:42:55 dims: 768
2020-09-02 13:42:55 }
2020-09-02 13:42:55 }
2020-09-02 13:42:55 }
2020-09-02 13:42:55 persistable: false
2020-09-02 13:42:55
经过lstm 输出数据,第三个分量不是我预期的hidden_size
2 =128而仍然是768
2020-09-02 13:42:55 query_rnn_out name: "cudnn_lstm_0.tmp_0"
2020-09-02 13:42:55 type {
2020-09-02 13:42:55 type: LOD_TENSOR
2020-09-02 13:42:55 lod_tensor {
2020-09-02 13:42:55 tensor {
2020-09-02 13:42:55 data_type: FP32
2020-09-02 13:42:55 dims: 128
2020-09-02 13:42:55 dims: -1
2020-09-02 13:42:55 dims: 768
2020-09-02 13:42:55 }
2020-09-02 13:42:55 }
2020-09-02 13:42:55 }
2020-09-02 13:42:55 persistable: false
这个也是同理,输入768维,输出hidden_size 仍未768.与文档中提到的并不符合,

2020-09-02 13:42:55 seq_feats_left name: "transpose_97.tmp_0"
2020-09-02 13:42:55 type {
2020-09-02 13:42:55 type: LOD_TENSOR
2020-09-02 13:42:55 lod_tensor {
2020-09-02 13:42:55 tensor {
2020-09-02 13:42:55 data_type: FP32
2020-09-02 13:42:55 dims: 128
2020-09-02 13:42:55 dims: -1
2020-09-02 13:42:55 dims: 768
2020-09-02 13:42:55 }
2020-09-02 13:42:55 }
2020-09-02 13:42:55 }
2020-09-02 13:42:55 persistable: false
2020-09-02 13:42:55
2020-09-02 13:42:55 left_rnn_out name: "cudnn_lstm_1.tmp_0"
2020-09-02 13:42:55 type {
2020-09-02 13:42:55 type: LOD_TENSOR
2020-09-02 13:42:55 lod_tensor {
2020-09-02 13:42:55 tensor {
2020-09-02 13:42:55 data_type: FP32
2020-09-02 13:42:55 dims: 128
2020-09-02 13:42:55 dims: -1
2020-09-02 13:42:55 dims: 768
2020-09-02 13:42:55 }
2020-09-02 13:42:55 }
2020-09-02 13:42:55 }
2020-09-02 13:42:55 persistable: false

pgpifvop

pgpifvop1#

您好,可以升级下paddle版本到1.8.4试试能否解决这个问题

sd2nnvve

sd2nnvve2#

官网的例子,1.8.1仍然有问题。

4szc88ey

4szc88ey3#

您好,刚了解到最近lstm有一些更新,9月中旬即将发布的2.0-beta版本应该会修复您遇到的问题。您可以到时更新到2.0-beta版本试下哈

xhv8bpkk

xhv8bpkk4#

#19925 我看其他的issue里面已经提了,不知道修复的版本号是?

ac1kyiln

ac1kyiln5#

由于其他的一些原因,我现在必须要用1.5.1版,请问有什么途径可以获得修复bug的1.5.1版安装包?

vu8f3i0k

vu8f3i0k6#

#19925 我看其他的issue里面已经提了,不知道修复的版本号是?

您提到的这个issue在2019年7月已经合入了,我确认了1.8.1也包含修复的代码。请问您使用的是cpu还是gpu?

qq24tv8q

qq24tv8q7#

https://github.com/PaddlePaddle/Paddle/blob/release/1.5/paddle/fluid/operators/cudnn_lstm_op.cc 的确,我看1.6版本以上都合并了这个bugfix,1.5版本没有合并,但目前由于预测阶段裁剪op的原因1.5版本以上inference阶段跑不下来,不知道1.5版本不合并的原因是出于?

c9qzyr3d

c9qzyr3d8#

https://github.com/PaddlePaddle/Paddle/blob/release/1.5/paddle/fluid/operators/cudnn_lstm_op.cc 的确,我看1.6版本以上都合并了这个bugfix,1.5版本没有合并,但目前由于预测阶段裁剪op的原因1.5版本以上inference阶段跑不下来,不知道1.5版本不合并的原因是出于?

这个bug应该是在1.6修复的。
预测阶段裁剪op导致1.5版本以上inference阶段跑不下来的问题,您可以再提一个issue我们看看怎么解决哈,我们这边还是针对当前版本进行迭代哈

j91ykkif

j91ykkif9#

好,昨天的信息有问题,我这边不是1.8版本的仍是1.5的,是pip显示的问题,我另提一个issue吧

相关问题