在使用PTB数据集训练词向量模型出现输入(X)和输入(label)的形状不一致

  • 关键字:数据维度concat

  • 问题描述:在使用N-gram神经网络训练PTB数据集时,使用接口fluid.layers.concat把四个词向量连接起来,最后经过全连接层输出。但是把fluid.layers.concataxis参数设置为0时就报错。

  • 报错信息:

<ipython-input-6-daf8837e1db3> in train(use_cuda, train_program, params_dirname)
     37         num_epochs=1,
     38         event_handler=event_handler,
---> 39         feed_order=['firstw', 'secondw', 'thirdw', 'fourthw', 'nextw'])

/usr/local/lib/python3.5/dist-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):

/usr/local/lib/python3.5/dist-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):

/usr/local/lib/python3.5/dist-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:

/usr/local/lib/python3.5/dist-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):400 != framework::slice_ddim(label_dims, 0, rank - 1):100.
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.embedding接口建立四个词向量,接着把这四个词向量通过fluid.layers.concat接口连接在一起,但是在设置axis参数的值为0的时候就会报错。错误代码如下:
embed_first = fluid.layers.embedding(
    input=first_word,
    size=[dict_size, EMBED_SIZE],
    dtype='float32',
    is_sparse=is_sparse,
    param_attr='shared_w')
embed_second = fluid.layers.embedding(
    input=second_word,
    size=[dict_size, EMBED_SIZE],
    dtype='float32',
    is_sparse=is_sparse,
    param_attr='shared_w')
embed_third = fluid.layers.embedding(
    input=third_word,
    size=[dict_size, EMBED_SIZE],
    dtype='float32',
    is_sparse=is_sparse,
    param_attr='shared_w')
embed_fourth = fluid.layers.embedding(
    input=fourth_word,
    size=[dict_size, EMBED_SIZE],
    dtype='float32',
    is_sparse=is_sparse,
    param_attr='shared_w')

concat_embed = fluid.layers.concat(
    input=[embed_first, embed_second, embed_third, embed_fourth], axis=0)
  • 解决问题:fluid.layers.concat接口中的axis参数是指把上面的四个将张量连接在一起的整数轴,因为输出数据都是一维的,所以这个参数的应该是1。经过拼接后,该层输出的形状应该是(Batch大小, 四个词向量维度的和)
embed_first = fluid.layers.embedding(
    input=first_word,
    size=[dict_size, EMBED_SIZE],
    dtype='float32',
    is_sparse=is_sparse,
    param_attr='shared_w')
embed_second = fluid.layers.embedding(
    input=second_word,
    size=[dict_size, EMBED_SIZE],
    dtype='float32',
    is_sparse=is_sparse,
    param_attr='shared_w')
embed_third = fluid.layers.embedding(
    input=third_word,
    size=[dict_size, EMBED_SIZE],
    dtype='float32',
    is_sparse=is_sparse,
    param_attr='shared_w')
embed_fourth = fluid.layers.embedding(
    input=fourth_word,
    size=[dict_size, EMBED_SIZE],
    dtype='float32',
    is_sparse=is_sparse,
    param_attr='shared_w')

concat_embed = fluid.layers.concat(
    input=[embed_first, embed_second, embed_third, embed_fourth], axis=1)
  • 问题拓展:fluid.layers.embedding接口是将高度稀疏的离散输入嵌入到一个新的实向量空间,对抗维数灾难,使用更少的维度,编码更丰富的信息。之后使用fluid.layers.concat把多个这样的向量并在一起,最后把数据送入到神经网络中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值