-
关键字:
非法指令,embedding -
问题描述:使用ml-1m数据集训练个性化推荐模型,使用ml-1m数据集中的数据转换成词向量,然后训练时出现非法指令的错误。
-
报错信息:
<ipython-input-8-71a7f986f7ba> in train(use_cuda, train_program, params_dirname)
39 event_handler=event_handler,
40 reader=train_reader,
---> 41 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: an illegal instruction was encountered at [/paddle/paddle/fluid/platform/device_context.cc:230]
PaddlePaddle Call Stacks:
- 问题复现:通过
paddle.dataset.movielens.max_job_id接口获取最大的工作类型ID,然后把获得的值作为fluid.layers.embedding接口参数size的值传进去,最好使用这些词向量构建成一个网络进行训练,在训练的时候就出现非法指令错误。错误代码如下:
USR_JOB_DICT_SIZE = paddle.dataset.movielens.max_job_id()
usr_job_id = layers.data(name='job_id', shape=[1], dtype="int64")
usr_job_emb = layers.embedding(
input=usr_job_id,
size=[USR_JOB_DICT_SIZE, 16],
param_attr='job_table',
is_sparse=IS_SPARSE)
usr_job_fc = layers.fc(input=usr_job_emb, size=16)
- 解决问题:通过
paddle.dataset.movielens.max_job_id的接口获得的是最大的工作类型ID,工作类型的ID是从0开始标号的,所以最大的工作类型ID再加上1才是工作类型的数量,上面的错误就是工作类别数量少了1个。正确代码如下:
USR_JOB_DICT_SIZE = paddle.dataset.movielens.max_job_id() + 1
usr_job_id = layers.data(name='job_id', shape=[1], dtype="int64")
usr_job_emb = layers.embedding(
input=usr_job_id,
size=[USR_JOB_DICT_SIZE, 16],
param_attr='job_table',
is_sparse=IS_SPARSE)
usr_job_fc = layers.fc(input=usr_job_emb, size=16)
- 问题拓展:不仅是以上的接口,还获取最大用户ID的接口
paddle.dataset.movielens.max_user_id和获取最大电影ID的接口paddle.dataset.movielens.max_movie_id也是需要同样的操作,否则也会出现类型的问题。
本文描述了在使用PaddlePaddle的embedding层时遇到的非法指令错误,详细解释了错误原因,并提供了修正代码,确保词向量大小与数据集匹配,避免训练过程中的异常终止。
1855

被折叠的 条评论
为什么被折叠?



