Bert瞎玩系列——试试自己的数据集

  • 瞎完之前你需要对bert有一个基本的认识,对他的老本家transformer有一个基本的认识,最最重要的,你需要对tfrecord和estimator这两种高级API的使用有一定的认识。
  • 以前跑不通bert…现在终于跑通了,也就有很多东西可以做了,重点想试试自己的数据分类,顺便熟悉一下bert加载模型的方式。

pb输出?

  • 代码有一个额外的输出?
  • …这个是部属模型时用的东西,最后再去细细研究
    Bert瞎玩系列——试试自己的数据集_第1张图片

自己的数据

  • 本来想网上找,结果没找到合适的,就自己随便本地找了个数据跑着玩,这个数据没参考价值,因为标记不是人工打的…但是用来试一下bert还是可以的。
  • 句子长度:个人限制在 10到20之间
  • 数据规模:18万左右(太大了,我…)
  • 类别:二分类

写自己的 SelfProcessor

  • 基于自己的数据文件格式,将代码里的加载方式改一下就行了,很简单。

可小小优化:

  • 代码的tfrecord文件生成和训练模型在一个程序里,其实完全可以分开。
  • 如果是分类任务,基本上只需要改改代码的文件读入函数,然后直接训练就玩事儿了。

训练时间

  • 慢——————…单单打印一个batch效果就看得出来,cpu跑巨慢无比,跑了一天一夜,看了感觉才跑了一点…看loss还不错,我就自己就停了。

  • 测试集合上的效果:

INFO:tensorflow:  eval_accuracy = 0.9672131
INFO:tensorflow:  eval_loss = 0.08941736
INFO:tensorflow:  global_step = 4401
INFO:tensorflow:  loss = 0.08580063
INFO:tensorflow:Restoring parameters from ./output1/model.ckpt-4401

几个细节

第一个细节

  • 代码没有写任何关于打印损失的函数,为什么他会打印出来训练的损失?
  • 经过实验,是下面那行代码起的作用:
tf.logging.set_verbosity(tf.logging.INFO)
  • 默认情况下,TENSFlow在WARN的日志记录级别进行配置,但是在跟踪模型训练时,需要将级别调整为INFO

第二个细节

  • 我停掉程序,改为测试为true其他为false的时候,我以为图结构会重新建立…但是它加载了最新的结构,哪里实现的???
  • 部分日志:
INFO:tensorflow:Restoring parameters from ./output1/model.ckpt-4401
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2019-10-18-07:21:04
INFO:tensorflow:Saving dict for global step 4401: eval_accuracy = 0.9672131, eval_loss = 0.08941736, global_step = 4401, loss = 0.08580063
INFO:tensorflow:***** Eval results *****
INFO:tensorflow:  eval_accuracy = 0.9672131
INFO:tensorflow:  eval_loss = 0.08941736
INFO:tensorflow:  global_step = 4401
INFO:tensorflow:  loss = 0.08580063
INFO:tensorflow:Restoring parameters from ./output1/model.ckpt-4401
INFO:tensorflow:Froze 89 variables.
  • 找到一篇不错的解释

  • 简单来说就是:检查点提供了一种容易的保存和恢复由 Estimator 生成的模型的自动化机制。换句话说,一旦检查点文件存在,TensorFlow 总会在你调用 train() 、 evaluation() 或 predict() 时重建模型。

END

  • 到这里,加上以前的知识储备,感觉基本bert就差最后一步了,好好品品它的代码。

你可能感兴趣的:(NLP,tensorflow,deeplearning)