PaddlePaddle在使用长短期记忆网络训练时出现出现输入形状错误

本文解决在使用长短期记忆网络(LSTM)训练IMDB数据集时遇到的输入形状不匹配错误。通过引入序列池化操作,确保了输入数据与标签具有相同的形状,从而避免了训练过程中的形状不一致问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 关键字:序列池化长短期记忆网络

  • 问题描述:使用一个长短期记忆网络训练IMDB数据集时,出现输入形状错误,错误提示:输入(X)和输入(标签)应具有相同的形状。

  • 报错信息:

<ipython-input-7-fd22a596e844> in train(use_cuda, train_program, params_dirname)
     41         event_handler=event_handler,
     42         reader=train_reader,
---> 43         feed_order=feed_order)

/opt/conda/envs/py35-paddle1.0.0/lib/python3.5/site-packages/paddle/fluid/contrib/trainer.py in train(self, num_epochs, event_handler, reader, feed_order)
    403         else:
    404             self._train_by_executor(num_epochs, event_handler, reader,
--> 405                                     feed_order)
    406 
    407     def test(self, reader, feed_order):

/opt/conda/envs/py35-paddle1.0.0/lib/python3.5/site-packages/paddle/fluid/contrib/trainer.py in _train_by_executor(self, num_epochs, event_handler, reader, feed_order)
    481             exe = executor.Executor(self.place)
    482             reader = feeder.decorate_reader(reader, multi_devices=False)
--> 483             self._train_by_any_executor(event_handler, exe, num_epochs, reader)
    484 
    485     def _train_by_any_executor(self, event_handler, exe, num_epochs, reader):

/opt/conda/envs/py35-paddle1.0.0/lib/python3.5/site-packages/paddle/fluid/contrib/trainer.py in _train_by_any_executor(self, event_handler, exe, num_epochs, reader)
    510                                       fetch_list=[
    511                                           var.name
--> 512                                           for var in self.train_func_outputs
    513                                       ])
    514                 else:

/opt/conda/envs/py35-paddle1.0.0/lib/python3.5/site-packages/paddle/fluid/executor.py in run(self, program, feed, fetch_list, feed_var_name, fetch_var_name, scope, return_numpy, use_program_cache)
    468 
    469         self._feed_data(program, feed, feed_var_name, scope)
--> 470         self.executor.run(program.desc, scope, 0, True, True)
    471         outs = self._fetch_data(fetch_list, fetch_var_name, scope)
    472         if return_numpy:

EnforceNotMet: Enforce failed. Expected framework::slice_ddim(x_dims, 0, rank - 1) == framework::slice_ddim(label_dims, 0, rank - 1), but received framework::slice_ddim(x_dims, 0, rank - 1):31673 != framework::slice_ddim(label_dims, 0, rank - 1):128.
Input(X) and Input(Label) shall have the same shape except the last dimension. at [/paddle/paddle/fluid/operators/cross_entropy_op.cc:37]
PaddlePaddle Call Stacks: 
  • 问题复现:在构建一个长短期记忆网络时,首先使用fluid.layers.fc定义了一个全连接层,然后又使用fluid.layers.dynamic_lstm创建了一个长短期记忆单元,最后使用使用这个两个进行分类输出,结果就会出现上面的错误,错误代码如下:
emb = fluid.layers.embedding(input=data, size=[input_dim, emb_dim], is_sparse=True)
fc1 = fluid.layers.fc(input=emb, size=hid_dim)
lstm1, cell1 = fluid.layers.dynamic_lstm(input=fc1, size=hid_dim)
prediction = fluid.layers.fc(input=[fc1, lstm1], size=class_dim, act='softmax')
  • 解决问题:搭建一个长短期记忆网络时,在执行最好一层分类器前还要经过一个序列进行池化的接口,将上面的全连接层和长短期记忆单元的输出全部时间步的特征进行池化,最后才执行分类器输出。正确代码如下:
emb = fluid.layers.embedding(input=data, size=[input_dim, emb_dim], is_sparse=True)
fc1 = fluid.layers.fc(input=emb, size=hid_dim)
lstm1, cell1 = fluid.layers.dynamic_lstm(input=fc1, size=hid_dim)
fc_last = fluid.layers.sequence_pool(input=fc1, pool_type='max')
lstm_last = fluid.layers.sequence_pool(input=lstm1, pool_type='max')
prediction = fluid.layers.fc(input=[fc_last, lstm_last], size=class_dim, act='softmax')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值