Python 火车拥抱面';s GPT2从头开始:断言n_状态%config.n_头==0错误

Python 火车拥抱面';s GPT2从头开始:断言n_状态%config.n_头==0错误,python,nlp,huggingface-transformers,transformer,gpt-2,Python,Nlp,Huggingface Transformers,Transformer,Gpt 2,我正在尝试将GPT2架构用于音乐应用程序,因此需要从头开始训练它。通过谷歌搜索,我发现huggingface的github发布的1714已经“解决”了这个问题。当我尝试运行建议解决方案时: from transformers import GPT2Config, GPT2Model NUMLAYER = 4 NUMHEAD = 4 SIZEREDUCTION = 10 #the factor by which we reduce the size of the velocity argumen

我正在尝试将GPT2架构用于音乐应用程序,因此需要从头开始训练它。通过谷歌搜索,我发现huggingface的github发布的1714已经“解决”了这个问题。当我尝试运行建议解决方案时:

from transformers import GPT2Config, GPT2Model

NUMLAYER = 4
NUMHEAD = 4
SIZEREDUCTION = 10 #the factor by which we reduce the size of the velocity argument.
VELSIZE = int(np.floor(127/SIZEREDUCTION)) + 1 
SEQLEN=40 #size of data sequences.
EMBEDSIZE = 5 

config = GPT2Config(vocab_size = VELSIZE, n_positions = SEQLEN, n_embd = EMBEDSIZE, n_layer = NUMLAYER, n_ctx = SEQLEN, n_head = NUMHEAD)  
model = GPT2Model(config)
我得到以下错误:

Traceback (most recent call last):

  File "<ipython-input-7-b043a7a2425f>", line 1, in <module>
    runfile('C:/Users/cnelias/Desktop/PHD/Swing project/code/script/GPT2.py', wdir='C:/Users/cnelias/Desktop/PHD/Swing project/code/script')

  File "C:\Users\cnelias\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 786, in runfile
    execfile(filename, namespace)

  File "C:\Users\cnelias\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/cnelias/Desktop/PHD/Swing project/code/script/GPT2.py", line 191, in <module>
    model = GPT2Model(config)

  File "C:\Users\cnelias\Anaconda3\lib\site-packages\transformers\modeling_gpt2.py", line 355, in __init__
    self.h = nn.ModuleList([Block(config.n_ctx, config, scale=True) for _ in range(config.n_layer)])

  File "C:\Users\cnelias\Anaconda3\lib\site-packages\transformers\modeling_gpt2.py", line 355, in <listcomp>
    self.h = nn.ModuleList([Block(config.n_ctx, config, scale=True) for _ in range(config.n_layer)])

  File "C:\Users\cnelias\Anaconda3\lib\site-packages\transformers\modeling_gpt2.py", line 223, in __init__
    self.attn = Attention(nx, n_ctx, config, scale)

  File "C:\Users\cnelias\Anaconda3\lib\site-packages\transformers\modeling_gpt2.py", line 109, in __init__
    assert n_state % config.n_head == 0
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
runfile('C:/Users/cnelias/Desktop/PHD/Swing project/code/script/GPT2.py',wdir='C:/Users/cnelias/Desktop/PHD/Swing project/code/script')
文件“C:\Users\cnelias\Anaconda3\lib\site packages\spyder\u kernels\customize\spyderrcustomize.py”,第786行,在runfile中
execfile(文件名、命名空间)
文件“C:\Users\cnelias\Anaconda3\lib\site packages\spyder\u kernels\customize\spyderrcustomize.py”,第110行,在execfile中
exec(编译(f.read(),文件名,'exec'),命名空间)
文件“C:/Users/cnelias/Desktop/PHD/Swing project/code/script/GPT2.py”,第191行,在
模型=GPT2Model(配置)
文件“C:\Users\cnelias\Anaconda3\lib\site packages\transformers\modeling\u gpt2.py”,第355行,在\uuu init中__
self.h=nn.ModuleList([Block(config.n\u ctx,config,scale=True)用于范围内(config.n\u layer)])
文件“C:\Users\cnelias\Anaconda3\lib\site packages\transformers\modeling\u gpt2.py”,第355行,在
self.h=nn.ModuleList([Block(config.n\u ctx,config,scale=True)用于范围内(config.n\u layer)])
文件“C:\Users\cnelias\Anaconda3\lib\site packages\transformers\modeling\u gpt2.py”,第223行,在\uuu init中__
self.attn=注意(nx,n_ctx,配置,比例)
文件“C:\Users\cnelias\Anaconda3\lib\site packages\transformers\modeling\u gpt2.py”,第109行,在\uuu init中__
断言n_状态%config.n_头==0
这意味着什么?我如何解决它

更一般地说,是否有关于如何使用GPT2进行转发呼叫的文档?我可以定义自己的
train()
函数吗?还是必须使用模型的内置函数?我是被迫使用
数据集
来进行训练,还是可以为其提供单独的张量? 我找了一下,但在医生上找不到答案,但也许我遗漏了什么


注:我已经阅读了huggingface.co的博客帖子,但它遗漏了太多信息和细节,无法用于我的应用程序。

我认为错误信息非常清楚:

assert n_state%config.n_head==0

通过追踪,我们可以看到

n_state=nx#注意:n_state=768


这表明
n_state
表示嵌入维度(在类似BERT的模型中,默认情况下通常为768)。然后,当我们查看时,指定此参数的参数似乎是
n_embd
,您正在将其设置为
5
。如错误所示,嵌入维度必须通过指定为
4
的注意头的数量来均匀划分。因此,选择不同的嵌入维度作为
4的倍数应该可以解决这个问题。当然,您也可以首先更改头的数量,但似乎不支持奇数嵌入维度。

我认为错误信息非常清楚:

assert n_state%config.n_head==0

通过追踪,我们可以看到

n_state=nx#注意:n_state=768


这表明
n_state
表示嵌入维度(在类似BERT的模型中,默认情况下通常为768)。然后,当我们查看时,指定此参数的参数似乎是
n_embd
,您正在将其设置为
5
。如错误所示,嵌入维度必须通过指定为
4
的注意头的数量来均匀划分。因此,选择不同的嵌入维度作为
4的倍数应该可以解决这个问题。当然,您也可以首先更改头的数量,但似乎不支持奇数嵌入维度。

非常感谢!!我有点像github noob,你介意告诉我你是如何找到出错的代码的吗?我自己也试过这么做,在对我放弃的每一份回购协议文件执行
ctrl+f
一段时间后。不用担心,很高兴看到你自己解决问题。具体来说,我通过错误消息反向工作。在错误消息的
assert…
上方,您可以看到该特定行所在文件的路径。从那时起,很容易找到它,不过我可以建议您使用github搜索栏(默认情况下,它会在当前存储库中开始搜索,因此是一个非常好的替代方法)。请注意,这是一个一次性的回答,因为正式的事情是在这个(不相关的)主题上提出一个新的问题。将注意力集中的人的数量增加一倍,确实解决了这个问题。非常感谢!!我有点像github noob,你介意告诉我你是如何找到出错的代码的吗?我自己也试过这么做,在对我放弃的每一份回购协议文件执行
ctrl+f
一段时间后。不用担心,很高兴看到你自己解决问题。具体来说,我通过错误消息反向工作。在错误消息的
assert…
上方,您可以看到该特定行所在文件的路径。从那时起,很容易找到它,不过我可以建议您使用github搜索栏(默认情况下,它会在当前存储库中开始搜索,因此是一个非常好的替代方法)。请注意,这是一个一次性的回答,因为正式的事情是就这个(不相关的)主题提出一个新问题