GPT2-Chinese icon indicating copy to clipboard operation
GPT2-Chinese copied to clipboard

分享一个训练好的《鬼吹灯》文本生成模型

Open ScottishFold007 opened this issue 4 years ago • 19 comments

前两天用电脑训练了一个《鬼吹灯》的文本生成模型,不生用题主的代码,基于“抱抱脸(Huggingface)”发布的GPT2生成模型改的,文本组成:

  • 鬼吹灯 1 精绝古城
  • 鬼吹灯 2 龙岭迷窟
  • 鬼吹灯 3 云南虫谷
  • 鬼吹灯 4 昆仑神宫
  • 鬼吹灯 5 黄皮子坟
  • 鬼吹灯 6 南海归墟
  • 鬼吹灯 7 怒晴湘西
  • 鬼吹灯 8 巫峡棺山

5M多的语料,用CPU训练跑了40000 epoch。以下是效果: image image

链接:https://pan.baidu.com/s/1yjXUOqLDdvHV-XvGvhvAng 提取码:ihp2 复制这段内容后打开百度网盘手机App,操作更方便哦

ScottishFold007 avatar Feb 16 '20 04:02 ScottishFold007

文本参数的设置可有些门道,我摸索了好久才找到比较理想的参数,大家也可以试试哈

ScottishFold007 avatar Feb 16 '20 04:02 ScottishFold007

怎么转tensorRT

chasemon88 avatar Feb 18 '20 02:02 chasemon88

@ScottishFold007 方便分享一下调参经验吗

felicitywang avatar Feb 18 '20 05:02 felicitywang

能留个联系方式交流下吗

Halfwaygo avatar Feb 27 '20 06:02 Halfwaygo

个人微信:g18818233178,来时请备注

---原始邮件--- 发件人: "Halfwaygo"<[email protected]> 发送时间: 2020年2月27日(周四) 下午2:28 收件人: "Morizeyao/GPT2-Chinese"<[email protected]>; 抄送: "Mention"<[email protected]>;"Scottish_Fold007"<[email protected]>; 主题: Re: [Morizeyao/GPT2-Chinese] 分享一个训练好的《鬼吹灯》文本生成模型 (#128)

能留个联系方式交流下吗

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

ScottishFold007 avatar Feb 27 '20 15:02 ScottishFold007

感谢分享

Morizeyao avatar Feb 28 '20 07:02 Morizeyao

感谢分享

这是huggingface哪个版本的transformers?或者能有个GPT2Tokenizer加载的例子吗?看新的v2.5.1词典文件,是个json而不是这种文本格式的

https://github.com/huggingface/transformers/blob/v2.5.1/src/transformers/tokenization_gpt2.py#L36


理解错LZ意思了。用pytorch_transformers可以了 👍

import pytorch_transformers
from tokenizations import tokenization_bert

config_file = "config.json"
vocab_file = "vocab.txt"
config = pytorch_transformers.GPT2Config.from_json_file(config_file)
config.output_attentions = True

model = pytorch_transformers.GPT2LMHeadModel.from_pretrained(".", config=config)
tokenizer = tokenization_bert.BertTokenizer(vocab_file=vocab_file)

device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
model.eval()

upbit avatar Mar 17 '20 14:03 upbit

模型也可以这样使用:

from transformers import BertTokenizer
 
tokenizer = BertTokenizer.from_pretrained(r'E:\GPT2_Text_generation\散文GPT2Model')

 
special_tokens_dict = {"bos_token": "<s>", "eos_token": "</s>", "unk_token": "<unk>", "sep_token": "<sep>", "pad_token": "<pad>", "mask_token": "<mask>"}
tokenizer.add_special_tokens(special_tokens_dict)
model = GPT2LMHeadModel.from_pretrained(r'E:\GPT2_Text_generation\散文GPT2Model')
model.eval()
generated = context
length = 50
import torch.nn.functional as F

with torch.no_grad():
    for _ in range(length):
        # run the model
        outputs,_ = model(generated)
        
        # get the logits for the next word prediction
        next_token_logits = outputs[0, -1, :]

        # sample from the distribution over vocab
        next_token = torch.multinomial(F.softmax(next_token_logits, dim=-1), num_samples=1)

        # concatenate the sampled token to generated
        generated = torch.cat((generated, next_token.unsqueeze(0)), dim=1)
#text = tokenizer.decode(generated[0].tolist())
tokens = tokenizer.convert_ids_to_tokens(generated[0].tolist(), skip_special_tokens=False) 
for i, item in enumerate(tokens):
    if item == '<mask>':
        tokens[i] = ''
    elif item == '</s>' or item == '<sep>':
        tokens[i] = '\n'
        
generated_text = ''.join(tokens).strip().replace(' ', '').replace('##', '')
print(generated_text)

ScottishFold007 avatar Mar 18 '20 10:03 ScottishFold007

感谢分享!

Morizeyao avatar Mar 27 '20 10:03 Morizeyao

@ScottishFold007 有没有通过指定部分关键词生成短文本或长文本的计划?

liutianling avatar May 07 '20 03:05 liutianling

@ScottishFold007 有没有通过指定部分关键词生成短文本或长文本的计划?

没标注数据。。。

ScottishFold007 avatar Jun 05 '20 06:06 ScottishFold007

你好,请问你的语料库的json文件是什么样的格式,方便发出来看看吗

luyi404 avatar Jul 27 '20 03:07 luyi404

同问,一直搞不懂语料库的格式,能以斗破那个txt文件讲解一下吗?train.json内容是["文章1","文章2","文章3"],如果是自己的语料库的话应该如何组织呢

ouening avatar Aug 25 '20 14:08 ouening

同问,一直搞不懂语料库的格式,能以斗破那个txt文件讲解一下吗?train.json内容是["文章1","文章2","文章3"],如果是自己的语料库的话应该如何组织呢

因为只用过train_single.py的方法,我举个金庸小说的例子吧,14部小说经过处理后变成json的格式然后写入到train.json当中去。 于是train.json = ["射雕英雄传整篇内容", "神雕侠侣整篇内容", "倚天屠龙记整篇内容".......] 同理,斗破苍穹如果只有一部那就是train.json = ["斗破苍穹整篇内容"]

Jaeker0512 avatar Sep 15 '20 01:09 Jaeker0512

以weibo.txt语料库为例,总结一下如何训练自定义数据集(时间过得比较久,可能有些步骤忽略了)

  1. 语料库是一行一段话,从train.py中的build_files函数可以看到‘\n’被替换成[SEP],[SEP],[MASK]是MML模型使用的token,weibo.txt就是这样子的结构;
  2. 首先生成词汇表,使用cache/make_vocab.py,作者使用thulac进行分词,其实也可以用jieba(lines[i]=' '.join(list(jieba.cut(line))),修改第22行:lines=f.readlines();注意--vocab_size参数,这个参数会在后面用到;
  3. 进行训练。修改train.py中读取文件的方式,还是一样,将第18行改成lines=f.readlines();注意参数--model_config,默认使用的是model_config_test.json这个配置,这里的vocab_size等于make_vocab.py中设置的vocab_size数量加5,一定要匹配,否则运行错误;不出意外的话可以正常训练了;注意模型默认保存在output_dir,--tokenizer_path是前面生成的词汇表路径;
  4. 模型测试。使用generate.py文件,这个比较坑的就是--model_path这个参数,这个参数实际指向的是前面output_dir/final_model路径,所以这个参数改为·--model_dir·比较合适,--prefix是文字生成的开头部分,--length可以指定生成文本的长度;Q:为什么模型输入是一个文件夹而不是单独的权重文件?A:其实从生成的文件夹来看包含模型配置文件config.json和对应的权重文件pytorch_model.bin,一个模型肯定是需要这两个菜完整的。平时使用pytorch保存的模型torch.save()直接把这两个都同时保存至一个文件了,所以可以正常加载,如果知道网络结构的情况下,只保存权重就可以 了
  5. 还有很多参数设置是可以修改的,这里就不再说明了,并且作者也说不再更新该库,transformers已经到3.2版本了,本库要求的是2.1.1才能运行。。。。

ouening avatar Sep 24 '20 01:09 ouening

同问,一直搞不懂语料库的格式,能以斗破那个txt文件讲解一下吗?train.json内容是["文章1","文章2","文章3"],如果是自己的语料库的话应该如何组织呢

因为只用过train_single.py的方法,我举个金庸小说的例子吧,14部小说经过处理后变成json的格式然后写入到train.json当中去。 于是train.json = ["射雕英雄传整篇内容", "神雕侠侣整篇内容", "倚天屠龙记整篇内容".......] 同理,斗破苍穹如果只有一部那就是train.json = ["斗破苍穹整篇内容"]

训练效果怎么样呢

malatangteileng avatar Jan 04 '21 13:01 malatangteileng

怎么转tensorRT

你好 你找到转tensorRT的途径了吗 最近考虑用triton部署gpt2

baoyu-yuan avatar Jan 12 '21 07:01 baoyu-yuan

我想训练一个问答模型,应该准备一些什么样子的数据呢,用这个能训练吗?

cywjava avatar Feb 21 '23 09:02 cywjava

Reference in n

我想训练一个问答模型,应该准备一些什么样子的数据呢,用这个能训练吗?

cywjava avatar Feb 21 '23 09:02 cywjava