Обучите GPT2 обнимающего лица с нуля: assert n_state% config.n_head == 0 error - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь использовать архитектуру GPT2 для музыкальных приложений и, следовательно, нужно обучить ее с нуля. После небольшого поиска в Google я обнаружил, что проблема # 1714 с github huggingface уже "решила" вопрос. Когда я пытаюсь запустить предлагаемое решение:

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

Что это значит и как я могу ее решить?

Также, в более общем плане, есть ли документация о том, как сделать прямой вызов с GPT2? Могу ли я определить свою собственную функцию train() или мне нужно использовать встроенную функцию модели? Я вынужден использовать Dataset для обучения или я могу кормить его отдельными тензорами? Я искал это, но не смог найти ответ на них в do c, но, возможно, я что-то упустил.

PS: Я уже читал блог пост fron huggingface.co, но он опускает слишком много информации и детали, которые будут полезны для моего заявления.

1 Ответ

1 голос
/ 24 марта 2020

Я думаю, что сообщение об ошибке довольно ясно:

assert n_state % config.n_head == 0

Отслеживание его через код , мы можем видеть

n_state = nx # in Attention: n_state=768

, который указывает, что n_state представляет размер вложения (который обычно равен 768 по умолчанию в BERT-подобных моделях). Затем, когда мы смотрим на документацию GPT-2 , кажется, что параметром, указывающим это, является n_embd, который вы устанавливаете на 5. Как указывает ошибка, размер вложения должен быть равномерно делим на количество головок внимания , которые были определены как 4. Таким образом, выбор другого размера вложения, кратного 4, должен решить проблему. Конечно, вы также можете изменить количество головок для начала, но кажется, что нечетные размеры встраивания не поддерживаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...