【黄埔学院学员遇到的问题】运行ernie样例代码报错
Created by: newdimitri
今天我在做上次课程的课后练习的时候,遇到一个错误: 按照教程https://aistudio.baidu.com/aistudio/projectDetail/147006 的步骤,我在Notebook中加入了1-7步的代码,代码如下:
#===================================================================================================================== #详细说明参考https://aistudio.baidu.com/aistudio/projectDetail/147006
-- coding: utf8 --
!pip install paddlehub==1.2.1
#!pip install --upgrade paddlehub
import paddlehub as hub
#选择ernie作为预训练模型,进行Fine-tune。ChnSentiCorp数据集是一个中文情感分类数据集。
module = hub.Module(name="ernie")
dataset = hub.dataset.ChnSentiCorp()
#生成一个文本分类的reader,reader负责将dataset的数据进行预处理,首先对文本进行切词,接着以特定格式组织并输入给模型进行训练。
reader = hub.reader.ClassifyReader(
dataset=dataset,
vocab_path=module.get_vocab_path(),
max_seq_len=128)
#选择Fine-Tune优化策略。适用于ERNIE/BERT这类Transformer模型的迁移优化策略为AdamWeightDecayStrategy
strategy = hub.AdamWeightDecayStrategy(
weight_decay=0.01,
warmup_proportion=0.1,
learning_rate=5e-5,
lr_scheduler="linear_decay",
optimizer_name="adam")
#运行时配置
config = hub.RunConfig(
use_cuda=True,
num_epoch=1,
checkpoint_dir="ernie_txt_cls_turtorial_demo",
batch_size=32,
log_interval=10,
eval_interval=50,
strategy=strategy)
#有了合适的预训练模型和准备要迁移的数据集后,我们开始组建一个Task。
1. 获取module的上下文环境,包括输入和输出的变量,以及Paddle Program;
2. 从输出变量中找到用于情感分类的文本特征pooled_output;
3. 在pooled_output后面接入一个全连接层,生成Task;
inputs, outputs, program = module.context( trainable=True, max_seq_len=128)
Use "pooled_output" for classification tasks on an entire sentence.
pooled_output = outputs["pooled_output"] feed_list = [ inputs["input_ids"].name, inputs["position_ids"].name, inputs["segment_ids"].name, inputs["input_mask"].name, ] cls_task = hub.TextClassifierTask( data_reader=reader, feature=pooled_output, feed_list=feed_list, num_classes=dataset.num_labels, config=config) #选择finetune_and_eval接口来进行模型训练,这个接口在finetune的过程中,会周期性的进行模型效果的评估,以便我们了解整个训练过程的性能变化。 cls_task.finetune_and_eval() #=====================================================================================================================
但在运行代码的时候,返回如下报错信息: EnforceNotMetTraceback (most recent call last) in () 59 60 #选择finetune_and_eval接口来进行模型训练,这个接口在finetune的过程中,会周期性的进行模型效果的评估,以便我们了解整个训练过程的性能变化。 ---> 61 cls_task.finetune_and_eval() /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddlehub/finetune/task/basic_task.pyc in finetune_and_eval(self) 581 582 def finetune_and_eval(self): --> 583 return self.finetune(do_eval=True) 584 585 def finetune(self, do_eval=False): /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddlehub/finetune/task/basic_task.pyc in finetune(self, do_eval) 586 # Start to finetune 587 with self.phase_guard(phase="train"): --> 588 self.init_if_necessary() 589 self._finetune_start_event() 590 run_states = [] /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddlehub/finetune/task/basic_task.pyc in init_if_necessary(self) 172 def init_if_necessary(self): 173 if not self.is_checkpoint_loaded: --> 174 if not self.load_checkpoint(): 175 self.exe.run(self._base_startup_program) 176 self.is_checkpoint_loaded = True /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddlehub/finetune/task/basic_task.pyc in load_checkpoint(self) 564 self.config.checkpoint_dir, 565 self.exe, --> 566 main_program=self.main_program) 567 568 return is_load_successful /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddlehub/finetune/task/basic_task.pyc in main_program(self) 352 def main_program(self): 353 if not self.env.is_inititalized: --> 354 self._build_env() 355 return self.env.main_program 356 /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddlehub/finetune/task/basic_task.pyc in _build_env(self) 267 self.scheduled_lr, self.max_train_steps = self.config.strategy.execute( 268 self.loss, self._base_data_reader, self.config, --> 269 self.device_count) 270 271 if self.is_train_phase: /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddlehub/finetune/strategy.pyc in execute(self, loss, data_reader, config, dev_count) 447 448 # handle regularization --> 449 self.regularization_handler(loss, scheduled_lr) 450 451 return scheduled_lr, max_train_steps /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddlehub/finetune/strategy.pyc in regularization_handler(self, loss, scheduled_lr) 389 regularization_coeff=self.regularization["L2SP"]) 390 --> 391 _, param_grads = self.optimizer.minimize(loss) 392 393 if self.regularization["weight_decay"]: </opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/decorator.pyc:decorator-gen-158> in minimize(self, loss, startup_program, parameter_list, no_grad_set, grad_clip) /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddle/fluid/wrapped_decorator.pyc in impl(func, *args, *kwargs) 23 def impl(func, args, *kwargs): 24 wrapped_func = decorator_func(func) ---> 25 return wrapped_func(args, **kwargs) 26 27 return impl /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddle/fluid/dygraph/base.pyc in impl(args, kwargs) 76 def impl(args, *kwargs): 77 with switch_tracer_mode_guard(is_train=False): ---> 78 return func(args, kwargs) 79 80 return impl /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddle/fluid/optimizer.pyc in minimize(self, loss, startup_program, parameter_list, no_grad_set, grad_clip) 676 startup_program=startup_program, 677 parameter_list=parameter_list, --> 678 no_grad_set=no_grad_set) 679 680 if grad_clip is not None and framework.in_dygraph_mode(): /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddle/fluid/optimizer.pyc in backward(self, loss, startup_program, parameter_list, no_grad_set, callbacks) 549 with program_guard(program, startup_program): 550 params_grads = append_backward(loss, parameter_list, --> 551 no_grad_set, callbacks) 552 # Note: since we can't use all_reduce_op now, 553 # dgc_op should be the last op of one grad. /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddle/fluid/backward.pyc in append_backward(loss, parameter_list, no_grad_set, callbacks, checkpoints) 1076 grad_to_var, 1077 callbacks, -> 1078 input_grad_names_set=input_grad_names_set) 1079 1080 # Because calc_gradient may be called multiple times, /opt/conda/envs/python27-paddle120-env/lib/python2.7/site-packages/paddle/fluid/backward.pyc in append_backward_ops(block, ops, target_block, no_grad_dict, grad_to_var, callbacks, input_grad_names_set) 796 # Getting op's corresponding grad_op 797 grad_op_desc, op_grad_to_var = core.get_grad_op_desc( --> 798 op.desc, cpt.to_text(no_grad_dict[block.idx]), grad_sub_block_list) 799 800 # If input_grad_names_set is not None, extend grad_op_descs only when EnforceNotMet: 0 std::string paddle::platform::GetTraceBackString<char const>(char const&&, char const, int) 1 paddle::platform::EnforceNotMet::EnforceNotMet(std::__exception_ptr::exception_ptr, char const, int) 2 paddle::framework::OpDesc::Input(std::string const&) const 3 paddle::operators::SliceOpGradMaker::Apply() const 4 std::_Function_handler<std::vector<std::unique_ptr<paddle::framework::OpDesc, std::default_deletepaddle::framework::OpDesc >, std::allocator<std::unique_ptr<paddle::framework::OpDesc, std::default_deletepaddle::framework::OpDesc > > > (paddle::framework::OpDesc const&, std::unordered_set<std::string, std::hashstd::string, std::equal_tostd::string, std::allocatorstd::string > const&, std::unordered_map<std::string, std::string, std::hashstd::string, std::equal_tostd::string, std::allocator<std::pair<std::string const, std::string> > >, std::vector<paddle::framework::BlockDesc, std::allocatorpaddle::framework::BlockDesc* > const&), paddle::framework::details::OpInfoFiller<paddle::operators::SliceOpGradMaker, (paddle::framework::details::OpInfoFillType)2>::operator()(char const, paddle::framework::OpInfo) const::{lambda(paddle::framework::OpDesc const&, std::unordered_set<std::string, std::hashstd::string, std::equal_tostd::string, std::allocatorstd::string > const&, std::unordered_map<std::string, std::string, std::hashstd::string, std::equal_tostd::string, std::allocator<std::pair<std::string const, std::string> > >, std::vector<paddle::framework::BlockDesc, std::allocatorpaddle::framework::BlockDesc* > const&)#1 (closed)}>::_M_invoke(std::_Any_data const&, paddle::framework::OpDesc const&, std::unordered_set<std::string, std::hashstd::string, std::equal_tostd::string, std::allocatorstd::string > const&, std::unordered_map<std::string, std::string, std::hashstd::string, std::equal_tostd::string, std::allocator<std::pair<std::string const, std::string> > >, std::vector<paddle::framework::BlockDesc, std::allocatorpaddle::framework::BlockDesc* > const&) PaddleCheckError: Input StartsTensor cannot be found in Op slice at [/paddle/paddle/fluid/framework/op_desc.cc:308]
我在终端里运行同样的代码,也是一样的错。还请帮忙看一下可能是什么问题,谢谢!
之前项目是配置的Python2.7,我后来选Python3.7试了一下,也是一样的错。 另外运行https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.2/demo/text-classification 里的样例代码,也会报同样的错。 请参考,谢谢!