Buckets:
| import{s as Dn,a as Xn,o as Yn,n as Vn}from"../chunks/scheduler.893fe8c9.js";import{S as Nn,i as Fn,e as c,s as a,c as j,h as Hn,a as y,d as e,b as M,f as Mn,g as m,j as T,k as el,l as zn,m as t,n as o,o as r,q as ie,t as U,p as b,r as Ue}from"../chunks/index.2d09ebb4.js";import{C as Sn,H as cl,E as Ln}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.01d747f2.js";import{Y as Bn}from"../chunks/Youtube.b7012d06.js";import{C}from"../chunks/CodeBlock.cebd0a06.js";import{C as vn}from"../chunks/CourseFloatingBanner.e3aeab73.js";import{F as qn}from"../chunks/FrameworkSwitchCourse.f49b9dc4.js";function On(E){let i,I;return i=new vn({props:{chapter:7,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter7/section2_tf.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter7/section2_tf.ipynb"}]}}),{c(){j(i.$$.fragment)},l(w){m(i.$$.fragment,w)},m(w,f){o(i,w,f),I=!0},i(w){I||(U(i.$$.fragment,w),I=!0)},o(w){r(i.$$.fragment,w),I=!1},d(w){b(i,w)}}}function Pn(E){let i,I;return i=new vn({props:{chapter:7,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter7/section2_pt.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter7/section2_pt.ipynb"}]}}),{c(){j(i.$$.fragment)},l(w){m(i.$$.fragment,w)},m(w,f){o(i,w,f),I=!0},i(w){I||(U(i.$$.fragment,w),I=!0)},o(w){r(i.$$.fragment,w),I=!1},d(w){b(i,w)}}}function Kn(E){let i,I,w,f="Фактический код, использующий Keras, будет очень похож на предыдущий; единственные изменения - это способ объединения данных в батч и функция вычисления метрики.",$;return i=new cl({props:{title:"Дообучение модели с помощью Keras",local:"fine-tuning-the-model-with-keras",headingTag:"h2"}}),{c(){j(i.$$.fragment),I=a(),w=c("p"),w.textContent=f},l(d){m(i.$$.fragment,d),I=M(d),w=y(d,"P",{"data-svelte-h":!0}),T(w)!=="svelte-1qqbl3q"&&(w.textContent=f)},m(d,k){o(i,d,k),t(d,I,k),t(d,w,k),$=!0},i(d){$||(U(i.$$.fragment,d),$=!0)},o(d){r(i.$$.fragment,d),$=!1},d(d){d&&(e(I),e(w)),b(i,d)}}}function la(E){let i,I,w,f="Фактический код, использующий <code>Trainer</code>, будет таким же, как и раньше; единственные изменения - это способ объединения данных в батч и функция вычисления метрики.",$;return i=new cl({props:{title:"Дообучение модели с помощью API Trainer",local:"fine-tuning-the-model-with-the-trainer-api",headingTag:"h2"}}),{c(){j(i.$$.fragment),I=a(),w=c("p"),w.innerHTML=f},l(d){m(i.$$.fragment,d),I=M(d),w=y(d,"P",{"data-svelte-h":!0}),T(w)!=="svelte-b25rz1"&&(w.innerHTML=f)},m(d,k){o(i,d,k),t(d,I,k),t(d,w,k),$=!0},i(d){$||(U(i.$$.fragment,d),$=!0)},o(d){r(i.$$.fragment,d),$=!1},d(d){d&&(e(I),e(w)),b(i,d)}}}function sa(E){let i,I;return i=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMERhdGFDb2xsYXRvckZvclRva2VuQ2xhc3NpZmljYXRpb24lMEElMEFkYXRhX2NvbGxhdG9yJTIwJTNEJTIwRGF0YUNvbGxhdG9yRm9yVG9rZW5DbGFzc2lmaWNhdGlvbiglMEElMjAlMjAlMjAlMjB0b2tlbml6ZXIlM0R0b2tlbml6ZXIlMkMlMjByZXR1cm5fdGVuc29ycyUzRCUyMnRmJTIyJTBBKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> DataCollatorForTokenClassification | |
| data_collator = DataCollatorForTokenClassification( | |
| tokenizer=tokenizer, return_tensors=<span class="hljs-string">"tf"</span> | |
| )`,wrap:!1}}),{c(){j(i.$$.fragment)},l(w){m(i.$$.fragment,w)},m(w,f){o(i,w,f),I=!0},i(w){I||(U(i.$$.fragment,w),I=!0)},o(w){r(i.$$.fragment,w),I=!1},d(w){b(i,w)}}}function ea(E){let i,I;return i=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMERhdGFDb2xsYXRvckZvclRva2VuQ2xhc3NpZmljYXRpb24lMEElMEFkYXRhX2NvbGxhdG9yJTIwJTNEJTIwRGF0YUNvbGxhdG9yRm9yVG9rZW5DbGFzc2lmaWNhdGlvbih0b2tlbml6ZXIlM0R0b2tlbml6ZXIp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> DataCollatorForTokenClassification | |
| data_collator = DataCollatorForTokenClassification(tokenizer=tokenizer)`,wrap:!1}}),{c(){j(i.$$.fragment)},l(w){m(i.$$.fragment,w)},m(w,f){o(i,w,f),I=!0},i(w){I||(U(i.$$.fragment,w),I=!0)},o(w){r(i.$$.fragment,w),I=!1},d(w){b(i,w)}}}function ta(E){let i,I="Наш коллатор данных готов к работе! Теперь давайте используем его для создания датасета <code>tf.data.Dataset</code> с помощью метода <code>to_tf_dataset()</code>. Вы также можете использовать <code>model.prepare_tf_dataset()</code>, чтобы сделать это с меньшим количеством кода - вы увидите это в некоторых других разделах этой главы.",w,f,$,d,k="Следующая остановка: сама модель.",A;return f=new C({props:{code:"dGZfdHJhaW5fZGF0YXNldCUyMCUzRCUyMHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVELnRvX3RmX2RhdGFzZXQoJTBBJTIwJTIwJTIwJTIwY29sdW1ucyUzRCU1QiUyMmF0dGVudGlvbl9tYXNrJTIyJTJDJTIwJTIyaW5wdXRfaWRzJTIyJTJDJTIwJTIybGFiZWxzJTIyJTJDJTIwJTIydG9rZW5fdHlwZV9pZHMlMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBjb2xsYXRlX2ZuJTNEZGF0YV9jb2xsYXRvciUyQyUwQSUyMCUyMCUyMCUyMHNodWZmbGUlM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hfc2l6ZSUzRDE2JTJDJTBBKSUwQSUwQXRmX2V2YWxfZGF0YXNldCUyMCUzRCUyMHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnZhbGlkYXRpb24lMjIlNUQudG9fdGZfZGF0YXNldCglMEElMjAlMjAlMjAlMjBjb2x1bW5zJTNEJTVCJTIyYXR0ZW50aW9uX21hc2slMjIlMkMlMjAlMjJpbnB1dF9pZHMlMjIlMkMlMjAlMjJsYWJlbHMlMjIlMkMlMjAlMjJ0b2tlbl90eXBlX2lkcyUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMGNvbGxhdGVfZm4lM0RkYXRhX2NvbGxhdG9yJTJDJTBBJTIwJTIwJTIwJTIwc2h1ZmZsZSUzREZhbHNlJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hfc2l6ZSUzRDE2JTJDJTBBKQ==",highlighted:`tf_train_dataset = tokenized_datasets[<span class="hljs-string">"train"</span>].to_tf_dataset( | |
| columns=[<span class="hljs-string">"attention_mask"</span>, <span class="hljs-string">"input_ids"</span>, <span class="hljs-string">"labels"</span>, <span class="hljs-string">"token_type_ids"</span>], | |
| collate_fn=data_collator, | |
| shuffle=<span class="hljs-literal">True</span>, | |
| batch_size=<span class="hljs-number">16</span>, | |
| ) | |
| tf_eval_dataset = tokenized_datasets[<span class="hljs-string">"validation"</span>].to_tf_dataset( | |
| columns=[<span class="hljs-string">"attention_mask"</span>, <span class="hljs-string">"input_ids"</span>, <span class="hljs-string">"labels"</span>, <span class="hljs-string">"token_type_ids"</span>], | |
| collate_fn=data_collator, | |
| shuffle=<span class="hljs-literal">False</span>, | |
| batch_size=<span class="hljs-number">16</span>, | |
| )`,wrap:!1}}),{c(){i=c("p"),i.innerHTML=I,w=a(),j(f.$$.fragment),$=a(),d=c("p"),d.textContent=k},l(u){i=y(u,"P",{"data-svelte-h":!0}),T(i)!=="svelte-1bq78or"&&(i.innerHTML=I),w=M(u),m(f.$$.fragment,u),$=M(u),d=y(u,"P",{"data-svelte-h":!0}),T(d)!=="svelte-k7zewb"&&(d.textContent=k)},m(u,_){t(u,i,_),t(u,w,_),o(f,u,_),t(u,$,_),t(u,d,_),A=!0},i(u){A||(U(f.$$.fragment,u),A=!0)},o(u){r(f.$$.fragment,u),A=!1},d(u){u&&(e(i),e(w),e($),e(d)),b(f,u)}}}function na(E){let i,I="Как мы видим, второй набор меток был дополнен до длины первого с помощью значения <code>-100</code>.";return{c(){i=c("p"),i.innerHTML=I},l(w){i=y(w,"P",{"data-svelte-h":!0}),T(i)!=="svelte-lpt18b"&&(i.innerHTML=I)},m(w,f){t(w,i,f)},i:Vn,o:Vn,d(w){w&&e(i)}}}function Wn(E){let i,I,w,f="Поскольку мы работаем над проблемой классификации токенов, мы будем использовать класс <code>TFAutoModelForTokenClassification</code>. Главное, что нужно помнить при определении этой модели, - это передать информацию о количестве имеющихся у нас меток. Проще всего передать это число с помощью аргумента <code>num_labels</code>, но если мы хотим получить красивый виджет инференса, подобный тому, что мы видели в начале этого раздела, то лучше задать правильные соответствия меток.",$,d,k="Они должны быть заданы двумя словарями, <code>id2label</code> и <code>label2id</code>, которые содержат отображение идентификатора в метку и наоборот:",A,u,_,g,h="Теперь мы можем просто передать их в метод <code>TFAutoModelForTokenClassification.from_pretrained()</code>, и они будут заданы в конфигурации модели, затем правильно сохранены и загружены в Hub:",R,x,Y,N,Wl='Как и при определении <code>TFAutoModelForSequenceClassification</code> в <a href="../chapter3/1">Главе 3</a>, при создании модели выдается предупреждение о том, что некоторые веса не были использованы (веса из предварительно обученной головы), а другие веса инициализированы случайно (веса из новой головы классификации токенов), и что эту модель нужно обучить. Мы сделаем это через минуту, но сначала давайте перепроверим, что наша модель имеет правильное количество меток:',Yl,F,al,H,Ml,z,Is="<p>⚠️ Если у вас есть модель с неправильным количеством меток, то при последующем вызове <code>model.fit()</code> вы получите непонятную ошибку. Это может вызвать раздражение при отладке, поэтому обязательно выполните эту проверку, чтобы убедиться, что у вас есть ожидаемое количество меток.</p>",W,tl,Al,Z,ae="Теперь мы готовы к обучению нашей модели! Однако сначала нам нужно сделать еще немного работы: войти в Hugging Face и определить гиперпараметры обучения. Если вы работаете в блокноте, есть удобная функция, которая поможет вам в этом:",_l,G,Nl,S,Gl="Появится виджет, в котором вы можете ввести свои учетные данные для входа в Hugging Face.",Rl,v,Me="Если вы работаете не в блокноте, просто введите следующую строку в терминале:",El,V,Fl,L,vl="После входа в аккаунт мы можем подготовить все необходимое для компиляции нашей модели. 🤗 Transformers предоставляет удобную функцию <code>create_optimizer()</code>, которая создаст вам оптимизатор <code>AdamW</code> с соответствующими настройками затухания весов и затухания скорости обучения, что позволит улучшить качество вашей модели по сравнению со встроенным оптимизатором <code>Adam</code>:",Zl,D,Hl,q,Dl="Обратите внимание, что мы не указываем аргумент <code>loss</code> в <code>compile()</code>. Это связано с тем, что модели могут вычислять потери внутри себя - если вы компилируете без потерь и предоставляете свои метки во входном словаре (как мы делаем в наших датасетах), то модель будет обучаться, используя эти внутренние потери, которые будут соответствовать задаче и типу выбранной вами модели.",Vl,B,Je="Далее мы определяем <code>PushToHubCallback</code> для загрузки нашей модели в Hub во время обучения модели с помощью этого обратного вызова:",Bl,X,zl,O,yl='С помощью аргумента <code>hub_model_id</code> можно указать полное имя репозитория, в который вы хотите передать модель (в частности, этот аргумент нужно использовать, чтобы передать модель в организацию). Например, когда мы отправили модель в <a href="https://huggingface.co/huggingface-course" rel="nofollow">организацию <code>huggingface-course</code></a>, мы добавили <code>hub_model_id="huggingface-course/bert-finetuned-ner"</code>. По умолчанию используемое хранилище будет находиться в вашем пространстве имен и называться в соответствии с заданной вами выходной директорией, например <code>"cool_huggingface_user/bert-finetuned-ner"</code>.',Jl,K,Qs="<p>💡 Если выходной каталог, который вы используете, уже существует, он должен быть локальным клоном репозитория, в который вы хотите выполнить push. Если это не так, вы получите ошибку при вызове <code>model.fit()</code> и должны будете задать новое имя.</p>",pl,nl,xs="Обратите внимание, что во время обучения каждый раз, когда модель сохраняется (здесь - каждую эпоху), она загружается на хаб в фоновом режиме. Таким образом, при необходимости вы сможете возобновить обучение на другой машине.",il,P,wl="На этом этапе вы можете использовать виджет инференса на Model Hub, чтобы протестировать свою модель и поделиться ею с друзьями. Вы успешно дообучили модель для задачи классификации токенов - поздравляем! Но насколько хороша наша модель на самом деле? Чтобы выяснить это, нам следует оценить некоторые метрики.",Ul;return i=new cl({props:{title:"Определение модели",local:"defining-the-model",headingTag:"h3"}}),u=new C({props:{code:"aWQybGFiZWwlMjAlM0QlMjAlN0JpJTNBJTIwbGFiZWwlMjBmb3IlMjBpJTJDJTIwbGFiZWwlMjBpbiUyMGVudW1lcmF0ZShsYWJlbF9uYW1lcyklN0QlMEFsYWJlbDJpZCUyMCUzRCUyMCU3QnYlM0ElMjBrJTIwZm9yJTIwayUyQyUyMHYlMjBpbiUyMGlkMmxhYmVsLml0ZW1zKCklN0Q=",highlighted:`id2label = {i: label <span class="hljs-keyword">for</span> i, label <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(label_names)} | |
| label2id = {v: k <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> id2label.items()}`,wrap:!1}}),x=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRGQXV0b01vZGVsRm9yVG9rZW5DbGFzc2lmaWNhdGlvbiUwQSUwQW1vZGVsJTIwJTNEJTIwVEZBdXRvTW9kZWxGb3JUb2tlbkNsYXNzaWZpY2F0aW9uLmZyb21fcHJldHJhaW5lZCglMEElMjAlMjAlMjAlMjBtb2RlbF9jaGVja3BvaW50JTJDJTBBJTIwJTIwJTIwJTIwaWQybGFiZWwlM0RpZDJsYWJlbCUyQyUwQSUyMCUyMCUyMCUyMGxhYmVsMmlkJTNEbGFiZWwyaWQlMkMlMEEp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> TFAutoModelForTokenClassification | |
| model = TFAutoModelForTokenClassification.from_pretrained( | |
| model_checkpoint, | |
| id2label=id2label, | |
| label2id=label2id, | |
| )`,wrap:!1}}),F=new C({props:{code:"bW9kZWwuY29uZmlnLm51bV9sYWJlbHM=",highlighted:"model.config.num_labels",wrap:!1}}),H=new C({props:{code:"OQ==",highlighted:'<span class="hljs-number">9</span>',wrap:!1}}),tl=new cl({props:{title:"Дообучение модели",local:"fine-tuning-the-model",headingTag:"h3"}}),G=new C({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMG5vdGVib29rX2xvZ2luJTBBJTBBbm90ZWJvb2tfbG9naW4oKQ==",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> notebook_login | |
| notebook_login()`,wrap:!1}}),V=new C({props:{code:"aHVnZ2luZ2ZhY2UtY2xpJTIwbG9naW4=",highlighted:"huggingface-cli login",wrap:!1}}),D=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMGNyZWF0ZV9vcHRpbWl6ZXIlMEFpbXBvcnQlMjB0ZW5zb3JmbG93JTIwYXMlMjB0ZiUwQSUwQSUyMyUyMCVEMCU5RSVEMCVCMSVEMSU4MyVEMSU4NyVEMCVCNSVEMCVCRCVEMCVCOCVEMCVCNSUyMCVEMSU4MSVEMCVCRSUyMCVEMSU4MSVEMCVCQyVEMCVCNSVEMSU4OCVEMCVCMCVEMCVCRCVEMCVCRCVEMCVCRSVEMCVCOSUyMCVEMSU4MiVEMCVCRSVEMSU4NyVEMCVCRCVEMCVCRSVEMSU4MSVEMSU4MiVEMSU4QyVEMSU4RSUyMGZsb2F0MTYlMEElMjMlMjAlRDAlOTclRDAlQjAlRDAlQkElRDAlQkUlRDAlQkMlRDAlQkMlRDAlQjUlRDAlQkQlRDElODIlRDAlQjglRDElODAlRDElODMlRDAlQjklRDElODIlRDAlQjUlMjAlRDElOEQlRDElODIlRDElODMlMjAlRDElODElRDElODIlRDElODAlRDAlQkUlRDAlQkElRDElODMlMkMlMjAlRDAlQjUlRDElODElRDAlQkIlRDAlQjglMjAlRDAlQjIlRDElOEIlMjAlRDAlQjglRDElODElRDAlQkYlRDAlQkUlRDAlQkIlRDElOEMlRDAlQjclRDElODMlRDAlQjUlRDElODIlRDAlQjUlMjBHUFUlMkMlMjAlRDAlQkElRDAlQkUlRDElODIlRDAlQkUlRDElODAlRDAlQkUlRDAlQkMlRDElODMlMjAlRDElOEQlRDElODIlRDAlQkUlMjAlRDAlQkQlRDAlQjUlMjAlRDAlQkYlRDElODAlRDAlQjglRDAlQkQlRDAlQjUlRDElODElRDAlQjUlRDElODIlMjAlRDAlQkQlRDAlQjglRDAlQkElRDAlQjAlRDAlQkElRDAlQjglRDElODUlMjAlRDAlQkYlRDElODAlRDAlQjUlRDAlQjglRDAlQkMlRDElODMlRDElODklRDAlQjUlRDElODElRDElODIlRDAlQjIlMEF0Zi5rZXJhcy5taXhlZF9wcmVjaXNpb24uc2V0X2dsb2JhbF9wb2xpY3koJTIybWl4ZWRfZmxvYXQxNiUyMiklMEElMEElMjMlMjAlRDAlOUElRDAlQkUlRDAlQkIlRDAlQjglRDElODclRDAlQjUlRDElODElRDElODIlRDAlQjIlRDAlQkUlMjAlRDElODglRDAlQjAlRDAlQjMlRDAlQkUlRDAlQjIlMjAlRDAlQkUlRDAlQjElRDElODMlRDElODclRDAlQjUlRDAlQkQlRDAlQjglRDElOEYlMjAtJTIwJUQxJThEJUQxJTgyJUQwJUJFJTIwJUQwJUJBJUQwJUJFJUQwJUJCJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQxJTgyJUQwJUIyJUQwJUJFJTIwJUQwJUJGJUQxJTgwJUQwJUI4JUQwJUJDJUQwJUI1JUQxJTgwJUQwJUJFJUQwJUIyJTIwJUQwJUIyJTIwJUQwJUI0JUQwJUIwJUQxJTgyJUQwJUIwJUQxJTgxJUQwJUI1JUQxJTgyJUQwJUI1JTJDJTIwJUQxJTgwJUQwJUIwJUQwJUI3JUQwJUI0JUQwJUI1JUQwJUJCJUQwJUI1JUQwJUJEJUQwJUJEJUQwJUJFJUQwJUI1JTIwJUQwJUJEJUQwJUIwJTIwJUQxJTgwJUQwJUIwJUQwJUI3JUQwJUJDJUQwJUI1JUQxJTgwJTIwJUQwJUIxJUQwJUIwJUQxJTgyJUQxJTg3JUQwJUIwJTJDJTIwJUQwJUI3JUQwJUIwJUQxJTgyJUQwJUI1JUQwJUJDJTIwJUQxJTgzJUQwJUJDJUQwJUJEJUQwJUJFJUQwJUI2JUQwJUI1JUQwJUJEJUQwJUJEJUQwJUJFJUQwJUI1JTBBJTIzJTIwJUQwJUJEJUQwJUIwJTIwJUQwJUJFJUQwJUIxJUQxJTg5JUQwJUI1JUQwJUI1JTIwJUQwJUJBJUQwJUJFJUQwJUJCJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQxJTgyJUQwJUIyJUQwJUJFJTIwJUQxJThEJUQwJUJGJUQwJUJFJUQxJTg1LiUyMCVEMCU5RSVEMCVCMSVEMSU4MCVEMCVCMCVEMSU4MiVEMCVCOCVEMSU4MiVEMCVCNSUyMCVEMCVCMiVEMCVCRCVEMCVCOCVEMCVCQyVEMCVCMCVEMCVCRCVEMCVCOCVEMCVCNSUyQyUyMCVEMSU4NyVEMSU4MiVEMCVCRSUyMHRmX3RyYWluX2RhdGFzZXQlMjAlRDAlQjclRDAlQjQlRDAlQjUlRDElODElRDElOEMlMjAtJTIwJUQxJThEJUQxJTgyJUQwJUJFJTIwJUQxJTgwJUQwJUIwJUQwJUI3JUQwJUIxJUQwJUI4JUQxJTgyJUQwJUJFJUQwJUI1JTIwJUQwJUJEJUQwJUIwJTIwJUQwJUIxJUQwJUIwJUQxJTgyJUQxJTg3JUQwJUI4JTIwdGYuZGF0YS5EYXRhc2V0JTJDJTBBJTIzJTIwJUQwJUIwJTIwJUQwJUJEJUQwJUI1JTIwJUQwJUJFJUQxJTgwJUQwJUI4JUQwJUIzJUQwJUI4JUQwJUJEJUQwJUIwJUQwJUJCJUQxJThDJUQwJUJEJUQxJThCJUQwJUI5JTIwJUQwJUI0JUQwJUIwJUQxJTgyJUQwJUIwJUQxJTgxJUQwJUI1JUQxJTgyJTIwSHVnZ2luZyUyMEZhY2UlMkMlMjAlRDAlQkYlRDAlQkUlRDElOEQlRDElODIlRDAlQkUlRDAlQkMlRDElODMlMjAlRDAlQjUlRDAlQjMlRDAlQkUlMjBsZW4oKSUyMCVEMSU4MyVEMCVCNiVEMCVCNSUyMCVEMSU4MCVEMCVCMCVEMCVCMiVEMCVCNSVEMCVCRCUyMG51bV9zYW1wbGVzJTIwJTJGJTJGJTIwYmF0Y2hfc2l6ZS4lMEFudW1fZXBvY2hzJTIwJTNEJTIwMyUwQW51bV90cmFpbl9zdGVwcyUyMCUzRCUyMGxlbih0Zl90cmFpbl9kYXRhc2V0KSUyMColMjBudW1fZXBvY2hzJTBBJTBBb3B0aW1pemVyJTJDJTIwc2NoZWR1bGUlMjAlM0QlMjBjcmVhdGVfb3B0aW1pemVyKCUwQSUyMCUyMCUyMCUyMGluaXRfbHIlM0QyZS01JTJDJTBBJTIwJTIwJTIwJTIwbnVtX3dhcm11cF9zdGVwcyUzRDAlMkMlMEElMjAlMjAlMjAlMjBudW1fdHJhaW5fc3RlcHMlM0RudW1fdHJhaW5fc3RlcHMlMkMlMEElMjAlMjAlMjAlMjB3ZWlnaHRfZGVjYXlfcmF0ZSUzRDAuMDElMkMlMEEpJTBBbW9kZWwuY29tcGlsZShvcHRpbWl6ZXIlM0RvcHRpbWl6ZXIp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> create_optimizer | |
| <span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf | |
| <span class="hljs-comment"># Обучение со смешанной точностью float16</span> | |
| <span class="hljs-comment"># Закомментируйте эту строку, если вы используете GPU, которому это не принесет никаких преимуществ</span> | |
| tf.keras.mixed_precision.set_global_policy(<span class="hljs-string">"mixed_float16"</span>) | |
| <span class="hljs-comment"># Количество шагов обучения - это количество примеров в датасете, разделенное на размер батча, затем умноженное</span> | |
| <span class="hljs-comment"># на общее количество эпох. Обратите внимание, что tf_train_dataset здесь - это разбитое на батчи tf.data.Dataset,</span> | |
| <span class="hljs-comment"># а не оригинальный датасет Hugging Face, поэтому его len() уже равен num_samples // batch_size.</span> | |
| num_epochs = <span class="hljs-number">3</span> | |
| num_train_steps = <span class="hljs-built_in">len</span>(tf_train_dataset) * num_epochs | |
| optimizer, schedule = create_optimizer( | |
| init_lr=<span class="hljs-number">2e-5</span>, | |
| num_warmup_steps=<span class="hljs-number">0</span>, | |
| num_train_steps=num_train_steps, | |
| weight_decay_rate=<span class="hljs-number">0.01</span>, | |
| ) | |
| model.<span class="hljs-built_in">compile</span>(optimizer=optimizer)`,wrap:!1}}),X=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycy5rZXJhc19jYWxsYmFja3MlMjBpbXBvcnQlMjBQdXNoVG9IdWJDYWxsYmFjayUwQSUwQWNhbGxiYWNrJTIwJTNEJTIwUHVzaFRvSHViQ2FsbGJhY2sob3V0cHV0X2RpciUzRCUyMmJlcnQtZmluZXR1bmVkLW5lciUyMiUyQyUyMHRva2VuaXplciUzRHRva2VuaXplciklMEElMEFtb2RlbC5maXQoJTBBJTIwJTIwJTIwJTIwdGZfdHJhaW5fZGF0YXNldCUyQyUwQSUyMCUyMCUyMCUyMHZhbGlkYXRpb25fZGF0YSUzRHRmX2V2YWxfZGF0YXNldCUyQyUwQSUyMCUyMCUyMCUyMGNhbGxiYWNrcyUzRCU1QmNhbGxiYWNrJTVEJTJDJTBBJTIwJTIwJTIwJTIwZXBvY2hzJTNEbnVtX2Vwb2NocyUyQyUwQSk=",highlighted:`<span class="hljs-keyword">from</span> transformers.keras_callbacks <span class="hljs-keyword">import</span> PushToHubCallback | |
| callback = PushToHubCallback(output_dir=<span class="hljs-string">"bert-finetuned-ner"</span>, tokenizer=tokenizer) | |
| model.fit( | |
| tf_train_dataset, | |
| validation_data=tf_eval_dataset, | |
| callbacks=[callback], | |
| epochs=num_epochs, | |
| )`,wrap:!1}}),{c(){j(i.$$.fragment),I=a(),w=c("p"),w.innerHTML=f,$=a(),d=c("p"),d.innerHTML=k,A=a(),j(u.$$.fragment),_=a(),g=c("p"),g.innerHTML=h,R=a(),j(x.$$.fragment),Y=a(),N=c("p"),N.innerHTML=Wl,Yl=a(),j(F.$$.fragment),al=a(),j(H.$$.fragment),Ml=a(),z=c("blockquote"),z.innerHTML=Is,W=a(),j(tl.$$.fragment),Al=a(),Z=c("p"),Z.textContent=ae,_l=a(),j(G.$$.fragment),Nl=a(),S=c("p"),S.textContent=Gl,Rl=a(),v=c("p"),v.textContent=Me,El=a(),j(V.$$.fragment),Fl=a(),L=c("p"),L.innerHTML=vl,Zl=a(),j(D.$$.fragment),Hl=a(),q=c("p"),q.innerHTML=Dl,Vl=a(),B=c("p"),B.innerHTML=Je,Bl=a(),j(X.$$.fragment),zl=a(),O=c("p"),O.innerHTML=yl,Jl=a(),K=c("blockquote"),K.innerHTML=Qs,pl=a(),nl=c("p"),nl.textContent=xs,il=a(),P=c("p"),P.textContent=wl,this.h()},l(J){m(i.$$.fragment,J),I=M(J),w=y(J,"P",{"data-svelte-h":!0}),T(w)!=="svelte-5azgp3"&&(w.innerHTML=f),$=M(J),d=y(J,"P",{"data-svelte-h":!0}),T(d)!=="svelte-1oxwc7g"&&(d.innerHTML=k),A=M(J),m(u.$$.fragment,J),_=M(J),g=y(J,"P",{"data-svelte-h":!0}),T(g)!=="svelte-14f10tl"&&(g.innerHTML=h),R=M(J),m(x.$$.fragment,J),Y=M(J),N=y(J,"P",{"data-svelte-h":!0}),T(N)!=="svelte-1i8puoc"&&(N.innerHTML=Wl),Yl=M(J),m(F.$$.fragment,J),al=M(J),m(H.$$.fragment,J),Ml=M(J),z=y(J,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),T(z)!=="svelte-881qze"&&(z.innerHTML=Is),W=M(J),m(tl.$$.fragment,J),Al=M(J),Z=y(J,"P",{"data-svelte-h":!0}),T(Z)!=="svelte-1ejaix1"&&(Z.textContent=ae),_l=M(J),m(G.$$.fragment,J),Nl=M(J),S=y(J,"P",{"data-svelte-h":!0}),T(S)!=="svelte-22u5y6"&&(S.textContent=Gl),Rl=M(J),v=y(J,"P",{"data-svelte-h":!0}),T(v)!=="svelte-4jtag1"&&(v.textContent=Me),El=M(J),m(V.$$.fragment,J),Fl=M(J),L=y(J,"P",{"data-svelte-h":!0}),T(L)!=="svelte-990tfr"&&(L.innerHTML=vl),Zl=M(J),m(D.$$.fragment,J),Hl=M(J),q=y(J,"P",{"data-svelte-h":!0}),T(q)!=="svelte-1bp2w3z"&&(q.innerHTML=Dl),Vl=M(J),B=y(J,"P",{"data-svelte-h":!0}),T(B)!=="svelte-n9zwbe"&&(B.innerHTML=Je),Bl=M(J),m(X.$$.fragment,J),zl=M(J),O=y(J,"P",{"data-svelte-h":!0}),T(O)!=="svelte-1amn25h"&&(O.innerHTML=yl),Jl=M(J),K=y(J,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),T(K)!=="svelte-jxgynt"&&(K.innerHTML=Qs),pl=M(J),nl=y(J,"P",{"data-svelte-h":!0}),T(nl)!=="svelte-d34znb"&&(nl.textContent=xs),il=M(J),P=y(J,"P",{"data-svelte-h":!0}),T(P)!=="svelte-b97g5x"&&(P.textContent=wl),this.h()},h(){el(z,"class","warning"),el(K,"class","tip")},m(J,Q){o(i,J,Q),t(J,I,Q),t(J,w,Q),t(J,$,Q),t(J,d,Q),t(J,A,Q),o(u,J,Q),t(J,_,Q),t(J,g,Q),t(J,R,Q),o(x,J,Q),t(J,Y,Q),t(J,N,Q),t(J,Yl,Q),o(F,J,Q),t(J,al,Q),o(H,J,Q),t(J,Ml,Q),t(J,z,Q),t(J,W,Q),o(tl,J,Q),t(J,Al,Q),t(J,Z,Q),t(J,_l,Q),o(G,J,Q),t(J,Nl,Q),t(J,S,Q),t(J,Rl,Q),t(J,v,Q),t(J,El,Q),o(V,J,Q),t(J,Fl,Q),t(J,L,Q),t(J,Zl,Q),o(D,J,Q),t(J,Hl,Q),t(J,q,Q),t(J,Vl,Q),t(J,B,Q),t(J,Bl,Q),o(X,J,Q),t(J,zl,Q),t(J,O,Q),t(J,Jl,Q),t(J,K,Q),t(J,pl,Q),t(J,nl,Q),t(J,il,Q),t(J,P,Q),Ul=!0},i(J){Ul||(U(i.$$.fragment,J),U(u.$$.fragment,J),U(x.$$.fragment,J),U(F.$$.fragment,J),U(H.$$.fragment,J),U(tl.$$.fragment,J),U(G.$$.fragment,J),U(V.$$.fragment,J),U(D.$$.fragment,J),U(X.$$.fragment,J),Ul=!0)},o(J){r(i.$$.fragment,J),r(u.$$.fragment,J),r(x.$$.fragment,J),r(F.$$.fragment,J),r(H.$$.fragment,J),r(tl.$$.fragment,J),r(G.$$.fragment,J),r(V.$$.fragment,J),r(D.$$.fragment,J),r(X.$$.fragment,J),Ul=!1},d(J){J&&(e(I),e(w),e($),e(d),e(A),e(_),e(g),e(R),e(Y),e(N),e(Yl),e(al),e(Ml),e(z),e(W),e(Al),e(Z),e(_l),e(Nl),e(S),e(Rl),e(v),e(El),e(Fl),e(L),e(Zl),e(Hl),e(q),e(Vl),e(B),e(Bl),e(zl),e(O),e(Jl),e(K),e(pl),e(nl),e(il),e(P)),b(i,J),b(u,J),b(x,J),b(F,J),b(H,J),b(tl,J),b(G,J),b(V,J),b(D,J),b(X,J)}}}function aa(E){let i,I='Традиционно для оценки прогнозирования классификации токенов используется библиотека <a href="https://github.com/chakki-works/seqeval" rel="nofollow"><em>seqeval</em></a>. Чтобы использовать эту метрику, сначала нужно установить библиотеку <em>seqeval</em>:',w,f,$,d,k='Мы можем загрузить ее с помощью функции <code>evaluate.load()</code>, как мы это делали в <a href="../chapter3/1">Главе 3</a>:',A;return f=new C({props:{code:"IXBpcCUyMGluc3RhbGwlMjBzZXFldmFs",highlighted:"!pip install seqeval",wrap:!1}}),{c(){i=c("p"),i.innerHTML=I,w=a(),j(f.$$.fragment),$=a(),d=c("p"),d.innerHTML=k},l(u){i=y(u,"P",{"data-svelte-h":!0}),T(i)!=="svelte-orol1w"&&(i.innerHTML=I),w=M(u),m(f.$$.fragment,u),$=M(u),d=y(u,"P",{"data-svelte-h":!0}),T(d)!=="svelte-vdotrj"&&(d.innerHTML=k)},m(u,_){t(u,i,_),t(u,w,_),o(f,u,_),t(u,$,_),t(u,d,_),A=!0},i(u){A||(U(f.$$.fragment,u),A=!0)},o(u){r(f.$$.fragment,u),A=!1},d(u){u&&(e(i),e(w),e($),e(d)),b(f,u)}}}function Ma(E){let i,I="Чтобы <code>Trainer</code> вычислял метрику каждую эпоху, нам нужно определить функцию <code>compute_metrics()</code>, которая принимает массивы прогнозов и меток и возвращает словарь с именами и значениями метрик.",w,f,$='Традиционно для оценки прогнозирования классификации токенов используется библиотека <a href="https://github.com/chakki-works/seqeval" rel="nofollow"><em>seqeval</em></a>. Чтобы использовать эту метрику, сначала нужно установить библиотеку <em>seqeval</em>:',d,k,A,u,_='Мы можем загрузить ее с помощью функции <code>evaluate.load()</code>, как мы это делали в <a href="../chapter3/1">Главе 3</a>:',g;return k=new C({props:{code:"IXBpcCUyMGluc3RhbGwlMjBzZXFldmFs",highlighted:"!pip install seqeval",wrap:!1}}),{c(){i=c("p"),i.innerHTML=I,w=a(),f=c("p"),f.innerHTML=$,d=a(),j(k.$$.fragment),A=a(),u=c("p"),u.innerHTML=_},l(h){i=y(h,"P",{"data-svelte-h":!0}),T(i)!=="svelte-1crrktm"&&(i.innerHTML=I),w=M(h),f=y(h,"P",{"data-svelte-h":!0}),T(f)!=="svelte-orol1w"&&(f.innerHTML=$),d=M(h),m(k.$$.fragment,h),A=M(h),u=y(h,"P",{"data-svelte-h":!0}),T(u)!=="svelte-vdotrj"&&(u.innerHTML=_)},m(h,R){t(h,i,R),t(h,w,R),t(h,f,R),t(h,d,R),o(k,h,R),t(h,A,R),t(h,u,R),g=!0},i(h){g||(U(k.$$.fragment,h),g=!0)},o(h){r(k.$$.fragment,h),g=!1},d(h){h&&(e(i),e(w),e(f),e(d),e(A),e(u)),b(k,h)}}}function Ja(E){let i,I="Она возвращает огромное количество информации! Мы получаем оценки precision, recall и F1 для каждой отдельной сущности, а также в целом. Теперь давайте посмотрим, что произойдет, если мы попробуем использовать реальные прогнозы модели для вычисления реальных оценок.",w,f,$="TensorFlow не любит конкатенировать наши прогнозы, поскольку они имеют переменную длину последовательности. Это означает, что мы не можем просто использовать <code>model.predict()</code> - но это нас не остановит. Мы будем получать прогнозы по батчу за раз и конкатенировать их в один большой длинный список по мере продвижения, отбрасывая токены <code>-100</code>, которые указывают на маскирование/дополнение, а затем вычислять метрики для списка в конце:",d,k,A,u,_,g,h="Как ваша модель показала себя по сравнению с нашей? Если вы получили похожие цифры, значит, ваше обучение прошло успешно!",R;return k=new C({props:{code:"aW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBJTBBYWxsX3ByZWRpY3Rpb25zJTIwJTNEJTIwJTVCJTVEJTBBYWxsX2xhYmVscyUyMCUzRCUyMCU1QiU1RCUwQWZvciUyMGJhdGNoJTIwaW4lMjB0Zl9ldmFsX2RhdGFzZXQlM0ElMEElMjAlMjAlMjAlMjBsb2dpdHMlMjAlM0QlMjBtb2RlbC5wcmVkaWN0X29uX2JhdGNoKGJhdGNoKSU1QiUyMmxvZ2l0cyUyMiU1RCUwQSUyMCUyMCUyMCUyMGxhYmVscyUyMCUzRCUyMGJhdGNoJTVCJTIybGFiZWxzJTIyJTVEJTBBJTIwJTIwJTIwJTIwcHJlZGljdGlvbnMlMjAlM0QlMjBucC5hcmdtYXgobG9naXRzJTJDJTIwYXhpcyUzRC0xKSUwQSUyMCUyMCUyMCUyMGZvciUyMHByZWRpY3Rpb24lMkMlMjBsYWJlbCUyMGluJTIwemlwKHByZWRpY3Rpb25zJTJDJTIwbGFiZWxzKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMHByZWRpY3RlZF9pZHglMkMlMjBsYWJlbF9pZHglMjBpbiUyMHppcChwcmVkaWN0aW9uJTJDJTIwbGFiZWwpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBsYWJlbF9pZHglMjAlM0QlM0QlMjAtMTAwJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29udGludWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhbGxfcHJlZGljdGlvbnMuYXBwZW5kKGxhYmVsX25hbWVzJTVCcHJlZGljdGVkX2lkeCU1RCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhbGxfbGFiZWxzLmFwcGVuZChsYWJlbF9uYW1lcyU1QmxhYmVsX2lkeCU1RCklMEFtZXRyaWMuY29tcHV0ZShwcmVkaWN0aW9ucyUzRCU1QmFsbF9wcmVkaWN0aW9ucyU1RCUyQyUyMHJlZmVyZW5jZXMlM0QlNUJhbGxfbGFiZWxzJTVEKQ==",highlighted:`<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| all_predictions = [] | |
| all_labels = [] | |
| <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> tf_eval_dataset: | |
| logits = model.predict_on_batch(batch)[<span class="hljs-string">"logits"</span>] | |
| labels = batch[<span class="hljs-string">"labels"</span>] | |
| predictions = np.argmax(logits, axis=-<span class="hljs-number">1</span>) | |
| <span class="hljs-keyword">for</span> prediction, label <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(predictions, labels): | |
| <span class="hljs-keyword">for</span> predicted_idx, label_idx <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(prediction, label): | |
| <span class="hljs-keyword">if</span> label_idx == -<span class="hljs-number">100</span>: | |
| <span class="hljs-keyword">continue</span> | |
| all_predictions.append(label_names[predicted_idx]) | |
| all_labels.append(label_names[label_idx]) | |
| metric.compute(predictions=[all_predictions], references=[all_labels])`,wrap:!1}}),u=new C({props:{code:"JTdCJ0xPQyclM0ElMjAlN0IncHJlY2lzaW9uJyUzQSUyMDAuOTElMkMlMjAncmVjYWxsJyUzQSUyMDAuOTIlMkMlMjAnZjEnJTNBJTIwMC45MSUyQyUyMCdudW1iZXInJTNBJTIwMTY2OCU3RCUyQyUwQSUyMCdNSVNDJyUzQSUyMCU3QidwcmVjaXNpb24nJTNBJTIwMC43MCUyQyUyMCdyZWNhbGwnJTNBJTIwMC43OSUyQyUyMCdmMSclM0ElMjAwLjc0JTJDJTIwJ251bWJlciclM0ElMjA3MDIlN0QlMkMlMEElMjAnT1JHJyUzQSUyMCU3QidwcmVjaXNpb24nJTNBJTIwMC44NSUyQyUyMCdyZWNhbGwnJTNBJTIwMC45MCUyQyUyMCdmMSclM0ElMjAwLjg4JTJDJTIwJ251bWJlciclM0ElMjAxNjYxJTdEJTJDJTBBJTIwJ1BFUiclM0ElMjAlN0IncHJlY2lzaW9uJyUzQSUyMDAuOTUlMkMlMjAncmVjYWxsJyUzQSUyMDAuOTUlMkMlMjAnZjEnJTNBJTIwMC45NSUyQyUyMCdudW1iZXInJTNBJTIwMTYxNyU3RCUyQyUwQSUyMCdvdmVyYWxsX3ByZWNpc2lvbiclM0ElMjAwLjg3JTJDJTBBJTIwJ292ZXJhbGxfcmVjYWxsJyUzQSUyMDAuOTElMkMlMEElMjAnb3ZlcmFsbF9mMSclM0ElMjAwLjg5JTJDJTBBJTIwJ292ZXJhbGxfYWNjdXJhY3knJTNBJTIwMC45NyU3RA==",highlighted:`{<span class="hljs-string">'LOC'</span>: {<span class="hljs-string">'precision'</span>: <span class="hljs-number">0.91</span>, <span class="hljs-string">'recall'</span>: <span class="hljs-number">0.92</span>, <span class="hljs-string">'f1'</span>: <span class="hljs-number">0.91</span>, <span class="hljs-string">'number'</span>: <span class="hljs-number">1668</span>}, | |
| <span class="hljs-string">'MISC'</span>: {<span class="hljs-string">'precision'</span>: <span class="hljs-number">0.70</span>, <span class="hljs-string">'recall'</span>: <span class="hljs-number">0.79</span>, <span class="hljs-string">'f1'</span>: <span class="hljs-number">0.74</span>, <span class="hljs-string">'number'</span>: <span class="hljs-number">702</span>}, | |
| <span class="hljs-string">'ORG'</span>: {<span class="hljs-string">'precision'</span>: <span class="hljs-number">0.85</span>, <span class="hljs-string">'recall'</span>: <span class="hljs-number">0.90</span>, <span class="hljs-string">'f1'</span>: <span class="hljs-number">0.88</span>, <span class="hljs-string">'number'</span>: <span class="hljs-number">1661</span>}, | |
| <span class="hljs-string">'PER'</span>: {<span class="hljs-string">'precision'</span>: <span class="hljs-number">0.95</span>, <span class="hljs-string">'recall'</span>: <span class="hljs-number">0.95</span>, <span class="hljs-string">'f1'</span>: <span class="hljs-number">0.95</span>, <span class="hljs-string">'number'</span>: <span class="hljs-number">1617</span>}, | |
| <span class="hljs-string">'overall_precision'</span>: <span class="hljs-number">0.87</span>, | |
| <span class="hljs-string">'overall_recall'</span>: <span class="hljs-number">0.91</span>, | |
| <span class="hljs-string">'overall_f1'</span>: <span class="hljs-number">0.89</span>, | |
| <span class="hljs-string">'overall_accuracy'</span>: <span class="hljs-number">0.97</span>}`,wrap:!1}}),{c(){i=c("p"),i.textContent=I,w=a(),f=c("p"),f.innerHTML=$,d=a(),j(k.$$.fragment),A=a(),j(u.$$.fragment),_=a(),g=c("p"),g.textContent=h},l(x){i=y(x,"P",{"data-svelte-h":!0}),T(i)!=="svelte-3jap57"&&(i.textContent=I),w=M(x),f=y(x,"P",{"data-svelte-h":!0}),T(f)!=="svelte-13ztghm"&&(f.innerHTML=$),d=M(x),m(k.$$.fragment,x),A=M(x),m(u.$$.fragment,x),_=M(x),g=y(x,"P",{"data-svelte-h":!0}),T(g)!=="svelte-pq3jau"&&(g.textContent=h)},m(x,Y){t(x,i,Y),t(x,w,Y),t(x,f,Y),t(x,d,Y),o(k,x,Y),t(x,A,Y),o(u,x,Y),t(x,_,Y),t(x,g,Y),R=!0},i(x){R||(U(k.$$.fragment,x),U(u.$$.fragment,x),R=!0)},o(x){r(k.$$.fragment,x),r(u.$$.fragment,x),R=!1},d(x){x&&(e(i),e(w),e(f),e(d),e(A),e(_),e(g)),b(k,x),b(u,x)}}}function pa(E){let i,I="Она возвращает огромное количество информации! Мы получаем оценки precision, recall и F1 для каждой отдельной сущности, а также в целом. Для расчета метрик мы сохраним только общую оценку, но вы можете настроить функцию <code>compute_metrics()</code> так, чтобы она возвращала все метрики, которые вы хотите получить.",w,f,$="Эта функция <code>compute_metrics()</code> сначала берет argmax логитов, чтобы преобразовать их в прогнозы (как обычно, логиты и вероятности расположены в том же порядке, поэтому нам не нужно применять softmax). Затем нам нужно преобразовать метки и прогнозы из целых чисел в строки. Мы удаляем все значения, для которых метка равна <code>-100</code>, а затем передаем результаты в метод <code>metric.compute()</code>:",d,k,A,u,_="Теперь, когда это сделано, мы почти готовы к определению нашего <code>Trainer</code>. Нам просто нужна <code>model</code>, чтобы дообучить ее!",g;return k=new C({props:{code:"aW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBJTBBJTBBZGVmJTIwY29tcHV0ZV9tZXRyaWNzKGV2YWxfcHJlZHMpJTNBJTBBJTIwJTIwJTIwJTIwbG9naXRzJTJDJTIwbGFiZWxzJTIwJTNEJTIwZXZhbF9wcmVkcyUwQSUyMCUyMCUyMCUyMHByZWRpY3Rpb25zJTIwJTNEJTIwbnAuYXJnbWF4KGxvZ2l0cyUyQyUyMGF4aXMlM0QtMSklMEElMEElMjAlMjAlMjAlMjAlMjMlMjAlRDAlQTMlRDAlQjQlRDAlQjAlRDAlQkIlRDElOEYlRDAlQjUlRDAlQkMlMjAlRDAlQjglRDAlQjMlRDAlQkQlRDAlQkUlRDElODAlRDAlQjglRDElODAlRDElODMlRDAlQjUlRDAlQkMlRDElOEIlRDAlQjklMjAlRDAlQjglRDAlQkQlRDAlQjQlRDAlQjUlRDAlQkElRDElODElMjAoJUQxJTgxJUQwJUJGJUQwJUI1JUQxJTg2JUQwJUI4JUQwJUIwJUQwJUJCJUQxJThDJUQwJUJEJUQxJThCJUQwJUI1JTIwJUQxJTgyJUQwJUJFJUQwJUJBJUQwJUI1JUQwJUJEJUQxJThCKSUyMCVEMCVCOCUyMCVEMCVCRiVEMSU4MCVEMCVCNSVEMCVCRSVEMCVCMSVEMSU4MCVEMCVCMCVEMCVCNyVEMSU4MyVEMCVCNSVEMCVCQyUyMCVEMCVCMiUyMCVEMCVCQyVEMCVCNSVEMSU4MiVEMCVCQSVEMCVCOCUwQSUyMCUyMCUyMCUyMHRydWVfbGFiZWxzJTIwJTNEJTIwJTVCJTVCbGFiZWxfbmFtZXMlNUJsJTVEJTIwZm9yJTIwbCUyMGluJTIwbGFiZWwlMjBpZiUyMGwlMjAhJTNEJTIwLTEwMCU1RCUyMGZvciUyMGxhYmVsJTIwaW4lMjBsYWJlbHMlNUQlMEElMjAlMjAlMjAlMjB0cnVlX3ByZWRpY3Rpb25zJTIwJTNEJTIwJTVCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVCbGFiZWxfbmFtZXMlNUJwJTVEJTIwZm9yJTIwKHAlMkMlMjBsKSUyMGluJTIwemlwKHByZWRpY3Rpb24lMkMlMjBsYWJlbCklMjBpZiUyMGwlMjAhJTNEJTIwLTEwMCU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMHByZWRpY3Rpb24lMkMlMjBsYWJlbCUyMGluJTIwemlwKHByZWRpY3Rpb25zJTJDJTIwbGFiZWxzKSUwQSUyMCUyMCUyMCUyMCU1RCUwQSUyMCUyMCUyMCUyMGFsbF9tZXRyaWNzJTIwJTNEJTIwbWV0cmljLmNvbXB1dGUocHJlZGljdGlvbnMlM0R0cnVlX3ByZWRpY3Rpb25zJTJDJTIwcmVmZXJlbmNlcyUzRHRydWVfbGFiZWxzKSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnByZWNpc2lvbiUyMiUzQSUyMGFsbF9tZXRyaWNzJTVCJTIyb3ZlcmFsbF9wcmVjaXNpb24lMjIlNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJyZWNhbGwlMjIlM0ElMjBhbGxfbWV0cmljcyU1QiUyMm92ZXJhbGxfcmVjYWxsJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZjElMjIlM0ElMjBhbGxfbWV0cmljcyU1QiUyMm92ZXJhbGxfZjElMjIlNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJhY2N1cmFjeSUyMiUzQSUyMGFsbF9tZXRyaWNzJTVCJTIyb3ZlcmFsbF9hY2N1cmFjeSUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMCU3RA==",highlighted:`<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">compute_metrics</span>(<span class="hljs-params">eval_preds</span>): | |
| logits, labels = eval_preds | |
| predictions = np.argmax(logits, axis=-<span class="hljs-number">1</span>) | |
| <span class="hljs-comment"># Удаляем игнорируемый индекс (специальные токены) и преобразуем в метки</span> | |
| true_labels = [[label_names[l] <span class="hljs-keyword">for</span> l <span class="hljs-keyword">in</span> label <span class="hljs-keyword">if</span> l != -<span class="hljs-number">100</span>] <span class="hljs-keyword">for</span> label <span class="hljs-keyword">in</span> labels] | |
| true_predictions = [ | |
| [label_names[p] <span class="hljs-keyword">for</span> (p, l) <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(prediction, label) <span class="hljs-keyword">if</span> l != -<span class="hljs-number">100</span>] | |
| <span class="hljs-keyword">for</span> prediction, label <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(predictions, labels) | |
| ] | |
| all_metrics = metric.compute(predictions=true_predictions, references=true_labels) | |
| <span class="hljs-keyword">return</span> { | |
| <span class="hljs-string">"precision"</span>: all_metrics[<span class="hljs-string">"overall_precision"</span>], | |
| <span class="hljs-string">"recall"</span>: all_metrics[<span class="hljs-string">"overall_recall"</span>], | |
| <span class="hljs-string">"f1"</span>: all_metrics[<span class="hljs-string">"overall_f1"</span>], | |
| <span class="hljs-string">"accuracy"</span>: all_metrics[<span class="hljs-string">"overall_accuracy"</span>], | |
| }`,wrap:!1}}),{c(){i=c("p"),i.innerHTML=I,w=a(),f=c("p"),f.innerHTML=$,d=a(),j(k.$$.fragment),A=a(),u=c("p"),u.innerHTML=_},l(h){i=y(h,"P",{"data-svelte-h":!0}),T(i)!=="svelte-wmf7uz"&&(i.innerHTML=I),w=M(h),f=y(h,"P",{"data-svelte-h":!0}),T(f)!=="svelte-1uxyez5"&&(f.innerHTML=$),d=M(h),m(k.$$.fragment,h),A=M(h),u=y(h,"P",{"data-svelte-h":!0}),T(u)!=="svelte-1gu97qe"&&(u.innerHTML=_)},m(h,R){t(h,i,R),t(h,w,R),t(h,f,R),t(h,d,R),o(k,h,R),t(h,A,R),t(h,u,R),g=!0},i(h){g||(U(k.$$.fragment,h),g=!0)},o(h){r(k.$$.fragment,h),g=!1},d(h){h&&(e(i),e(w),e(f),e(d),e(A),e(u)),b(k,h)}}}function Gn(E){let i,I,w,f="Поскольку мы работаем над проблемой классификации токенов, мы будем использовать класс <code>AutoModelForTokenClassification</code>. Главное, что нужно помнить при определении этой модели, - это передать информацию о количестве имеющихся у нас меток. Проще всего передать это число с помощью аргумента <code>num_labels</code>, но если мы хотим получить красивый виджет инференса, подобный тому, что мы видели в начале этого раздела, то лучше задать правильное сопоставление меток.",$,d,k="Оно должно задаваться двумя словарями, <code>id2label</code> и <code>label2id</code>, которые содержат соответствие между идентификатором и меткой и наоборот:",A,u,_,g,h="Теперь мы можем просто передать их в метод <code>AutoModelForTokenClassification.from_pretrained()</code>, и они будут заданы в конфигурации модели, а затем правильно сохранены и загружены в Hub:",R,x,Y,N,Wl='Как и в случае определения <code>AutoModelForSequenceClassification</code> в <a href="../chapter3/1">Главе 3</a>, при создании модели выдается предупреждение о том, что некоторые веса не были использованы (те, что были получены из предварительно обученной головы), а другие инициализированы случайно (те, что были получены из новой головы классификации токенов), и что эту модель необходимо обучить. Мы сделаем это через минуту, но сначала давайте перепроверим, что наша модель имеет правильное количество меток:',Yl,F,al,H,Ml,z,Is="<p>⚠️ Если у вас есть модель с неправильным количеством меток, то при последующем вызове метода <code>Trainer.train()</code> вы получите непонятную ошибку (что-то вроде “CUDA error: device-side assert triggered”). Это главная причина ошибок, о которых сообщают пользователи, поэтому обязательно выполните эту проверку, чтобы убедиться, что у вас есть ожидаемое количество меток.</p>",W,tl,Al,Z,ae="Теперь мы готовы к обучению нашей модели! Нам осталось сделать две последние вещи, прежде чем мы определим наш <code>Trainer</code>: войти в Hugging Face и определить наши аргументы для обучения. Если вы работаете в блокноте, есть удобная функция, которая поможет вам в этом:",_l,G,Nl,S,Gl="Появится виджет, в котором вы можете ввести свои учетные данные для входа в Hugging Face.",Rl,v,Me="Если вы работаете не в ноутбуке, просто введите следующую строку в терминале:",El,V,Fl,L,vl="Как только это будет сделано, мы сможем определить наши <code>TrainingArguments</code>:",Zl,D,Hl,q,Dl='Большинство из них вы уже видели: мы задаем некоторые гиперпараметры (например, скорость обучения, количество эпох для обучения и затухание весов) и указываем <code>push_to_hub=True</code>, чтобы указать, что мы хотим сохранить модель и оценить ее в конце каждой эпохи, а также что мы хотим загрузить наши результаты в Model Hub. Обратите внимание, что с помощью аргумента <code>hub_model_id</code> можно указать имя репозитория, в который вы хотите передать модель (в частности, этот аргумент нужно использовать, чтобы передать модель в организацию). Например, когда мы передавали модель в <a href="https://huggingface.co/huggingface-course" rel="nofollow">организацию <code>huggingface-course</code></a>, мы добавили <code>hub_model_id="huggingface-course/bert-finetuned-ner"</code> в <code>TrainingArguments</code>. По умолчанию используемый репозиторий будет находиться в вашем пространстве имен и называться в соответствии с заданным вами выходным каталогом, так что в нашем случае это будет <code>"sgugger/bert-finetuned-ner"</code>.',Vl,B,Je="<p>💡 Если выходной каталог, который вы используете, уже существует, он должен быть локальным клоном репозитория, в который вы хотите передать модель. Если это не так, вы получите ошибку при определении вашего <code>Trainer</code> и должны будете задать новое имя.</p>",Bl,X,zl="Наконец, мы просто передаем все в <code>Trainer</code> и запускаем обучение:",O,yl,Jl,K,Qs="Обратите внимание, что во время обучения каждый раз, когда модель сохраняется (здесь - каждую эпоху), она загружается в Hub в фоновом режиме. Таким образом, при необходимости вы сможете возобновить обучение на другой машине.",pl,nl,xs="После завершения обучения мы используем метод <code>push_to_hub()</code>, чтобы убедиться, что загружена самая последняя версия модели:",il,P,wl,Ul,J="Эта команда возвращает URL только что выполненного commit, если вы хотите его проверить:",Q,Sl,Ll,ql,ks="<code>Trainer</code> также создает черновик карточки модели со всеми результатами оценки и загружает его. На этом этапе вы можете использовать виджет инференса на Model Hub, чтобы протестировать свою модель и поделиться ею с друзьями. Вы успешно дообучили модель для задачи классификации токенов - поздравляем!",Ds,Tl,wt="Если вы хотите более глубоко погрузиться в цикл обучения, мы покажем вам, как сделать то же самое с помощью 🤗 Accelerate.",Xs,jl,Ys,ml,re='Теперь давайте рассмотрим полный цикл обучения, чтобы вы могли легко настроить нужные вам части. Он будет очень похож на тот, что мы делали в <a href="../chapter3/4">Главе 3</a>, с некоторыми изменениями для оценки.',Ol,$s,Ns,ol,ce="Сначала нам нужно создать <code>DataLoader</code> для наших датасетов. Мы используем наш <code>data_collator</code> в качестве <code>collate_fn</code> и перемешиваем обучающий набор, но не валидационный:",Pl,Kl,ls,gs,ye="Затем мы повторно инстанцируем нашу модель, чтобы убедиться, что мы не продолжаем дообучать модель, а снова начинаем с предварительно обученной модели BERT:",ss,As,Fs,bl,Tt="Тогда нам понадобится оптимизатор. Мы будем использовать классический <code>AdamW</code>, который похож на <code>Adam</code>, но с исправлениями в способе применения затухания весов:",Hs,ul,zs,dl,we="Когда у нас есть все эти объекты, мы можем отправить их в метод <code>accelerator.prepare()</code>:",es,_s,Ss,rl,Te='<p>🚨 Если вы обучаетесь на TPU, вам нужно будет перенести весь код, начиная с ячейки выше, в специальную функцию обучения. Подробнее смотрите <a href="../chapter3/1">Главу 3</a>.</p>',ts,Rs,je="Теперь, когда мы отправили наш <code>train_dataloader</code> в <code>accelerator.prepare()</code>, мы можем использовать его длину для вычисления количества шагов обучения. Помните, что это всегда нужно делать после подготовки загрузчика данных, так как этот метод изменит его длину. Мы используем классический линейный планировшик скорости обучения до 0:",Xl,Es,Ls,Cl,me="Наконец, чтобы передать нашу модель в Hub, нам нужно создать объект <code>Repository</code> в рабочей папке. Сначала авторизуйтесь в Hugging Face, если вы еще не авторизованы. Мы определим имя репозитория по идентификатору модели, который мы хотим присвоить нашей модели (не стесняйтесь заменить <code>repo_name</code> на свой собственный выбор; он просто должен содержать ваше имя пользователя, что и делает функция <code>get_full_repo_name()</code>):",ns,as,Ms,Zs,qs,fl,jt="Затем мы можем клонировать этот репозиторий в локальную папку. Если она уже существует, эта локальная папка должна быть существующим клоном репозитория, с которым мы работаем:",Os,hl,Ps,Il,mt="Теперь мы можем загрузить все, что сохранили в <code>output_dir</code>, вызвав метод <code>repo.push_to_hub()</code>. Это поможет нам загружать промежуточные модели в конце каждой эпохи.",Ks,Ql,le,xl,oe="Теперь мы готовы написать полный цикл обучения. Чтобы упростить его оценочную часть, мы определяем функцию <code>postprocess()</code>, которая принимает прогнозы и метки и преобразует их в списки строк, как того ожидает наш объект <code>metric</code>:",Js,Vs,se,kl,be="Затем мы можем написать цикл обучения. После определения прогресс-бара, чтобы следить за ходом обучения, цикл состоит из трех частей:",ps,is,Bs="<li>Само обучение представляет собой классическую итерацию по <code>train_dataloader</code>, прямой проход по модели, затем обратный проход и шаг оптимизатора.</li> <li>Оценка, в которой есть новшество после получения выходов нашей модели на батче: поскольку два процесса могли дополнять входы и метки до разных форм, нам нужно использовать <code>accelerator.pad_across_processes()</code>, чтобы сделать прогнозы и метки одинаковой формы перед вызовом метода <code>gather()</code>. Если мы этого не сделаем, оценка либо завершится с ошибкой, либо зависнет навсегда. Затем мы отправляем результаты в <code>metric.add_batch()</code> и вызываем <code>metric.compute()</code> после завершения цикла оценки.</li> <li>Сохранение и загрузка, где мы сначала сохраняем модель и токенизатор, а затем вызываем <code>repo.push_to_hub()</code>. Обратите внимание, что мы используем аргумент <code>blocking=False</code>, чтобы указать библиотеке 🤗 Hub на выполнение push в асинхронном процессе. Таким образом, обучение продолжается нормально, а эта (длинная) инструкция выполняется в фоновом режиме.</li>",ue,Us,Ws="Вот полный код цикла обучения:",de,rs,cs,ys,Gs="Если вы впервые видите модель, сохраненную с помощью 🤗 Accelerate, давайте посмотрим на три строки кода, которые идут вместе с ним:",ee,$l,Ce,ws,vs="Первая строка не требует пояснений: она указывает всем процессам подождать, пока все не окажутся на этой стадии, прежде чем продолжить работу. Это нужно для того, чтобы убедиться, что у нас одна и та же модель в каждом процессе перед сохранением. Затем мы берем <code>unwrapped_model</code>, которая является базовой моделью, которую мы определили. Метод <code>accelerator.prepare()</code> изменяет модель для работы в распределенном обучении, поэтому у нее больше не будет метода <code>save_pretrained()</code>; метод <code>accelerator.unwrap_model()</code> отменяет этот шаг. Наконец, мы вызываем <code>save_pretrained()</code>, но указываем этому методу использовать <code>accelerator.save()</code> вместо <code>torch.save()</code>.",te,gl,ot='После того как это будет сделано, у вас должна получиться модель, выдающая результаты, очень похожие на те, что были обучены с помощью <code>Trainer</code>. Вы можете посмотреть модель, которую мы обучили с помощью этого кода, на <a href="https://huggingface.co/huggingface-course/bert-finetuned-ner-accelerate" rel="nofollow"><em>huggingface-course/bert-finetuned-ner-accelerate</em></a>. А если вы хотите протестировать какие-либо изменения в цикле обучения, вы можете напрямую реализовать их, отредактировав код, показанный выше!',ne;return i=new cl({props:{title:"Определение модели",local:"defining-the-model",headingTag:"h3"}}),u=new C({props:{code:"aWQybGFiZWwlMjAlM0QlMjAlN0JpJTNBJTIwbGFiZWwlMjBmb3IlMjBpJTJDJTIwbGFiZWwlMjBpbiUyMGVudW1lcmF0ZShsYWJlbF9uYW1lcyklN0QlMEFsYWJlbDJpZCUyMCUzRCUyMCU3QnYlM0ElMjBrJTIwZm9yJTIwayUyQyUyMHYlMjBpbiUyMGlkMmxhYmVsLml0ZW1zKCklN0Q=",highlighted:`id2label = {i: label <span class="hljs-keyword">for</span> i, label <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(label_names)} | |
| label2id = {v: k <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> id2label.items()}`,wrap:!1}}),x=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Nb2RlbEZvclRva2VuQ2xhc3NpZmljYXRpb24lMEElMEFtb2RlbCUyMCUzRCUyMEF1dG9Nb2RlbEZvclRva2VuQ2xhc3NpZmljYXRpb24uZnJvbV9wcmV0cmFpbmVkKCUwQSUyMCUyMCUyMCUyMG1vZGVsX2NoZWNrcG9pbnQlMkMlMEElMjAlMjAlMjAlMjBpZDJsYWJlbCUzRGlkMmxhYmVsJTJDJTBBJTIwJTIwJTIwJTIwbGFiZWwyaWQlM0RsYWJlbDJpZCUyQyUwQSk=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoModelForTokenClassification | |
| model = AutoModelForTokenClassification.from_pretrained( | |
| model_checkpoint, | |
| id2label=id2label, | |
| label2id=label2id, | |
| )`,wrap:!1}}),F=new C({props:{code:"bW9kZWwuY29uZmlnLm51bV9sYWJlbHM=",highlighted:"model.config.num_labels",wrap:!1}}),H=new C({props:{code:"OQ==",highlighted:'<span class="hljs-number">9</span>',wrap:!1}}),tl=new cl({props:{title:"Дообучение модели",local:"fine-tuning-the-model",headingTag:"h3"}}),G=new C({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMG5vdGVib29rX2xvZ2luJTBBJTBBbm90ZWJvb2tfbG9naW4oKQ==",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> notebook_login | |
| notebook_login()`,wrap:!1}}),V=new C({props:{code:"aHVnZ2luZ2ZhY2UtY2xpJTIwbG9naW4=",highlighted:"huggingface-cli login",wrap:!1}}),D=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRyYWluaW5nQXJndW1lbnRzJTBBJTBBYXJncyUyMCUzRCUyMFRyYWluaW5nQXJndW1lbnRzKCUwQSUyMCUyMCUyMCUyMCUyMmJlcnQtZmluZXR1bmVkLW5lciUyMiUyQyUwQSUyMCUyMCUyMCUyMGV2YWx1YXRpb25fc3RyYXRlZ3klM0QlMjJlcG9jaCUyMiUyQyUwQSUyMCUyMCUyMCUyMHNhdmVfc3RyYXRlZ3klM0QlMjJlcG9jaCUyMiUyQyUwQSUyMCUyMCUyMCUyMGxlYXJuaW5nX3JhdGUlM0QyZS01JTJDJTBBJTIwJTIwJTIwJTIwbnVtX3RyYWluX2Vwb2NocyUzRDMlMkMlMEElMjAlMjAlMjAlMjB3ZWlnaHRfZGVjYXklM0QwLjAxJTJDJTBBJTIwJTIwJTIwJTIwcHVzaF90b19odWIlM0RUcnVlJTJDJTBBKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> TrainingArguments | |
| args = TrainingArguments( | |
| <span class="hljs-string">"bert-finetuned-ner"</span>, | |
| evaluation_strategy=<span class="hljs-string">"epoch"</span>, | |
| save_strategy=<span class="hljs-string">"epoch"</span>, | |
| learning_rate=<span class="hljs-number">2e-5</span>, | |
| num_train_epochs=<span class="hljs-number">3</span>, | |
| weight_decay=<span class="hljs-number">0.01</span>, | |
| push_to_hub=<span class="hljs-literal">True</span>, | |
| )`,wrap:!1}}),yl=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRyYWluZXIlMEElMEF0cmFpbmVyJTIwJTNEJTIwVHJhaW5lciglMEElMjAlMjAlMjAlMjBtb2RlbCUzRG1vZGVsJTJDJTBBJTIwJTIwJTIwJTIwYXJncyUzRGFyZ3MlMkMlMEElMjAlMjAlMjAlMjB0cmFpbl9kYXRhc2V0JTNEdG9rZW5pemVkX2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBldmFsX2RhdGFzZXQlM0R0b2tlbml6ZWRfZGF0YXNldHMlNUIlMjJ2YWxpZGF0aW9uJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwZGF0YV9jb2xsYXRvciUzRGRhdGFfY29sbGF0b3IlMkMlMEElMjAlMjAlMjAlMjBjb21wdXRlX21ldHJpY3MlM0Rjb21wdXRlX21ldHJpY3MlMkMlMEElMjAlMjAlMjAlMjB0b2tlbml6ZXIlM0R0b2tlbml6ZXIlMkMlMEEpJTBBdHJhaW5lci50cmFpbigp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> Trainer | |
| trainer = Trainer( | |
| model=model, | |
| args=args, | |
| train_dataset=tokenized_datasets[<span class="hljs-string">"train"</span>], | |
| eval_dataset=tokenized_datasets[<span class="hljs-string">"validation"</span>], | |
| data_collator=data_collator, | |
| compute_metrics=compute_metrics, | |
| tokenizer=tokenizer, | |
| ) | |
| trainer.train()`,wrap:!1}}),P=new C({props:{code:"dHJhaW5lci5wdXNoX3RvX2h1Yihjb21taXRfbWVzc2FnZSUzRCUyMlRyYWluaW5nJTIwY29tcGxldGUlMjIp",highlighted:'trainer.push_to_hub(commit_message=<span class="hljs-string">"Training complete"</span>)',wrap:!1}}),Sl=new C({props:{code:"J2h0dHBzJTNBJTJGJTJGaHVnZ2luZ2ZhY2UuY28lMkZzZ3VnZ2VyJTJGYmVydC1maW5ldHVuZWQtbmVyJTJGY29tbWl0JTJGMjZhYjIxZTViMTU2OGY5YWZlY2NkYWVkMmQ4NzE1ZjU3MWQ3ODZlZCc=",highlighted:'<span class="hljs-string">'https://huggingface.co/sgugger/bert-finetuned-ner/commit/26ab21e5b1568f9afeccdaed2d8715f571d786ed'</span>',wrap:!1}}),jl=new cl({props:{title:"Индивидуальный цикл обучения",local:"a-custom-training-loop",headingTag:"h2"}}),$s=new cl({props:{title:"Подготовка всего к обучению",local:"preparing-everything-for-training",headingTag:"h3"}}),Kl=new C({props:{code:"ZnJvbSUyMHRvcmNoLnV0aWxzLmRhdGElMjBpbXBvcnQlMjBEYXRhTG9hZGVyJTBBJTBBdHJhaW5fZGF0YWxvYWRlciUyMCUzRCUyMERhdGFMb2FkZXIoJTBBJTIwJTIwJTIwJTIwdG9rZW5pemVkX2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBzaHVmZmxlJTNEVHJ1ZSUyQyUwQSUyMCUyMCUyMCUyMGNvbGxhdGVfZm4lM0RkYXRhX2NvbGxhdG9yJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hfc2l6ZSUzRDglMkMlMEEpJTBBZXZhbF9kYXRhbG9hZGVyJTIwJTNEJTIwRGF0YUxvYWRlciglMEElMjAlMjAlMjAlMjB0b2tlbml6ZWRfZGF0YXNldHMlNUIlMjJ2YWxpZGF0aW9uJTIyJTVEJTJDJTIwY29sbGF0ZV9mbiUzRGRhdGFfY29sbGF0b3IlMkMlMjBiYXRjaF9zaXplJTNEOCUwQSk=",highlighted:`<span class="hljs-keyword">from</span> torch.utils.data <span class="hljs-keyword">import</span> DataLoader | |
| train_dataloader = DataLoader( | |
| tokenized_datasets[<span class="hljs-string">"train"</span>], | |
| shuffle=<span class="hljs-literal">True</span>, | |
| collate_fn=data_collator, | |
| batch_size=<span class="hljs-number">8</span>, | |
| ) | |
| eval_dataloader = DataLoader( | |
| tokenized_datasets[<span class="hljs-string">"validation"</span>], collate_fn=data_collator, batch_size=<span class="hljs-number">8</span> | |
| )`,wrap:!1}}),As=new C({props:{code:"bW9kZWwlMjAlM0QlMjBBdXRvTW9kZWxGb3JUb2tlbkNsYXNzaWZpY2F0aW9uLmZyb21fcHJldHJhaW5lZCglMEElMjAlMjAlMjAlMjBtb2RlbF9jaGVja3BvaW50JTJDJTBBJTIwJTIwJTIwJTIwaWQybGFiZWwlM0RpZDJsYWJlbCUyQyUwQSUyMCUyMCUyMCUyMGxhYmVsMmlkJTNEbGFiZWwyaWQlMkMlMEEp",highlighted:`model = AutoModelForTokenClassification.from_pretrained( | |
| model_checkpoint, | |
| id2label=id2label, | |
| label2id=label2id, | |
| )`,wrap:!1}}),ul=new C({props:{code:"ZnJvbSUyMHRvcmNoLm9wdGltJTIwaW1wb3J0JTIwQWRhbVclMEElMEFvcHRpbWl6ZXIlMjAlM0QlMjBBZGFtVyhtb2RlbC5wYXJhbWV0ZXJzKCklMkMlMjBsciUzRDJlLTUp",highlighted:`<span class="hljs-keyword">from</span> torch.optim <span class="hljs-keyword">import</span> AdamW | |
| optimizer = AdamW(model.parameters(), lr=<span class="hljs-number">2e-5</span>)`,wrap:!1}}),_s=new C({props:{code:"ZnJvbSUyMGFjY2VsZXJhdGUlMjBpbXBvcnQlMjBBY2NlbGVyYXRvciUwQSUwQWFjY2VsZXJhdG9yJTIwJTNEJTIwQWNjZWxlcmF0b3IoKSUwQW1vZGVsJTJDJTIwb3B0aW1pemVyJTJDJTIwdHJhaW5fZGF0YWxvYWRlciUyQyUyMGV2YWxfZGF0YWxvYWRlciUyMCUzRCUyMGFjY2VsZXJhdG9yLnByZXBhcmUoJTBBJTIwJTIwJTIwJTIwbW9kZWwlMkMlMjBvcHRpbWl6ZXIlMkMlMjB0cmFpbl9kYXRhbG9hZGVyJTJDJTIwZXZhbF9kYXRhbG9hZGVyJTBBKQ==",highlighted:`<span class="hljs-keyword">from</span> accelerate <span class="hljs-keyword">import</span> Accelerator | |
| accelerator = Accelerator() | |
| model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare( | |
| model, optimizer, train_dataloader, eval_dataloader | |
| )`,wrap:!1}}),Es=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMGdldF9zY2hlZHVsZXIlMEElMEFudW1fdHJhaW5fZXBvY2hzJTIwJTNEJTIwMyUwQW51bV91cGRhdGVfc3RlcHNfcGVyX2Vwb2NoJTIwJTNEJTIwbGVuKHRyYWluX2RhdGFsb2FkZXIpJTBBbnVtX3RyYWluaW5nX3N0ZXBzJTIwJTNEJTIwbnVtX3RyYWluX2Vwb2NocyUyMColMjBudW1fdXBkYXRlX3N0ZXBzX3Blcl9lcG9jaCUwQSUwQWxyX3NjaGVkdWxlciUyMCUzRCUyMGdldF9zY2hlZHVsZXIoJTBBJTIwJTIwJTIwJTIwJTIybGluZWFyJTIyJTJDJTBBJTIwJTIwJTIwJTIwb3B0aW1pemVyJTNEb3B0aW1pemVyJTJDJTBBJTIwJTIwJTIwJTIwbnVtX3dhcm11cF9zdGVwcyUzRDAlMkMlMEElMjAlMjAlMjAlMjBudW1fdHJhaW5pbmdfc3RlcHMlM0RudW1fdHJhaW5pbmdfc3RlcHMlMkMlMEEp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> get_scheduler | |
| num_train_epochs = <span class="hljs-number">3</span> | |
| num_update_steps_per_epoch = <span class="hljs-built_in">len</span>(train_dataloader) | |
| num_training_steps = num_train_epochs * num_update_steps_per_epoch | |
| lr_scheduler = get_scheduler( | |
| <span class="hljs-string">"linear"</span>, | |
| optimizer=optimizer, | |
| num_warmup_steps=<span class="hljs-number">0</span>, | |
| num_training_steps=num_training_steps, | |
| )`,wrap:!1}}),as=new C({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMFJlcG9zaXRvcnklMkMlMjBnZXRfZnVsbF9yZXBvX25hbWUlMEElMEFtb2RlbF9uYW1lJTIwJTNEJTIwJTIyYmVydC1maW5ldHVuZWQtbmVyLWFjY2VsZXJhdGUlMjIlMEFyZXBvX25hbWUlMjAlM0QlMjBnZXRfZnVsbF9yZXBvX25hbWUobW9kZWxfbmFtZSklMEFyZXBvX25hbWU=",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> Repository, get_full_repo_name | |
| model_name = <span class="hljs-string">"bert-finetuned-ner-accelerate"</span> | |
| repo_name = get_full_repo_name(model_name) | |
| repo_name`,wrap:!1}}),Zs=new C({props:{code:"J3NndWdnZXIlMkZiZXJ0LWZpbmV0dW5lZC1uZXItYWNjZWxlcmF0ZSc=",highlighted:'<span class="hljs-string">'sgugger/bert-finetuned-ner-accelerate'</span>',wrap:!1}}),hl=new C({props:{code:"b3V0cHV0X2RpciUyMCUzRCUyMCUyMmJlcnQtZmluZXR1bmVkLW5lci1hY2NlbGVyYXRlJTIyJTBBcmVwbyUyMCUzRCUyMFJlcG9zaXRvcnkob3V0cHV0X2RpciUyQyUyMGNsb25lX2Zyb20lM0RyZXBvX25hbWUp",highlighted:`output_dir = <span class="hljs-string">"bert-finetuned-ner-accelerate"</span> | |
| repo = Repository(output_dir, clone_from=repo_name)`,wrap:!1}}),Ql=new cl({props:{title:"Цикл обучения",local:"training-loop",headingTag:"h3"}}),Vs=new C({props:{code:"ZGVmJTIwcG9zdHByb2Nlc3MocHJlZGljdGlvbnMlMkMlMjBsYWJlbHMpJTNBJTBBJTIwJTIwJTIwJTIwcHJlZGljdGlvbnMlMjAlM0QlMjBwcmVkaWN0aW9ucy5kZXRhY2goKS5jcHUoKS5jbG9uZSgpLm51bXB5KCklMEElMjAlMjAlMjAlMjBsYWJlbHMlMjAlM0QlMjBsYWJlbHMuZGV0YWNoKCkuY3B1KCkuY2xvbmUoKS5udW1weSgpJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJUEzJUQwJUI0JUQwJUIwJUQwJUJCJUQxJThGJUQwJUI1JUQwJUJDJTIwJUQwJUI4JUQwJUIzJUQwJUJEJUQwJUJFJUQxJTgwJUQwJUI4JUQxJTgwJUQxJTgzJUQwJUI1JUQwJUJDJUQxJThCJUQwJUI5JTIwJUQwJUI4JUQwJUJEJUQwJUI0JUQwJUI1JUQwJUJBJUQxJTgxJTIwKCVEMSU4MSVEMCVCRiVEMCVCNSVEMSU4NiVEMCVCOCVEMCVCMCVEMCVCQiVEMSU4QyVEMCVCRCVEMSU4QiVEMCVCNSUyMCVEMSU4MiVEMCVCRSVEMCVCQSVEMCVCNSVEMCVCRCVEMSU4QiklMjAlRDAlQjglMjAlRDAlQkYlRDElODAlRDAlQjUlRDAlQkUlRDAlQjElRDElODAlRDAlQjAlRDAlQjclRDElODMlRDAlQjUlRDAlQkMlMjAlRDAlQjIlMjAlRDAlQkMlRDAlQjUlRDElODIlRDAlQkElRDAlQjglMEElMjAlMjAlMjAlMjB0cnVlX2xhYmVscyUyMCUzRCUyMCU1QiU1QmxhYmVsX25hbWVzJTVCbCU1RCUyMGZvciUyMGwlMjBpbiUyMGxhYmVsJTIwaWYlMjBsJTIwISUzRCUyMC0xMDAlNUQlMjBmb3IlMjBsYWJlbCUyMGluJTIwbGFiZWxzJTVEJTBBJTIwJTIwJTIwJTIwdHJ1ZV9wcmVkaWN0aW9ucyUyMCUzRCUyMCU1QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QmxhYmVsX25hbWVzJTVCcCU1RCUyMGZvciUyMChwJTJDJTIwbCklMjBpbiUyMHppcChwcmVkaWN0aW9uJTJDJTIwbGFiZWwpJTIwaWYlMjBsJTIwISUzRCUyMC0xMDAlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjBwcmVkaWN0aW9uJTJDJTIwbGFiZWwlMjBpbiUyMHppcChwcmVkaWN0aW9ucyUyQyUyMGxhYmVscyklMEElMjAlMjAlMjAlMjAlNUQlMEElMjAlMjAlMjAlMjByZXR1cm4lMjB0cnVlX2xhYmVscyUyQyUyMHRydWVfcHJlZGljdGlvbnM=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">postprocess</span>(<span class="hljs-params">predictions, labels</span>): | |
| predictions = predictions.detach().cpu().clone().numpy() | |
| labels = labels.detach().cpu().clone().numpy() | |
| <span class="hljs-comment"># Удаляем игнорируемый индекс (специальные токены) и преобразуем в метки</span> | |
| true_labels = [[label_names[l] <span class="hljs-keyword">for</span> l <span class="hljs-keyword">in</span> label <span class="hljs-keyword">if</span> l != -<span class="hljs-number">100</span>] <span class="hljs-keyword">for</span> label <span class="hljs-keyword">in</span> labels] | |
| true_predictions = [ | |
| [label_names[p] <span class="hljs-keyword">for</span> (p, l) <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(prediction, label) <span class="hljs-keyword">if</span> l != -<span class="hljs-number">100</span>] | |
| <span class="hljs-keyword">for</span> prediction, label <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(predictions, labels) | |
| ] | |
| <span class="hljs-keyword">return</span> true_labels, true_predictions`,wrap:!1}}),rs=new C({props:{code:"ZnJvbSUyMHRxZG0uYXV0byUyMGltcG9ydCUyMHRxZG0lMEFpbXBvcnQlMjB0b3JjaCUwQSUwQXByb2dyZXNzX2JhciUyMCUzRCUyMHRxZG0ocmFuZ2UobnVtX3RyYWluaW5nX3N0ZXBzKSklMEElMEFmb3IlMjBlcG9jaCUyMGluJTIwcmFuZ2UobnVtX3RyYWluX2Vwb2NocyklM0ElMEElMjAlMjAlMjAlMjAlMjMlMjAlRDAlOUUlRDAlQjElRDElODMlRDElODclRDAlQjUlRDAlQkQlRDAlQjglRDAlQjUlMEElMjAlMjAlMjAlMjBtb2RlbC50cmFpbigpJTBBJTIwJTIwJTIwJTIwZm9yJTIwYmF0Y2glMjBpbiUyMHRyYWluX2RhdGFsb2FkZXIlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvdXRwdXRzJTIwJTNEJTIwbW9kZWwoKipiYXRjaCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsb3NzJTIwJTNEJTIwb3V0cHV0cy5sb3NzJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWNjZWxlcmF0b3IuYmFja3dhcmQobG9zcyklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvcHRpbWl6ZXIuc3RlcCgpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbHJfc2NoZWR1bGVyLnN0ZXAoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG9wdGltaXplci56ZXJvX2dyYWQoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByb2dyZXNzX2Jhci51cGRhdGUoMSklMEElMEElMjAlMjAlMjAlMjAlMjMlMjAlRDAlOUUlRDElODYlRDAlQjUlRDAlQkQlRDAlQkElRDAlQjAlMEElMjAlMjAlMjAlMjBtb2RlbC5ldmFsKCklMEElMjAlMjAlMjAlMjBmb3IlMjBiYXRjaCUyMGluJTIwZXZhbF9kYXRhbG9hZGVyJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwd2l0aCUyMHRvcmNoLm5vX2dyYWQoKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG91dHB1dHMlMjAlM0QlMjBtb2RlbCgqKmJhdGNoKSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByZWRpY3Rpb25zJTIwJTNEJTIwb3V0cHV0cy5sb2dpdHMuYXJnbWF4KGRpbSUzRC0xKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVscyUyMCUzRCUyMGJhdGNoJTVCJTIybGFiZWxzJTIyJTVEJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwJUQwJTlEJUQwJUI1JUQwJUJFJUQwJUIxJUQxJTg1JUQwJUJFJUQwJUI0JUQwJUI4JUQwJUJDJUQwJUJFJTIwJUQwJUI0JUQwJUJFJUQwJUIxJUQwJUIwJUQwJUIyJUQwJUI4JUQxJTgyJUQxJThDJTIwJUQwJUJGJUQxJTgwJUQwJUI1JUQwJUI0JUQxJTgxJUQwJUJBJUQwJUIwJUQwJUI3JUQwJUIwJUQwJUJEJUQwJUI4JUQxJThGJTIwJUQwJUI4JTIwJUQwJUJDJUQwJUI1JUQxJTgyJUQwJUJBJUQwJUI4JTIwJUQwJUI0JUQwJUJCJUQxJThGJTIwZ2F0aGVyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJlZGljdGlvbnMlMjAlM0QlMjBhY2NlbGVyYXRvci5wYWRfYWNyb3NzX3Byb2Nlc3NlcyhwcmVkaWN0aW9ucyUyQyUyMGRpbSUzRDElMkMlMjBwYWRfaW5kZXglM0QtMTAwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVscyUyMCUzRCUyMGFjY2VsZXJhdG9yLnBhZF9hY3Jvc3NfcHJvY2Vzc2VzKGxhYmVscyUyQyUyMGRpbSUzRDElMkMlMjBwYWRfaW5kZXglM0QtMTAwKSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByZWRpY3Rpb25zX2dhdGhlcmVkJTIwJTNEJTIwYWNjZWxlcmF0b3IuZ2F0aGVyKHByZWRpY3Rpb25zKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVsc19nYXRoZXJlZCUyMCUzRCUyMGFjY2VsZXJhdG9yLmdhdGhlcihsYWJlbHMpJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdHJ1ZV9wcmVkaWN0aW9ucyUyQyUyMHRydWVfbGFiZWxzJTIwJTNEJTIwcG9zdHByb2Nlc3MocHJlZGljdGlvbnNfZ2F0aGVyZWQlMkMlMjBsYWJlbHNfZ2F0aGVyZWQpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWV0cmljLmFkZF9iYXRjaChwcmVkaWN0aW9ucyUzRHRydWVfcHJlZGljdGlvbnMlMkMlMjByZWZlcmVuY2VzJTNEdHJ1ZV9sYWJlbHMpJTBBJTBBJTIwJTIwJTIwJTIwcmVzdWx0cyUyMCUzRCUyMG1ldHJpYy5jb21wdXRlKCklMEElMjAlMjAlMjAlMjBwcmludCglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmJTIyZXBvY2glMjAlN0JlcG9jaCU3RCUzQSUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGtleSUzQSUyMHJlc3VsdHMlNUJmJTIyb3ZlcmFsbF8lN0JrZXklN0QlMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjBrZXklMjBpbiUyMCU1QiUyMnByZWNpc2lvbiUyMiUyQyUyMCUyMnJlY2FsbCUyMiUyQyUyMCUyMmYxJTIyJTJDJTIwJTIyYWNjdXJhY3klMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMjAlMjAlMjAlMjApJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUQwJUExJUQwJUJFJUQxJTg1JUQxJTgwJUQwJUIwJUQwJUJEJUQwJUI1JUQwJUJEJUQwJUI4JUQwJUI1JTIwJUQwJUI4JTIwJUQwJUI3JUQwJUIwJUQwJUIzJUQxJTgwJUQxJTgzJUQwJUI3JUQwJUJBJUQwJUIwJTBBJTIwJTIwJTIwJTIwYWNjZWxlcmF0b3Iud2FpdF9mb3JfZXZlcnlvbmUoKSUwQSUyMCUyMCUyMCUyMHVud3JhcHBlZF9tb2RlbCUyMCUzRCUyMGFjY2VsZXJhdG9yLnVud3JhcF9tb2RlbChtb2RlbCklMEElMjAlMjAlMjAlMjB1bndyYXBwZWRfbW9kZWwuc2F2ZV9wcmV0cmFpbmVkKG91dHB1dF9kaXIlMkMlMjBzYXZlX2Z1bmN0aW9uJTNEYWNjZWxlcmF0b3Iuc2F2ZSklMEElMjAlMjAlMjAlMjBpZiUyMGFjY2VsZXJhdG9yLmlzX21haW5fcHJvY2VzcyUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRva2VuaXplci5zYXZlX3ByZXRyYWluZWQob3V0cHV0X2RpciklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXBvLnB1c2hfdG9faHViKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNvbW1pdF9tZXNzYWdlJTNEZiUyMlRyYWluaW5nJTIwaW4lMjBwcm9ncmVzcyUyMGVwb2NoJTIwJTdCZXBvY2glN0QlMjIlMkMlMjBibG9ja2luZyUzREZhbHNlJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKQ==",highlighted:`<span class="hljs-keyword">from</span> tqdm.auto <span class="hljs-keyword">import</span> tqdm | |
| <span class="hljs-keyword">import</span> torch | |
| progress_bar = tqdm(<span class="hljs-built_in">range</span>(num_training_steps)) | |
| <span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(num_train_epochs): | |
| <span class="hljs-comment"># Обучение</span> | |
| model.train() | |
| <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> train_dataloader: | |
| outputs = model(**batch) | |
| loss = outputs.loss | |
| accelerator.backward(loss) | |
| optimizer.step() | |
| lr_scheduler.step() | |
| optimizer.zero_grad() | |
| progress_bar.update(<span class="hljs-number">1</span>) | |
| <span class="hljs-comment"># Оценка</span> | |
| model.<span class="hljs-built_in">eval</span>() | |
| <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> eval_dataloader: | |
| <span class="hljs-keyword">with</span> torch.no_grad(): | |
| outputs = model(**batch) | |
| predictions = outputs.logits.argmax(dim=-<span class="hljs-number">1</span>) | |
| labels = batch[<span class="hljs-string">"labels"</span>] | |
| <span class="hljs-comment"># Необходимо добавить предсказания и метки для gather</span> | |
| predictions = accelerator.pad_across_processes(predictions, dim=<span class="hljs-number">1</span>, pad_index=-<span class="hljs-number">100</span>) | |
| labels = accelerator.pad_across_processes(labels, dim=<span class="hljs-number">1</span>, pad_index=-<span class="hljs-number">100</span>) | |
| predictions_gathered = accelerator.gather(predictions) | |
| labels_gathered = accelerator.gather(labels) | |
| true_predictions, true_labels = postprocess(predictions_gathered, labels_gathered) | |
| metric.add_batch(predictions=true_predictions, references=true_labels) | |
| results = metric.compute() | |
| <span class="hljs-built_in">print</span>( | |
| <span class="hljs-string">f"epoch <span class="hljs-subst">{epoch}</span>:"</span>, | |
| { | |
| key: results[<span class="hljs-string">f"overall_<span class="hljs-subst">{key}</span>"</span>] | |
| <span class="hljs-keyword">for</span> key <span class="hljs-keyword">in</span> [<span class="hljs-string">"precision"</span>, <span class="hljs-string">"recall"</span>, <span class="hljs-string">"f1"</span>, <span class="hljs-string">"accuracy"</span>] | |
| }, | |
| ) | |
| <span class="hljs-comment"># Сохранение и загрузка</span> | |
| accelerator.wait_for_everyone() | |
| unwrapped_model = accelerator.unwrap_model(model) | |
| unwrapped_model.save_pretrained(output_dir, save_function=accelerator.save) | |
| <span class="hljs-keyword">if</span> accelerator.is_main_process: | |
| tokenizer.save_pretrained(output_dir) | |
| repo.push_to_hub( | |
| commit_message=<span class="hljs-string">f"Training in progress epoch <span class="hljs-subst">{epoch}</span>"</span>, blocking=<span class="hljs-literal">False</span> | |
| )`,wrap:!1}}),$l=new C({props:{code:"YWNjZWxlcmF0b3Iud2FpdF9mb3JfZXZlcnlvbmUoKSUwQXVud3JhcHBlZF9tb2RlbCUyMCUzRCUyMGFjY2VsZXJhdG9yLnVud3JhcF9tb2RlbChtb2RlbCklMEF1bndyYXBwZWRfbW9kZWwuc2F2ZV9wcmV0cmFpbmVkKG91dHB1dF9kaXIlMkMlMjBzYXZlX2Z1bmN0aW9uJTNEYWNjZWxlcmF0b3Iuc2F2ZSk=",highlighted:`accelerator.wait_for_everyone() | |
| unwrapped_model = accelerator.unwrap_model(model) | |
| unwrapped_model.save_pretrained(output_dir, save_function=accelerator.save)`,wrap:!1}}),{c(){j(i.$$.fragment),I=a(),w=c("p"),w.innerHTML=f,$=a(),d=c("p"),d.innerHTML=k,A=a(),j(u.$$.fragment),_=a(),g=c("p"),g.innerHTML=h,R=a(),j(x.$$.fragment),Y=a(),N=c("p"),N.innerHTML=Wl,Yl=a(),j(F.$$.fragment),al=a(),j(H.$$.fragment),Ml=a(),z=c("blockquote"),z.innerHTML=Is,W=a(),j(tl.$$.fragment),Al=a(),Z=c("p"),Z.innerHTML=ae,_l=a(),j(G.$$.fragment),Nl=a(),S=c("p"),S.textContent=Gl,Rl=a(),v=c("p"),v.textContent=Me,El=a(),j(V.$$.fragment),Fl=a(),L=c("p"),L.innerHTML=vl,Zl=a(),j(D.$$.fragment),Hl=a(),q=c("p"),q.innerHTML=Dl,Vl=a(),B=c("blockquote"),B.innerHTML=Je,Bl=a(),X=c("p"),X.innerHTML=zl,O=a(),j(yl.$$.fragment),Jl=a(),K=c("p"),K.textContent=Qs,pl=a(),nl=c("p"),nl.innerHTML=xs,il=a(),j(P.$$.fragment),wl=a(),Ul=c("p"),Ul.textContent=J,Q=a(),j(Sl.$$.fragment),Ll=a(),ql=c("p"),ql.innerHTML=ks,Ds=a(),Tl=c("p"),Tl.textContent=wt,Xs=a(),j(jl.$$.fragment),Ys=a(),ml=c("p"),ml.innerHTML=re,Ol=a(),j($s.$$.fragment),Ns=a(),ol=c("p"),ol.innerHTML=ce,Pl=a(),j(Kl.$$.fragment),ls=a(),gs=c("p"),gs.textContent=ye,ss=a(),j(As.$$.fragment),Fs=a(),bl=c("p"),bl.innerHTML=Tt,Hs=a(),j(ul.$$.fragment),zs=a(),dl=c("p"),dl.innerHTML=we,es=a(),j(_s.$$.fragment),Ss=a(),rl=c("blockquote"),rl.innerHTML=Te,ts=a(),Rs=c("p"),Rs.innerHTML=je,Xl=a(),j(Es.$$.fragment),Ls=a(),Cl=c("p"),Cl.innerHTML=me,ns=a(),j(as.$$.fragment),Ms=a(),j(Zs.$$.fragment),qs=a(),fl=c("p"),fl.textContent=jt,Os=a(),j(hl.$$.fragment),Ps=a(),Il=c("p"),Il.innerHTML=mt,Ks=a(),j(Ql.$$.fragment),le=a(),xl=c("p"),xl.innerHTML=oe,Js=a(),j(Vs.$$.fragment),se=a(),kl=c("p"),kl.textContent=be,ps=a(),is=c("ul"),is.innerHTML=Bs,ue=a(),Us=c("p"),Us.textContent=Ws,de=a(),j(rs.$$.fragment),cs=a(),ys=c("p"),ys.textContent=Gs,ee=a(),j($l.$$.fragment),Ce=a(),ws=c("p"),ws.innerHTML=vs,te=a(),gl=c("p"),gl.innerHTML=ot,this.h()},l(s){m(i.$$.fragment,s),I=M(s),w=y(s,"P",{"data-svelte-h":!0}),T(w)!=="svelte-193b5cx"&&(w.innerHTML=f),$=M(s),d=y(s,"P",{"data-svelte-h":!0}),T(d)!=="svelte-hmkwdx"&&(d.innerHTML=k),A=M(s),m(u.$$.fragment,s),_=M(s),g=y(s,"P",{"data-svelte-h":!0}),T(g)!=="svelte-6lrybf"&&(g.innerHTML=h),R=M(s),m(x.$$.fragment,s),Y=M(s),N=y(s,"P",{"data-svelte-h":!0}),T(N)!=="svelte-pjoa30"&&(N.innerHTML=Wl),Yl=M(s),m(F.$$.fragment,s),al=M(s),m(H.$$.fragment,s),Ml=M(s),z=y(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),T(z)!=="svelte-5kqbw1"&&(z.innerHTML=Is),W=M(s),m(tl.$$.fragment,s),Al=M(s),Z=y(s,"P",{"data-svelte-h":!0}),T(Z)!=="svelte-1e9ptwb"&&(Z.innerHTML=ae),_l=M(s),m(G.$$.fragment,s),Nl=M(s),S=y(s,"P",{"data-svelte-h":!0}),T(S)!=="svelte-22u5y6"&&(S.textContent=Gl),Rl=M(s),v=y(s,"P",{"data-svelte-h":!0}),T(v)!=="svelte-1kqefx4"&&(v.textContent=Me),El=M(s),m(V.$$.fragment,s),Fl=M(s),L=y(s,"P",{"data-svelte-h":!0}),T(L)!=="svelte-sbo7q0"&&(L.innerHTML=vl),Zl=M(s),m(D.$$.fragment,s),Hl=M(s),q=y(s,"P",{"data-svelte-h":!0}),T(q)!=="svelte-iou9ge"&&(q.innerHTML=Dl),Vl=M(s),B=y(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),T(B)!=="svelte-14vlnt5"&&(B.innerHTML=Je),Bl=M(s),X=y(s,"P",{"data-svelte-h":!0}),T(X)!=="svelte-1szuw39"&&(X.innerHTML=zl),O=M(s),m(yl.$$.fragment,s),Jl=M(s),K=y(s,"P",{"data-svelte-h":!0}),T(K)!=="svelte-1d3jyn9"&&(K.textContent=Qs),pl=M(s),nl=y(s,"P",{"data-svelte-h":!0}),T(nl)!=="svelte-vd3uij"&&(nl.innerHTML=xs),il=M(s),m(P.$$.fragment,s),wl=M(s),Ul=y(s,"P",{"data-svelte-h":!0}),T(Ul)!=="svelte-n1jc5l"&&(Ul.textContent=J),Q=M(s),m(Sl.$$.fragment,s),Ll=M(s),ql=y(s,"P",{"data-svelte-h":!0}),T(ql)!=="svelte-af2fh1"&&(ql.innerHTML=ks),Ds=M(s),Tl=y(s,"P",{"data-svelte-h":!0}),T(Tl)!=="svelte-12ycamx"&&(Tl.textContent=wt),Xs=M(s),m(jl.$$.fragment,s),Ys=M(s),ml=y(s,"P",{"data-svelte-h":!0}),T(ml)!=="svelte-akbnxn"&&(ml.innerHTML=re),Ol=M(s),m($s.$$.fragment,s),Ns=M(s),ol=y(s,"P",{"data-svelte-h":!0}),T(ol)!=="svelte-os7410"&&(ol.innerHTML=ce),Pl=M(s),m(Kl.$$.fragment,s),ls=M(s),gs=y(s,"P",{"data-svelte-h":!0}),T(gs)!=="svelte-vrg2mk"&&(gs.textContent=ye),ss=M(s),m(As.$$.fragment,s),Fs=M(s),bl=y(s,"P",{"data-svelte-h":!0}),T(bl)!=="svelte-1k0xixg"&&(bl.innerHTML=Tt),Hs=M(s),m(ul.$$.fragment,s),zs=M(s),dl=y(s,"P",{"data-svelte-h":!0}),T(dl)!=="svelte-rz0pm1"&&(dl.innerHTML=we),es=M(s),m(_s.$$.fragment,s),Ss=M(s),rl=y(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),T(rl)!=="svelte-orcgzw"&&(rl.innerHTML=Te),ts=M(s),Rs=y(s,"P",{"data-svelte-h":!0}),T(Rs)!=="svelte-wwcz06"&&(Rs.innerHTML=je),Xl=M(s),m(Es.$$.fragment,s),Ls=M(s),Cl=y(s,"P",{"data-svelte-h":!0}),T(Cl)!=="svelte-ad2nf"&&(Cl.innerHTML=me),ns=M(s),m(as.$$.fragment,s),Ms=M(s),m(Zs.$$.fragment,s),qs=M(s),fl=y(s,"P",{"data-svelte-h":!0}),T(fl)!=="svelte-g8paq4"&&(fl.textContent=jt),Os=M(s),m(hl.$$.fragment,s),Ps=M(s),Il=y(s,"P",{"data-svelte-h":!0}),T(Il)!=="svelte-2q65e7"&&(Il.innerHTML=mt),Ks=M(s),m(Ql.$$.fragment,s),le=M(s),xl=y(s,"P",{"data-svelte-h":!0}),T(xl)!=="svelte-13ipbq3"&&(xl.innerHTML=oe),Js=M(s),m(Vs.$$.fragment,s),se=M(s),kl=y(s,"P",{"data-svelte-h":!0}),T(kl)!=="svelte-9vu1bi"&&(kl.textContent=be),ps=M(s),is=y(s,"UL",{"data-svelte-h":!0}),T(is)!=="svelte-1oq9bfg"&&(is.innerHTML=Bs),ue=M(s),Us=y(s,"P",{"data-svelte-h":!0}),T(Us)!=="svelte-1ga6jtq"&&(Us.textContent=Ws),de=M(s),m(rs.$$.fragment,s),cs=M(s),ys=y(s,"P",{"data-svelte-h":!0}),T(ys)!=="svelte-xxx1kl"&&(ys.textContent=Gs),ee=M(s),m($l.$$.fragment,s),Ce=M(s),ws=y(s,"P",{"data-svelte-h":!0}),T(ws)!=="svelte-1xeycxm"&&(ws.innerHTML=vs),te=M(s),gl=y(s,"P",{"data-svelte-h":!0}),T(gl)!=="svelte-1vb86wo"&&(gl.innerHTML=ot),this.h()},h(){el(z,"class","warning"),el(B,"class","tip"),el(rl,"class","tip")},m(s,p){o(i,s,p),t(s,I,p),t(s,w,p),t(s,$,p),t(s,d,p),t(s,A,p),o(u,s,p),t(s,_,p),t(s,g,p),t(s,R,p),o(x,s,p),t(s,Y,p),t(s,N,p),t(s,Yl,p),o(F,s,p),t(s,al,p),o(H,s,p),t(s,Ml,p),t(s,z,p),t(s,W,p),o(tl,s,p),t(s,Al,p),t(s,Z,p),t(s,_l,p),o(G,s,p),t(s,Nl,p),t(s,S,p),t(s,Rl,p),t(s,v,p),t(s,El,p),o(V,s,p),t(s,Fl,p),t(s,L,p),t(s,Zl,p),o(D,s,p),t(s,Hl,p),t(s,q,p),t(s,Vl,p),t(s,B,p),t(s,Bl,p),t(s,X,p),t(s,O,p),o(yl,s,p),t(s,Jl,p),t(s,K,p),t(s,pl,p),t(s,nl,p),t(s,il,p),o(P,s,p),t(s,wl,p),t(s,Ul,p),t(s,Q,p),o(Sl,s,p),t(s,Ll,p),t(s,ql,p),t(s,Ds,p),t(s,Tl,p),t(s,Xs,p),o(jl,s,p),t(s,Ys,p),t(s,ml,p),t(s,Ol,p),o($s,s,p),t(s,Ns,p),t(s,ol,p),t(s,Pl,p),o(Kl,s,p),t(s,ls,p),t(s,gs,p),t(s,ss,p),o(As,s,p),t(s,Fs,p),t(s,bl,p),t(s,Hs,p),o(ul,s,p),t(s,zs,p),t(s,dl,p),t(s,es,p),o(_s,s,p),t(s,Ss,p),t(s,rl,p),t(s,ts,p),t(s,Rs,p),t(s,Xl,p),o(Es,s,p),t(s,Ls,p),t(s,Cl,p),t(s,ns,p),o(as,s,p),t(s,Ms,p),o(Zs,s,p),t(s,qs,p),t(s,fl,p),t(s,Os,p),o(hl,s,p),t(s,Ps,p),t(s,Il,p),t(s,Ks,p),o(Ql,s,p),t(s,le,p),t(s,xl,p),t(s,Js,p),o(Vs,s,p),t(s,se,p),t(s,kl,p),t(s,ps,p),t(s,is,p),t(s,ue,p),t(s,Us,p),t(s,de,p),o(rs,s,p),t(s,cs,p),t(s,ys,p),t(s,ee,p),o($l,s,p),t(s,Ce,p),t(s,ws,p),t(s,te,p),t(s,gl,p),ne=!0},i(s){ne||(U(i.$$.fragment,s),U(u.$$.fragment,s),U(x.$$.fragment,s),U(F.$$.fragment,s),U(H.$$.fragment,s),U(tl.$$.fragment,s),U(G.$$.fragment,s),U(V.$$.fragment,s),U(D.$$.fragment,s),U(yl.$$.fragment,s),U(P.$$.fragment,s),U(Sl.$$.fragment,s),U(jl.$$.fragment,s),U($s.$$.fragment,s),U(Kl.$$.fragment,s),U(As.$$.fragment,s),U(ul.$$.fragment,s),U(_s.$$.fragment,s),U(Es.$$.fragment,s),U(as.$$.fragment,s),U(Zs.$$.fragment,s),U(hl.$$.fragment,s),U(Ql.$$.fragment,s),U(Vs.$$.fragment,s),U(rs.$$.fragment,s),U($l.$$.fragment,s),ne=!0)},o(s){r(i.$$.fragment,s),r(u.$$.fragment,s),r(x.$$.fragment,s),r(F.$$.fragment,s),r(H.$$.fragment,s),r(tl.$$.fragment,s),r(G.$$.fragment,s),r(V.$$.fragment,s),r(D.$$.fragment,s),r(yl.$$.fragment,s),r(P.$$.fragment,s),r(Sl.$$.fragment,s),r(jl.$$.fragment,s),r($s.$$.fragment,s),r(Kl.$$.fragment,s),r(As.$$.fragment,s),r(ul.$$.fragment,s),r(_s.$$.fragment,s),r(Es.$$.fragment,s),r(as.$$.fragment,s),r(Zs.$$.fragment,s),r(hl.$$.fragment,s),r(Ql.$$.fragment,s),r(Vs.$$.fragment,s),r(rs.$$.fragment,s),r($l.$$.fragment,s),ne=!1},d(s){s&&(e(I),e(w),e($),e(d),e(A),e(_),e(g),e(R),e(Y),e(N),e(Yl),e(al),e(Ml),e(z),e(W),e(Al),e(Z),e(_l),e(Nl),e(S),e(Rl),e(v),e(El),e(Fl),e(L),e(Zl),e(Hl),e(q),e(Vl),e(B),e(Bl),e(X),e(O),e(Jl),e(K),e(pl),e(nl),e(il),e(wl),e(Ul),e(Q),e(Ll),e(ql),e(Ds),e(Tl),e(Xs),e(Ys),e(ml),e(Ol),e(Ns),e(ol),e(Pl),e(ls),e(gs),e(ss),e(Fs),e(bl),e(Hs),e(zs),e(dl),e(es),e(Ss),e(rl),e(ts),e(Rs),e(Xl),e(Ls),e(Cl),e(ns),e(Ms),e(qs),e(fl),e(Os),e(Ps),e(Il),e(Ks),e(le),e(xl),e(Js),e(se),e(kl),e(ps),e(is),e(ue),e(Us),e(de),e(cs),e(ys),e(ee),e(Ce),e(ws),e(te),e(gl)),b(i,s),b(u,s),b(x,s),b(F,s),b(H,s),b(tl,s),b(G,s),b(V,s),b(D,s),b(yl,s),b(P,s),b(Sl,s),b(jl,s),b($s,s),b(Kl,s),b(As,s),b(ul,s),b(_s,s),b(Es,s),b(as,s),b(Zs,s),b(hl,s),b(Ql,s),b(Vs,s),b(rs,s),b($l,s)}}}function ia(E){let i,I,w,f,$,d,k,A,u,_,g,h,R,x,Y="Первое приложение, которое мы рассмотрим, - это классификация токенов. Эта общая задача охватывает любую проблему, которую можно сформулировать как “присвоение метки каждому токену в предложении”, например:",N,Wl,Yl="<li><strong>Распознавание именованных сущностей (Named entity recognition - NER)</strong>: Поиск сущностей (например, лиц, мест или организаций) в предложении. Это можно сформулировать как приписывание метки каждому токену, имея один класс для сущности и один класс для “нет сущности”.</li> <li><strong>Морфологическая разметка (Part-of-speech tagging - POS)</strong>: Пометить каждое слово в предложении как соответствующее определенной части речи (например, существительное, глагол, прилагательное и т. д.).</li> <li><strong>Выделение токенов (Chunking)</strong>: Поиск токенов, принадлежащих одной и той же сущности. Эта задача (которая может быть объединена с POS или NER) может быть сформулирована как присвоение одной метки (обычно <code>B-</code>) всем токенам, которые находятся в начале фрагмента текста, другой метки (обычно <code>I-</code>) - токенам, которые находятся внутри фрагмента текста, и третьей метки (обычно <code>O</code>) - токенам, которые не принадлежат ни к одному фрагменту.</li>",F,al,H,Ml,z="Конечно, существует множество других типов задач классификации токенов; это лишь несколько показательных примеров. В этом разделе мы дообучим модель (BERT) для задачи NER, которая затем сможет вычислять прогнозы, подобные этому:",Is,W,tl,Al,Z,ae='<img class="block dark:hidden lg:w-3/5" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/model-eval-bert-finetuned-ner.png" alt="One-hot encoded labels for question answering."/> <img class="hidden dark:block lg:w-3/5" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/model-eval-bert-finetuned-ner-dark.png" alt="One-hot encoded labels for question answering."/>',_l,G,Nl='Вы можете найти модель, которую мы обучим и загрузим на хаб, и перепроверить ее предсказания <a href="https://huggingface.co/huggingface-course/bert-finetuned-ner?text=My+name+is+Sylvain+and+I+work+at+Hugging+Face+in+Brooklyn" rel="nofollow">здесь</a>.',S,Gl,Rl,v,Me='Прежде всего, нам нужен набор данных, подходящий для классификации токенов. В этом разделе мы будем использовать <a href="https://huggingface.co/datasets/conll2003" rel="nofollow">набор данных CoNLL-2003</a>, который содержит новости от Reuters.',El,V,Fl='<p>💡 Если ваш набор данных состоит из текстов, часть которых состоит из слов с соответствующими метками, вы сможете адаптировать описанные здесь процедуры обработки данных к своему набору данных. Обратитесь к <a href="../chapter5/1">Главе 5</a>, если вам нужно освежить в памяти то, как загружать собственные данные в <code>Dataset</code>.</p>',L,vl,Zl,D,Hl="Для загрузки датасета CoNLL-2003 мы используем метод <code>load_dataset()</code> из библиотеки 🤗 Datasets:",q,Dl,Vl,B,Je='Это позволит загрузить и кэшировать датасет, как мы видели в <a href="../chapter3/1">Главе 3</a> для датасета GLUE MRPC. Изучение этого объекта показывает нам присутствующие столбцы и части тренировочного, проверочного и тестового наборов:',Bl,X,zl,O,yl,Jl,K="В частности, мы видим, что датасет содержит метки для трех задач, о которых мы говорили ранее: NER, POS и chunking. Существенным отличием от других датасетов является то, что входные тексты представлены не как предложения или документы, а как списки слов (последний столбец называется <code>tokens</code>, но он содержит слова в том смысле, что это предварительно токинизированные входные данные, которые еще должны пройти через токенизатор для токенизации по подсловам).",Qs,pl,nl="Давайте посмотрим на первый элемент обучающего набора:",xs,il,P,wl,Ul,J,Q="Поскольку мы хотим выполнить распознавание именованных сущностей, мы изучим теги NER:",Sl,Ll,ql,ks,Ds,Tl,wt="Это метки в виде целых чисел, готовые для обучения, но они не всегда полезны, когда мы хотим проанализировать данные. Как и в случае с классификацией текста, мы можем получить доступ к соответствию между этими целыми числами и названиями меток, посмотрев на атрибут <code>features</code> нашего датасета:",Xs,jl,Ys,ml,re,Ol,$s="Таким образом, этот столбец содержит элементы, которые являются последовательностями <code>ClassLabel</code>. Тип элементов последовательности указан в атрибуте <code>feature</code> этого <code>ner_feature</code>, и мы можем получить доступ к списку имен, посмотрев на атрибут <code>names</code> этого <code>feature</code>:",Ns,ol,ce,Pl,Kl,ls,gs='Мы уже видели эти метки при изучении конвейера <code>token-classification</code> в <a href="../chapter6/3">Главе 6</a>, но для краткости напомним:',ye,ss,As="<li><code>O</code> означает, что слово не соответствует какой-либо сущности.</li> <li><code>B-PER</code>/<code>I-PER</code> означает, что слово соответствует началу/находится внутри сущности персоны <em>person</em>.</li> <li><code>B-ORG</code>/<code>I-ORG</code> означает, что слово соответствует началу/находится внутри сущности <em>organization</em>.</li> <li><code>B-LOC</code>/<code>I-LOC</code> означает, что слово соответствует началу/находится внутри сущности <em>location</em>.</li> <li><code>B-MISC</code>/<code>I-MISC</code> означает, что слово соответствует началу/находится внутри сущности <em>miscellaneous</em>.</li>",Fs,bl,Tt="Теперь декодирование меток, которые мы видели ранее, дает нам следующее:",Hs,ul,zs,dl,we,es,_s="В качестве примера смешивания меток <code>B-</code> и <code>I-</code>, вот что дает тот же код для элемента обучающего множества с индексом 4:",Ss,rl,Te,ts,Rs="Как мы видим, сущностям, состоящим из двух слов, например “European Union” и “Werner Zwingmann”, присваивается метка <code>B-</code> для первого слова и метка <code>I-</code> для второго.",je,Xl,Es="<p>✏️ <strong>Попробуйте!</strong> Выведите те же два предложения с метками POS или chunking.</p>",Ls,Cl,me,ns,as,Ms,Zs='Как обычно, наши тексты должны быть преобразованы в идентификаторы токенов, прежде чем модель сможет понять их смысл. Как мы видели в <a href="../chapter6/">Главе 6</a>, существенным отличием задачи классификации токенов является то, что у нас есть предварительно токенизированные входные данные. К счастью, API токенизатора справляется с этим довольно легко; нам просто нужно предупредить <code>tokenizer</code> специальным флагом.',qs,fl,jt="Для начала давайте создадим объект <code>tokenizer</code>. Как мы уже говорили, мы будем использовать предварительно обученную модель BERT, поэтому начнем с загрузки и кэширования соответствующего токенизатора:",Os,hl,Ps,Il,mt='Вы можете заменить <code>model_checkpoint</code> на любую другую модель из <a href="https://huggingface.co/models" rel="nofollow">Hub</a> или на локальную папку, в которой вы сохранили предварительно обученную модель и токенизатор. Единственное ограничение - токенизатор должен быть создан с помощью библиотеки 🤗 Tokenizers, поэтому существует “быстрая” версия. Вы можете увидеть все архитектуры, которые поставляются с быстрой версией в <a href="https://huggingface.co/transformers/#supported-frameworks" rel="nofollow">этой большой таблице</a>, а чтобы проверить, что используемый вами объект <code>tokenizer</code> действительно поддерживается 🤗 Tokenizers, вы можете посмотреть на его атрибут <code>is_fast</code>:',Ks,Ql,le,xl,oe,Js,Vs="Для токенизации предварительно токинизированного ввода мы можем использовать наш <code>tokenizer</code>, как обычно, просто добавив <code>is_split_into_words=True</code>:",se,kl,be,ps,is,Bs,ue="Как мы видим, токенизатор добавил специальные токены, используемые моделью (<code>[CLS]</code> в начале и <code>[SEP]</code> в конце), и оставил большинство слов нетронутыми. Слово <code>lamb</code>, однако, было токенизировано на два подслова, <code>la</code> и <code>##mb</code>. Это вносит несоответствие между нашими входными данными и метками: список меток состоит всего из 9 элементов, в то время как наши входные данные теперь содержат 12 токенов. Учесть специальные токены легко (мы знаем, что они находятся в начале и в конце), но нам также нужно убедиться, что мы выровняли все метки с соответствующими словами.",Us,Ws,de='К счастью, поскольку мы используем быстрый токенизатор, у нас есть доступ к суперспособностям 🤗 Tokenizers, что означает, что мы можем легко сопоставить каждый токен с соответствующим словом (как показано в <a href="../chapter6/3">Глава 6</a>):',rs,cs,ys,Gs,ee,$l,Ce="Немного поработав, мы сможем расширить список меток, чтобы он соответствовал токенам. Первое правило, которое мы применим, заключается в том, что специальные токены получают метку <code>-100</code>. Это связано с тем, что по умолчанию <code>-100</code> - это индекс, который игнорируется в функции потерь, которую мы будем использовать (кросс-энтропия). Затем каждый токен получает ту же метку, что и токен, с которого началось слово, в котором он находится, поскольку они являются частью одной и той же сущности. Для токенов, находящихся внутри слова, но не в его начале, мы заменяем <code>B-</code> на <code>I-</code> (поскольку такие токены не являются началом сущности):",ws,vs,te,gl,ot="Давайте опробуем это на нашем первом предложении:",ne,s,p,fe,ut,he,Jn="Как мы видим, наша функция добавила <code>-100</code> для двух специальных токенов в начале и в конце и новый <code>0</code> для нашего слова, которое было разбито на две части.",dt,pe,pn="<p>✏️ <strong>Попробуйте!</strong> Некоторые исследователи предпочитают назначать только одну метку на слово и присваивать <code>-100</code> другим подтокенам в данном слове. Это делается для того, чтобы длинные слова, часть которых состоит из множества субтокенов, не вносили значительный вклад в потери.</p>",Ct,Ie,Un="Чтобы предварительно обработать весь наш датасет, нам нужно провести токенизацию всех входных данных и применить <code>align_labels_with_tokens()</code> ко всем меткам. Чтобы воспользоваться преимуществами скорости нашего быстрого токенизатора, лучше всего токенизировать много текстов одновременно, поэтому мы напишем функцию, которая обрабатывает список примеров и использует метод <code>Dataset.map()</code> с параметром <code>batched=True</code>. Единственное отличие от нашего предыдущего примера заключается в том, что функция <code>word_ids()</code> должна получить индекс примера, идентификаторы слов которого нам нужны, с учётом того что входными данными для токенизатора являются списки текстов (или, в нашем случае, списки слов), поэтому мы добавляем и это:",ft,Qe,ht,xe,rn="Обратите внимание, что мы еще не добавляли во входные данные дополняющие токены; мы сделаем это позже, при создании батчей с помощью коллатора данных.",It,ke,cn="Теперь мы можем применить всю эту предварительную обработку к другим частям нашего датасета:",Qt,$e,xt,ge,yn='Мы сделали самую сложную часть! Теперь, когда данные прошли предварительную обработку, само обучение будет выглядеть примерно так, как мы делали это в <a href="../chapter3/1">Главе 3</a>.',kt,Ts,js,Jt,Ae,$t,_e,wn='Мы не можем просто использовать <code>DataCollatorWithPadding</code>, как в <a href="../chapter3/1">Главе 3</a>, потому что в этом случае дополняются только входные данные (идентификаторы входов, маска внимания и идентификаторы типов токенов). Здесь наши метки должны быть дополнены точно так же, как и входы, чтобы они оставались одного размера, используя <code>-100</code> в качестве значения, чтобы соответствующие прогнозы игнорировались при вычислении потерь.',gt,Re,Tn='Все это делает <a href="https://huggingface.co/transformers/main_classes/data_collator.html#datacollatorfortokenclassification" rel="nofollow"><code>DataCollatorForTokenClassification</code></a>. Как и <code>DataCollatorWithPadding</code>, он принимает <code>токенизатор</code>, используемый для предварительной обработки входных данных:',At,ms,os,pt,Ee,jn="Чтобы проверить его на нескольких примерах, мы можем просто вызвать его на списке примеров из нашего токенизированного обучающего набора:",_t,Ze,Rt,Ve,Et,Be,mn="Давайте сравним это с метками для первого и второго элементов в нашем датасете:",Zt,We,Vt,Ge,Bt,bs,us,it,Ut,ve,Wt,ds,Cs,rt,De,Gt,Xe,on="Эта метрика ведет себя не так, как стандартная accuracy: на самом деле она принимает списки меток как строки, а не как целые числа, поэтому нам нужно полностью декодировать прогноз и метки перед передачей их в метрику. Давайте посмотрим, как это работает. Сначала мы получим метки для нашего первого обучающего примера:",vt,Ye,Dt,Ne,Xt,Fe,bn="Затем мы можем создать фальшивые прогнозы для них, просто изменив значение в индексе 2:",Yt,He,Nt,ze,un="Обратите внимание, что метрика принимает список прогнозов (не только один) и список меток. Вот результат:",Ft,Se,Ht,fs,hs,ct,yt,Le,zt,qe,dn="Мы уже показали вам, как можно использовать модель, которую мы дообучили на Model Hub, с помощью виджета инференса. Чтобы использовать ее локально в <code>pipeline</code>, нужно просто указать соответствующий идентификатор модели:",St,Oe,Lt,Pe,qt,Ke,Cn="Отлично! Наша модель работает так же хорошо, как и модель по умолчанию для этого конвейера!",Ot,lt,Pt,bt,Kt;$=new qn({props:{fw:E[0]}}),k=new Sn({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),u=new cl({props:{title:"Классификация токенов",local:"token-classification",headingTag:"h1"}});const fn=[Pn,On],st=[];function hn(l,n){return l[0]==="pt"?0:1}g=hn(E),h=st[g]=fn[g](E),al=new Bn({props:{id:"wVHdVlPScxA"}}),Gl=new cl({props:{title:"Подготовка данных",local:"preparing-the-data",headingTag:"h2"}}),vl=new cl({props:{title:"Датасет CoNLL-2003",local:"the-conll-2003-dataset",headingTag:"h3"}}),Dl=new C({props:{code:"ZnJvbSUyMGRhdGFzZXRzJTIwaW1wb3J0JTIwbG9hZF9kYXRhc2V0JTBBJTBBcmF3X2RhdGFzZXRzJTIwJTNEJTIwbG9hZF9kYXRhc2V0KCUyMmNvbmxsMjAwMyUyMik=",highlighted:`<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> load_dataset | |
| raw_datasets = load_dataset(<span class="hljs-string">"conll2003"</span>)`,wrap:!1}}),X=new C({props:{code:"cmF3X2RhdGFzZXRz",highlighted:"raw_datasets",wrap:!1}}),O=new C({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2NodW5rX3RhZ3MnJTJDJTIwJ2lkJyUyQyUyMCduZXJfdGFncyclMkMlMjAncG9zX3RhZ3MnJTJDJTIwJ3Rva2VucyclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDE0MDQxJTBBJTIwJTIwJTIwJTIwJTdEKSUwQSUyMCUyMCUyMCUyMHZhbGlkYXRpb24lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2NodW5rX3RhZ3MnJTJDJTIwJ2lkJyUyQyUyMCduZXJfdGFncyclMkMlMjAncG9zX3RhZ3MnJTJDJTIwJ3Rva2VucyclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDMyNTAlMEElMjAlMjAlMjAlMjAlN0QpJTBBJTIwJTIwJTIwJTIwdGVzdCUzQSUyMERhdGFzZXQoJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZmVhdHVyZXMlM0ElMjAlNUInY2h1bmtfdGFncyclMkMlMjAnaWQnJTJDJTIwJ25lcl90YWdzJyUyQyUyMCdwb3NfdGFncyclMkMlMjAndG9rZW5zJyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwMzQ1MyUwQSUyMCUyMCUyMCUyMCU3RCklMEElN0Qp",highlighted:`DatasetDict({ | |
| train: Dataset({ | |
| features: [<span class="hljs-string">'chunk_tags'</span>, <span class="hljs-string">'id'</span>, <span class="hljs-string">'ner_tags'</span>, <span class="hljs-string">'pos_tags'</span>, <span class="hljs-string">'tokens'</span>], | |
| num_rows: <span class="hljs-number">14041</span> | |
| }) | |
| validation: Dataset({ | |
| features: [<span class="hljs-string">'chunk_tags'</span>, <span class="hljs-string">'id'</span>, <span class="hljs-string">'ner_tags'</span>, <span class="hljs-string">'pos_tags'</span>, <span class="hljs-string">'tokens'</span>], | |
| num_rows: <span class="hljs-number">3250</span> | |
| }) | |
| test: Dataset({ | |
| features: [<span class="hljs-string">'chunk_tags'</span>, <span class="hljs-string">'id'</span>, <span class="hljs-string">'ner_tags'</span>, <span class="hljs-string">'pos_tags'</span>, <span class="hljs-string">'tokens'</span>], | |
| num_rows: <span class="hljs-number">3453</span> | |
| }) | |
| })`,wrap:!1}}),il=new C({props:{code:"cmF3X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIwJTVEJTVCJTIydG9rZW5zJTIyJTVE",highlighted:'raw_datasets[<span class="hljs-string">"train"</span>][<span class="hljs-number">0</span>][<span class="hljs-string">"tokens"</span>]',wrap:!1}}),wl=new C({props:{code:"JTVCJ0VVJyUyQyUyMCdyZWplY3RzJyUyQyUyMCdHZXJtYW4nJTJDJTIwJ2NhbGwnJTJDJTIwJ3RvJyUyQyUyMCdib3ljb3R0JyUyQyUyMCdCcml0aXNoJyUyQyUyMCdsYW1iJyUyQyUyMCcuJyU1RA==",highlighted:'[<span class="hljs-string">'EU'</span>, <span class="hljs-string">'rejects'</span>, <span class="hljs-string">'German'</span>, <span class="hljs-string">'call'</span>, <span class="hljs-string">'to'</span>, <span class="hljs-string">'boycott'</span>, <span class="hljs-string">'British'</span>, <span class="hljs-string">'lamb'</span>, <span class="hljs-string">'.'</span>]',wrap:!1}}),Ll=new C({props:{code:"cmF3X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIwJTVEJTVCJTIybmVyX3RhZ3MlMjIlNUQ=",highlighted:'raw_datasets[<span class="hljs-string">"train"</span>][<span class="hljs-number">0</span>][<span class="hljs-string">"ner_tags"</span>]',wrap:!1}}),ks=new C({props:{code:"JTVCMyUyQyUyMDAlMkMlMjA3JTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwNyUyQyUyMDAlMkMlMjAwJTVE",highlighted:'[<span class="hljs-number">3</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>]',wrap:!1}}),jl=new C({props:{code:"bmVyX2ZlYXR1cmUlMjAlM0QlMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RC5mZWF0dXJlcyU1QiUyMm5lcl90YWdzJTIyJTVEJTBBbmVyX2ZlYXR1cmU=",highlighted:`ner_feature = raw_datasets[<span class="hljs-string">"train"</span>].features[<span class="hljs-string">"ner_tags"</span>] | |
| ner_feature`,wrap:!1}}),ml=new C({props:{code:"U2VxdWVuY2UoZmVhdHVyZSUzRENsYXNzTGFiZWwobnVtX2NsYXNzZXMlM0Q5JTJDJTIwbmFtZXMlM0QlNUInTyclMkMlMjAnQi1QRVInJTJDJTIwJ0ktUEVSJyUyQyUyMCdCLU9SRyclMkMlMjAnSS1PUkcnJTJDJTIwJ0ItTE9DJyUyQyUyMCdJLUxPQyclMkMlMjAnQi1NSVNDJyUyQyUyMCdJLU1JU0MnJTVEJTJDJTIwbmFtZXNfZmlsZSUzRE5vbmUlMkMlMjBpZCUzRE5vbmUpJTJDJTIwbGVuZ3RoJTNELTElMkMlMjBpZCUzRE5vbmUp",highlighted:'<span class="hljs-type">Sequence</span>(feature=ClassLabel(num_classes=<span class="hljs-number">9</span>, names=[<span class="hljs-string">'O'</span>, <span class="hljs-string">'B-PER'</span>, <span class="hljs-string">'I-PER'</span>, <span class="hljs-string">'B-ORG'</span>, <span class="hljs-string">'I-ORG'</span>, <span class="hljs-string">'B-LOC'</span>, <span class="hljs-string">'I-LOC'</span>, <span class="hljs-string">'B-MISC'</span>, <span class="hljs-string">'I-MISC'</span>], names_file=<span class="hljs-literal">None</span>, <span class="hljs-built_in">id</span>=<span class="hljs-literal">None</span>), length=-<span class="hljs-number">1</span>, <span class="hljs-built_in">id</span>=<span class="hljs-literal">None</span>)',wrap:!1}}),ol=new C({props:{code:"bGFiZWxfbmFtZXMlMjAlM0QlMjBuZXJfZmVhdHVyZS5mZWF0dXJlLm5hbWVzJTBBbGFiZWxfbmFtZXM=",highlighted:`label_names = ner_feature.feature.names | |
| label_names`,wrap:!1}}),Pl=new C({props:{code:"JTVCJ08nJTJDJTIwJ0ItUEVSJyUyQyUyMCdJLVBFUiclMkMlMjAnQi1PUkcnJTJDJTIwJ0ktT1JHJyUyQyUyMCdCLUxPQyclMkMlMjAnSS1MT0MnJTJDJTIwJ0ItTUlTQyclMkMlMjAnSS1NSVNDJyU1RA==",highlighted:'[<span class="hljs-string">'O'</span>, <span class="hljs-string">'B-PER'</span>, <span class="hljs-string">'I-PER'</span>, <span class="hljs-string">'B-ORG'</span>, <span class="hljs-string">'I-ORG'</span>, <span class="hljs-string">'B-LOC'</span>, <span class="hljs-string">'I-LOC'</span>, <span class="hljs-string">'B-MISC'</span>, <span class="hljs-string">'I-MISC'</span>]',wrap:!1}}),ul=new C({props:{code:"d29yZHMlMjAlM0QlMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QjAlNUQlNUIlMjJ0b2tlbnMlMjIlNUQlMEFsYWJlbHMlMjAlM0QlMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QjAlNUQlNUIlMjJuZXJfdGFncyUyMiU1RCUwQWxpbmUxJTIwJTNEJTIwJTIyJTIyJTBBbGluZTIlMjAlM0QlMjAlMjIlMjIlMEFmb3IlMjB3b3JkJTJDJTIwbGFiZWwlMjBpbiUyMHppcCh3b3JkcyUyQyUyMGxhYmVscyklM0ElMEElMjAlMjAlMjAlMjBmdWxsX2xhYmVsJTIwJTNEJTIwbGFiZWxfbmFtZXMlNUJsYWJlbCU1RCUwQSUyMCUyMCUyMCUyMG1heF9sZW5ndGglMjAlM0QlMjBtYXgobGVuKHdvcmQpJTJDJTIwbGVuKGZ1bGxfbGFiZWwpKSUwQSUyMCUyMCUyMCUyMGxpbmUxJTIwJTJCJTNEJTIwd29yZCUyMCUyQiUyMCUyMiUyMCUyMiUyMColMjAobWF4X2xlbmd0aCUyMC0lMjBsZW4od29yZCklMjAlMkIlMjAxKSUwQSUyMCUyMCUyMCUyMGxpbmUyJTIwJTJCJTNEJTIwZnVsbF9sYWJlbCUyMCUyQiUyMCUyMiUyMCUyMiUyMColMjAobWF4X2xlbmd0aCUyMC0lMjBsZW4oZnVsbF9sYWJlbCklMjAlMkIlMjAxKSUwQSUwQXByaW50KGxpbmUxKSUwQXByaW50KGxpbmUyKQ==",highlighted:`words = raw_datasets[<span class="hljs-string">"train"</span>][<span class="hljs-number">0</span>][<span class="hljs-string">"tokens"</span>] | |
| labels = raw_datasets[<span class="hljs-string">"train"</span>][<span class="hljs-number">0</span>][<span class="hljs-string">"ner_tags"</span>] | |
| line1 = <span class="hljs-string">""</span> | |
| line2 = <span class="hljs-string">""</span> | |
| <span class="hljs-keyword">for</span> word, label <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(words, labels): | |
| full_label = label_names[label] | |
| max_length = <span class="hljs-built_in">max</span>(<span class="hljs-built_in">len</span>(word), <span class="hljs-built_in">len</span>(full_label)) | |
| line1 += word + <span class="hljs-string">" "</span> * (max_length - <span class="hljs-built_in">len</span>(word) + <span class="hljs-number">1</span>) | |
| line2 += full_label + <span class="hljs-string">" "</span> * (max_length - <span class="hljs-built_in">len</span>(full_label) + <span class="hljs-number">1</span>) | |
| <span class="hljs-built_in">print</span>(line1) | |
| <span class="hljs-built_in">print</span>(line2)`,wrap:!1}}),dl=new C({props:{code:"J0VVJTIwJTIwJTIwJTIwcmVqZWN0cyUyMEdlcm1hbiUyMGNhbGwlMjB0byUyMGJveWNvdHQlMjBCcml0aXNoJTIwbGFtYiUyMC4nJTBBJ0ItT1JHJTIwTyUyMCUyMCUyMCUyMCUyMCUyMCUyMEItTUlTQyUyME8lMjAlMjAlMjAlMjBPJTIwJTIwTyUyMCUyMCUyMCUyMCUyMCUyMCUyMEItTUlTQyUyMCUyME8lMjAlMjAlMjAlMjBPJw==",highlighted:`<span class="hljs-string">'EU rejects German call to boycott British lamb .'</span> | |
| <span class="hljs-string">'B-ORG O B-MISC O O O B-MISC O O'</span>`,wrap:!1}}),rl=new C({props:{code:"J0dlcm1hbnklMjAlNUMncyUyMHJlcHJlc2VudGF0aXZlJTIwdG8lMjB0aGUlMjBFdXJvcGVhbiUyMFVuaW9uJTIwJTVDJ3MlMjB2ZXRlcmluYXJ5JTIwY29tbWl0dGVlJTIwV2VybmVyJTIwWndpbmdtYW5uJTIwc2FpZCUyMG9uJTIwV2VkbmVzZGF5JTIwY29uc3VtZXJzJTIwc2hvdWxkJTIwYnV5JTIwc2hlZXBtZWF0JTIwZnJvbSUyMGNvdW50cmllcyUyMG90aGVyJTIwdGhhbiUyMEJyaXRhaW4lMjB1bnRpbCUyMHRoZSUyMHNjaWVudGlmaWMlMjBhZHZpY2UlMjB3YXMlMjBjbGVhcmVyJTIwLiclMEEnQi1MT0MlMjAlMjAlMjBPJTIwJTIwTyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyME8lMjAlMjBPJTIwJTIwJTIwQi1PUkclMjAlMjAlMjAlMjBJLU9SRyUyME8lMjAlMjBPJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEItUEVSJTIwJTIwSS1QRVIlMjAlMjAlMjAlMjAlMjBPJTIwJTIwJTIwJTIwTyUyMCUyME8lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBPJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTyUyMCUyMCUyMCUyMCUyMCUyME8lMjAlMjAlMjBPJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTyUyMCUyMCUyMCUyME8lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBPJTIwJTIwJTIwJTIwJTIwTyUyMCUyMCUyMCUyMEItTE9DJTIwJTIwJTIwTyUyMCUyMCUyMCUyMCUyME8lMjAlMjAlMjBPJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTyUyMCUyMCUyMCUyMCUyMCUyME8lMjAlMjAlMjBPJTIwJTIwJTIwJTIwJTIwJTIwJTIwTyc=",highlighted:`<span class="hljs-string">'Germany \\'s representative to the European Union \\'s veterinary committee Werner Zwingmann said on Wednesday consumers should buy sheepmeat from countries other than Britain until the scientific advice was clearer .'</span> | |
| <span class="hljs-string">'B-LOC O O O O B-ORG I-ORG O O O B-PER I-PER O O O O O O O O O O O B-LOC O O O O O O O'</span>`,wrap:!1}}),Cl=new cl({props:{title:"Обработка данных",local:"processing-the-data",headingTag:"h3"}}),ns=new Bn({props:{id:"iY2AZYdZAr0"}}),hl=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMEElMEFtb2RlbF9jaGVja3BvaW50JTIwJTNEJTIwJTIyYmVydC1iYXNlLWNhc2VkJTIyJTBBdG9rZW5pemVyJTIwJTNEJTIwQXV0b1Rva2VuaXplci5mcm9tX3ByZXRyYWluZWQobW9kZWxfY2hlY2twb2ludCk=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer | |
| model_checkpoint = <span class="hljs-string">"bert-base-cased"</span> | |
| tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)`,wrap:!1}}),Ql=new C({props:{code:"dG9rZW5pemVyLmlzX2Zhc3Q=",highlighted:"tokenizer.is_fast",wrap:!1}}),xl=new C({props:{code:"VHJ1ZQ==",highlighted:'<span class="hljs-literal">True</span>',wrap:!1}}),kl=new C({props:{code:"aW5wdXRzJTIwJTNEJTIwdG9rZW5pemVyKHJhd19kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVEJTVCMCU1RCU1QiUyMnRva2VucyUyMiU1RCUyQyUyMGlzX3NwbGl0X2ludG9fd29yZHMlM0RUcnVlKSUwQWlucHV0cy50b2tlbnMoKQ==",highlighted:`inputs = tokenizer(raw_datasets[<span class="hljs-string">"train"</span>][<span class="hljs-number">0</span>][<span class="hljs-string">"tokens"</span>], is_split_into_words=<span class="hljs-literal">True</span>) | |
| inputs.tokens()`,wrap:!1}}),ps=new C({props:{code:"JTVCJyU1QkNMUyU1RCclMkMlMjAnRVUnJTJDJTIwJ3JlamVjdHMnJTJDJTIwJ0dlcm1hbiclMkMlMjAnY2FsbCclMkMlMjAndG8nJTJDJTIwJ2JveWNvdHQnJTJDJTIwJ0JyaXRpc2gnJTJDJTIwJ2xhJyUyQyUyMCclMjMlMjNtYiclMkMlMjAnLiclMkMlMjAnJTVCU0VQJTVEJyU1RA==",highlighted:'[<span class="hljs-string">'[CLS]'</span>, <span class="hljs-string">'EU'</span>, <span class="hljs-string">'rejects'</span>, <span class="hljs-string">'German'</span>, <span class="hljs-string">'call'</span>, <span class="hljs-string">'to'</span>, <span class="hljs-string">'boycott'</span>, <span class="hljs-string">'British'</span>, <span class="hljs-string">'la'</span>, <span class="hljs-string">'##mb'</span>, <span class="hljs-string">'.'</span>, <span class="hljs-string">'[SEP]'</span>]',wrap:!1}}),cs=new C({props:{code:"aW5wdXRzLndvcmRfaWRzKCk=",highlighted:"inputs.word_ids()",wrap:!1}}),Gs=new C({props:{code:"JTVCTm9uZSUyQyUyMDAlMkMlMjAxJTJDJTIwMiUyQyUyMDMlMkMlMjA0JTJDJTIwNSUyQyUyMDYlMkMlMjA3JTJDJTIwNyUyQyUyMDglMkMlMjBOb25lJTVE",highlighted:'[<span class="hljs-literal">None</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">6</span>, <span class="hljs-number">7</span>, <span class="hljs-number">7</span>, <span class="hljs-number">8</span>, <span class="hljs-literal">None</span>]',wrap:!1}}),vs=new C({props:{code:"ZGVmJTIwYWxpZ25fbGFiZWxzX3dpdGhfdG9rZW5zKGxhYmVscyUyQyUyMHdvcmRfaWRzKSUzQSUwQSUyMCUyMCUyMCUyMG5ld19sYWJlbHMlMjAlM0QlMjAlNUIlNUQlMEElMjAlMjAlMjAlMjBjdXJyZW50X3dvcmQlMjAlM0QlMjBOb25lJTBBJTIwJTIwJTIwJTIwZm9yJTIwd29yZF9pZCUyMGluJTIwd29yZF9pZHMlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMHdvcmRfaWQlMjAhJTNEJTIwY3VycmVudF93b3JkJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwJUQwJTlEJUQwJUIwJUQxJTg3JUQwJUIwJUQwJUJCJUQwJUJFJTIwJUQwJUJEJUQwJUJFJUQwJUIyJUQwJUJFJUQwJUIzJUQwJUJFJTIwJUQxJTgxJUQwJUJCJUQwJUJFJUQwJUIyJUQwJUIwISUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGN1cnJlbnRfd29yZCUyMCUzRCUyMHdvcmRfaWQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsYWJlbCUyMCUzRCUyMC0xMDAlMjBpZiUyMHdvcmRfaWQlMjBpcyUyME5vbmUlMjBlbHNlJTIwbGFiZWxzJTVCd29yZF9pZCU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG5ld19sYWJlbHMuYXBwZW5kKGxhYmVsKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGVsaWYlMjB3b3JkX2lkJTIwaXMlMjBOb25lJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwJUQwJUExJUQwJUJGJUQwJUI1JUQxJTg2JUQwJUI4JUQwJUIwJUQwJUJCJUQxJThDJUQwJUJEJUQxJThCJUQwJUI5JTIwJUQxJTgyJUQwJUJFJUQwJUJBJUQwJUI1JUQwJUJEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbmV3X2xhYmVscy5hcHBlbmQoLTEwMCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBlbHNlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwJUQwJUEyJUQwJUJFJTIwJUQwJUI2JUQwJUI1JTIwJUQxJTgxJUQwJUJCJUQwJUJFJUQwJUIyJUQwJUJFJTJDJTIwJUQxJTg3JUQxJTgyJUQwJUJFJTIwJUQwJUI4JTIwJUQwJUJGJUQxJTgwJUQwJUI1JUQwJUI0JUQxJThCJUQwJUI0JUQxJTgzJUQxJTg5JUQwJUI4JUQwJUI5JTIwJUQxJTgyJUQwJUJFJUQwJUJBJUQwJUI1JUQwJUJEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGFiZWwlMjAlM0QlMjBsYWJlbHMlNUJ3b3JkX2lkJTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwJUQwJTk1JUQxJTgxJUQwJUJCJUQwJUI4JTIwJUQwJUJDJUQwJUI1JUQxJTgyJUQwJUJBJUQwJUIwJTIwQi1YWFglMkMlMjAlRDAlQjclRDAlQjAlRDAlQkMlRDAlQjUlRDAlQkQlRDElOEYlRDAlQjUlRDAlQkMlMjAlRDAlQjUlRDAlQjUlMjAlRDAlQkQlRDAlQjAlMjBJLVhYWCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwbGFiZWwlMjAlMjUlMjAyJTIwJTNEJTNEJTIwMSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVsJTIwJTJCJTNEJTIwMSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG5ld19sYWJlbHMuYXBwZW5kKGxhYmVsKSUwQSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMG5ld19sYWJlbHM=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">align_labels_with_tokens</span>(<span class="hljs-params">labels, word_ids</span>): | |
| new_labels = [] | |
| current_word = <span class="hljs-literal">None</span> | |
| <span class="hljs-keyword">for</span> word_id <span class="hljs-keyword">in</span> word_ids: | |
| <span class="hljs-keyword">if</span> word_id != current_word: | |
| <span class="hljs-comment"># Начало нового слова!</span> | |
| current_word = word_id | |
| label = -<span class="hljs-number">100</span> <span class="hljs-keyword">if</span> word_id <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span> <span class="hljs-keyword">else</span> labels[word_id] | |
| new_labels.append(label) | |
| <span class="hljs-keyword">elif</span> word_id <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>: | |
| <span class="hljs-comment"># Специальный токен</span> | |
| new_labels.append(-<span class="hljs-number">100</span>) | |
| <span class="hljs-keyword">else</span>: | |
| <span class="hljs-comment"># То же слово, что и предыдущий токен</span> | |
| label = labels[word_id] | |
| <span class="hljs-comment"># Если метка B-XXX, заменяем ее на I-XXX</span> | |
| <span class="hljs-keyword">if</span> label % <span class="hljs-number">2</span> == <span class="hljs-number">1</span>: | |
| label += <span class="hljs-number">1</span> | |
| new_labels.append(label) | |
| <span class="hljs-keyword">return</span> new_labels`,wrap:!1}}),s=new C({props:{code:"bGFiZWxzJTIwJTNEJTIwcmF3X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIwJTVEJTVCJTIybmVyX3RhZ3MlMjIlNUQlMEF3b3JkX2lkcyUyMCUzRCUyMGlucHV0cy53b3JkX2lkcygpJTBBcHJpbnQobGFiZWxzKSUwQXByaW50KGFsaWduX2xhYmVsc193aXRoX3Rva2VucyhsYWJlbHMlMkMlMjB3b3JkX2lkcykp",highlighted:`labels = raw_datasets[<span class="hljs-string">"train"</span>][<span class="hljs-number">0</span>][<span class="hljs-string">"ner_tags"</span>] | |
| word_ids = inputs.word_ids() | |
| <span class="hljs-built_in">print</span>(labels) | |
| <span class="hljs-built_in">print</span>(align_labels_with_tokens(labels, word_ids))`,wrap:!1}}),fe=new C({props:{code:"JTVCMyUyQyUyMDAlMkMlMjA3JTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwNyUyQyUyMDAlMkMlMjAwJTVEJTBBJTVCLTEwMCUyQyUyMDMlMkMlMjAwJTJDJTIwNyUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDclMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAtMTAwJTVE",highlighted:`[<span class="hljs-number">3</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>] | |
| [-<span class="hljs-number">100</span>, <span class="hljs-number">3</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, -<span class="hljs-number">100</span>]`,wrap:!1}}),Qe=new C({props:{code:"ZGVmJTIwdG9rZW5pemVfYW5kX2FsaWduX2xhYmVscyhleGFtcGxlcyklM0ElMEElMjAlMjAlMjAlMjB0b2tlbml6ZWRfaW5wdXRzJTIwJTNEJTIwdG9rZW5pemVyKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGV4YW1wbGVzJTVCJTIydG9rZW5zJTIyJTVEJTJDJTIwdHJ1bmNhdGlvbiUzRFRydWUlMkMlMjBpc19zcGxpdF9pbnRvX3dvcmRzJTNEVHJ1ZSUwQSUyMCUyMCUyMCUyMCklMEElMjAlMjAlMjAlMjBhbGxfbGFiZWxzJTIwJTNEJTIwZXhhbXBsZXMlNUIlMjJuZXJfdGFncyUyMiU1RCUwQSUyMCUyMCUyMCUyMG5ld19sYWJlbHMlMjAlM0QlMjAlNUIlNUQlMEElMjAlMjAlMjAlMjBmb3IlMjBpJTJDJTIwbGFiZWxzJTIwaW4lMjBlbnVtZXJhdGUoYWxsX2xhYmVscyklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3b3JkX2lkcyUyMCUzRCUyMHRva2VuaXplZF9pbnB1dHMud29yZF9pZHMoaSklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBuZXdfbGFiZWxzLmFwcGVuZChhbGlnbl9sYWJlbHNfd2l0aF90b2tlbnMobGFiZWxzJTJDJTIwd29yZF9pZHMpKSUwQSUwQSUyMCUyMCUyMCUyMHRva2VuaXplZF9pbnB1dHMlNUIlMjJsYWJlbHMlMjIlNUQlMjAlM0QlMjBuZXdfbGFiZWxzJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwdG9rZW5pemVkX2lucHV0cw==",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">tokenize_and_align_labels</span>(<span class="hljs-params">examples</span>): | |
| tokenized_inputs = tokenizer( | |
| examples[<span class="hljs-string">"tokens"</span>], truncation=<span class="hljs-literal">True</span>, is_split_into_words=<span class="hljs-literal">True</span> | |
| ) | |
| all_labels = examples[<span class="hljs-string">"ner_tags"</span>] | |
| new_labels = [] | |
| <span class="hljs-keyword">for</span> i, labels <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(all_labels): | |
| word_ids = tokenized_inputs.word_ids(i) | |
| new_labels.append(align_labels_with_tokens(labels, word_ids)) | |
| tokenized_inputs[<span class="hljs-string">"labels"</span>] = new_labels | |
| <span class="hljs-keyword">return</span> tokenized_inputs`,wrap:!1}}),$e=new C({props:{code:"dG9rZW5pemVkX2RhdGFzZXRzJTIwJTNEJTIwcmF3X2RhdGFzZXRzLm1hcCglMEElMjAlMjAlMjAlMjB0b2tlbml6ZV9hbmRfYWxpZ25fbGFiZWxzJTJDJTBBJTIwJTIwJTIwJTIwYmF0Y2hlZCUzRFRydWUlMkMlMEElMjAlMjAlMjAlMjByZW1vdmVfY29sdW1ucyUzRHJhd19kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVELmNvbHVtbl9uYW1lcyUyQyUwQSk=",highlighted:`tokenized_datasets = raw_datasets.<span class="hljs-built_in">map</span>( | |
| tokenize_and_align_labels, | |
| batched=<span class="hljs-literal">True</span>, | |
| remove_columns=raw_datasets[<span class="hljs-string">"train"</span>].column_names, | |
| )`,wrap:!1}});const In=[la,Kn],et=[];function Qn(l,n){return l[0]==="pt"?0:1}Ts=Qn(E),js=et[Ts]=In[Ts](E),Ae=new cl({props:{title:"Сопоставление данных",local:"data-collation",headingTag:"h3"}});const xn=[ea,sa],tt=[];function kn(l,n){return l[0]==="pt"?0:1}ms=kn(E),os=tt[ms]=xn[ms](E),Ze=new C({props:{code:"YmF0Y2glMjAlM0QlMjBkYXRhX2NvbGxhdG9yKCU1QnRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVEJTVCaSU1RCUyMGZvciUyMGklMjBpbiUyMHJhbmdlKDIpJTVEKSUwQWJhdGNoJTVCJTIybGFiZWxzJTIyJTVE",highlighted:`batch = data_collator([tokenized_datasets[<span class="hljs-string">"train"</span>][i] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">2</span>)]) | |
| batch[<span class="hljs-string">"labels"</span>]`,wrap:!1}}),Ve=new C({props:{code:"dGVuc29yKCU1QiU1Qi0xMDAlMkMlMjAlMjAlMjAlMjAzJTJDJTIwJTIwJTIwJTIwMCUyQyUyMCUyMCUyMCUyMDclMkMlMjAlMjAlMjAlMjAwJTJDJTIwJTIwJTIwJTIwMCUyQyUyMCUyMCUyMCUyMDAlMkMlMjAlMjAlMjAlMjA3JTJDJTIwJTIwJTIwJTIwMCUyQyUyMCUyMCUyMCUyMDAlMkMlMjAlMjAlMjAlMjAwJTJDJTIwLTEwMCU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1Qi0xMDAlMkMlMjAlMjAlMjAlMjAxJTJDJTIwJTIwJTIwJTIwMiUyQyUyMC0xMDAlMkMlMjAtMTAwJTJDJTIwLTEwMCUyQyUyMC0xMDAlMkMlMjAtMTAwJTJDJTIwLTEwMCUyQyUyMC0xMDAlMkMlMjAtMTAwJTJDJTIwLTEwMCU1RCU1RCk=",highlighted:`tensor([[-<span class="hljs-number">100</span>, <span class="hljs-number">3</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, -<span class="hljs-number">100</span>], | |
| [-<span class="hljs-number">100</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>, -<span class="hljs-number">100</span>]])`,wrap:!1}}),We=new C({props:{code:"Zm9yJTIwaSUyMGluJTIwcmFuZ2UoMiklM0ElMEElMjAlMjAlMjAlMjBwcmludCh0b2tlbml6ZWRfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QmklNUQlNUIlMjJsYWJlbHMlMjIlNUQp",highlighted:`<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">2</span>): | |
| <span class="hljs-built_in">print</span>(tokenized_datasets[<span class="hljs-string">"train"</span>][i][<span class="hljs-string">"labels"</span>])`,wrap:!1}}),Ge=new C({props:{code:"JTVCLTEwMCUyQyUyMDMlMkMlMjAwJTJDJTIwNyUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDclMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAtMTAwJTVEJTBBJTVCLTEwMCUyQyUyMDElMkMlMjAyJTJDJTIwLTEwMCU1RA==",highlighted:`[-<span class="hljs-number">100</span>, <span class="hljs-number">3</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">7</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, -<span class="hljs-number">100</span>] | |
| [-<span class="hljs-number">100</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, -<span class="hljs-number">100</span>]`,wrap:!1}});const $n=[na,ta],nt=[];function gn(l,n){return l[0]==="pt"?0:1}bs=gn(E),us=nt[bs]=$n[bs](E);let ll=E[0]==="tf"&&Wn();ve=new cl({props:{title:"Метрики",local:"metrics",headingTag:"h3"}});const An=[Ma,aa],at=[];function _n(l,n){return l[0]==="pt"?0:1}ds=_n(E),Cs=at[ds]=An[ds](E),De=new C({props:{code:"aW1wb3J0JTIwZXZhbHVhdGUlMEElMEFtZXRyaWMlMjAlM0QlMjBldmFsdWF0ZS5sb2FkKCUyMnNlcWV2YWwlMjIp",highlighted:`<span class="hljs-keyword">import</span> evaluate | |
| metric = evaluate.load(<span class="hljs-string">"seqeval"</span>)`,wrap:!1}}),Ye=new C({props:{code:"bGFiZWxzJTIwJTNEJTIwcmF3X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIwJTVEJTVCJTIybmVyX3RhZ3MlMjIlNUQlMEFsYWJlbHMlMjAlM0QlMjAlNUJsYWJlbF9uYW1lcyU1QmklNUQlMjBmb3IlMjBpJTIwaW4lMjBsYWJlbHMlNUQlMEFsYWJlbHM=",highlighted:`labels = raw_datasets[<span class="hljs-string">"train"</span>][<span class="hljs-number">0</span>][<span class="hljs-string">"ner_tags"</span>] | |
| labels = [label_names[i] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> labels] | |
| labels`,wrap:!1}}),Ne=new C({props:{code:"JTVCJ0ItT1JHJyUyQyUyMCdPJyUyQyUyMCdCLU1JU0MnJTJDJTIwJ08nJTJDJTIwJ08nJTJDJTIwJ08nJTJDJTIwJ0ItTUlTQyclMkMlMjAnTyclMkMlMjAnTyclNUQ=",highlighted:'[<span class="hljs-string">'B-ORG'</span>, <span class="hljs-string">'O'</span>, <span class="hljs-string">'B-MISC'</span>, <span class="hljs-string">'O'</span>, <span class="hljs-string">'O'</span>, <span class="hljs-string">'O'</span>, <span class="hljs-string">'B-MISC'</span>, <span class="hljs-string">'O'</span>, <span class="hljs-string">'O'</span>]',wrap:!1}}),He=new C({props:{code:"cHJlZGljdGlvbnMlMjAlM0QlMjBsYWJlbHMuY29weSgpJTBBcHJlZGljdGlvbnMlNUIyJTVEJTIwJTNEJTIwJTIyTyUyMiUwQW1ldHJpYy5jb21wdXRlKHByZWRpY3Rpb25zJTNEJTVCcHJlZGljdGlvbnMlNUQlMkMlMjByZWZlcmVuY2VzJTNEJTVCbGFiZWxzJTVEKQ==",highlighted:`predictions = labels.copy() | |
| predictions[<span class="hljs-number">2</span>] = <span class="hljs-string">"O"</span> | |
| metric.compute(predictions=[predictions], references=[labels])`,wrap:!1}}),Se=new C({props:{code:"JTdCJ01JU0MnJTNBJTIwJTdCJ3ByZWNpc2lvbiclM0ElMjAxLjAlMkMlMjAncmVjYWxsJyUzQSUyMDAuNSUyQyUyMCdmMSclM0ElMjAwLjY3JTJDJTIwJ251bWJlciclM0ElMjAyJTdEJTJDJTBBJTIwJ09SRyclM0ElMjAlN0IncHJlY2lzaW9uJyUzQSUyMDEuMCUyQyUyMCdyZWNhbGwnJTNBJTIwMS4wJTJDJTIwJ2YxJyUzQSUyMDEuMCUyQyUyMCdudW1iZXInJTNBJTIwMSU3RCUyQyUwQSUyMCdvdmVyYWxsX3ByZWNpc2lvbiclM0ElMjAxLjAlMkMlMEElMjAnb3ZlcmFsbF9yZWNhbGwnJTNBJTIwMC42NyUyQyUwQSUyMCdvdmVyYWxsX2YxJyUzQSUyMDAuOCUyQyUwQSUyMCdvdmVyYWxsX2FjY3VyYWN5JyUzQSUyMDAuODklN0Q=",highlighted:`{<span class="hljs-string">'MISC'</span>: {<span class="hljs-string">'precision'</span>: <span class="hljs-number">1.0</span>, <span class="hljs-string">'recall'</span>: <span class="hljs-number">0.5</span>, <span class="hljs-string">'f1'</span>: <span class="hljs-number">0.67</span>, <span class="hljs-string">'number'</span>: <span class="hljs-number">2</span>}, | |
| <span class="hljs-string">'ORG'</span>: {<span class="hljs-string">'precision'</span>: <span class="hljs-number">1.0</span>, <span class="hljs-string">'recall'</span>: <span class="hljs-number">1.0</span>, <span class="hljs-string">'f1'</span>: <span class="hljs-number">1.0</span>, <span class="hljs-string">'number'</span>: <span class="hljs-number">1</span>}, | |
| <span class="hljs-string">'overall_precision'</span>: <span class="hljs-number">1.0</span>, | |
| <span class="hljs-string">'overall_recall'</span>: <span class="hljs-number">0.67</span>, | |
| <span class="hljs-string">'overall_f1'</span>: <span class="hljs-number">0.8</span>, | |
| <span class="hljs-string">'overall_accuracy'</span>: <span class="hljs-number">0.89</span>}`,wrap:!1}});const Rn=[pa,Ja],Mt=[];function En(l,n){return l[0]==="pt"?0:1}fs=En(E),hs=Mt[fs]=Rn[fs](E);let sl=E[0]==="pt"&&Gn();return Le=new cl({props:{title:"Использование дообученной модели",local:"using-the-fine-tuned-model",headingTag:"h2"}}),Oe=new C({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMHBpcGVsaW5lJTBBJTBBJTIzJTIwJUQwJTk3JUQwJUIwJUQwJUJDJUQwJUI1JUQwJUJEJUQwJUI4JUQxJTgyJUQwJUI1JTIwJUQxJThEJUQxJTgyJUQwJUJFJTIwJUQwJUJEJUQwJUIwJTIwJUQxJTgxJUQwJUIyJUQwJUJFJUQxJThFJTIwJUQxJTgxJUQwJUJFJUQwJUIxJUQxJTgxJUQxJTgyJUQwJUIyJUQwJUI1JUQwJUJEJUQwJUJEJUQxJTgzJUQxJThFJTIwJUQwJUJBJUQwJUJFJUQwJUJEJUQxJTgyJUQxJTgwJUQwJUJFJUQwJUJCJUQxJThDJUQwJUJEJUQxJTgzJUQxJThFJTIwJUQxJTgyJUQwJUJFJUQxJTg3JUQwJUJBJUQxJTgzJTBBbW9kZWxfY2hlY2twb2ludCUyMCUzRCUyMCUyMmh1Z2dpbmdmYWNlLWNvdXJzZSUyRmJlcnQtZmluZXR1bmVkLW5lciUyMiUwQXRva2VuX2NsYXNzaWZpZXIlMjAlM0QlMjBwaXBlbGluZSglMEElMjAlMjAlMjAlMjAlMjJ0b2tlbi1jbGFzc2lmaWNhdGlvbiUyMiUyQyUyMG1vZGVsJTNEbW9kZWxfY2hlY2twb2ludCUyQyUyMGFnZ3JlZ2F0aW9uX3N0cmF0ZWd5JTNEJTIyc2ltcGxlJTIyJTBBKSUwQXRva2VuX2NsYXNzaWZpZXIoJTIyTXklMjBuYW1lJTIwaXMlMjBTeWx2YWluJTIwYW5kJTIwSSUyMHdvcmslMjBhdCUyMEh1Z2dpbmclMjBGYWNlJTIwaW4lMjBCcm9va2x5bi4lMjIp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline | |
| <span class="hljs-comment"># Замените это на свою собственную контрольную точку</span> | |
| model_checkpoint = <span class="hljs-string">"huggingface-course/bert-finetuned-ner"</span> | |
| token_classifier = pipeline( | |
| <span class="hljs-string">"token-classification"</span>, model=model_checkpoint, aggregation_strategy=<span class="hljs-string">"simple"</span> | |
| ) | |
| token_classifier(<span class="hljs-string">"My name is Sylvain and I work at Hugging Face in Brooklyn."</span>)`,wrap:!1}}),Pe=new C({props:{code:"JTVCJTdCJ2VudGl0eV9ncm91cCclM0ElMjAnUEVSJyUyQyUyMCdzY29yZSclM0ElMjAwLjk5ODg1MDYlMkMlMjAnd29yZCclM0ElMjAnU3lsdmFpbiclMkMlMjAnc3RhcnQnJTNBJTIwMTElMkMlMjAnZW5kJyUzQSUyMDE4JTdEJTJDJTBBJTIwJTdCJ2VudGl0eV9ncm91cCclM0ElMjAnT1JHJyUyQyUyMCdzY29yZSclM0ElMjAwLjk2NDc2MjUlMkMlMjAnd29yZCclM0ElMjAnSHVnZ2luZyUyMEZhY2UnJTJDJTIwJ3N0YXJ0JyUzQSUyMDMzJTJDJTIwJ2VuZCclM0ElMjA0NSU3RCUyQyUwQSUyMCU3QidlbnRpdHlfZ3JvdXAnJTNBJTIwJ0xPQyclMkMlMjAnc2NvcmUnJTNBJTIwMC45OTg2MTE4JTJDJTIwJ3dvcmQnJTNBJTIwJ0Jyb29rbHluJyUyQyUyMCdzdGFydCclM0ElMjA0OSUyQyUyMCdlbmQnJTNBJTIwNTclN0QlNUQ=",highlighted:`[{<span class="hljs-string">'entity_group'</span>: <span class="hljs-string">'PER'</span>, <span class="hljs-string">'score'</span>: <span class="hljs-number">0.9988506</span>, <span class="hljs-string">'word'</span>: <span class="hljs-string">'Sylvain'</span>, <span class="hljs-string">'start'</span>: <span class="hljs-number">11</span>, <span class="hljs-string">'end'</span>: <span class="hljs-number">18</span>}, | |
| {<span class="hljs-string">'entity_group'</span>: <span class="hljs-string">'ORG'</span>, <span class="hljs-string">'score'</span>: <span class="hljs-number">0.9647625</span>, <span class="hljs-string">'word'</span>: <span class="hljs-string">'Hugging Face'</span>, <span class="hljs-string">'start'</span>: <span class="hljs-number">33</span>, <span class="hljs-string">'end'</span>: <span class="hljs-number">45</span>}, | |
| {<span class="hljs-string">'entity_group'</span>: <span class="hljs-string">'LOC'</span>, <span class="hljs-string">'score'</span>: <span class="hljs-number">0.9986118</span>, <span class="hljs-string">'word'</span>: <span class="hljs-string">'Brooklyn'</span>, <span class="hljs-string">'start'</span>: <span class="hljs-number">49</span>, <span class="hljs-string">'end'</span>: <span class="hljs-number">57</span>}]`,wrap:!1}}),lt=new Ln({props:{source:"https://github.com/huggingface/course/blob/main/chapters/ru/chapter7/2.mdx"}}),{c(){i=c("meta"),I=a(),w=c("p"),f=a(),j($.$$.fragment),d=a(),j(k.$$.fragment),A=a(),j(u.$$.fragment),_=a(),h.c(),R=a(),x=c("p"),x.textContent=Y,N=a(),Wl=c("ul"),Wl.innerHTML=Yl,F=a(),j(al.$$.fragment),H=a(),Ml=c("p"),Ml.textContent=z,Is=a(),W=c("iframe"),Al=a(),Z=c("a"),Z.innerHTML=ae,_l=a(),G=c("p"),G.innerHTML=Nl,S=a(),j(Gl.$$.fragment),Rl=a(),v=c("p"),v.innerHTML=Me,El=a(),V=c("blockquote"),V.innerHTML=Fl,L=a(),j(vl.$$.fragment),Zl=a(),D=c("p"),D.innerHTML=Hl,q=a(),j(Dl.$$.fragment),Vl=a(),B=c("p"),B.innerHTML=Je,Bl=a(),j(X.$$.fragment),zl=a(),j(O.$$.fragment),yl=a(),Jl=c("p"),Jl.innerHTML=K,Qs=a(),pl=c("p"),pl.textContent=nl,xs=a(),j(il.$$.fragment),P=a(),j(wl.$$.fragment),Ul=a(),J=c("p"),J.textContent=Q,Sl=a(),j(Ll.$$.fragment),ql=a(),j(ks.$$.fragment),Ds=a(),Tl=c("p"),Tl.innerHTML=wt,Xs=a(),j(jl.$$.fragment),Ys=a(),j(ml.$$.fragment),re=a(),Ol=c("p"),Ol.innerHTML=$s,Ns=a(),j(ol.$$.fragment),ce=a(),j(Pl.$$.fragment),Kl=a(),ls=c("p"),ls.innerHTML=gs,ye=a(),ss=c("ul"),ss.innerHTML=As,Fs=a(),bl=c("p"),bl.textContent=Tt,Hs=a(),j(ul.$$.fragment),zs=a(),j(dl.$$.fragment),we=a(),es=c("p"),es.innerHTML=_s,Ss=a(),j(rl.$$.fragment),Te=a(),ts=c("p"),ts.innerHTML=Rs,je=a(),Xl=c("blockquote"),Xl.innerHTML=Es,Ls=a(),j(Cl.$$.fragment),me=a(),j(ns.$$.fragment),as=a(),Ms=c("p"),Ms.innerHTML=Zs,qs=a(),fl=c("p"),fl.innerHTML=jt,Os=a(),j(hl.$$.fragment),Ps=a(),Il=c("p"),Il.innerHTML=mt,Ks=a(),j(Ql.$$.fragment),le=a(),j(xl.$$.fragment),oe=a(),Js=c("p"),Js.innerHTML=Vs,se=a(),j(kl.$$.fragment),be=a(),j(ps.$$.fragment),is=a(),Bs=c("p"),Bs.innerHTML=ue,Us=a(),Ws=c("p"),Ws.innerHTML=de,rs=a(),j(cs.$$.fragment),ys=a(),j(Gs.$$.fragment),ee=a(),$l=c("p"),$l.innerHTML=Ce,ws=a(),j(vs.$$.fragment),te=a(),gl=c("p"),gl.textContent=ot,ne=a(),j(s.$$.fragment),p=a(),j(fe.$$.fragment),ut=a(),he=c("p"),he.innerHTML=Jn,dt=a(),pe=c("blockquote"),pe.innerHTML=pn,Ct=a(),Ie=c("p"),Ie.innerHTML=Un,ft=a(),j(Qe.$$.fragment),ht=a(),xe=c("p"),xe.textContent=rn,It=a(),ke=c("p"),ke.textContent=cn,Qt=a(),j($e.$$.fragment),xt=a(),ge=c("p"),ge.innerHTML=yn,kt=a(),js.c(),Jt=a(),j(Ae.$$.fragment),$t=a(),_e=c("p"),_e.innerHTML=wn,gt=a(),Re=c("p"),Re.innerHTML=Tn,At=a(),os.c(),pt=a(),Ee=c("p"),Ee.textContent=jn,_t=a(),j(Ze.$$.fragment),Rt=a(),j(Ve.$$.fragment),Et=a(),Be=c("p"),Be.textContent=mn,Zt=a(),j(We.$$.fragment),Vt=a(),j(Ge.$$.fragment),Bt=a(),us.c(),it=a(),ll&&ll.c(),Ut=a(),j(ve.$$.fragment),Wt=a(),Cs.c(),rt=a(),j(De.$$.fragment),Gt=a(),Xe=c("p"),Xe.textContent=on,vt=a(),j(Ye.$$.fragment),Dt=a(),j(Ne.$$.fragment),Xt=a(),Fe=c("p"),Fe.textContent=bn,Yt=a(),j(He.$$.fragment),Nt=a(),ze=c("p"),ze.textContent=un,Ft=a(),j(Se.$$.fragment),Ht=a(),hs.c(),ct=a(),sl&&sl.c(),yt=a(),j(Le.$$.fragment),zt=a(),qe=c("p"),qe.innerHTML=dn,St=a(),j(Oe.$$.fragment),Lt=a(),j(Pe.$$.fragment),qt=a(),Ke=c("p"),Ke.textContent=Cn,Ot=a(),j(lt.$$.fragment),Pt=a(),bt=c("p"),this.h()},l(l){const n=Hn("svelte-u9bgzb",document.head);i=y(n,"META",{name:!0,content:!0}),n.forEach(e),I=M(l),w=y(l,"P",{}),Mn(w).forEach(e),f=M(l),m($.$$.fragment,l),d=M(l),m(k.$$.fragment,l),A=M(l),m(u.$$.fragment,l),_=M(l),h.l(l),R=M(l),x=y(l,"P",{"data-svelte-h":!0}),T(x)!=="svelte-a0uu83"&&(x.textContent=Y),N=M(l),Wl=y(l,"UL",{"data-svelte-h":!0}),T(Wl)!=="svelte-8wlosr"&&(Wl.innerHTML=Yl),F=M(l),m(al.$$.fragment,l),H=M(l),Ml=y(l,"P",{"data-svelte-h":!0}),T(Ml)!=="svelte-1i8g9xv"&&(Ml.textContent=z),Is=M(l),W=y(l,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),Mn(W).forEach(e),Al=M(l),Z=y(l,"A",{class:!0,href:!0,"data-svelte-h":!0}),T(Z)!=="svelte-1n7oe9l"&&(Z.innerHTML=ae),_l=M(l),G=y(l,"P",{"data-svelte-h":!0}),T(G)!=="svelte-10738mp"&&(G.innerHTML=Nl),S=M(l),m(Gl.$$.fragment,l),Rl=M(l),v=y(l,"P",{"data-svelte-h":!0}),T(v)!=="svelte-rmr7bq"&&(v.innerHTML=Me),El=M(l),V=y(l,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),T(V)!=="svelte-wt20ic"&&(V.innerHTML=Fl),L=M(l),m(vl.$$.fragment,l),Zl=M(l),D=y(l,"P",{"data-svelte-h":!0}),T(D)!=="svelte-141zivw"&&(D.innerHTML=Hl),q=M(l),m(Dl.$$.fragment,l),Vl=M(l),B=y(l,"P",{"data-svelte-h":!0}),T(B)!=="svelte-1qv293e"&&(B.innerHTML=Je),Bl=M(l),m(X.$$.fragment,l),zl=M(l),m(O.$$.fragment,l),yl=M(l),Jl=y(l,"P",{"data-svelte-h":!0}),T(Jl)!=="svelte-1yv590d"&&(Jl.innerHTML=K),Qs=M(l),pl=y(l,"P",{"data-svelte-h":!0}),T(pl)!=="svelte-h0v1oc"&&(pl.textContent=nl),xs=M(l),m(il.$$.fragment,l),P=M(l),m(wl.$$.fragment,l),Ul=M(l),J=y(l,"P",{"data-svelte-h":!0}),T(J)!=="svelte-c4thjq"&&(J.textContent=Q),Sl=M(l),m(Ll.$$.fragment,l),ql=M(l),m(ks.$$.fragment,l),Ds=M(l),Tl=y(l,"P",{"data-svelte-h":!0}),T(Tl)!=="svelte-81hxjm"&&(Tl.innerHTML=wt),Xs=M(l),m(jl.$$.fragment,l),Ys=M(l),m(ml.$$.fragment,l),re=M(l),Ol=y(l,"P",{"data-svelte-h":!0}),T(Ol)!=="svelte-1xkhkpt"&&(Ol.innerHTML=$s),Ns=M(l),m(ol.$$.fragment,l),ce=M(l),m(Pl.$$.fragment,l),Kl=M(l),ls=y(l,"P",{"data-svelte-h":!0}),T(ls)!=="svelte-uf0735"&&(ls.innerHTML=gs),ye=M(l),ss=y(l,"UL",{"data-svelte-h":!0}),T(ss)!=="svelte-mkc0kq"&&(ss.innerHTML=As),Fs=M(l),bl=y(l,"P",{"data-svelte-h":!0}),T(bl)!=="svelte-1xqvusy"&&(bl.textContent=Tt),Hs=M(l),m(ul.$$.fragment,l),zs=M(l),m(dl.$$.fragment,l),we=M(l),es=y(l,"P",{"data-svelte-h":!0}),T(es)!=="svelte-ev1kih"&&(es.innerHTML=_s),Ss=M(l),m(rl.$$.fragment,l),Te=M(l),ts=y(l,"P",{"data-svelte-h":!0}),T(ts)!=="svelte-11vpjyj"&&(ts.innerHTML=Rs),je=M(l),Xl=y(l,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),T(Xl)!=="svelte-12u5ids"&&(Xl.innerHTML=Es),Ls=M(l),m(Cl.$$.fragment,l),me=M(l),m(ns.$$.fragment,l),as=M(l),Ms=y(l,"P",{"data-svelte-h":!0}),T(Ms)!=="svelte-39rsmk"&&(Ms.innerHTML=Zs),qs=M(l),fl=y(l,"P",{"data-svelte-h":!0}),T(fl)!=="svelte-74c9k"&&(fl.innerHTML=jt),Os=M(l),m(hl.$$.fragment,l),Ps=M(l),Il=y(l,"P",{"data-svelte-h":!0}),T(Il)!=="svelte-3zwc4k"&&(Il.innerHTML=mt),Ks=M(l),m(Ql.$$.fragment,l),le=M(l),m(xl.$$.fragment,l),oe=M(l),Js=y(l,"P",{"data-svelte-h":!0}),T(Js)!=="svelte-1f2l4n"&&(Js.innerHTML=Vs),se=M(l),m(kl.$$.fragment,l),be=M(l),m(ps.$$.fragment,l),is=M(l),Bs=y(l,"P",{"data-svelte-h":!0}),T(Bs)!=="svelte-1e07b76"&&(Bs.innerHTML=ue),Us=M(l),Ws=y(l,"P",{"data-svelte-h":!0}),T(Ws)!=="svelte-1pw6oi9"&&(Ws.innerHTML=de),rs=M(l),m(cs.$$.fragment,l),ys=M(l),m(Gs.$$.fragment,l),ee=M(l),$l=y(l,"P",{"data-svelte-h":!0}),T($l)!=="svelte-16cd1so"&&($l.innerHTML=Ce),ws=M(l),m(vs.$$.fragment,l),te=M(l),gl=y(l,"P",{"data-svelte-h":!0}),T(gl)!=="svelte-1ynetib"&&(gl.textContent=ot),ne=M(l),m(s.$$.fragment,l),p=M(l),m(fe.$$.fragment,l),ut=M(l),he=y(l,"P",{"data-svelte-h":!0}),T(he)!=="svelte-yrzz2e"&&(he.innerHTML=Jn),dt=M(l),pe=y(l,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),T(pe)!=="svelte-1qwbnf6"&&(pe.innerHTML=pn),Ct=M(l),Ie=y(l,"P",{"data-svelte-h":!0}),T(Ie)!=="svelte-114sjpo"&&(Ie.innerHTML=Un),ft=M(l),m(Qe.$$.fragment,l),ht=M(l),xe=y(l,"P",{"data-svelte-h":!0}),T(xe)!=="svelte-owqkz4"&&(xe.textContent=rn),It=M(l),ke=y(l,"P",{"data-svelte-h":!0}),T(ke)!=="svelte-1sttpde"&&(ke.textContent=cn),Qt=M(l),m($e.$$.fragment,l),xt=M(l),ge=y(l,"P",{"data-svelte-h":!0}),T(ge)!=="svelte-28cpom"&&(ge.innerHTML=yn),kt=M(l),js.l(l),Jt=M(l),m(Ae.$$.fragment,l),$t=M(l),_e=y(l,"P",{"data-svelte-h":!0}),T(_e)!=="svelte-76hyub"&&(_e.innerHTML=wn),gt=M(l),Re=y(l,"P",{"data-svelte-h":!0}),T(Re)!=="svelte-1s1g2l3"&&(Re.innerHTML=Tn),At=M(l),os.l(l),pt=M(l),Ee=y(l,"P",{"data-svelte-h":!0}),T(Ee)!=="svelte-1xn3mrd"&&(Ee.textContent=jn),_t=M(l),m(Ze.$$.fragment,l),Rt=M(l),m(Ve.$$.fragment,l),Et=M(l),Be=y(l,"P",{"data-svelte-h":!0}),T(Be)!=="svelte-1tui7cr"&&(Be.textContent=mn),Zt=M(l),m(We.$$.fragment,l),Vt=M(l),m(Ge.$$.fragment,l),Bt=M(l),us.l(l),it=M(l),ll&&ll.l(l),Ut=M(l),m(ve.$$.fragment,l),Wt=M(l),Cs.l(l),rt=M(l),m(De.$$.fragment,l),Gt=M(l),Xe=y(l,"P",{"data-svelte-h":!0}),T(Xe)!=="svelte-g98ex8"&&(Xe.textContent=on),vt=M(l),m(Ye.$$.fragment,l),Dt=M(l),m(Ne.$$.fragment,l),Xt=M(l),Fe=y(l,"P",{"data-svelte-h":!0}),T(Fe)!=="svelte-6kjzd9"&&(Fe.textContent=bn),Yt=M(l),m(He.$$.fragment,l),Nt=M(l),ze=y(l,"P",{"data-svelte-h":!0}),T(ze)!=="svelte-c57go6"&&(ze.textContent=un),Ft=M(l),m(Se.$$.fragment,l),Ht=M(l),hs.l(l),ct=M(l),sl&&sl.l(l),yt=M(l),m(Le.$$.fragment,l),zt=M(l),qe=y(l,"P",{"data-svelte-h":!0}),T(qe)!=="svelte-1eh1ha9"&&(qe.innerHTML=dn),St=M(l),m(Oe.$$.fragment,l),Lt=M(l),m(Pe.$$.fragment,l),qt=M(l),Ke=y(l,"P",{"data-svelte-h":!0}),T(Ke)!=="svelte-43uxyp"&&(Ke.textContent=Cn),Ot=M(l),m(lt.$$.fragment,l),Pt=M(l),bt=y(l,"P",{}),Mn(bt).forEach(e),this.h()},h(){el(i,"name","hf:doc:metadata"),el(i,"content",Ua),Xn(W.src,tl="https://course-demos-bert-finetuned-ner.hf.space")||el(W,"src",tl),el(W,"frameborder","0"),el(W,"height","350"),el(W,"title","Gradio app"),el(W,"class","block dark:hidden container p-0 flex-grow space-iframe"),el(W,"allow","accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking"),el(W,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"),el(Z,"class","flex justify-center"),el(Z,"href","/huggingface-course/bert-finetuned-ner"),el(V,"class","tip"),el(Xl,"class","tip"),el(pe,"class","tip")},m(l,n){zn(document.head,i),t(l,I,n),t(l,w,n),t(l,f,n),o($,l,n),t(l,d,n),o(k,l,n),t(l,A,n),o(u,l,n),t(l,_,n),st[g].m(l,n),t(l,R,n),t(l,x,n),t(l,N,n),t(l,Wl,n),t(l,F,n),o(al,l,n),t(l,H,n),t(l,Ml,n),t(l,Is,n),t(l,W,n),t(l,Al,n),t(l,Z,n),t(l,_l,n),t(l,G,n),t(l,S,n),o(Gl,l,n),t(l,Rl,n),t(l,v,n),t(l,El,n),t(l,V,n),t(l,L,n),o(vl,l,n),t(l,Zl,n),t(l,D,n),t(l,q,n),o(Dl,l,n),t(l,Vl,n),t(l,B,n),t(l,Bl,n),o(X,l,n),t(l,zl,n),o(O,l,n),t(l,yl,n),t(l,Jl,n),t(l,Qs,n),t(l,pl,n),t(l,xs,n),o(il,l,n),t(l,P,n),o(wl,l,n),t(l,Ul,n),t(l,J,n),t(l,Sl,n),o(Ll,l,n),t(l,ql,n),o(ks,l,n),t(l,Ds,n),t(l,Tl,n),t(l,Xs,n),o(jl,l,n),t(l,Ys,n),o(ml,l,n),t(l,re,n),t(l,Ol,n),t(l,Ns,n),o(ol,l,n),t(l,ce,n),o(Pl,l,n),t(l,Kl,n),t(l,ls,n),t(l,ye,n),t(l,ss,n),t(l,Fs,n),t(l,bl,n),t(l,Hs,n),o(ul,l,n),t(l,zs,n),o(dl,l,n),t(l,we,n),t(l,es,n),t(l,Ss,n),o(rl,l,n),t(l,Te,n),t(l,ts,n),t(l,je,n),t(l,Xl,n),t(l,Ls,n),o(Cl,l,n),t(l,me,n),o(ns,l,n),t(l,as,n),t(l,Ms,n),t(l,qs,n),t(l,fl,n),t(l,Os,n),o(hl,l,n),t(l,Ps,n),t(l,Il,n),t(l,Ks,n),o(Ql,l,n),t(l,le,n),o(xl,l,n),t(l,oe,n),t(l,Js,n),t(l,se,n),o(kl,l,n),t(l,be,n),o(ps,l,n),t(l,is,n),t(l,Bs,n),t(l,Us,n),t(l,Ws,n),t(l,rs,n),o(cs,l,n),t(l,ys,n),o(Gs,l,n),t(l,ee,n),t(l,$l,n),t(l,ws,n),o(vs,l,n),t(l,te,n),t(l,gl,n),t(l,ne,n),o(s,l,n),t(l,p,n),o(fe,l,n),t(l,ut,n),t(l,he,n),t(l,dt,n),t(l,pe,n),t(l,Ct,n),t(l,Ie,n),t(l,ft,n),o(Qe,l,n),t(l,ht,n),t(l,xe,n),t(l,It,n),t(l,ke,n),t(l,Qt,n),o($e,l,n),t(l,xt,n),t(l,ge,n),t(l,kt,n),et[Ts].m(l,n),t(l,Jt,n),o(Ae,l,n),t(l,$t,n),t(l,_e,n),t(l,gt,n),t(l,Re,n),t(l,At,n),tt[ms].m(l,n),t(l,pt,n),t(l,Ee,n),t(l,_t,n),o(Ze,l,n),t(l,Rt,n),o(Ve,l,n),t(l,Et,n),t(l,Be,n),t(l,Zt,n),o(We,l,n),t(l,Vt,n),o(Ge,l,n),t(l,Bt,n),nt[bs].m(l,n),t(l,it,n),ll&&ll.m(l,n),t(l,Ut,n),o(ve,l,n),t(l,Wt,n),at[ds].m(l,n),t(l,rt,n),o(De,l,n),t(l,Gt,n),t(l,Xe,n),t(l,vt,n),o(Ye,l,n),t(l,Dt,n),o(Ne,l,n),t(l,Xt,n),t(l,Fe,n),t(l,Yt,n),o(He,l,n),t(l,Nt,n),t(l,ze,n),t(l,Ft,n),o(Se,l,n),t(l,Ht,n),Mt[fs].m(l,n),t(l,ct,n),sl&&sl.m(l,n),t(l,yt,n),o(Le,l,n),t(l,zt,n),t(l,qe,n),t(l,St,n),o(Oe,l,n),t(l,Lt,n),o(Pe,l,n),t(l,qt,n),t(l,Ke,n),t(l,Ot,n),o(lt,l,n),t(l,Pt,n),t(l,bt,n),Kt=!0},p(l,[n]){const Zn={};n&1&&(Zn.fw=l[0]),$.$set(Zn);let ln=g;g=hn(l),g!==ln&&(Ue(),r(st[ln],1,1,()=>{st[ln]=null}),ie(),h=st[g],h||(h=st[g]=fn[g](l),h.c()),U(h,1),h.m(R.parentNode,R));let sn=Ts;Ts=Qn(l),Ts!==sn&&(Ue(),r(et[sn],1,1,()=>{et[sn]=null}),ie(),js=et[Ts],js||(js=et[Ts]=In[Ts](l),js.c()),U(js,1),js.m(Jt.parentNode,Jt));let en=ms;ms=kn(l),ms!==en&&(Ue(),r(tt[en],1,1,()=>{tt[en]=null}),ie(),os=tt[ms],os||(os=tt[ms]=xn[ms](l),os.c()),U(os,1),os.m(pt.parentNode,pt));let tn=bs;bs=gn(l),bs!==tn&&(Ue(),r(nt[tn],1,1,()=>{nt[tn]=null}),ie(),us=nt[bs],us||(us=nt[bs]=$n[bs](l),us.c()),U(us,1),us.m(it.parentNode,it)),l[0]==="tf"?ll?n&1&&U(ll,1):(ll=Wn(),ll.c(),U(ll,1),ll.m(Ut.parentNode,Ut)):ll&&(Ue(),r(ll,1,1,()=>{ll=null}),ie());let nn=ds;ds=_n(l),ds!==nn&&(Ue(),r(at[nn],1,1,()=>{at[nn]=null}),ie(),Cs=at[ds],Cs||(Cs=at[ds]=An[ds](l),Cs.c()),U(Cs,1),Cs.m(rt.parentNode,rt));let an=fs;fs=En(l),fs!==an&&(Ue(),r(Mt[an],1,1,()=>{Mt[an]=null}),ie(),hs=Mt[fs],hs||(hs=Mt[fs]=Rn[fs](l),hs.c()),U(hs,1),hs.m(ct.parentNode,ct)),l[0]==="pt"?sl?n&1&&U(sl,1):(sl=Gn(),sl.c(),U(sl,1),sl.m(yt.parentNode,yt)):sl&&(Ue(),r(sl,1,1,()=>{sl=null}),ie())},i(l){Kt||(U($.$$.fragment,l),U(k.$$.fragment,l),U(u.$$.fragment,l),U(h),U(al.$$.fragment,l),U(Gl.$$.fragment,l),U(vl.$$.fragment,l),U(Dl.$$.fragment,l),U(X.$$.fragment,l),U(O.$$.fragment,l),U(il.$$.fragment,l),U(wl.$$.fragment,l),U(Ll.$$.fragment,l),U(ks.$$.fragment,l),U(jl.$$.fragment,l),U(ml.$$.fragment,l),U(ol.$$.fragment,l),U(Pl.$$.fragment,l),U(ul.$$.fragment,l),U(dl.$$.fragment,l),U(rl.$$.fragment,l),U(Cl.$$.fragment,l),U(ns.$$.fragment,l),U(hl.$$.fragment,l),U(Ql.$$.fragment,l),U(xl.$$.fragment,l),U(kl.$$.fragment,l),U(ps.$$.fragment,l),U(cs.$$.fragment,l),U(Gs.$$.fragment,l),U(vs.$$.fragment,l),U(s.$$.fragment,l),U(fe.$$.fragment,l),U(Qe.$$.fragment,l),U($e.$$.fragment,l),U(js),U(Ae.$$.fragment,l),U(os),U(Ze.$$.fragment,l),U(Ve.$$.fragment,l),U(We.$$.fragment,l),U(Ge.$$.fragment,l),U(us),U(ll),U(ve.$$.fragment,l),U(Cs),U(De.$$.fragment,l),U(Ye.$$.fragment,l),U(Ne.$$.fragment,l),U(He.$$.fragment,l),U(Se.$$.fragment,l),U(hs),U(sl),U(Le.$$.fragment,l),U(Oe.$$.fragment,l),U(Pe.$$.fragment,l),U(lt.$$.fragment,l),Kt=!0)},o(l){r($.$$.fragment,l),r(k.$$.fragment,l),r(u.$$.fragment,l),r(h),r(al.$$.fragment,l),r(Gl.$$.fragment,l),r(vl.$$.fragment,l),r(Dl.$$.fragment,l),r(X.$$.fragment,l),r(O.$$.fragment,l),r(il.$$.fragment,l),r(wl.$$.fragment,l),r(Ll.$$.fragment,l),r(ks.$$.fragment,l),r(jl.$$.fragment,l),r(ml.$$.fragment,l),r(ol.$$.fragment,l),r(Pl.$$.fragment,l),r(ul.$$.fragment,l),r(dl.$$.fragment,l),r(rl.$$.fragment,l),r(Cl.$$.fragment,l),r(ns.$$.fragment,l),r(hl.$$.fragment,l),r(Ql.$$.fragment,l),r(xl.$$.fragment,l),r(kl.$$.fragment,l),r(ps.$$.fragment,l),r(cs.$$.fragment,l),r(Gs.$$.fragment,l),r(vs.$$.fragment,l),r(s.$$.fragment,l),r(fe.$$.fragment,l),r(Qe.$$.fragment,l),r($e.$$.fragment,l),r(js),r(Ae.$$.fragment,l),r(os),r(Ze.$$.fragment,l),r(Ve.$$.fragment,l),r(We.$$.fragment,l),r(Ge.$$.fragment,l),r(us),r(ll),r(ve.$$.fragment,l),r(Cs),r(De.$$.fragment,l),r(Ye.$$.fragment,l),r(Ne.$$.fragment,l),r(He.$$.fragment,l),r(Se.$$.fragment,l),r(hs),r(sl),r(Le.$$.fragment,l),r(Oe.$$.fragment,l),r(Pe.$$.fragment,l),r(lt.$$.fragment,l),Kt=!1},d(l){l&&(e(I),e(w),e(f),e(d),e(A),e(_),e(R),e(x),e(N),e(Wl),e(F),e(H),e(Ml),e(Is),e(W),e(Al),e(Z),e(_l),e(G),e(S),e(Rl),e(v),e(El),e(V),e(L),e(Zl),e(D),e(q),e(Vl),e(B),e(Bl),e(zl),e(yl),e(Jl),e(Qs),e(pl),e(xs),e(P),e(Ul),e(J),e(Sl),e(ql),e(Ds),e(Tl),e(Xs),e(Ys),e(re),e(Ol),e(Ns),e(ce),e(Kl),e(ls),e(ye),e(ss),e(Fs),e(bl),e(Hs),e(zs),e(we),e(es),e(Ss),e(Te),e(ts),e(je),e(Xl),e(Ls),e(me),e(as),e(Ms),e(qs),e(fl),e(Os),e(Ps),e(Il),e(Ks),e(le),e(oe),e(Js),e(se),e(be),e(is),e(Bs),e(Us),e(Ws),e(rs),e(ys),e(ee),e($l),e(ws),e(te),e(gl),e(ne),e(p),e(ut),e(he),e(dt),e(pe),e(Ct),e(Ie),e(ft),e(ht),e(xe),e(It),e(ke),e(Qt),e(xt),e(ge),e(kt),e(Jt),e($t),e(_e),e(gt),e(Re),e(At),e(pt),e(Ee),e(_t),e(Rt),e(Et),e(Be),e(Zt),e(Vt),e(Bt),e(it),e(Ut),e(Wt),e(rt),e(Gt),e(Xe),e(vt),e(Dt),e(Xt),e(Fe),e(Yt),e(Nt),e(ze),e(Ft),e(Ht),e(ct),e(yt),e(zt),e(qe),e(St),e(Lt),e(qt),e(Ke),e(Ot),e(Pt),e(bt)),e(i),b($,l),b(k,l),b(u,l),st[g].d(l),b(al,l),b(Gl,l),b(vl,l),b(Dl,l),b(X,l),b(O,l),b(il,l),b(wl,l),b(Ll,l),b(ks,l),b(jl,l),b(ml,l),b(ol,l),b(Pl,l),b(ul,l),b(dl,l),b(rl,l),b(Cl,l),b(ns,l),b(hl,l),b(Ql,l),b(xl,l),b(kl,l),b(ps,l),b(cs,l),b(Gs,l),b(vs,l),b(s,l),b(fe,l),b(Qe,l),b($e,l),et[Ts].d(l),b(Ae,l),tt[ms].d(l),b(Ze,l),b(Ve,l),b(We,l),b(Ge,l),nt[bs].d(l),ll&&ll.d(l),b(ve,l),at[ds].d(l),b(De,l),b(Ye,l),b(Ne,l),b(He,l),b(Se,l),Mt[fs].d(l),sl&&sl.d(l),b(Le,l),b(Oe,l),b(Pe,l),b(lt,l)}}}const Ua='{"title":"Классификация токенов","local":"token-classification","sections":[{"title":"Подготовка данных","local":"preparing-the-data","sections":[{"title":"Датасет CoNLL-2003","local":"the-conll-2003-dataset","sections":[],"depth":3},{"title":"Обработка данных","local":"processing-the-data","sections":[],"depth":3}],"depth":2},{"title":"Дообучение модели с помощью API Trainer","local":"fine-tuning-the-model-with-the-trainer-api","sections":[],"depth":2},{"title":"Дообучение модели с помощью Keras","local":"fine-tuning-the-model-with-keras","sections":[{"title":"Сопоставление данных","local":"data-collation","sections":[],"depth":3},{"title":"Определение модели","local":"defining-the-model","sections":[],"depth":3},{"title":"Дообучение модели","local":"fine-tuning-the-model","sections":[],"depth":3},{"title":"Метрики","local":"metrics","sections":[],"depth":3},{"title":"Определение модели","local":"defining-the-model","sections":[],"depth":3},{"title":"Дообучение модели","local":"fine-tuning-the-model","sections":[],"depth":3}],"depth":2},{"title":"Индивидуальный цикл обучения","local":"a-custom-training-loop","sections":[{"title":"Подготовка всего к обучению","local":"preparing-everything-for-training","sections":[],"depth":3},{"title":"Цикл обучения","local":"training-loop","sections":[],"depth":3}],"depth":2},{"title":"Использование дообученной модели","local":"using-the-fine-tuned-model","sections":[],"depth":2}],"depth":1}';function ra(E,i,I){let w="pt";return Yn(()=>{const f=new URLSearchParams(window.location.search);I(0,w=f.get("fw")||"pt")}),[w]}class ba extends Nn{constructor(i){super(),Fn(this,i,ra,ia,Dn,{})}}export{ba as component}; | |
Xet Storage Details
- Size:
- 162 kB
- Xet hash:
- 6bf4c72c53ed5c1fc68bc871b55438859d0447116f5e2e68fe92567205c009e4
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.