import{S as Xv,i as Zv,s as Kv,e as l,w as j,k as p,t as n,c as o,a as r,x as w,d as s,m as c,h as a,b as _,g as u,G as e,y as x,q as b,o as $,B as C,M as Yv,N as ed,p as Yr,v as Jv,n as Jr,L as Hv}from"../../chunks/vendor-hf-doc-builder.js";import{T as Qr}from"../../chunks/Tip-hf-doc-builder.js";import{Y as Gv}from"../../chunks/Youtube-hf-doc-builder.js";import{I as it}from"../../chunks/IconCopyLink-hf-doc-builder.js";import{C as M}from"../../chunks/CodeBlock-hf-doc-builder.js";import{C as Wv}from"../../chunks/CourseFloatingBanner-hf-doc-builder.js";import{F as Qv}from"../../chunks/FrameworkSwitchCourse-hf-doc-builder.js";function eh(V){let d,g;return d=new Wv({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/fr/chapter7/section2_tf.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/fr/chapter7/section2_tf.ipynb"}]}}),{c(){j(d.$$.fragment)},l(v){w(d.$$.fragment,v)},m(v,q){x(d,v,q),g=!0},i(v){g||(b(d.$$.fragment,v),g=!0)},o(v){$(d.$$.fragment,v),g=!1},d(v){C(d,v)}}}function sh(V){let d,g;return d=new Wv({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/fr/chapter7/section2_pt.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/fr/chapter7/section2_pt.ipynb"}]}}),{c(){j(d.$$.fragment)},l(v){w(d.$$.fragment,v)},m(v,q){x(d,v,q),g=!0},i(v){g||(b(d.$$.fragment,v),g=!0)},o(v){$(d.$$.fragment,v),g=!1},d(v){C(d,v)}}}function th(V){let d,g,v,q,O,E,k,D;return{c(){d=l("p"),g=n("\u{1F4A1} Tant que votre jeu de donn\xE9es consiste en des textes divis\xE9s en mots avec leurs \xE9tiquettes correspondantes, vous pourrez adapter les proc\xE9dures de traitement des donn\xE9es d\xE9crites ici \xE0 votre propre jeu de donn\xE9es. Reportez-vous au "),v=l("a"),q=n("chapitre 5"),O=n(" si vous avez besoin d\u2019un rafra\xEEchissement sur la fa\xE7on de charger vos propres donn\xE9es personnalis\xE9es dans un "),E=l("code"),k=n("Dataset"),D=n("."),this.h()},l(y){d=o(y,"P",{});var z=r(d);g=a(z,"\u{1F4A1} Tant que votre jeu de donn\xE9es consiste en des textes divis\xE9s en mots avec leurs \xE9tiquettes correspondantes, vous pourrez adapter les proc\xE9dures de traitement des donn\xE9es d\xE9crites ici \xE0 votre propre jeu de donn\xE9es. Reportez-vous au "),v=o(z,"A",{href:!0});var B=r(v);q=a(B,"chapitre 5"),B.forEach(s),O=a(z," si vous avez besoin d\u2019un rafra\xEEchissement sur la fa\xE7on de charger vos propres donn\xE9es personnalis\xE9es dans un "),E=o(z,"CODE",{});var N=r(E);k=a(N,"Dataset"),N.forEach(s),D=a(z,"."),z.forEach(s),this.h()},h(){_(v,"href","/course/fr/chapter5")},m(y,z){u(y,d,z),e(d,g),e(d,v),e(v,q),e(d,O),e(d,E),e(E,k),e(d,D)},d(y){y&&s(d)}}}function nh(V){let d,g,v,q,O,E,k,D;return{c(){d=l("p"),g=n("\u270F\uFE0F "),v=l("em"),q=n("A votre tour !"),O=n(" Affichez les deux m\xEAmes phrases avec leurs \xE9tiquettes POS ou "),E=l("em"),k=n("chunking"),D=n(".")},l(y){d=o(y,"P",{});var z=r(d);g=a(z,"\u270F\uFE0F "),v=o(z,"EM",{});var B=r(v);q=a(B,"A votre tour !"),B.forEach(s),O=a(z," Affichez les deux m\xEAmes phrases avec leurs \xE9tiquettes POS ou "),E=o(z,"EM",{});var N=r(E);k=a(N,"chunking"),N.forEach(s),D=a(z,"."),z.forEach(s)},m(y,z){u(y,d,z),e(d,g),e(d,v),e(v,q),e(d,O),e(d,E),e(E,k),e(d,D)},d(y){y&&s(d)}}}function ah(V){let d,g,v,q,O,E,k,D,y,z,B;return{c(){d=l("p"),g=n("\u270F\uFE0F "),v=l("em"),q=n("A votre tour !"),O=n(" Certains chercheurs pr\xE9f\xE8rent n\u2019attribuer qu\u2019une seule \xE9tiquette par mot et attribuer "),E=l("code"),k=n("-100"),D=n(" aux autres sous-"),y=l("em"),z=n("tokens"),B=n(" dans un mot donn\xE9. Ceci afin d\u2019\xE9viter que les longs mots qui se divisent en plusieurs batchs ne contribuent fortement \xE0 la perte. Changez la fonction pr\xE9c\xE9dente pour aligner les \xE9tiquettes avec les identifiants d\u2019entr\xE9e en suivant cette r\xE8gle.")},l(N){d=o(N,"P",{});var R=r(d);g=a(R,"\u270F\uFE0F "),v=o(R,"EM",{});var I=r(v);q=a(I,"A votre tour !"),I.forEach(s),O=a(R," Certains chercheurs pr\xE9f\xE8rent n\u2019attribuer qu\u2019une seule \xE9tiquette par mot et attribuer "),E=o(R,"CODE",{});var P=r(E);k=a(P,"-100"),P.forEach(s),D=a(R," aux autres sous-"),y=o(R,"EM",{});var T=r(y);z=a(T,"tokens"),T.forEach(s),B=a(R," dans un mot donn\xE9. Ceci afin d\u2019\xE9viter que les longs mots qui se divisent en plusieurs batchs ne contribuent fortement \xE0 la perte. Changez la fonction pr\xE9c\xE9dente pour aligner les \xE9tiquettes avec les identifiants d\u2019entr\xE9e en suivant cette r\xE8gle."),R.forEach(s)},m(N,R){u(N,d,R),e(d,g),e(d,v),e(v,q),e(d,O),e(d,E),e(E,k),e(d,D),e(d,y),e(y,z),e(d,B)},d(N){N&&s(d)}}}function lh(V){let d,g,v,q,O,E,k,D,y,z,B,N,R;return q=new it({}),{c(){d=l("h2"),g=l("a"),v=l("span"),j(q.$$.fragment),O=p(),E=l("span"),k=l("i"),D=n("Finetuning"),y=n(" du mod\xE8le avec Keras"),z=p(),B=l("p"),N=n("Le code utilisant Keras sera tr\xE8s similaire au pr\xE9c\xE9dent. Les seuls changements sont la fa\xE7on dont les donn\xE9es sont rassembl\xE9es dans un batch ainsi que la fonction de calcul de la m\xE9trique."),this.h()},l(I){d=o(I,"H2",{class:!0});var P=r(d);g=o(P,"A",{id:!0,class:!0,href:!0});var T=r(g);v=o(T,"SPAN",{});var W=r(v);w(q.$$.fragment,W),W.forEach(s),T.forEach(s),O=c(P),E=o(P,"SPAN",{});var G=r(E);k=o(G,"I",{});var S=r(k);D=a(S,"Finetuning"),S.forEach(s),y=a(G," du mod\xE8le avec Keras"),G.forEach(s),P.forEach(s),z=c(I),B=o(I,"P",{});var X=r(B);N=a(X,"Le code utilisant Keras sera tr\xE8s similaire au pr\xE9c\xE9dent. Les seuls changements sont la fa\xE7on dont les donn\xE9es sont rassembl\xE9es dans un batch ainsi que la fonction de calcul de la m\xE9trique."),X.forEach(s),this.h()},h(){_(g,"id","ifinetuningi-du-modle-avec-keras"),_(g,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(g,"href","#ifinetuningi-du-modle-avec-keras"),_(d,"class","relative group")},m(I,P){u(I,d,P),e(d,g),e(g,v),x(q,v,null),e(d,O),e(d,E),e(E,k),e(k,D),e(E,y),u(I,z,P),u(I,B,P),e(B,N),R=!0},i(I){R||(b(q.$$.fragment,I),R=!0)},o(I){$(q.$$.fragment,I),R=!1},d(I){I&&s(d),C(q),I&&s(z),I&&s(B)}}}function oh(V){let d,g,v,q,O,E,k,D,y,z,B,N,R,I,P,T,W,G;return q=new it({}),{c(){d=l("h2"),g=l("a"),v=l("span"),j(q.$$.fragment),O=p(),E=l("span"),k=l("i"),D=n("Finetuning"),y=n(" du mod\xE8le avec l'API "),z=l("code"),B=n("Trainer"),N=p(),R=l("p"),I=n("Le code utilisant "),P=l("code"),T=n("Trainer"),W=n(" sera le m\xEAme que pr\xE9c\xE9demment. Les seuls changements sont la fa\xE7on dont les donn\xE9es sont rassembl\xE9es dans un batch ainsi que la fonction de calcul de la m\xE9trique."),this.h()},l(S){d=o(S,"H2",{class:!0});var X=r(d);g=o(X,"A",{id:!0,class:!0,href:!0});var J=r(g);v=o(J,"SPAN",{});var ae=r(v);w(q.$$.fragment,ae),ae.forEach(s),J.forEach(s),O=c(X),E=o(X,"SPAN",{});var A=r(E);k=o(A,"I",{});var U=r(k);D=a(U,"Finetuning"),U.forEach(s),y=a(A," du mod\xE8le avec l'API "),z=o(A,"CODE",{});var se=r(z);B=a(se,"Trainer"),se.forEach(s),A.forEach(s),X.forEach(s),N=c(S),R=o(S,"P",{});var Y=r(R);I=a(Y,"Le code utilisant "),P=o(Y,"CODE",{});var ee=r(P);T=a(ee,"Trainer"),ee.forEach(s),W=a(Y," sera le m\xEAme que pr\xE9c\xE9demment. Les seuls changements sont la fa\xE7on dont les donn\xE9es sont rassembl\xE9es dans un batch ainsi que la fonction de calcul de la m\xE9trique."),Y.forEach(s),this.h()},h(){_(g,"id","ifinetuningi-du-modle-avec-lapi-trainer"),_(g,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(g,"href","#ifinetuningi-du-modle-avec-lapi-trainer"),_(d,"class","relative group")},m(S,X){u(S,d,X),e(d,g),e(g,v),x(q,v,null),e(d,O),e(d,E),e(E,k),e(k,D),e(E,y),e(E,z),e(z,B),u(S,N,X),u(S,R,X),e(R,I),e(R,P),e(P,T),e(R,W),G=!0},i(S){G||(b(q.$$.fragment,S),G=!0)},o(S){$(q.$$.fragment,S),G=!1},d(S){S&&s(d),C(q),S&&s(N),S&&s(R)}}}function rh(V){let d,g;return d=new M({props:{code:`from transformers import DataCollatorForTokenClassification

data_collator = DataCollatorForTokenClassification(
    tokenizer=tokenizer, return_tensors="tf"
)`,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">&quot;tf&quot;</span>
)`}}),{c(){j(d.$$.fragment)},l(v){w(d.$$.fragment,v)},m(v,q){x(d,v,q),g=!0},i(v){g||(b(d.$$.fragment,v),g=!0)},o(v){$(d.$$.fragment,v),g=!1},d(v){C(d,v)}}}function ih(V){let d,g;return d=new M({props:{code:`from transformers import DataCollatorForTokenClassification

data_collator = DataCollatorForTokenClassification(tokenizer=tokenizer)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> DataCollatorForTokenClassification

data_collator = DataCollatorForTokenClassification(tokenizer=tokenizer)`}}),{c(){j(d.$$.fragment)},l(v){w(d.$$.fragment,v)},m(v,q){x(d,v,q),g=!0},i(v){g||(b(d.$$.fragment,v),g=!0)},o(v){$(d.$$.fragment,v),g=!1},d(v){C(d,v)}}}function uh(V){let d,g,v,q,O,E,k,D,y,z,B,N,R,I;return z=new M({props:{code:`tf_train_dataset = tokenized_datasets["train"].to_tf_dataset(
    columns=["attention_mask", "input_ids", "labels", "token_type_ids"],
    collate_fn=data_collator,
    shuffle=True,
    batch_size=16,
)

tf_eval_dataset = tokenized_datasets["validation"].to_tf_dataset(
    columns=["attention_mask", "input_ids", "labels", "token_type_ids"],
    collate_fn=data_collator,
    shuffle=False,
    batch_size=16,
)`,highlighted:`tf_train_dataset = tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>].to_tf_dataset(
    columns=[<span class="hljs-string">&quot;attention_mask&quot;</span>, <span class="hljs-string">&quot;input_ids&quot;</span>, <span class="hljs-string">&quot;labels&quot;</span>, <span class="hljs-string">&quot;token_type_ids&quot;</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">&quot;validation&quot;</span>].to_tf_dataset(
    columns=[<span class="hljs-string">&quot;attention_mask&quot;</span>, <span class="hljs-string">&quot;input_ids&quot;</span>, <span class="hljs-string">&quot;labels&quot;</span>, <span class="hljs-string">&quot;token_type_ids&quot;</span>],
    collate_fn=data_collator,
    shuffle=<span class="hljs-literal">False</span>,
    batch_size=<span class="hljs-number">16</span>,
)`}}),{c(){d=l("p"),g=n("Notre assembleur de donn\xE9es est pr\xEAt \xE0 fonctionner ! Maintenant, utilisons-le pour cr\xE9er un "),v=l("code"),q=n("tf.data.Dataset"),O=n(" avec la m\xE9thode "),E=l("code"),k=n("to_tf_dataset()"),D=n("."),y=p(),j(z.$$.fragment),B=p(),N=l("p"),R=n("Prochain arr\xEAt : le mod\xE8le lui-m\xEAme.")},l(P){d=o(P,"P",{});var T=r(d);g=a(T,"Notre assembleur de donn\xE9es est pr\xEAt \xE0 fonctionner ! Maintenant, utilisons-le pour cr\xE9er un "),v=o(T,"CODE",{});var W=r(v);q=a(W,"tf.data.Dataset"),W.forEach(s),O=a(T," avec la m\xE9thode "),E=o(T,"CODE",{});var G=r(E);k=a(G,"to_tf_dataset()"),G.forEach(s),D=a(T,"."),T.forEach(s),y=c(P),w(z.$$.fragment,P),B=c(P),N=o(P,"P",{});var S=r(N);R=a(S,"Prochain arr\xEAt : le mod\xE8le lui-m\xEAme."),S.forEach(s)},m(P,T){u(P,d,T),e(d,g),e(d,v),e(v,q),e(d,O),e(d,E),e(E,k),e(d,D),u(P,y,T),x(z,P,T),u(P,B,T),u(P,N,T),e(N,R),I=!0},i(P){I||(b(z.$$.fragment,P),I=!0)},o(P){$(z.$$.fragment,P),I=!1},d(P){P&&s(d),P&&s(y),C(z,P),P&&s(B),P&&s(N)}}}function ph(V){let d,g,v,q,O;return{c(){d=l("p"),g=n("Comme nous pouvons le voir, le deuxi\xE8me jeu d\u2019\xE9tiquettes a \xE9t\xE9 compl\xE9t\xE9 \xE0 la longueur du premier en utilisant des "),v=l("code"),q=n("-100"),O=n(".")},l(E){d=o(E,"P",{});var k=r(d);g=a(k,"Comme nous pouvons le voir, le deuxi\xE8me jeu d\u2019\xE9tiquettes a \xE9t\xE9 compl\xE9t\xE9 \xE0 la longueur du premier en utilisant des "),v=o(k,"CODE",{});var D=r(v);q=a(D,"-100"),D.forEach(s),O=a(k,"."),k.forEach(s)},m(E,k){u(E,d,k),e(d,g),e(d,v),e(v,q),e(d,O)},i:Hv,o:Hv,d(E){E&&s(d)}}}function Uv(V){let d,g,v,q,O,E,k,D,y,z,B,N,R,I,P,T,W,G,S,X,J,ae,A,U,se,Y,ee,F,K,de,Pe,he,H,le,Q,re,Z,pe,Qe,_e,ge,ys,Ce,De,es,ne,ms,fs,Mt,qa,te,ka,dn,zs,ja,wa,ut,ss,mn,Se,fn,ts,pt,ye,Le,Os,ns,xa,as,ct,Ca,vn,hn,ze,_n,dt,ya,Un,vs,Ws,ls,Ps,Ds,At,Xs,bn,Nt,Zs,Vn,Ee,mt,Wn,qe,Tt,$n,ie,os,gn,Ks,ft,St,Xn,Ys,Lt,rs,It,me,za,Ft,hs,Ve,Js,Me,Oa,Ms,Pa,Zn,ke,En,qn,Kn,Ae,vt,kn,jn,Yn,_s,wn,Ie,is,bs,ht,Rt,As,Jn,je,Ne,Bt,$s,Da,Ns,_t,Ma,Qn,us,bt,Ht,gs,Aa,$t,Qs,et,st,We,xn,Fe,Cn,oe,ea,$e,Na,yn,gt,Ta,zn,Et,Sa,On,Gt,Ut,Pn,Dn,Xe,Mn;return q=new it({}),H=new M({props:{code:`id2label = {i: label for i, label in enumerate(label_names)}
label2id = {v: k for k, v in id2label.items()}`,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()}`}}),De=new M({props:{code:`from transformers import TFAutoModelForTokenClassification

model = TFAutoModelForTokenClassification.from_pretrained(
    model_checkpoint,
    id2label=id2label,
    label2id=label2id,
)`,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,
)`}}),ss=new M({props:{code:"model.config.num_labels",highlighted:"model.config.num_labels"}}),Se=new M({props:{code:"9",highlighted:'<span class="hljs-number">9</span>'}}),ts=new Qr({props:{warning:!0,$$slots:{default:[ch]},$$scope:{ctx:V}}}),ns=new it({}),Ws=new M({props:{code:`from huggingface_hub import notebook_login

notebook_login()`,highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> notebook_login

notebook_login()`}}),Tt=new M({props:{code:"huggingface-cli login",highlighted:"huggingface-cli login"}}),Ve=new M({props:{code:`from transformers import create_optimizer
import tensorflow as tf

# Entra\xEEner en mixed-precision float16
# Commentez cette ligne si vous utilisez un GPU qui ne b\xE9n\xE9ficiera pas de cette fonction
tf.keras.mixed_precision.set_global_policy("mixed_float16")

# Le nombre d'\xE9tapes d'entra\xEEnement est le nombre d'\xE9chantillons dans l'ensemble de donn\xE9es, divis\xE9 par la taille du batch puis multipli\xE9 par le nombre total d'\xE9poques
# par le nombre total d'\xE9poques. Notez que le jeu de donn\xE9es tf_train_dataset est ici un batchtf.data.Dataset,
# et non le jeu de donn\xE9es original Hugging Face Dataset, donc son len() est d\xE9j\xE0 num_samples // batch_size
num_epochs = 3
num_train_steps = len(tf_train_dataset) * num_epochs

optimizer, schedule = create_optimizer(
    init_lr=2e-5,
    num_warmup_steps=0,
    num_train_steps=num_train_steps,
    weight_decay_rate=0.01,
)
model.compile(optimizer=optimizer)`,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"># Entra\xEEner en mixed-precision float16</span>
<span class="hljs-comment"># Commentez cette ligne si vous utilisez un GPU qui ne b\xE9n\xE9ficiera pas de cette fonction</span>
tf.keras.mixed_precision.set_global_policy(<span class="hljs-string">&quot;mixed_float16&quot;</span>)

<span class="hljs-comment"># Le nombre d&#x27;\xE9tapes d&#x27;entra\xEEnement est le nombre d&#x27;\xE9chantillons dans l&#x27;ensemble de donn\xE9es, divis\xE9 par la taille du batch puis multipli\xE9 par le nombre total d&#x27;\xE9poques</span>
<span class="hljs-comment"># par le nombre total d&#x27;\xE9poques. Notez que le jeu de donn\xE9es tf_train_dataset est ici un batchtf.data.Dataset,</span>
<span class="hljs-comment"># et non le jeu de donn\xE9es original Hugging Face Dataset, donc son len() est d\xE9j\xE0 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)`}}),As=new M({props:{code:`from transformers.keras_callbacks import PushToHubCallback

callback = PushToHubCallback(output_dir="bert-finetuned-ner", tokenizer=tokenizer)

model.fit(
    tf_train_dataset,
    validation_data=tf_eval_dataset,
    callbacks=[callback],
    epochs=num_epochs,
)`,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">&quot;bert-finetuned-ner&quot;</span>, tokenizer=tokenizer)

model.fit(
    tf_train_dataset,
    validation_data=tf_eval_dataset,
    callbacks=[callback],
    epochs=num_epochs,
)`}}),et=new Qr({props:{$$slots:{default:[dh]},$$scope:{ctx:V}}}),{c(){d=l("h3"),g=l("a"),v=l("span"),j(q.$$.fragment),O=p(),E=l("span"),k=n("D\xE9finir le mod\xE8le"),D=p(),y=l("p"),z=n("Puisque nous travaillons sur un probl\xE8me de classification de "),B=l("em"),N=n("tokens"),R=n(", nous allons utiliser la classe "),I=l("code"),P=n("TFAutoModelForTokenClassification"),T=n(". La principale chose \xE0 retenir lors de la d\xE9finition de ce mod\xE8le est de transmettre des informations sur le nombre d\u2019\xE9tiquettes que nous avons. La fa\xE7on la plus simple de le faire est de passer ce nombre avec l\u2019argument "),W=l("code"),G=n("num_labels"),S=n(", mais si nous voulons un joli "),X=l("em"),J=n("widget"),ae=n(" d\u2019inf\xE9rence fonctionnant comme celui que nous avons vu au d\xE9but de cette section, il est pr\xE9f\xE9rable de d\xE9finir les correspondances correctes des \xE9tiquettes \xE0 la place."),A=p(),U=l("p"),se=n("Elles devraient \xEAtre d\xE9finies par deux dictionnaires, "),Y=l("code"),ee=n("id2label"),F=n(" et "),K=l("code"),de=n("label2id"),Pe=n(", qui contiennent la correspondance de l\u2019identifiant \xE0 l\u2019\xE9tiquette et vice versa :"),he=p(),j(H.$$.fragment),le=p(),Q=l("p"),re=n("Maintenant, nous pouvons simplement les passer \xE0 la m\xE9thode "),Z=l("code"),pe=n("TFAutoModelForTokenClassification.from_pretrained()"),Qe=n(", et ils seront d\xE9finis dans la configuration du mod\xE8le puis correctement enregistr\xE9s et t\xE9l\xE9charg\xE9s vers le "),_e=l("em"),ge=n("Hub"),ys=n(" :"),Ce=p(),j(De.$$.fragment),es=p(),ne=l("p"),ms=n("Comme lorsque nous avons d\xE9fini notre "),fs=l("code"),Mt=n("TFAutoModelForSequenceClassification"),qa=n(" au "),te=l("a"),ka=n("chapitre 3"),dn=n(", la cr\xE9ation du mod\xE8le \xE9met un avertissement indiquant que certains poids n\u2019ont pas \xE9t\xE9 utilis\xE9s (ceux de la t\xEAte de pr\xE9-entra\xEEnement) et que d\u2019autres poids ont \xE9t\xE9 initialis\xE9s de mani\xE8re al\xE9atoire (ceux de la t\xEAte de classification des nouveaux "),zs=l("em"),ja=n("tokens"),wa=n("), et que ce mod\xE8le doit \xEAtre entra\xEEn\xE9. Nous ferons cela dans une minute mais v\xE9rifions d\u2019abord que notre mod\xE8le a le bon nombre d\u2019\xE9tiquettes :"),ut=p(),j(ss.$$.fragment),mn=p(),j(Se.$$.fragment),fn=p(),j(ts.$$.fragment),pt=p(),ye=l("h3"),Le=l("a"),Os=l("span"),j(ns.$$.fragment),xa=p(),as=l("span"),ct=l("i"),Ca=n("Finetuning"),vn=n(" du mod\xE8le"),hn=p(),ze=l("p"),_n=n("Nous sommes maintenant pr\xEAts \xE0 entra\xEEner notre mod\xE8le ! Mais nous devons d\u2019abord faire un peu de m\xE9nage : nous devons nous connecter \xE0 Hugging Face et d\xE9finir nos hyperparam\xE8tres d\u2019entra\xEEnement. Si vous travaillez dans un "),dt=l("em"),ya=n("notebook"),Un=n(", il y a une fonction pratique pour vous aider \xE0 le faire :"),vs=p(),j(Ws.$$.fragment),ls=p(),Ps=l("p"),Ds=n("Cela affichera un "),At=l("em"),Xs=n("widget"),bn=n(" o\xF9 vous pourrez entrer vos identifiants de connexion \xE0 Hugging Face."),Nt=p(),Zs=l("p"),Vn=n("Si vous ne travaillez pas dans un "),Ee=l("em"),mt=n("notebook"),Wn=n(", tapez simplement la ligne suivante dans votre terminal :"),qe=p(),j(Tt.$$.fragment),$n=p(),ie=l("p"),os=n("Apr\xE8s s\u2019\xEAtre connect\xE9, nous pouvons pr\xE9parer tout ce dont nous avons besoin pour compiler notre mod\xE8le. \u{1F917} "),gn=l("em"),Ks=n("Transformers"),ft=n(" fournit une fonction pratique "),St=l("code"),Xn=n("create_optimizer()"),Ys=n(" qui vous donnera un optimiseur "),Lt=l("code"),rs=n("AdamW"),It=n(" avec des param\xE8tres appropri\xE9s pour le taux de d\xE9croissance des poids et le taux de d\xE9croissance de l\u2019apprentissage, les deux am\xE9liorant les performances de votre mod\xE8le par rapport \xE0 l\u2019optimiseur "),me=l("code"),za=n("Adam"),Ft=n(" :"),hs=p(),j(Ve.$$.fragment),Js=p(),Me=l("p"),Oa=n("Notez \xE9galement que nous ne fournissons pas d\u2019argument "),Ms=l("code"),Pa=n("loss"),Zn=n(" \xE0 "),ke=l("code"),En=n("compile()"),qn=n(". C\u2019est parce que les mod\xE8les peuvent en fait calculer la perte en interne. Si vous compilez sans perte et fournissez vos \xE9tiquettes dans le dictionnaire d\u2019entr\xE9e (comme nous le faisons dans nos jeux de donn\xE9es), alors le mod\xE8le s\u2019entra\xEEnera en utilisant cette perte interne, qui sera appropri\xE9e pour la t\xE2che et le type de mod\xE8le que vous avez choisi."),Kn=p(),Ae=l("p"),vt=n("Ensuite, nous d\xE9finissons un "),kn=l("code"),jn=n("PushToHubCallback"),Yn=n(" pour t\xE9l\xE9charger notre mod\xE8le vers le "),_s=l("em"),wn=n("Hub"),Ie=n(" pendant l\u2019entra\xEEnement, et nous ajustons le mod\xE8le avec ce "),is=l("em"),bs=n("callback"),ht=n(" :"),Rt=p(),j(As.$$.fragment),Jn=p(),je=l("p"),Ne=n("Vous pouvez sp\xE9cifier le nom complet du d\xE9p\xF4t vers lequel vous voulez pousser avec l\u2019argument "),Bt=l("code"),$s=n("hub_model_id"),Da=n(" (en particulier, vous devrez utiliser cet argument pour pousser vers une organisation). Par exemple, lorsque nous avons pouss\xE9 le mod\xE8le vers l\u2019organisation "),Ns=l("a"),_t=l("code"),Ma=n("huggingface-course"),Qn=n(", nous avons ajout\xE9 "),us=l("code"),bt=n('hub_model_id="huggingface-course/bert-finetuned-ner"'),Ht=n(". Par d\xE9faut, le d\xE9p\xF4t utilis\xE9 sera dans votre espace de noms et nomm\xE9 apr\xE8s le r\xE9pertoire de sortie que vous avez d\xE9fini, par exemple "),gs=l("code"),Aa=n('"cool_huggingface_user/bert-finetuned-ner"'),$t=n("."),Qs=p(),j(et.$$.fragment),st=p(),We=l("p"),xn=n("Notez que pendant l\u2019entra\xEEnement, chaque fois que le mod\xE8le est sauvegard\xE9 (ici, \xE0 chaque \xE9poque), il est t\xE9l\xE9charg\xE9 sur le "),Fe=l("em"),Cn=n("Hub"),oe=n(" en arri\xE8re-plan. De cette fa\xE7on, vous pourrez reprendre votre entra\xEEnement sur une autre machine si n\xE9cessaire."),ea=p(),$e=l("p"),Na=n("A ce stade, vous pouvez utiliser le "),yn=l("em"),gt=n("widget"),Ta=n(" d\u2019inf\xE9rence sur le "),zn=l("em"),Et=n("Hub"),Sa=n(" pour tester votre mod\xE8le et le partager avec vos amis. Vous avez r\xE9ussi \xE0 "),On=l("em"),Gt=n("finetuner"),Ut=n(" un mod\xE8le sur une t\xE2che de classification de "),Pn=l("em"),Dn=n("tokens"),Xe=n(". F\xE9licitations ! Mais quelle est la qualit\xE9 r\xE9elle de notre mod\xE8le ? Nous devons \xE9valuer certaines m\xE9triques pour le d\xE9couvrir."),this.h()},l(f){d=o(f,"H3",{class:!0});var L=r(d);g=o(L,"A",{id:!0,class:!0,href:!0});var An=r(g);v=o(An,"SPAN",{});var La=r(v);w(q.$$.fragment,La),La.forEach(s),An.forEach(s),O=c(L),E=o(L,"SPAN",{});var Ts=r(E);k=a(Ts,"D\xE9finir le mod\xE8le"),Ts.forEach(s),L.forEach(s),D=c(f),y=o(f,"P",{});var be=r(y);z=a(be,"Puisque nous travaillons sur un probl\xE8me de classification de "),B=o(be,"EM",{});var Nn=r(B);N=a(Nn,"tokens"),Nn.forEach(s),R=a(be,", nous allons utiliser la classe "),I=o(be,"CODE",{});var Es=r(I);P=a(Es,"TFAutoModelForTokenClassification"),Es.forEach(s),T=a(be,". La principale chose \xE0 retenir lors de la d\xE9finition de ce mod\xE8le est de transmettre des informations sur le nombre d\u2019\xE9tiquettes que nous avons. La fa\xE7on la plus simple de le faire est de passer ce nombre avec l\u2019argument "),W=o(be,"CODE",{});var Ia=r(W);G=a(Ia,"num_labels"),Ia.forEach(s),S=a(be,", mais si nous voulons un joli "),X=o(be,"EM",{});var Ss=r(X);J=a(Ss,"widget"),Ss.forEach(s),ae=a(be," d\u2019inf\xE9rence fonctionnant comme celui que nous avons vu au d\xE9but de cette section, il est pr\xE9f\xE9rable de d\xE9finir les correspondances correctes des \xE9tiquettes \xE0 la place."),be.forEach(s),A=c(f),U=o(f,"P",{});var Vt=r(U);se=a(Vt,"Elles devraient \xEAtre d\xE9finies par deux dictionnaires, "),Y=o(Vt,"CODE",{});var Tn=r(Y);ee=a(Tn,"id2label"),Tn.forEach(s),F=a(Vt," et "),K=o(Vt,"CODE",{});var qt=r(K);de=a(qt,"label2id"),qt.forEach(s),Pe=a(Vt,", qui contiennent la correspondance de l\u2019identifiant \xE0 l\u2019\xE9tiquette et vice versa :"),Vt.forEach(s),he=c(f),w(H.$$.fragment,f),le=c(f),Q=o(f,"P",{});var Wt=r(Q);re=a(Wt,"Maintenant, nous pouvons simplement les passer \xE0 la m\xE9thode "),Z=o(Wt,"CODE",{});var Xt=r(Z);pe=a(Xt,"TFAutoModelForTokenClassification.from_pretrained()"),Xt.forEach(s),Qe=a(Wt,", et ils seront d\xE9finis dans la configuration du mod\xE8le puis correctement enregistr\xE9s et t\xE9l\xE9charg\xE9s vers le "),_e=o(Wt,"EM",{});var Zt=r(_e);ge=a(Zt,"Hub"),Zt.forEach(s),ys=a(Wt," :"),Wt.forEach(s),Ce=c(f),w(De.$$.fragment,f),es=c(f),ne=o(f,"P",{});var Ls=r(ne);ms=a(Ls,"Comme lorsque nous avons d\xE9fini notre "),fs=o(Ls,"CODE",{});var kt=r(fs);Mt=a(kt,"TFAutoModelForSequenceClassification"),kt.forEach(s),qa=a(Ls," au "),te=o(Ls,"A",{href:!0});var Is=r(te);ka=a(Is,"chapitre 3"),Is.forEach(s),dn=a(Ls,", la cr\xE9ation du mod\xE8le \xE9met un avertissement indiquant que certains poids n\u2019ont pas \xE9t\xE9 utilis\xE9s (ceux de la t\xEAte de pr\xE9-entra\xEEnement) et que d\u2019autres poids ont \xE9t\xE9 initialis\xE9s de mani\xE8re al\xE9atoire (ceux de la t\xEAte de classification des nouveaux "),zs=o(Ls,"EM",{});var fe=r(zs);ja=a(fe,"tokens"),fe.forEach(s),wa=a(Ls,"), et que ce mod\xE8le doit \xEAtre entra\xEEn\xE9. Nous ferons cela dans une minute mais v\xE9rifions d\u2019abord que notre mod\xE8le a le bon nombre d\u2019\xE9tiquettes :"),Ls.forEach(s),ut=c(f),w(ss.$$.fragment,f),mn=c(f),w(Se.$$.fragment,f),fn=c(f),w(ts.$$.fragment,f),pt=c(f),ye=o(f,"H3",{class:!0});var Kt=r(ye);Le=o(Kt,"A",{id:!0,class:!0,href:!0});var tt=r(Le);Os=o(tt,"SPAN",{});var wl=r(Os);w(ns.$$.fragment,wl),wl.forEach(s),tt.forEach(s),xa=c(Kt),as=o(Kt,"SPAN",{});var Sn=r(as);ct=o(Sn,"I",{});var sa=r(ct);Ca=a(sa,"Finetuning"),sa.forEach(s),vn=a(Sn," du mod\xE8le"),Sn.forEach(s),Kt.forEach(s),hn=c(f),ze=o(f,"P",{});var Ln=r(ze);_n=a(Ln,"Nous sommes maintenant pr\xEAts \xE0 entra\xEEner notre mod\xE8le ! Mais nous devons d\u2019abord faire un peu de m\xE9nage : nous devons nous connecter \xE0 Hugging Face et d\xE9finir nos hyperparam\xE8tres d\u2019entra\xEEnement. Si vous travaillez dans un "),dt=o(Ln,"EM",{});var ps=r(dt);ya=a(ps,"notebook"),ps.forEach(s),Un=a(Ln,", il y a une fonction pratique pour vous aider \xE0 le faire :"),Ln.forEach(s),vs=c(f),w(Ws.$$.fragment,f),ls=c(f),Ps=o(f,"P",{});var Yt=r(Ps);Ds=a(Yt,"Cela affichera un "),At=o(Yt,"EM",{});var ta=r(At);Xs=a(ta,"widget"),ta.forEach(s),bn=a(Yt," o\xF9 vous pourrez entrer vos identifiants de connexion \xE0 Hugging Face."),Yt.forEach(s),Nt=c(f),Zs=o(f,"P",{});var na=r(Zs);Vn=a(na,"Si vous ne travaillez pas dans un "),Ee=o(na,"EM",{});var aa=r(Ee);mt=a(aa,"notebook"),aa.forEach(s),Wn=a(na,", tapez simplement la ligne suivante dans votre terminal :"),na.forEach(s),qe=c(f),w(Tt.$$.fragment,f),$n=c(f),ie=o(f,"P",{});var Ze=r(ie);os=a(Ze,"Apr\xE8s s\u2019\xEAtre connect\xE9, nous pouvons pr\xE9parer tout ce dont nous avons besoin pour compiler notre mod\xE8le. \u{1F917} "),gn=o(Ze,"EM",{});var xl=r(gn);Ks=a(xl,"Transformers"),xl.forEach(s),ft=a(Ze," fournit une fonction pratique "),St=o(Ze,"CODE",{});var la=r(St);Xn=a(la,"create_optimizer()"),la.forEach(s),Ys=a(Ze," qui vous donnera un optimiseur "),Lt=o(Ze,"CODE",{});var oa=r(Lt);rs=a(oa,"AdamW"),oa.forEach(s),It=a(Ze," avec des param\xE8tres appropri\xE9s pour le taux de d\xE9croissance des poids et le taux de d\xE9croissance de l\u2019apprentissage, les deux am\xE9liorant les performances de votre mod\xE8le par rapport \xE0 l\u2019optimiseur "),me=o(Ze,"CODE",{});var Cl=r(me);za=a(Cl,"Adam"),Cl.forEach(s),Ft=a(Ze," :"),Ze.forEach(s),hs=c(f),w(Ve.$$.fragment,f),Js=c(f),Me=o(f,"P",{});var jt=r(Me);Oa=a(jt,"Notez \xE9galement que nous ne fournissons pas d\u2019argument "),Ms=o(jt,"CODE",{});var wt=r(Ms);Pa=a(wt,"loss"),wt.forEach(s),Zn=a(jt," \xE0 "),ke=o(jt,"CODE",{});var xt=r(ke);En=a(xt,"compile()"),xt.forEach(s),qn=a(jt,". C\u2019est parce que les mod\xE8les peuvent en fait calculer la perte en interne. Si vous compilez sans perte et fournissez vos \xE9tiquettes dans le dictionnaire d\u2019entr\xE9e (comme nous le faisons dans nos jeux de donn\xE9es), alors le mod\xE8le s\u2019entra\xEEnera en utilisant cette perte interne, qui sera appropri\xE9e pour la t\xE2che et le type de mod\xE8le que vous avez choisi."),jt.forEach(s),Kn=c(f),Ae=o(f,"P",{});var Re=r(Ae);vt=a(Re,"Ensuite, nous d\xE9finissons un "),kn=o(Re,"CODE",{});var nt=r(kn);jn=a(nt,"PushToHubCallback"),nt.forEach(s),Yn=a(Re," pour t\xE9l\xE9charger notre mod\xE8le vers le "),_s=o(Re,"EM",{});var Fs=r(_s);wn=a(Fs,"Hub"),Fs.forEach(s),Ie=a(Re," pendant l\u2019entra\xEEnement, et nous ajustons le mod\xE8le avec ce "),is=o(Re,"EM",{});var ra=r(is);bs=a(ra,"callback"),ra.forEach(s),ht=a(Re," :"),Re.forEach(s),Rt=c(f),w(As.$$.fragment,f),Jn=c(f),je=o(f,"P",{});var Be=r(je);Ne=a(Be,"Vous pouvez sp\xE9cifier le nom complet du d\xE9p\xF4t vers lequel vous voulez pousser avec l\u2019argument "),Bt=o(Be,"CODE",{});var yl=r(Bt);$s=a(yl,"hub_model_id"),yl.forEach(s),Da=a(Be," (en particulier, vous devrez utiliser cet argument pour pousser vers une organisation). Par exemple, lorsque nous avons pouss\xE9 le mod\xE8le vers l\u2019organisation "),Ns=o(Be,"A",{href:!0,rel:!0});var Fa=r(Ns);_t=o(Fa,"CODE",{});var at=r(_t);Ma=a(at,"huggingface-course"),at.forEach(s),Fa.forEach(s),Qn=a(Be,", nous avons ajout\xE9 "),us=o(Be,"CODE",{});var Ra=r(us);bt=a(Ra,'hub_model_id="huggingface-course/bert-finetuned-ner"'),Ra.forEach(s),Ht=a(Be,". Par d\xE9faut, le d\xE9p\xF4t utilis\xE9 sera dans votre espace de noms et nomm\xE9 apr\xE8s le r\xE9pertoire de sortie que vous avez d\xE9fini, par exemple "),gs=o(Be,"CODE",{});var Rs=r(gs);Aa=a(Rs,'"cool_huggingface_user/bert-finetuned-ner"'),Rs.forEach(s),$t=a(Be,"."),Be.forEach(s),Qs=c(f),w(et.$$.fragment,f),st=c(f),We=o(f,"P",{});var In=r(We);xn=a(In,"Notez que pendant l\u2019entra\xEEnement, chaque fois que le mod\xE8le est sauvegard\xE9 (ici, \xE0 chaque \xE9poque), il est t\xE9l\xE9charg\xE9 sur le "),Fe=o(In,"EM",{});var Oe=r(Fe);Cn=a(Oe,"Hub"),Oe.forEach(s),oe=a(In," en arri\xE8re-plan. De cette fa\xE7on, vous pourrez reprendre votre entra\xEEnement sur une autre machine si n\xE9cessaire."),In.forEach(s),ea=c(f),$e=o(f,"P",{});var He=r($e);Na=a(He,"A ce stade, vous pouvez utiliser le "),yn=o(He,"EM",{});var ia=r(yn);gt=a(ia,"widget"),ia.forEach(s),Ta=a(He," d\u2019inf\xE9rence sur le "),zn=o(He,"EM",{});var ua=r(zn);Et=a(ua,"Hub"),ua.forEach(s),Sa=a(He," pour tester votre mod\xE8le et le partager avec vos amis. Vous avez r\xE9ussi \xE0 "),On=o(He,"EM",{});var zl=r(On);Gt=a(zl,"finetuner"),zl.forEach(s),Ut=a(He," un mod\xE8le sur une t\xE2che de classification de "),Pn=o(He,"EM",{});var Ol=r(Pn);Dn=a(Ol,"tokens"),Ol.forEach(s),Xe=a(He,". F\xE9licitations ! Mais quelle est la qualit\xE9 r\xE9elle de notre mod\xE8le ? Nous devons \xE9valuer certaines m\xE9triques pour le d\xE9couvrir."),He.forEach(s),this.h()},h(){_(g,"id","dfinir-le-modle"),_(g,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(g,"href","#dfinir-le-modle"),_(d,"class","relative group"),_(te,"href","/course/fr/chapter3"),_(Le,"id","ifinetuningi-du-modle"),_(Le,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(Le,"href","#ifinetuningi-du-modle"),_(ye,"class","relative group"),_(Ns,"href","https://huggingface.co/huggingface-course"),_(Ns,"rel","nofollow")},m(f,L){u(f,d,L),e(d,g),e(g,v),x(q,v,null),e(d,O),e(d,E),e(E,k),u(f,D,L),u(f,y,L),e(y,z),e(y,B),e(B,N),e(y,R),e(y,I),e(I,P),e(y,T),e(y,W),e(W,G),e(y,S),e(y,X),e(X,J),e(y,ae),u(f,A,L),u(f,U,L),e(U,se),e(U,Y),e(Y,ee),e(U,F),e(U,K),e(K,de),e(U,Pe),u(f,he,L),x(H,f,L),u(f,le,L),u(f,Q,L),e(Q,re),e(Q,Z),e(Z,pe),e(Q,Qe),e(Q,_e),e(_e,ge),e(Q,ys),u(f,Ce,L),x(De,f,L),u(f,es,L),u(f,ne,L),e(ne,ms),e(ne,fs),e(fs,Mt),e(ne,qa),e(ne,te),e(te,ka),e(ne,dn),e(ne,zs),e(zs,ja),e(ne,wa),u(f,ut,L),x(ss,f,L),u(f,mn,L),x(Se,f,L),u(f,fn,L),x(ts,f,L),u(f,pt,L),u(f,ye,L),e(ye,Le),e(Le,Os),x(ns,Os,null),e(ye,xa),e(ye,as),e(as,ct),e(ct,Ca),e(as,vn),u(f,hn,L),u(f,ze,L),e(ze,_n),e(ze,dt),e(dt,ya),e(ze,Un),u(f,vs,L),x(Ws,f,L),u(f,ls,L),u(f,Ps,L),e(Ps,Ds),e(Ps,At),e(At,Xs),e(Ps,bn),u(f,Nt,L),u(f,Zs,L),e(Zs,Vn),e(Zs,Ee),e(Ee,mt),e(Zs,Wn),u(f,qe,L),x(Tt,f,L),u(f,$n,L),u(f,ie,L),e(ie,os),e(ie,gn),e(gn,Ks),e(ie,ft),e(ie,St),e(St,Xn),e(ie,Ys),e(ie,Lt),e(Lt,rs),e(ie,It),e(ie,me),e(me,za),e(ie,Ft),u(f,hs,L),x(Ve,f,L),u(f,Js,L),u(f,Me,L),e(Me,Oa),e(Me,Ms),e(Ms,Pa),e(Me,Zn),e(Me,ke),e(ke,En),e(Me,qn),u(f,Kn,L),u(f,Ae,L),e(Ae,vt),e(Ae,kn),e(kn,jn),e(Ae,Yn),e(Ae,_s),e(_s,wn),e(Ae,Ie),e(Ae,is),e(is,bs),e(Ae,ht),u(f,Rt,L),x(As,f,L),u(f,Jn,L),u(f,je,L),e(je,Ne),e(je,Bt),e(Bt,$s),e(je,Da),e(je,Ns),e(Ns,_t),e(_t,Ma),e(je,Qn),e(je,us),e(us,bt),e(je,Ht),e(je,gs),e(gs,Aa),e(je,$t),u(f,Qs,L),x(et,f,L),u(f,st,L),u(f,We,L),e(We,xn),e(We,Fe),e(Fe,Cn),e(We,oe),u(f,ea,L),u(f,$e,L),e($e,Na),e($e,yn),e(yn,gt),e($e,Ta),e($e,zn),e(zn,Et),e($e,Sa),e($e,On),e(On,Gt),e($e,Ut),e($e,Pn),e(Pn,Dn),e($e,Xe),Mn=!0},i(f){Mn||(b(q.$$.fragment,f),b(H.$$.fragment,f),b(De.$$.fragment,f),b(ss.$$.fragment,f),b(Se.$$.fragment,f),b(ts.$$.fragment,f),b(ns.$$.fragment,f),b(Ws.$$.fragment,f),b(Tt.$$.fragment,f),b(Ve.$$.fragment,f),b(As.$$.fragment,f),b(et.$$.fragment,f),Mn=!0)},o(f){$(q.$$.fragment,f),$(H.$$.fragment,f),$(De.$$.fragment,f),$(ss.$$.fragment,f),$(Se.$$.fragment,f),$(ts.$$.fragment,f),$(ns.$$.fragment,f),$(Ws.$$.fragment,f),$(Tt.$$.fragment,f),$(Ve.$$.fragment,f),$(As.$$.fragment,f),$(et.$$.fragment,f),Mn=!1},d(f){f&&s(d),C(q),f&&s(D),f&&s(y),f&&s(A),f&&s(U),f&&s(he),C(H,f),f&&s(le),f&&s(Q),f&&s(Ce),C(De,f),f&&s(es),f&&s(ne),f&&s(ut),C(ss,f),f&&s(mn),C(Se,f),f&&s(fn),C(ts,f),f&&s(pt),f&&s(ye),C(ns),f&&s(hn),f&&s(ze),f&&s(vs),C(Ws,f),f&&s(ls),f&&s(Ps),f&&s(Nt),f&&s(Zs),f&&s(qe),C(Tt,f),f&&s($n),f&&s(ie),f&&s(hs),C(Ve,f),f&&s(Js),f&&s(Me),f&&s(Kn),f&&s(Ae),f&&s(Rt),C(As,f),f&&s(Jn),f&&s(je),f&&s(Qs),C(et,f),f&&s(st),f&&s(We),f&&s(ea),f&&s($e)}}}function ch(V){let d,g,v,q,O;return{c(){d=l("p"),g=n("\u26A0\uFE0F Si vous avez un mod\xE8le avec le mauvais nombre d\u2019\xE9tiquettes, vous obtiendrez plus tard une erreur obscure lors de l\u2019appel de "),v=l("code"),q=n("model.fit()"),O=n(". Cela peut \xEAtre ennuyeux \xE0 d\xE9boguer donc assurez-vous de faire cette v\xE9rification pour confirmer que vous avez le nombre d\u2019\xE9tiquettes attendu.")},l(E){d=o(E,"P",{});var k=r(d);g=a(k,"\u26A0\uFE0F Si vous avez un mod\xE8le avec le mauvais nombre d\u2019\xE9tiquettes, vous obtiendrez plus tard une erreur obscure lors de l\u2019appel de "),v=o(k,"CODE",{});var D=r(v);q=a(D,"model.fit()"),D.forEach(s),O=a(k,". Cela peut \xEAtre ennuyeux \xE0 d\xE9boguer donc assurez-vous de faire cette v\xE9rification pour confirmer que vous avez le nombre d\u2019\xE9tiquettes attendu."),k.forEach(s)},m(E,k){u(E,d,k),e(d,g),e(d,v),e(v,q),e(d,O)},d(E){E&&s(d)}}}function dh(V){let d,g,v,q,O;return{c(){d=l("p"),g=n("\u{1F4A1} Si le r\xE9pertoire de sortie que vous utilisez existe d\xE9j\xE0, il doit \xEAtre un clone local du d\xE9p\xF4t vers lequel vous voulez pousser. S\u2019il ne l\u2019est pas, vous obtiendrez une erreur lors de l\u2019appel de "),v=l("code"),q=n("model.fit()"),O=n(" et devrez d\xE9finir un nouveau nom.")},l(E){d=o(E,"P",{});var k=r(d);g=a(k,"\u{1F4A1} Si le r\xE9pertoire de sortie que vous utilisez existe d\xE9j\xE0, il doit \xEAtre un clone local du d\xE9p\xF4t vers lequel vous voulez pousser. S\u2019il ne l\u2019est pas, vous obtiendrez une erreur lors de l\u2019appel de "),v=o(k,"CODE",{});var D=r(v);q=a(D,"model.fit()"),D.forEach(s),O=a(k," et devrez d\xE9finir un nouveau nom."),k.forEach(s)},m(E,k){u(E,d,k),e(d,g),e(d,v),e(v,q),e(d,O)},d(E){E&&s(d)}}}function mh(V){let d,g,v,q,O,E,k,D,y,z,B,N,R,I,P,T,W,G,S,X,J,ae,A,U,se,Y,ee;return W=new M({props:{code:"!pip install seqeval",highlighted:"!pip install seqeval"}}),{c(){d=l("p"),g=n("Le "),v=l("em"),q=n("framework"),O=n("  traditionnel utilis\xE9 pour \xE9valuer la pr\xE9diction de la classification des "),E=l("em"),k=n("tokens"),D=n(" est "),y=l("a"),z=l("em"),B=n("seqeval"),N=n(". Pour utiliser cette m\xE9trique, nous devons d\u2019abord installer la biblioth\xE8que "),R=l("em"),I=n("seqeval"),P=n(" :"),T=p(),j(W.$$.fragment),G=p(),S=l("p"),X=n("Nous pouvons ensuite le charger via la fonction "),J=l("code"),ae=n("evaluate.load()"),A=n(" comme nous l\u2019avons fait dans le "),U=l("a"),se=n("chapitre 3"),Y=n(" :"),this.h()},l(F){d=o(F,"P",{});var K=r(d);g=a(K,"Le "),v=o(K,"EM",{});var de=r(v);q=a(de,"framework"),de.forEach(s),O=a(K,"  traditionnel utilis\xE9 pour \xE9valuer la pr\xE9diction de la classification des "),E=o(K,"EM",{});var Pe=r(E);k=a(Pe,"tokens"),Pe.forEach(s),D=a(K," est "),y=o(K,"A",{href:!0,rel:!0});var he=r(y);z=o(he,"EM",{});var H=r(z);B=a(H,"seqeval"),H.forEach(s),he.forEach(s),N=a(K,". Pour utiliser cette m\xE9trique, nous devons d\u2019abord installer la biblioth\xE8que "),R=o(K,"EM",{});var le=r(R);I=a(le,"seqeval"),le.forEach(s),P=a(K," :"),K.forEach(s),T=c(F),w(W.$$.fragment,F),G=c(F),S=o(F,"P",{});var Q=r(S);X=a(Q,"Nous pouvons ensuite le charger via la fonction "),J=o(Q,"CODE",{});var re=r(J);ae=a(re,"evaluate.load()"),re.forEach(s),A=a(Q," comme nous l\u2019avons fait dans le "),U=o(Q,"A",{href:!0});var Z=r(U);se=a(Z,"chapitre 3"),Z.forEach(s),Y=a(Q," :"),Q.forEach(s),this.h()},h(){_(y,"href","https://github.com/chakki-works/seqeval"),_(y,"rel","nofollow"),_(U,"href","/course/fr/chapter3")},m(F,K){u(F,d,K),e(d,g),e(d,v),e(v,q),e(d,O),e(d,E),e(E,k),e(d,D),e(d,y),e(y,z),e(z,B),e(d,N),e(d,R),e(R,I),e(d,P),u(F,T,K),x(W,F,K),u(F,G,K),u(F,S,K),e(S,X),e(S,J),e(J,ae),e(S,A),e(S,U),e(U,se),e(S,Y),ee=!0},i(F){ee||(b(W.$$.fragment,F),ee=!0)},o(F){$(W.$$.fragment,F),ee=!1},d(F){F&&s(d),F&&s(T),C(W,F),F&&s(G),F&&s(S)}}}function fh(V){let d,g,v,q,O,E,k,D,y,z,B,N,R,I,P,T,W,G,S,X,J,ae,A,U,se,Y,ee,F,K,de,Pe,he,H,le,Q,re;return Y=new M({props:{code:"!pip install seqeval",highlighted:"!pip install seqeval"}}),{c(){d=l("p"),g=n("Pour que le "),v=l("code"),q=n("Trainer"),O=n(" calcule une m\xE9trique \xE0 chaque \xE9poque, nous devrons d\xE9finir une fonction "),E=l("code"),k=n("compute_metrics()"),D=n(" qui prend les tableaux de pr\xE9dictions et d\u2019\xE9tiquettes, et retourne un dictionnaire avec les noms et les valeurs des m\xE9triques."),y=p(),z=l("p"),B=n("Le "),N=l("em"),R=n("framework"),I=n(" traditionnel utilis\xE9 pour \xE9valuer la pr\xE9diction de la classification des "),P=l("em"),T=n("tokens"),W=n(" est "),G=l("a"),S=l("em"),X=n("seqeval"),J=n(". Pour utiliser cette m\xE9trique, nous devons d\u2019abord installer la biblioth\xE8que "),ae=l("em"),A=n("seqeval"),U=n(" :"),se=p(),j(Y.$$.fragment),ee=p(),F=l("p"),K=n("Nous pouvons ensuite le charger via la fonction "),de=l("code"),Pe=n("evaluate.load()"),he=n(" comme nous l\u2019avons fait dans le "),H=l("a"),le=n("chapitre 3"),Q=n(" :"),this.h()},l(Z){d=o(Z,"P",{});var pe=r(d);g=a(pe,"Pour que le "),v=o(pe,"CODE",{});var Qe=r(v);q=a(Qe,"Trainer"),Qe.forEach(s),O=a(pe," calcule une m\xE9trique \xE0 chaque \xE9poque, nous devrons d\xE9finir une fonction "),E=o(pe,"CODE",{});var _e=r(E);k=a(_e,"compute_metrics()"),_e.forEach(s),D=a(pe," qui prend les tableaux de pr\xE9dictions et d\u2019\xE9tiquettes, et retourne un dictionnaire avec les noms et les valeurs des m\xE9triques."),pe.forEach(s),y=c(Z),z=o(Z,"P",{});var ge=r(z);B=a(ge,"Le "),N=o(ge,"EM",{});var ys=r(N);R=a(ys,"framework"),ys.forEach(s),I=a(ge," traditionnel utilis\xE9 pour \xE9valuer la pr\xE9diction de la classification des "),P=o(ge,"EM",{});var Ce=r(P);T=a(Ce,"tokens"),Ce.forEach(s),W=a(ge," est "),G=o(ge,"A",{href:!0,rel:!0});var De=r(G);S=o(De,"EM",{});var es=r(S);X=a(es,"seqeval"),es.forEach(s),De.forEach(s),J=a(ge,". Pour utiliser cette m\xE9trique, nous devons d\u2019abord installer la biblioth\xE8que "),ae=o(ge,"EM",{});var ne=r(ae);A=a(ne,"seqeval"),ne.forEach(s),U=a(ge," :"),ge.forEach(s),se=c(Z),w(Y.$$.fragment,Z),ee=c(Z),F=o(Z,"P",{});var ms=r(F);K=a(ms,"Nous pouvons ensuite le charger via la fonction "),de=o(ms,"CODE",{});var fs=r(de);Pe=a(fs,"evaluate.load()"),fs.forEach(s),he=a(ms," comme nous l\u2019avons fait dans le "),H=o(ms,"A",{href:!0});var Mt=r(H);le=a(Mt,"chapitre 3"),Mt.forEach(s),Q=a(ms," :"),ms.forEach(s),this.h()},h(){_(G,"href","https://github.com/chakki-works/seqeval"),_(G,"rel","nofollow"),_(H,"href","/course/fr/chapter3")},m(Z,pe){u(Z,d,pe),e(d,g),e(d,v),e(v,q),e(d,O),e(d,E),e(E,k),e(d,D),u(Z,y,pe),u(Z,z,pe),e(z,B),e(z,N),e(N,R),e(z,I),e(z,P),e(P,T),e(z,W),e(z,G),e(G,S),e(S,X),e(z,J),e(z,ae),e(ae,A),e(z,U),u(Z,se,pe),x(Y,Z,pe),u(Z,ee,pe),u(Z,F,pe),e(F,K),e(F,de),e(de,Pe),e(F,he),e(F,H),e(H,le),e(F,Q),re=!0},i(Z){re||(b(Y.$$.fragment,Z),re=!0)},o(Z){$(Y.$$.fragment,Z),re=!1},d(Z){Z&&s(d),Z&&s(y),Z&&s(z),Z&&s(se),C(Y,Z),Z&&s(ee),Z&&s(F)}}}function vh(V){let d,g,v,q,O,E,k,D,y,z,B,N,R,I,P,T,W,G,S,X,J,ae;return T=new M({props:{code:`import numpy as np

all_predictions = []
all_labels = []
for batch in tf_eval_dataset:
    logits = model.predict(batch)["logits"]
    labels = batch["labels"]
    predictions = np.argmax(logits, axis=-1)
    for prediction, label in zip(predictions, labels):
        for predicted_idx, label_idx in zip(prediction, label):
            if label_idx == -100:
                continue
            all_predictions.append(label_names[predicted_idx])
            all_labels.append(label_names[label_idx])
metric.compute(predictions=[all_predictions], references=[all_labels])`,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(batch)[<span class="hljs-string">&quot;logits&quot;</span>]
    labels = batch[<span class="hljs-string">&quot;labels&quot;</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])`}}),G=new M({props:{code:`{'LOC': {'precision': 0.91, 'recall': 0.92, 'f1': 0.91, 'number': 1668},
 'MISC': {'precision': 0.70, 'recall': 0.79, 'f1': 0.74, 'number': 702},
 'ORG': {'precision': 0.85, 'recall': 0.90, 'f1': 0.88, 'number': 1661},
 'PER': {'precision': 0.95, 'recall': 0.95, 'f1': 0.95, 'number': 1617},
 'overall_precision': 0.87,
 'overall_recall': 0.91,
 'overall_f1': 0.89,
 'overall_accuracy': 0.97}`,highlighted:`{<span class="hljs-string">&#x27;LOC&#x27;</span>: {<span class="hljs-string">&#x27;precision&#x27;</span>: <span class="hljs-number">0.91</span>, <span class="hljs-string">&#x27;recall&#x27;</span>: <span class="hljs-number">0.92</span>, <span class="hljs-string">&#x27;f1&#x27;</span>: <span class="hljs-number">0.91</span>, <span class="hljs-string">&#x27;number&#x27;</span>: <span class="hljs-number">1668</span>},
 <span class="hljs-string">&#x27;MISC&#x27;</span>: {<span class="hljs-string">&#x27;precision&#x27;</span>: <span class="hljs-number">0.70</span>, <span class="hljs-string">&#x27;recall&#x27;</span>: <span class="hljs-number">0.79</span>, <span class="hljs-string">&#x27;f1&#x27;</span>: <span class="hljs-number">0.74</span>, <span class="hljs-string">&#x27;number&#x27;</span>: <span class="hljs-number">702</span>},
 <span class="hljs-string">&#x27;ORG&#x27;</span>: {<span class="hljs-string">&#x27;precision&#x27;</span>: <span class="hljs-number">0.85</span>, <span class="hljs-string">&#x27;recall&#x27;</span>: <span class="hljs-number">0.90</span>, <span class="hljs-string">&#x27;f1&#x27;</span>: <span class="hljs-number">0.88</span>, <span class="hljs-string">&#x27;number&#x27;</span>: <span class="hljs-number">1661</span>},
 <span class="hljs-string">&#x27;PER&#x27;</span>: {<span class="hljs-string">&#x27;precision&#x27;</span>: <span class="hljs-number">0.95</span>, <span class="hljs-string">&#x27;recall&#x27;</span>: <span class="hljs-number">0.95</span>, <span class="hljs-string">&#x27;f1&#x27;</span>: <span class="hljs-number">0.95</span>, <span class="hljs-string">&#x27;number&#x27;</span>: <span class="hljs-number">1617</span>},
 <span class="hljs-string">&#x27;overall_precision&#x27;</span>: <span class="hljs-number">0.87</span>,
 <span class="hljs-string">&#x27;overall_recall&#x27;</span>: <span class="hljs-number">0.91</span>,
 <span class="hljs-string">&#x27;overall_f1&#x27;</span>: <span class="hljs-number">0.89</span>,
 <span class="hljs-string">&#x27;overall_accuracy&#x27;</span>: <span class="hljs-number">0.97</span>}`}}),{c(){d=l("p"),g=n("Cela renvoie un batch d\u2019informations ! Nous obtenons la pr\xE9cision, le rappel et le score F1 pour chaque entit\xE9 s\xE9par\xE9e, ainsi que pour l\u2019ensemble. Voyons maintenant ce qui se passe si nous essayons d\u2019utiliser les pr\xE9dictions de notre mod\xE8le pour calculer des scores r\xE9els."),v=p(),q=l("p"),O=n("TensorFlow n\u2019aime pas concat\xE9ner nos pr\xE9dictions ensemble car elles ont des longueurs de s\xE9quence variables. Cela signifie que nous ne pouvons pas simplement utiliser "),E=l("code"),k=n("model.predict()"),D=n(". Mais cela ne va pas nous arr\xEAter. Nous obtiendrons des pr\xE9dictions un batch \xE0 la fois et les concat\xE9nerons en une grande liste longue au fur et \xE0 mesure et en laissant de c\xF4t\xE9 les "),y=l("em"),z=n("tokens"),B=p(),N=l("code"),R=n("-100"),I=n(" qui indiquent le masquage/le remplissage. Puis nous calculerons les m\xE9triques sur la liste \xE0 la fin :"),P=p(),j(T.$$.fragment),W=p(),j(G.$$.fragment),S=p(),X=l("p"),J=n("Comment s\u2019est comport\xE9 votre mod\xE8le, compar\xE9 au n\xF4tre ? Si vous avez obtenu des chiffres similaires, votre entra\xEEnement a \xE9t\xE9 un succ\xE8s !")},l(A){d=o(A,"P",{});var U=r(d);g=a(U,"Cela renvoie un batch d\u2019informations ! Nous obtenons la pr\xE9cision, le rappel et le score F1 pour chaque entit\xE9 s\xE9par\xE9e, ainsi que pour l\u2019ensemble. Voyons maintenant ce qui se passe si nous essayons d\u2019utiliser les pr\xE9dictions de notre mod\xE8le pour calculer des scores r\xE9els."),U.forEach(s),v=c(A),q=o(A,"P",{});var se=r(q);O=a(se,"TensorFlow n\u2019aime pas concat\xE9ner nos pr\xE9dictions ensemble car elles ont des longueurs de s\xE9quence variables. Cela signifie que nous ne pouvons pas simplement utiliser "),E=o(se,"CODE",{});var Y=r(E);k=a(Y,"model.predict()"),Y.forEach(s),D=a(se,". Mais cela ne va pas nous arr\xEAter. Nous obtiendrons des pr\xE9dictions un batch \xE0 la fois et les concat\xE9nerons en une grande liste longue au fur et \xE0 mesure et en laissant de c\xF4t\xE9 les "),y=o(se,"EM",{});var ee=r(y);z=a(ee,"tokens"),ee.forEach(s),B=c(se),N=o(se,"CODE",{});var F=r(N);R=a(F,"-100"),F.forEach(s),I=a(se," qui indiquent le masquage/le remplissage. Puis nous calculerons les m\xE9triques sur la liste \xE0 la fin :"),se.forEach(s),P=c(A),w(T.$$.fragment,A),W=c(A),w(G.$$.fragment,A),S=c(A),X=o(A,"P",{});var K=r(X);J=a(K,"Comment s\u2019est comport\xE9 votre mod\xE8le, compar\xE9 au n\xF4tre ? Si vous avez obtenu des chiffres similaires, votre entra\xEEnement a \xE9t\xE9 un succ\xE8s !"),K.forEach(s)},m(A,U){u(A,d,U),e(d,g),u(A,v,U),u(A,q,U),e(q,O),e(q,E),e(E,k),e(q,D),e(q,y),e(y,z),e(q,B),e(q,N),e(N,R),e(q,I),u(A,P,U),x(T,A,U),u(A,W,U),x(G,A,U),u(A,S,U),u(A,X,U),e(X,J),ae=!0},i(A){ae||(b(T.$$.fragment,A),b(G.$$.fragment,A),ae=!0)},o(A){$(T.$$.fragment,A),$(G.$$.fragment,A),ae=!1},d(A){A&&s(d),A&&s(v),A&&s(q),A&&s(P),C(T,A),A&&s(W),C(G,A),A&&s(S),A&&s(X)}}}function hh(V){let d,g,v,q,O,E,k,D,y,z,B,N,R,I,P,T,W,G,S,X,J,ae,A,U,se,Y,ee,F,K,de,Pe,he;return S=new M({props:{code:`import numpy as np


def compute_metrics(eval_preds):
    logits, labels = eval_preds
    predictions = np.argmax(logits, axis=-1)

    # Suppression de l'index ignor\xE9 (tokens sp\xE9ciaux) et conversion en \xE9tiquettes
    true_labels = [[label_names[l] for l in label if l != -100] for label in labels]
    true_predictions = [
        [label_names[p] for (p, l) in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]
    all_metrics = metric.compute(predictions=true_predictions, references=true_labels)
    return {
        "precision": all_metrics["overall_precision"],
        "recall": all_metrics["overall_recall"],
        "f1": all_metrics["overall_f1"],
        "accuracy": all_metrics["overall_accuracy"],
    }`,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"># Suppression de l&#x27;index ignor\xE9 (tokens sp\xE9ciaux) et conversion en \xE9tiquettes</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">&quot;precision&quot;</span>: all_metrics[<span class="hljs-string">&quot;overall_precision&quot;</span>],
        <span class="hljs-string">&quot;recall&quot;</span>: all_metrics[<span class="hljs-string">&quot;overall_recall&quot;</span>],
        <span class="hljs-string">&quot;f1&quot;</span>: all_metrics[<span class="hljs-string">&quot;overall_f1&quot;</span>],
        <span class="hljs-string">&quot;accuracy&quot;</span>: all_metrics[<span class="hljs-string">&quot;overall_accuracy&quot;</span>],
    }`}}),{c(){d=l("p"),g=n("Cela renvoie un batch d\u2019informations ! Nous obtenons la pr\xE9cision, le rappel et le score F1 pour chaque entit\xE9 s\xE9par\xE9e, ainsi que le score global. Pour notre calcul de m\xE9trique, nous ne garderons que le score global, mais n\u2019h\xE9sitez pas \xE0 modifier la fonction "),v=l("code"),q=n("compute_metrics()"),O=n(" pour retourner toutes les m\xE9triques que vous souhaitez."),E=p(),k=l("p"),D=n("Cette fonction "),y=l("code"),z=n("compute_metrics()"),B=n(" prend d\u2019abord l\u2019argmax des logits pour les convertir en pr\xE9dictions (comme d\u2019habitude, les logits et les probabilit\xE9s sont dans le m\xEAme ordre, donc nous n\u2019avons pas besoin d\u2019appliquer la fonction softmax). Ensuite, nous devons convertir les \xE9tiquettes et les pr\xE9dictions des entiers en cha\xEEnes de caract\xE8res. Nous supprimons toutes les valeurs dont l\u2019\xE9tiquette est "),N=l("code"),R=n("-100"),I=n(", puis nous passons les r\xE9sultats \xE0 la m\xE9thode "),P=l("code"),T=n("metric.compute()"),W=n(" :"),G=p(),j(S.$$.fragment),X=p(),J=l("p"),ae=n("Maintenant que ceci est fait, nous sommes presque pr\xEAts \xE0 d\xE9finir notre "),A=l("code"),U=n("Trainer"),se=n(". Nous avons juste besoin d\u2019un objet "),Y=l("code"),ee=n("model"),F=n(" pour "),K=l("em"),de=n("finetuner"),Pe=n(" !")},l(H){d=o(H,"P",{});var le=r(d);g=a(le,"Cela renvoie un batch d\u2019informations ! Nous obtenons la pr\xE9cision, le rappel et le score F1 pour chaque entit\xE9 s\xE9par\xE9e, ainsi que le score global. Pour notre calcul de m\xE9trique, nous ne garderons que le score global, mais n\u2019h\xE9sitez pas \xE0 modifier la fonction "),v=o(le,"CODE",{});var Q=r(v);q=a(Q,"compute_metrics()"),Q.forEach(s),O=a(le," pour retourner toutes les m\xE9triques que vous souhaitez."),le.forEach(s),E=c(H),k=o(H,"P",{});var re=r(k);D=a(re,"Cette fonction "),y=o(re,"CODE",{});var Z=r(y);z=a(Z,"compute_metrics()"),Z.forEach(s),B=a(re," prend d\u2019abord l\u2019argmax des logits pour les convertir en pr\xE9dictions (comme d\u2019habitude, les logits et les probabilit\xE9s sont dans le m\xEAme ordre, donc nous n\u2019avons pas besoin d\u2019appliquer la fonction softmax). Ensuite, nous devons convertir les \xE9tiquettes et les pr\xE9dictions des entiers en cha\xEEnes de caract\xE8res. Nous supprimons toutes les valeurs dont l\u2019\xE9tiquette est "),N=o(re,"CODE",{});var pe=r(N);R=a(pe,"-100"),pe.forEach(s),I=a(re,", puis nous passons les r\xE9sultats \xE0 la m\xE9thode "),P=o(re,"CODE",{});var Qe=r(P);T=a(Qe,"metric.compute()"),Qe.forEach(s),W=a(re," :"),re.forEach(s),G=c(H),w(S.$$.fragment,H),X=c(H),J=o(H,"P",{});var _e=r(J);ae=a(_e,"Maintenant que ceci est fait, nous sommes presque pr\xEAts \xE0 d\xE9finir notre "),A=o(_e,"CODE",{});var ge=r(A);U=a(ge,"Trainer"),ge.forEach(s),se=a(_e,". Nous avons juste besoin d\u2019un objet "),Y=o(_e,"CODE",{});var ys=r(Y);ee=a(ys,"model"),ys.forEach(s),F=a(_e," pour "),K=o(_e,"EM",{});var Ce=r(K);de=a(Ce,"finetuner"),Ce.forEach(s),Pe=a(_e," !"),_e.forEach(s)},m(H,le){u(H,d,le),e(d,g),e(d,v),e(v,q),e(d,O),u(H,E,le),u(H,k,le),e(k,D),e(k,y),e(y,z),e(k,B),e(k,N),e(N,R),e(k,I),e(k,P),e(P,T),e(k,W),u(H,G,le),x(S,H,le),u(H,X,le),u(H,J,le),e(J,ae),e(J,A),e(A,U),e(J,se),e(J,Y),e(Y,ee),e(J,F),e(J,K),e(K,de),e(J,Pe),he=!0},i(H){he||(b(S.$$.fragment,H),he=!0)},o(H){$(S.$$.fragment,H),he=!1},d(H){H&&s(d),H&&s(E),H&&s(k),H&&s(G),C(S,H),H&&s(X),H&&s(J)}}}function Vv(V){let d,g,v,q,O,E,k,D,y,z,B,N,R,I,P,T,W,G,S,X,J,ae,A,U,se,Y,ee,F,K,de,Pe,he,H,le,Q,re,Z,pe,Qe,_e,ge,ys,Ce,De,es,ne,ms,fs,Mt,qa,te,ka,dn,zs,ja,wa,ut,ss,mn,Se,fn,ts,pt,ye,Le,Os,ns,xa,as,ct,Ca,vn,hn,ze,_n,dt,ya,Un,vs,Ws,ls,Ps,Ds,At,Xs,bn,Nt,Zs,Vn,Ee,mt,Wn,qe,Tt,$n,ie,os,gn,Ks,ft,St,Xn,Ys,Lt,rs,It,me,za,Ft,hs,Ve,Js,Me,Oa,Ms,Pa,Zn,ke,En,qn,Kn,Ae,vt,kn,jn,Yn,_s,wn,Ie,is,bs,ht,Rt,As,Jn,je,Ne,Bt,$s,Da,Ns,_t,Ma,Qn,us,bt,Ht,gs,Aa,$t,Qs,et,st,We,xn,Fe,Cn,oe,ea,$e,Na,yn,gt,Ta,zn,Et,Sa,On,Gt,Ut,Pn,Dn,Xe,Mn,f,L,An,La,Ts,be,Nn,Es,Ia,Ss,Vt,Tn,qt,Wt,Xt,Zt,Ls,kt,Is,fe,Kt,tt,wl,Sn,sa,Ln,ps,Yt,ta,na,aa,Ze,xl,la,oa,Cl,jt,wt,xt,Re,nt,Fs,ra,Be,yl,Fa,at,Ra,Rs,In,Oe,He,ia,ua,zl,Ol,Ct,Fn,Qo,pa,fo,vo,ei,ho,er,Ba,sr,qs,Pl,lt,si,Ha,ti,ni,Ga,ai,li,_o,Jt,bo,tr,Ua,Dl,ks,oi,Va,ri,ii,$o,Qt,go,Eo,ui,qo,ko,pi,jo,nr,Wa,wo,en,ar,Xa,Za,xo,yt,Co,Ge,ci,Ka,di,mi,Ya,fi,vi,yo,Bs,Rn,ot,Ja,zo,Oo,hi,Ml,sn,_i,Al,ca,lr,zt,da,Po,ma,Qa,Nl,Tl,or,fa,Ot,we,bi,el,$i,gi,Sl,Hs,Ei,sl,qi,ki,tl,ji,wi,nl,xi,Ci,Ll,tn,yi,Do,Gs,zi,al,Oi,Pi,Il,ll,rr,ue,Di,Mo,Ao,Mi,ol,Fl,Rl,Ai,Bl,rl,ir,nn,Ni,No,To,Ti,ur,Pt,pr,xe,So,Lo,Si,Io,Fo,Li,Ro,Bo,Ii,cr,Bn,dr,il,Hl,an,Fi,ul,Ri,Bi,pl,Hi,Gi,Ho,js,mr,Hn,fr,ve,cl,dl,Ui,Vi,Gl;return q=new it({}),H=new M({props:{code:`id2label = {i: label for i, label in enumerate(label_names)}
label2id = {v: k for k, v in id2label.items()}`,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()}`}}),De=new M({props:{code:`from transformers import AutoModelForTokenClassification

model = AutoModelForTokenClassification.from_pretrained(
    model_checkpoint,
    id2label=id2label,
    label2id=label2id,
)`,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,
)`}}),ss=new M({props:{code:"model.config.num_labels",highlighted:"model.config.num_labels"}}),Se=new M({props:{code:"9",highlighted:'<span class="hljs-number">9</span>'}}),ts=new Qr({props:{warning:!0,$$slots:{default:[_h]},$$scope:{ctx:V}}}),ns=new it({}),Ds=new M({props:{code:`from huggingface_hub import notebook_login

notebook_login()`,highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> notebook_login

notebook_login()`}}),os=new M({props:{code:"huggingface-cli login",highlighted:"huggingface-cli login"}}),rs=new M({props:{code:`from transformers import TrainingArguments

args = TrainingArguments(
    "bert-finetuned-ner",
    evaluation_strategy="epoch",
    save_strategy="epoch",
    learning_rate=2e-5,
    num_train_epochs=3,
    weight_decay=0.01,
    push_to_hub=True,
)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> TrainingArguments

args = TrainingArguments(
    <span class="hljs-string">&quot;bert-finetuned-ner&quot;</span>,
    evaluation_strategy=<span class="hljs-string">&quot;epoch&quot;</span>,
    save_strategy=<span class="hljs-string">&quot;epoch&quot;</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>,
)`}}),Ie=new Qr({props:{$$slots:{default:[bh]},$$scope:{ctx:V}}}),Ne=new M({props:{code:`from transformers import Trainer

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    data_collator=data_collator,
    compute_metrics=compute_metrics,
    tokenizer=tokenizer,
)
trainer.train()`,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">&quot;train&quot;</span>],
    eval_dataset=tokenized_datasets[<span class="hljs-string">&quot;validation&quot;</span>],
    data_collator=data_collator,
    compute_metrics=compute_metrics,
    tokenizer=tokenizer,
)
trainer.train()`}}),Qs=new M({props:{code:'trainer.push_to_hub(commit_message="Training complete")',highlighted:'trainer.push_to_hub(commit_message=<span class="hljs-string">&quot;Training complete&quot;</span>)'}}),Fe=new M({props:{code:"'https://huggingface.co/sgugger/bert-finetuned-ner/commit/26ab21e5b1568f9afeccdaed2d8715f571d786ed'",highlighted:'<span class="hljs-string">&#x27;https://huggingface.co/sgugger/bert-finetuned-ner/commit/26ab21e5b1568f9afeccdaed2d8715f571d786ed&#x27;</span>'}}),Es=new it({}),tt=new it({}),xt=new M({props:{code:`from torch.utils.data import DataLoader

train_dataloader = DataLoader(
    tokenized_datasets["train"],
    shuffle=True,
    collate_fn=data_collator,
    batch_size=8,
)
eval_dataloader = DataLoader(
    tokenized_datasets["validation"], collate_fn=data_collator, batch_size=8
)`,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">&quot;train&quot;</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">&quot;validation&quot;</span>], collate_fn=data_collator, batch_size=<span class="hljs-number">8</span>
)`}}),at=new M({props:{code:`model = AutoModelForTokenClassification.from_pretrained(
    model_checkpoint,
    id2label=id2label,
    label2id=label2id,
)`,highlighted:`model = AutoModelForTokenClassification.from_pretrained(
    model_checkpoint,
    id2label=id2label,
    label2id=label2id,
)`}}),Fn=new M({props:{code:`from torch.optim import AdamW

optimizer = AdamW(model.parameters(), lr=2e-5)`,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>)`}}),Ba=new M({props:{code:`from accelerate import Accelerator

accelerator = Accelerator()
model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare(
    model, optimizer, train_dataloader, eval_dataloader
)`,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
)`}}),qs=new Qr({props:{$$slots:{default:[$h]},$$scope:{ctx:V}}}),Ua=new M({props:{code:`from transformers import get_scheduler

num_train_epochs = 3
num_update_steps_per_epoch = len(train_dataloader)
num_training_steps = num_train_epochs * num_update_steps_per_epoch

lr_scheduler = get_scheduler(
    "linear",
    optimizer=optimizer,
    num_warmup_steps=0,
    num_training_steps=num_training_steps,
)`,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">&quot;linear&quot;</span>,
    optimizer=optimizer,
    num_warmup_steps=<span class="hljs-number">0</span>,
    num_training_steps=num_training_steps,
)`}}),Wa=new M({props:{code:`from huggingface_hub import Repository, get_full_repo_name

model_name = "bert-finetuned-ner-accelerate"
repo_name = get_full_repo_name(model_name)
repo_name`,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">&quot;bert-finetuned-ner-accelerate&quot;</span>
repo_name = get_full_repo_name(model_name)
repo_name`}}),en=new M({props:{code:"'sgugger/bert-finetuned-ner-accelerate'",highlighted:'<span class="hljs-string">&#x27;sgugger/bert-finetuned-ner-accelerate&#x27;</span>'}}),yt=new M({props:{code:`output_dir = "bert-finetuned-ner-accelerate"
repo = Repository(output_dir, clone_from=repo_name)`,highlighted:`output_dir = <span class="hljs-string">&quot;bert-finetuned-ner-accelerate&quot;</span>
repo = Repository(output_dir, clone_from=repo_name)`}}),Ja=new it({}),Qa=new M({props:{code:`def postprocess(predictions, labels):
    predictions = predictions.detach().cpu().clone().numpy()
    labels = labels.detach().cpu().clone().numpy()

    # Suppression de l'index ignor\xE9 (tokens sp\xE9ciaux) et conversion en \xE9tiquettes
    true_labels = [[label_names[l] for l in label if l != -100] for label in labels]
    true_predictions = [
        [label_names[p] for (p, l) in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]
    return true_labels, true_predictions`,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"># Suppression de l&#x27;index ignor\xE9 (tokens sp\xE9ciaux) et conversion en \xE9tiquettes</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`}}),rl=new M({props:{code:`from tqdm.auto import tqdm
import torch

progress_bar = tqdm(range(num_training_steps))

for epoch in range(num_train_epochs):
    # Entra\xEEnement
    model.train()
    for batch in train_dataloader:
        outputs = model(**batch)
        loss = outputs.loss
        accelerator.backward(loss)

        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()
        progress_bar.update(1)

    # Evaluation
    model.eval()
    for batch in eval_dataloader:
        with torch.no_grad():
            outputs = model(**batch)

        predictions = outputs.logits.argmax(dim=-1)
        labels = batch["labels"]

        # N\xE9cessaire pour rembourrer les pr\xE9dictions et les \xE9tiquettes \xE0 rassembler
        predictions = accelerator.pad_across_processes(predictions, dim=1, pad_index=-100)
        labels = accelerator.pad_across_processes(labels, dim=1, pad_index=-100)

        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()
    print(
        f"epoch {epoch}:",
        {
            key: results[f"overall_{key}"]
            for key in ["precision", "recall", "f1", "accuracy"]
        },
    )

    # Sauvegarder et t\xE9l\xE9charger
    accelerator.wait_for_everyone()
    unwrapped_model = accelerator.unwrap_model(model)
    unwrapped_model.save_pretrained(output_dir, save_function=accelerator.save)
    if accelerator.is_main_process:
        tokenizer.save_pretrained(output_dir)
        repo.push_to_hub(
            commit_message=f"Training in progress epoch {epoch}", blocking=False
        )`,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"># Entra\xEEnement</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"># Evaluation</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">&quot;labels&quot;</span>]

        <span class="hljs-comment"># N\xE9cessaire pour rembourrer les pr\xE9dictions et les \xE9tiquettes \xE0 rassembler</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&quot;epoch <span class="hljs-subst">{epoch}</span>:&quot;</span>,
        {
            key: results[<span class="hljs-string">f&quot;overall_<span class="hljs-subst">{key}</span>&quot;</span>]
            <span class="hljs-keyword">for</span> key <span class="hljs-keyword">in</span> [<span class="hljs-string">&quot;precision&quot;</span>, <span class="hljs-string">&quot;recall&quot;</span>, <span class="hljs-string">&quot;f1&quot;</span>, <span class="hljs-string">&quot;accuracy&quot;</span>]
        },
    )

    <span class="hljs-comment"># Sauvegarder et t\xE9l\xE9charger</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&quot;Training in progress epoch <span class="hljs-subst">{epoch}</span>&quot;</span>, blocking=<span class="hljs-literal">False</span>
        )`}}),Pt=new M({props:{code:`accelerator.wait_for_everyone()
unwrapped_model = accelerator.unwrap_model(model)
unwrapped_model.save_pretrained(output_dir, save_function=accelerator.save)`,highlighted:`accelerator.wait_for_everyone()
unwrapped_model = accelerator.unwrap_model(model)
unwrapped_model.save_pretrained(output_dir, save_function=accelerator.save)`}}),{c(){d=l("h3"),g=l("a"),v=l("span"),j(q.$$.fragment),O=p(),E=l("span"),k=n("D\xE9finir le mod\xE8le"),D=p(),y=l("p"),z=n("Puisque nous travaillons sur un probl\xE8me de classification de "),B=l("em"),N=n("tokens"),R=n(", nous allons utiliser la classe "),I=l("code"),P=n("AutoModelForTokenClassification"),T=n(". La principale chose \xE0 retenir lors de la d\xE9finition de ce mod\xE8le est de transmettre des informations sur le nombre d\u2019\xE9tiquettes que nous avons. La fa\xE7on la plus simple de le faire est de passer ce nombre avec l\u2019argument "),W=l("code"),G=n("num_labels"),S=n(", mais si nous voulons un joli "),X=l("em"),J=n("widget"),ae=n(" d\u2019inf\xE9rence fonctionnant comme celui que nous avons vu au d\xE9but de cette section, il est pr\xE9f\xE9rable de d\xE9finir les correspondances des \xE9tiquettes \xE0 la place."),A=p(),U=l("p"),se=n("Elles devraient \xEAtre d\xE9finies par deux dictionnaires, "),Y=l("code"),ee=n("id2label"),F=n(" et "),K=l("code"),de=n("label2id"),Pe=n(", qui contiennent les correspondances entre identifiants et \xE9tiquettes et vice versa :"),he=p(),j(H.$$.fragment),le=p(),Q=l("p"),re=n("Maintenant nous pouvons simplement les passer \xE0 la m\xE9thode "),Z=l("code"),pe=n("AutoModelForTokenClassification.from_pretrained()"),Qe=n(", ils seront d\xE9finis dans la configuration du mod\xE8le puis correctement sauvegard\xE9s et t\xE9l\xE9charg\xE9s vers le "),_e=l("em"),ge=n("Hub"),ys=n(" :"),Ce=p(),j(De.$$.fragment),es=p(),ne=l("p"),ms=n("Comme lorsque nous avons d\xE9fini notre "),fs=l("code"),Mt=n("AutoModelForSequenceClassification"),qa=n(" au "),te=l("a"),ka=n("chapitre 3"),dn=n(", la cr\xE9ation du mod\xE8le \xE9met un avertissement indiquant que certains poids n\u2019ont pas \xE9t\xE9 utilis\xE9s (ceux de la t\xEAte de pr\xE9-entra\xEEnement) et que d\u2019autres poids ont \xE9t\xE9 initialis\xE9s de mani\xE8re al\xE9atoire (ceux de la t\xEAte de classification des nouveaux "),zs=l("em"),ja=n("tokens"),wa=n("), et que ce mod\xE8le doit \xEAtre entra\xEEn\xE9. Nous ferons cela dans une minute, mais v\xE9rifions d\u2019abord que notre mod\xE8le a le bon nombre d\u2019\xE9tiquettes :"),ut=p(),j(ss.$$.fragment),mn=p(),j(Se.$$.fragment),fn=p(),j(ts.$$.fragment),pt=p(),ye=l("h3"),Le=l("a"),Os=l("span"),j(ns.$$.fragment),xa=p(),as=l("span"),ct=l("i"),Ca=n("Finetuning"),vn=n(" du mod\xE8le"),hn=p(),ze=l("p"),_n=n("Nous sommes maintenant pr\xEAts \xE0 entra\xEEner notre mod\xE8le ! Nous devons juste faire deux derni\xE8res choses avant de d\xE9finir notre "),dt=l("code"),ya=n("Trainer"),Un=n(" : se connecter \xE0 Hugging Face et d\xE9finir nos arguments d\u2019entra\xEEnement. Si vous travaillez dans un "),vs=l("em"),Ws=n("notebook"),ls=n(", il y a une fonction pratique pour vous aider \xE0 le faire :"),Ps=p(),j(Ds.$$.fragment),At=p(),Xs=l("p"),bn=n("Cela affichera un "),Nt=l("em"),Zs=n("widget"),Vn=n(" o\xF9 vous pourrez entrer vos identifiants de connexion \xE0 Hugging Face."),Ee=p(),mt=l("p"),Wn=n("Si vous ne travaillez pas dans un "),qe=l("em"),Tt=n("notebook"),$n=n(", tapez simplement la ligne suivante dans votre terminal :"),ie=p(),j(os.$$.fragment),gn=p(),Ks=l("p"),ft=n("Une fois ceci fait, nous pouvons d\xE9finir nos "),St=l("code"),Xn=n("TrainingArguments"),Ys=n(" :"),Lt=p(),j(rs.$$.fragment),It=p(),me=l("p"),za=n("Vous avez d\xE9j\xE0 vu la plupart d\u2019entre eux. Nous d\xE9finissons quelques hyperparam\xE8tres (comme le taux d\u2019apprentissage, le nombre d\u2019\xE9poques \xE0 entra\xEEner, et le taux de d\xE9croissance des poids), et nous sp\xE9cifions "),Ft=l("code"),hs=n("push_to_hub=True"),Ve=n(" pour indiquer que nous voulons sauvegarder le mod\xE8le, l\u2019\xE9valuer \xE0 la fin de chaque \xE9poque, et que nous voulons t\xE9l\xE9charger nos r\xE9sultats vers le "),Js=l("em"),Me=n("Hub"),Oa=n(". Notez que vous pouvez sp\xE9cifier le nom du d\xE9p\xF4t vers lequel vous voulez pousser avec l\u2019argument "),Ms=l("code"),Pa=n("hub_model_id"),Zn=n(" (en particulier, vous devrez utiliser cet argument pour pousser vers une organisation). Par exemple, lorsque nous avons pouss\xE9 le mod\xE8le vers l\u2019organisation "),ke=l("a"),En=l("code"),qn=n("huggingface-course"),Kn=n(", nous avons ajout\xE9 "),Ae=l("code"),vt=n('hub_model_id="huggingface-course/bert-finetuned-ner"``TrainingArguments'),kn=n(". Par d\xE9faut, le d\xE9p\xF4t utilis\xE9 sera dans votre espace de noms et nomm\xE9 d\u2019apr\xE8s le r\xE9pertoire de sortie que vous avez d\xE9fini, donc dans notre cas ce sera "),jn=l("code"),Yn=n('"sgugger/bert-finetuned-ner"'),_s=n("."),wn=p(),j(Ie.$$.fragment),is=p(),bs=l("p"),ht=n("Enfin, nous passons tout au "),Rt=l("code"),As=n("Trainer"),Jn=n(" et lan\xE7ons l\u2019entra\xEEnement :"),je=p(),j(Ne.$$.fragment),Bt=p(),$s=l("p"),Da=n("Notez que pendant l\u2019entra\xEEnement, chaque fois que le mod\xE8le est sauvegard\xE9 (ici, \xE0 chaque \xE9poque), il est t\xE9l\xE9charg\xE9 sur le "),Ns=l("em"),_t=n("Hub"),Ma=n(" en arri\xE8re-plan. De cette fa\xE7on, vous serez en mesure de reprendre votre entra\xEEnement sur une autre machine si n\xE9cessaire."),Qn=p(),us=l("p"),bt=n("Une fois l\u2019entra\xEEnement termin\xE9, nous utilisons la m\xE9thode "),Ht=l("code"),gs=n("push_to_hub()"),Aa=n(" pour nous assurer que nous t\xE9l\xE9chargeons la version la plus r\xE9cente du mod\xE8le :"),$t=p(),j(Qs.$$.fragment),et=p(),st=l("p"),We=n("Cette commande renvoie l\u2019URL du commit qu\u2019elle vient de faire, si vous voulez l\u2019inspecter :"),xn=p(),j(Fe.$$.fragment),Cn=p(),oe=l("p"),ea=n("Le "),$e=l("code"),Na=n("Trainer"),yn=n(" r\xE9dige \xE9galement une carte mod\xE8le avec tous les r\xE9sultats de l\u2019\xE9valuation et la t\xE9l\xE9charge. A ce stade, vous pouvez utiliser le "),gt=l("em"),Ta=n("widget"),zn=n(" d\u2019inf\xE9rence sur le "),Et=l("em"),Sa=n("Hub"),On=n(" pour tester votre mod\xE8le et le partager avec vos amis. Vous avez r\xE9ussi \xE0 affiner un mod\xE8le sur une t\xE2che de classification de "),Gt=l("em"),Ut=n("tokens"),Pn=n(". F\xE9licitations !"),Dn=p(),Xe=l("p"),Mn=n("Si vous voulez plonger un peu plus profond\xE9ment dans la boucle d\u2019entra\xEEnement, nous allons maintenant vous montrer comment faire la m\xEAme chose en utilisant \u{1F917} "),f=l("em"),L=n("Accelerate"),An=n("."),La=p(),Ts=l("h2"),be=l("a"),Nn=l("span"),j(Es.$$.fragment),Ia=p(),Ss=l("span"),Vt=n("Une boucle d'entra\xEEnement personnalis\xE9e"),Tn=p(),qt=l("p"),Wt=n("Jetons maintenant un coup d\u2019\u0153il \xE0 la boucle d\u2019entra\xEEnement compl\xE8te afin que vous puissiez facilement personnaliser les parties dont vous avez besoin. Elle ressemblera beaucoup \xE0 ce que nous avons fait dans le "),Xt=l("a"),Zt=n("chapitre 3"),Ls=n(" avec quelques changements pour l\u2019\xE9valuation."),kt=p(),Is=l("h3"),fe=l("a"),Kt=l("span"),j(tt.$$.fragment),wl=p(),Sn=l("span"),sa=n("Pr\xE9parer tout pour l'entra\xEEnement"),Ln=p(),ps=l("p"),Yt=n("D\u2019abord nous devons construire le "),ta=l("code"),na=n("DataLoader"),aa=n("s \xE0 partir de nos jeux de donn\xE9es. Nous r\xE9utilisons notre "),Ze=l("code"),xl=n("data_collator"),la=n(" comme un "),oa=l("code"),Cl=n("collate_fn"),jt=n(" et m\xE9langer l\u2019ensemble d\u2019entra\xEEnement, mais pas l\u2019ensemble de validation :"),wt=p(),j(xt.$$.fragment),Re=p(),nt=l("p"),Fs=n("Ensuite, nous r\xE9instantifions notre mod\xE8le pour nous assurer que nous ne continuons pas le "),ra=l("em"),Be=n("finetuning"),yl=n(" d\u2019avant et que nous repartons bien du mod\xE8le pr\xE9-entra\xEEn\xE9 de BERT :"),Fa=p(),j(at.$$.fragment),Ra=p(),Rs=l("p"),In=n("Ensuite, nous avons besoin d\u2019un optimiseur. Nous utilisons le classique "),Oe=l("code"),He=n("AdamW"),ia=n(", qui est comme "),ua=l("code"),zl=n("Adam"),Ol=n(", mais avec un correctif dans la fa\xE7on dont le taux de d\xE9croissance des poids est appliqu\xE9e :"),Ct=p(),j(Fn.$$.fragment),Qo=p(),pa=l("p"),fo=n("Une fois que nous avons tous ces objets, nous pouvons les envoyer \xE0 la m\xE9thode "),vo=l("code"),ei=n("accelerator.prepare()"),ho=n(" :"),er=p(),j(Ba.$$.fragment),sr=p(),j(qs.$$.fragment),Pl=p(),lt=l("p"),si=n("Maintenant que nous avons envoy\xE9 notre "),Ha=l("code"),ti=n("train_dataloader"),ni=n(" \xE0 "),Ga=l("code"),ai=n("accelerator.prepare()"),li=n(", nous pouvons utiliser sa longueur pour calculer le nombre d\u2019\xE9tapes d\u2019entra\xEEnement. Rappelez-vous que nous devrions toujours faire cela apr\xE8s avoir pr\xE9par\xE9 le "),_o=l("em"),Jt=n("dataloader"),bo=n(" car cette m\xE9thode modifiera sa longueur. Nous utilisons un programme lin\xE9aire classique du taux d\u2019apprentissage \xE0 0 :"),tr=p(),j(Ua.$$.fragment),Dl=p(),ks=l("p"),oi=n("Enfin, pour pousser notre mod\xE8le vers le "),Va=l("em"),ri=n("Hub"),ii=n(", nous avons besoin de cr\xE9er un objet "),$o=l("code"),Qt=n("Repository"),go=n(" dans un dossier de travail. Tout d\u2019abord, connectez-vous \xE0 Hugging Face si vous n\u2019\xEAtes pas d\xE9j\xE0 connect\xE9. Nous d\xE9terminons le nom du d\xE9p\xF4t \xE0 partir de l\u2019identifiant du mod\xE8le que nous voulons donner \xE0 notre mod\xE8le (n\u2019h\xE9sitez pas \xE0 remplacer le "),Eo=l("code"),ui=n("repo_name"),qo=n(" par votre propre choix, il doit juste contenir votre nom d\u2019utilisateur et ce que fait la fonction "),ko=l("code"),pi=n("get_full_repo_name()"),jo=n(") :"),nr=p(),j(Wa.$$.fragment),wo=p(),j(en.$$.fragment),ar=p(),Xa=l("p"),Za=n("Ensuite, nous pouvons cloner ce d\xE9p\xF4t dans un dossier local. S\u2019il existe d\xE9j\xE0, ce dossier local doit \xEAtre un clone existant du d\xE9p\xF4t avec lequel nous travaillons :"),xo=p(),j(yt.$$.fragment),Co=p(),Ge=l("p"),ci=n("Nous pouvons maintenant t\xE9l\xE9charger tout ce que nous sauvegardons dans "),Ka=l("code"),di=n("output_dir"),mi=n(" en appelant la m\xE9thode "),Ya=l("code"),fi=n("repo.push_to_hub()"),vi=n(". Cela nous aidera \xE0 t\xE9l\xE9charger les mod\xE8les interm\xE9diaires \xE0 la fin de chaque \xE9poque."),yo=p(),Bs=l("h3"),Rn=l("a"),ot=l("span"),j(Ja.$$.fragment),zo=p(),Oo=l("span"),hi=n("Boucle d'entra\xEEnement"),Ml=p(),sn=l("p"),_i=n("Nous sommes maintenant pr\xEAts \xE0 \xE9crire la boucle d\u2019entra\xEEnement compl\xE8te. Pour simplifier sa partie \xE9valuation, nous d\xE9finissons cette fonction "),Al=l("code"),ca=n("postprocess()"),lr=n(" qui prend les pr\xE9dictions et les \xE9tiquettes, et les convertit en listes de cha\xEEnes de caract\xE8res comme notre objet "),zt=l("code"),da=n("metric"),Po=n(" l\u2019attend :"),ma=p(),j(Qa.$$.fragment),Nl=p(),Tl=l("p"),or=n("Ensuite, nous pouvons \xE9crire la boucle d\u2019entra\xEEnement. Apr\xE8s avoir d\xE9fini une barre de progression pour suivre l\u2019\xE9volution de l\u2019entra\xEEnement, la boucle comporte trois parties :"),fa=p(),Ot=l("ul"),we=l("li"),bi=n("L\u2019entra\xEEnement proprement dit, qui est l\u2019it\xE9ration classique sur le "),el=l("code"),$i=n("train_dataloader"),gi=n(", passage en avant, puis passage en arri\xE8re et \xE9tape d\u2019optimisation."),Sl=p(),Hs=l("li"),Ei=n("L\u2019\xE9valuation, dans laquelle il y a une nouveaut\xE9 apr\xE8s avoir obtenu les sorties de notre mod\xE8le sur un batch : puisque deux processus peuvent avoir padd\xE9 les entr\xE9es et les \xE9tiquettes \xE0 des formes diff\xE9rentes, nous devons utiliser "),sl=l("code"),qi=n("accelerator.pad_across_processes()"),ki=n(" pour rendre les pr\xE9dictions et les \xE9tiquettes de la m\xEAme forme avant d\u2019appeler la m\xE9thode "),tl=l("code"),ji=n("gather()"),wi=n(". Si nous ne le faisons pas, l\u2019\xE9valuation va soit se tromper, soit se bloquer pour toujours. Ensuite, nous envoyons les r\xE9sultats \xE0 "),nl=l("code"),xi=n("metric.add_batch()"),Ci=n(" et appelons "),Ll=l("code"),tn=n("metric.compute()"),yi=n(" une fois que la boucle d\u2019\xE9valuation est termin\xE9e."),Do=p(),Gs=l("li"),zi=n("Sauvegarde et t\xE9l\xE9chargement, o\xF9 nous sauvegardons d\u2019abord le mod\xE8le et le "),al=l("em"),Oi=n("tokenizer"),Pi=n(", puis appelons "),Il=l("code"),ll=n("repo.push_to_hub()"),rr=n(". Remarquez que nous utilisons l\u2019argument "),ue=l("code"),Di=n("blocking=False"),Mo=n(" pour indiquer \xE0 la biblioth\xE8que \u{1F917} "),Ao=l("em"),Mi=n("Hub"),ol=n(" de pousser dans un processus asynchrone. De cette fa\xE7on, l\u2019entra\xEEnement continue normalement et cette (longue) instruction est ex\xE9cut\xE9e en arri\xE8re-plan."),Fl=p(),Rl=l("p"),Ai=n("Voici le code complet de la boucle d\u2019entra\xEEnement :"),Bl=p(),j(rl.$$.fragment),ir=p(),nn=l("p"),Ni=n("Au cas o\xF9 ce serait la premi\xE8re fois que vous verriez un mod\xE8le enregistr\xE9 avec \u{1F917} "),No=l("em"),To=n("Accelerate"),Ti=n(", prenons un moment pour inspecter les trois lignes de code qui l\u2019accompagnent :"),ur=p(),j(Pt.$$.fragment),pr=p(),xe=l("p"),So=n("La premi\xE8re ligne est explicite : elle indique \xE0 tous les processus d\u2019attendre que tout le monde soit \xE0 ce stade avant de continuer. C\u2019est pour s\u2019assurer que nous avons le m\xEAme mod\xE8le dans chaque processus avant de sauvegarder. Ensuite, nous prenons le "),Lo=l("code"),Si=n("unwrapped_model"),Io=n(" qui est le mod\xE8le de base que nous avons d\xE9fini. La m\xE9thode "),Fo=l("code"),Li=n("accelerator.prepare()"),Ro=n(" modifie le mod\xE8le pour qu\u2019il fonctionne dans l\u2019entra\xEEnement distribu\xE9, donc il n\u2019aura plus la m\xE9thode "),Bo=l("code"),Ii=n("save_pretrained()"),cr=n(" ; la m\xE9thode "),Bn=l("code"),dr=n("accelerator.unwrap_model()"),il=n(" annule cette \xE9tape. Enfin, nous appelons "),Hl=l("code"),an=n("save_pretrained()"),Fi=n(" mais nous disons \xE0 cette m\xE9thode d\u2019utiliser "),ul=l("code"),Ri=n("accelerator.save()"),Bi=n(" au lieu de "),pl=l("code"),Hi=n("torch.save()"),Gi=n("."),Ho=p(),js=l("p"),mr=n("Une fois ceci fait, vous devriez avoir un mod\xE8le qui produit des r\xE9sultats assez similaires \xE0 celui entra\xEEn\xE9 avec le "),Hn=l("code"),fr=n("Trainer"),ve=n(". Vous pouvez v\xE9rifier le mod\xE8le que nous avons form\xE9 en utilisant ce code \xE0 "),cl=l("a"),dl=l("em"),Ui=n("huggingface-course/bert-finetuned-ner-accelerate"),Vi=n(". Et si vous voulez tester des modifications de la boucle d\u2019entra\xEEnement, vous pouvez les impl\xE9menter directement en modifiant le code ci-dessus !"),this.h()},l(i){d=o(i,"H3",{class:!0});var h=r(d);g=o(h,"A",{id:!0,class:!0,href:!0});var vr=r(g);v=o(vr,"SPAN",{});var xu=r(v);w(q.$$.fragment,xu),xu.forEach(s),vr.forEach(s),O=c(h),E=o(h,"SPAN",{});var Cu=r(E);k=a(Cu,"D\xE9finir le mod\xE8le"),Cu.forEach(s),h.forEach(s),D=c(i),y=o(i,"P",{});var rt=r(y);z=a(rt,"Puisque nous travaillons sur un probl\xE8me de classification de "),B=o(rt,"EM",{});var yu=r(B);N=a(yu,"tokens"),yu.forEach(s),R=a(rt,", nous allons utiliser la classe "),I=o(rt,"CODE",{});var zu=r(I);P=a(zu,"AutoModelForTokenClassification"),zu.forEach(s),T=a(rt,". La principale chose \xE0 retenir lors de la d\xE9finition de ce mod\xE8le est de transmettre des informations sur le nombre d\u2019\xE9tiquettes que nous avons. La fa\xE7on la plus simple de le faire est de passer ce nombre avec l\u2019argument "),W=o(rt,"CODE",{});var hr=r(W);G=a(hr,"num_labels"),hr.forEach(s),S=a(rt,", mais si nous voulons un joli "),X=o(rt,"EM",{});var Ou=r(X);J=a(Ou,"widget"),Ou.forEach(s),ae=a(rt," d\u2019inf\xE9rence fonctionnant comme celui que nous avons vu au d\xE9but de cette section, il est pr\xE9f\xE9rable de d\xE9finir les correspondances des \xE9tiquettes \xE0 la place."),rt.forEach(s),A=c(i),U=o(i,"P",{});var Ul=r(U);se=a(Ul,"Elles devraient \xEAtre d\xE9finies par deux dictionnaires, "),Y=o(Ul,"CODE",{});var _r=r(Y);ee=a(_r,"id2label"),_r.forEach(s),F=a(Ul," et "),K=o(Ul,"CODE",{});var Pu=r(K);de=a(Pu,"label2id"),Pu.forEach(s),Pe=a(Ul,", qui contiennent les correspondances entre identifiants et \xE9tiquettes et vice versa :"),Ul.forEach(s),he=c(i),w(H.$$.fragment,i),le=c(i),Q=o(i,"P",{});var Vl=r(Q);re=a(Vl,"Maintenant nous pouvons simplement les passer \xE0 la m\xE9thode "),Z=o(Vl,"CODE",{});var br=r(Z);pe=a(br,"AutoModelForTokenClassification.from_pretrained()"),br.forEach(s),Qe=a(Vl,", ils seront d\xE9finis dans la configuration du mod\xE8le puis correctement sauvegard\xE9s et t\xE9l\xE9charg\xE9s vers le "),_e=o(Vl,"EM",{});var Du=r(_e);ge=a(Du,"Hub"),Du.forEach(s),ys=a(Vl," :"),Vl.forEach(s),Ce=c(i),w(De.$$.fragment,i),es=c(i),ne=o(i,"P",{});var va=r(ne);ms=a(va,"Comme lorsque nous avons d\xE9fini notre "),fs=o(va,"CODE",{});var $r=r(fs);Mt=a($r,"AutoModelForSequenceClassification"),$r.forEach(s),qa=a(va," au "),te=o(va,"A",{href:!0});var Mu=r(te);ka=a(Mu,"chapitre 3"),Mu.forEach(s),dn=a(va,", la cr\xE9ation du mod\xE8le \xE9met un avertissement indiquant que certains poids n\u2019ont pas \xE9t\xE9 utilis\xE9s (ceux de la t\xEAte de pr\xE9-entra\xEEnement) et que d\u2019autres poids ont \xE9t\xE9 initialis\xE9s de mani\xE8re al\xE9atoire (ceux de la t\xEAte de classification des nouveaux "),zs=o(va,"EM",{});var Au=r(zs);ja=a(Au,"tokens"),Au.forEach(s),wa=a(va,"), et que ce mod\xE8le doit \xEAtre entra\xEEn\xE9. Nous ferons cela dans une minute, mais v\xE9rifions d\u2019abord que notre mod\xE8le a le bon nombre d\u2019\xE9tiquettes :"),va.forEach(s),ut=c(i),w(ss.$$.fragment,i),mn=c(i),w(Se.$$.fragment,i),fn=c(i),w(ts.$$.fragment,i),pt=c(i),ye=o(i,"H3",{class:!0});var Wl=r(ye);Le=o(Wl,"A",{id:!0,class:!0,href:!0});var Nu=r(Le);Os=o(Nu,"SPAN",{});var Tu=r(Os);w(ns.$$.fragment,Tu),Tu.forEach(s),Nu.forEach(s),xa=c(Wl),as=o(Wl,"SPAN",{});var gr=r(as);ct=o(gr,"I",{});var Us=r(ct);Ca=a(Us,"Finetuning"),Us.forEach(s),vn=a(gr," du mod\xE8le"),gr.forEach(s),Wl.forEach(s),hn=c(i),ze=o(i,"P",{});var Xl=r(ze);_n=a(Xl,"Nous sommes maintenant pr\xEAts \xE0 entra\xEEner notre mod\xE8le ! Nous devons juste faire deux derni\xE8res choses avant de d\xE9finir notre "),dt=o(Xl,"CODE",{});var Er=r(dt);ya=a(Er,"Trainer"),Er.forEach(s),Un=a(Xl," : se connecter \xE0 Hugging Face et d\xE9finir nos arguments d\u2019entra\xEEnement. Si vous travaillez dans un "),vs=o(Xl,"EM",{});var Su=r(vs);Ws=a(Su,"notebook"),Su.forEach(s),ls=a(Xl,", il y a une fonction pratique pour vous aider \xE0 le faire :"),Xl.forEach(s),Ps=c(i),w(Ds.$$.fragment,i),At=c(i),Xs=o(i,"P",{});var qr=r(Xs);bn=a(qr,"Cela affichera un "),Nt=o(qr,"EM",{});var kr=r(Nt);Zs=a(kr,"widget"),kr.forEach(s),Vn=a(qr," o\xF9 vous pourrez entrer vos identifiants de connexion \xE0 Hugging Face."),qr.forEach(s),Ee=c(i),mt=o(i,"P",{});var jr=r(mt);Wn=a(jr,"Si vous ne travaillez pas dans un "),qe=o(jr,"EM",{});var Lu=r(qe);Tt=a(Lu,"notebook"),Lu.forEach(s),$n=a(jr,", tapez simplement la ligne suivante dans votre terminal :"),jr.forEach(s),ie=c(i),w(os.$$.fragment,i),gn=c(i),Ks=o(i,"P",{});var Zl=r(Ks);ft=a(Zl,"Une fois ceci fait, nous pouvons d\xE9finir nos "),St=o(Zl,"CODE",{});var Iu=r(St);Xn=a(Iu,"TrainingArguments"),Iu.forEach(s),Ys=a(Zl," :"),Zl.forEach(s),Lt=c(i),w(rs.$$.fragment,i),It=c(i),me=o(i,"P",{});var ws=r(me);za=a(ws,"Vous avez d\xE9j\xE0 vu la plupart d\u2019entre eux. Nous d\xE9finissons quelques hyperparam\xE8tres (comme le taux d\u2019apprentissage, le nombre d\u2019\xE9poques \xE0 entra\xEEner, et le taux de d\xE9croissance des poids), et nous sp\xE9cifions "),Ft=o(ws,"CODE",{});var Go=r(Ft);hs=a(Go,"push_to_hub=True"),Go.forEach(s),Ve=a(ws," pour indiquer que nous voulons sauvegarder le mod\xE8le, l\u2019\xE9valuer \xE0 la fin de chaque \xE9poque, et que nous voulons t\xE9l\xE9charger nos r\xE9sultats vers le "),Js=o(ws,"EM",{});var Fu=r(Js);Me=a(Fu,"Hub"),Fu.forEach(s),Oa=a(ws,". Notez que vous pouvez sp\xE9cifier le nom du d\xE9p\xF4t vers lequel vous voulez pousser avec l\u2019argument "),Ms=o(ws,"CODE",{});var Ru=r(Ms);Pa=a(Ru,"hub_model_id"),Ru.forEach(s),Zn=a(ws," (en particulier, vous devrez utiliser cet argument pour pousser vers une organisation). Par exemple, lorsque nous avons pouss\xE9 le mod\xE8le vers l\u2019organisation "),ke=o(ws,"A",{href:!0,rel:!0});var Wi=r(ke);En=o(Wi,"CODE",{});var Kl=r(En);qn=a(Kl,"huggingface-course"),Kl.forEach(s),Wi.forEach(s),Kn=a(ws,", nous avons ajout\xE9 "),Ae=o(ws,"CODE",{});var Xi=r(Ae);vt=a(Xi,'hub_model_id="huggingface-course/bert-finetuned-ner"``TrainingArguments'),Xi.forEach(s),kn=a(ws,". Par d\xE9faut, le d\xE9p\xF4t utilis\xE9 sera dans votre espace de noms et nomm\xE9 d\u2019apr\xE8s le r\xE9pertoire de sortie que vous avez d\xE9fini, donc dans notre cas ce sera "),jn=o(ws,"CODE",{});var Yl=r(jn);Yn=a(Yl,'"sgugger/bert-finetuned-ner"'),Yl.forEach(s),_s=a(ws,"."),ws.forEach(s),wn=c(i),w(Ie.$$.fragment,i),is=c(i),bs=o(i,"P",{});var Uo=r(bs);ht=a(Uo,"Enfin, nous passons tout au "),Rt=o(Uo,"CODE",{});var ce=r(Rt);As=a(ce,"Trainer"),ce.forEach(s),Jn=a(Uo," et lan\xE7ons l\u2019entra\xEEnement :"),Uo.forEach(s),je=c(i),w(Ne.$$.fragment,i),Bt=c(i),$s=o(i,"P",{});var wr=r($s);Da=a(wr,"Notez que pendant l\u2019entra\xEEnement, chaque fois que le mod\xE8le est sauvegard\xE9 (ici, \xE0 chaque \xE9poque), il est t\xE9l\xE9charg\xE9 sur le "),Ns=o(wr,"EM",{});var xr=r(Ns);_t=a(xr,"Hub"),xr.forEach(s),Ma=a(wr," en arri\xE8re-plan. De cette fa\xE7on, vous serez en mesure de reprendre votre entra\xEEnement sur une autre machine si n\xE9cessaire."),wr.forEach(s),Qn=c(i),us=o(i,"P",{});var Cr=r(us);bt=a(Cr,"Une fois l\u2019entra\xEEnement termin\xE9, nous utilisons la m\xE9thode "),Ht=o(Cr,"CODE",{});var Bu=r(Ht);gs=a(Bu,"push_to_hub()"),Bu.forEach(s),Aa=a(Cr," pour nous assurer que nous t\xE9l\xE9chargeons la version la plus r\xE9cente du mod\xE8le :"),Cr.forEach(s),$t=c(i),w(Qs.$$.fragment,i),et=c(i),st=o(i,"P",{});var yr=r(st);We=a(yr,"Cette commande renvoie l\u2019URL du commit qu\u2019elle vient de faire, si vous voulez l\u2019inspecter :"),yr.forEach(s),xn=c(i),w(Fe.$$.fragment,i),Cn=c(i),oe=o(i,"P",{});var ln=r(oe);ea=a(ln,"Le "),$e=o(ln,"CODE",{});var Hu=r($e);Na=a(Hu,"Trainer"),Hu.forEach(s),yn=a(ln," r\xE9dige \xE9galement une carte mod\xE8le avec tous les r\xE9sultats de l\u2019\xE9valuation et la t\xE9l\xE9charge. A ce stade, vous pouvez utiliser le "),gt=o(ln,"EM",{});var zr=r(gt);Ta=a(zr,"widget"),zr.forEach(s),zn=a(ln," d\u2019inf\xE9rence sur le "),Et=o(ln,"EM",{});var Gu=r(Et);Sa=a(Gu,"Hub"),Gu.forEach(s),On=a(ln," pour tester votre mod\xE8le et le partager avec vos amis. Vous avez r\xE9ussi \xE0 affiner un mod\xE8le sur une t\xE2che de classification de "),Gt=o(ln,"EM",{});var Uu=r(Gt);Ut=a(Uu,"tokens"),Uu.forEach(s),Pn=a(ln,". F\xE9licitations !"),ln.forEach(s),Dn=c(i),Xe=o(i,"P",{});var Jl=r(Xe);Mn=a(Jl,"Si vous voulez plonger un peu plus profond\xE9ment dans la boucle d\u2019entra\xEEnement, nous allons maintenant vous montrer comment faire la m\xEAme chose en utilisant \u{1F917} "),f=o(Jl,"EM",{});var Vu=r(f);L=a(Vu,"Accelerate"),Vu.forEach(s),An=a(Jl,"."),Jl.forEach(s),La=c(i),Ts=o(i,"H2",{class:!0});var Or=r(Ts);be=o(Or,"A",{id:!0,class:!0,href:!0});var Pr=r(be);Nn=o(Pr,"SPAN",{});var Wu=r(Nn);w(Es.$$.fragment,Wu),Wu.forEach(s),Pr.forEach(s),Ia=c(Or),Ss=o(Or,"SPAN",{});var Xu=r(Ss);Vt=a(Xu,"Une boucle d'entra\xEEnement personnalis\xE9e"),Xu.forEach(s),Or.forEach(s),Tn=c(i),qt=o(i,"P",{});var Ql=r(qt);Wt=a(Ql,"Jetons maintenant un coup d\u2019\u0153il \xE0 la boucle d\u2019entra\xEEnement compl\xE8te afin que vous puissiez facilement personnaliser les parties dont vous avez besoin. Elle ressemblera beaucoup \xE0 ce que nous avons fait dans le "),Xt=o(Ql,"A",{href:!0});var Zu=r(Xt);Zt=a(Zu,"chapitre 3"),Zu.forEach(s),Ls=a(Ql," avec quelques changements pour l\u2019\xE9valuation."),Ql.forEach(s),kt=c(i),Is=o(i,"H3",{class:!0});var Dr=r(Is);fe=o(Dr,"A",{id:!0,class:!0,href:!0});var Mr=r(fe);Kt=o(Mr,"SPAN",{});var Ku=r(Kt);w(tt.$$.fragment,Ku),Ku.forEach(s),Mr.forEach(s),wl=c(Dr),Sn=o(Dr,"SPAN",{});var Yu=r(Sn);sa=a(Yu,"Pr\xE9parer tout pour l'entra\xEEnement"),Yu.forEach(s),Dr.forEach(s),Ln=c(i),ps=o(i,"P",{});var on=r(ps);Yt=a(on,"D\u2019abord nous devons construire le "),ta=o(on,"CODE",{});var Ju=r(ta);na=a(Ju,"DataLoader"),Ju.forEach(s),aa=a(on,"s \xE0 partir de nos jeux de donn\xE9es. Nous r\xE9utilisons notre "),Ze=o(on,"CODE",{});var Qu=r(Ze);xl=a(Qu,"data_collator"),Qu.forEach(s),la=a(on," comme un "),oa=o(on,"CODE",{});var Ar=r(oa);Cl=a(Ar,"collate_fn"),Ar.forEach(s),jt=a(on," et m\xE9langer l\u2019ensemble d\u2019entra\xEEnement, mais pas l\u2019ensemble de validation :"),on.forEach(s),wt=c(i),w(xt.$$.fragment,i),Re=c(i),nt=o(i,"P",{});var Nr=r(nt);Fs=a(Nr,"Ensuite, nous r\xE9instantifions notre mod\xE8le pour nous assurer que nous ne continuons pas le "),ra=o(Nr,"EM",{});var ep=r(ra);Be=a(ep,"finetuning"),ep.forEach(s),yl=a(Nr," d\u2019avant et que nous repartons bien du mod\xE8le pr\xE9-entra\xEEn\xE9 de BERT :"),Nr.forEach(s),Fa=c(i),w(at.$$.fragment,i),Ra=c(i),Rs=o(i,"P",{});var ha=r(Rs);In=a(ha,"Ensuite, nous avons besoin d\u2019un optimiseur. Nous utilisons le classique "),Oe=o(ha,"CODE",{});var sp=r(Oe);He=a(sp,"AdamW"),sp.forEach(s),ia=a(ha,", qui est comme "),ua=o(ha,"CODE",{});var tp=r(ua);zl=a(tp,"Adam"),tp.forEach(s),Ol=a(ha,", mais avec un correctif dans la fa\xE7on dont le taux de d\xE9croissance des poids est appliqu\xE9e :"),ha.forEach(s),Ct=c(i),w(Fn.$$.fragment,i),Qo=c(i),pa=o(i,"P",{});var Vo=r(pa);fo=a(Vo,"Une fois que nous avons tous ces objets, nous pouvons les envoyer \xE0 la m\xE9thode "),vo=o(Vo,"CODE",{});var eo=r(vo);ei=a(eo,"accelerator.prepare()"),eo.forEach(s),ho=a(Vo," :"),Vo.forEach(s),er=c(i),w(Ba.$$.fragment,i),sr=c(i),w(qs.$$.fragment,i),Pl=c(i),lt=o(i,"P",{});var Gn=r(lt);si=a(Gn,"Maintenant que nous avons envoy\xE9 notre "),Ha=o(Gn,"CODE",{});var Wo=r(Ha);ti=a(Wo,"train_dataloader"),Wo.forEach(s),ni=a(Gn," \xE0 "),Ga=o(Gn,"CODE",{});var np=r(Ga);ai=a(np,"accelerator.prepare()"),np.forEach(s),li=a(Gn,", nous pouvons utiliser sa longueur pour calculer le nombre d\u2019\xE9tapes d\u2019entra\xEEnement. Rappelez-vous que nous devrions toujours faire cela apr\xE8s avoir pr\xE9par\xE9 le "),_o=o(Gn,"EM",{});var Zi=r(_o);Jt=a(Zi,"dataloader"),Zi.forEach(s),bo=a(Gn," car cette m\xE9thode modifiera sa longueur. Nous utilisons un programme lin\xE9aire classique du taux d\u2019apprentissage \xE0 0 :"),Gn.forEach(s),tr=c(i),w(Ua.$$.fragment,i),Dl=c(i),ks=o(i,"P",{});var xs=r(ks);oi=a(xs,"Enfin, pour pousser notre mod\xE8le vers le "),Va=o(xs,"EM",{});var Ki=r(Va);ri=a(Ki,"Hub"),Ki.forEach(s),ii=a(xs,", nous avons besoin de cr\xE9er un objet "),$o=o(xs,"CODE",{});var so=r($o);Qt=a(so,"Repository"),so.forEach(s),go=a(xs," dans un dossier de travail. Tout d\u2019abord, connectez-vous \xE0 Hugging Face si vous n\u2019\xEAtes pas d\xE9j\xE0 connect\xE9. Nous d\xE9terminons le nom du d\xE9p\xF4t \xE0 partir de l\u2019identifiant du mod\xE8le que nous voulons donner \xE0 notre mod\xE8le (n\u2019h\xE9sitez pas \xE0 remplacer le "),Eo=o(xs,"CODE",{});var Yi=r(Eo);ui=a(Yi,"repo_name"),Yi.forEach(s),qo=a(xs," par votre propre choix, il doit juste contenir votre nom d\u2019utilisateur et ce que fait la fonction "),ko=o(xs,"CODE",{});var Vs=r(ko);pi=a(Vs,"get_full_repo_name()"),Vs.forEach(s),jo=a(xs,") :"),xs.forEach(s),nr=c(i),w(Wa.$$.fragment,i),wo=c(i),w(en.$$.fragment,i),ar=c(i),Xa=o(i,"P",{});var ap=r(Xa);Za=a(ap,"Ensuite, nous pouvons cloner ce d\xE9p\xF4t dans un dossier local. S\u2019il existe d\xE9j\xE0, ce dossier local doit \xEAtre un clone existant du d\xE9p\xF4t avec lequel nous travaillons :"),ap.forEach(s),xo=c(i),w(yt.$$.fragment,i),Co=c(i),Ge=o(i,"P",{});var _a=r(Ge);ci=a(_a,"Nous pouvons maintenant t\xE9l\xE9charger tout ce que nous sauvegardons dans "),Ka=o(_a,"CODE",{});var lp=r(Ka);di=a(lp,"output_dir"),lp.forEach(s),mi=a(_a," en appelant la m\xE9thode "),Ya=o(_a,"CODE",{});var op=r(Ya);fi=a(op,"repo.push_to_hub()"),op.forEach(s),vi=a(_a,". Cela nous aidera \xE0 t\xE9l\xE9charger les mod\xE8les interm\xE9diaires \xE0 la fin de chaque \xE9poque."),_a.forEach(s),yo=c(i),Bs=o(i,"H3",{class:!0});var to=r(Bs);Rn=o(to,"A",{id:!0,class:!0,href:!0});var rp=r(Rn);ot=o(rp,"SPAN",{});var ip=r(ot);w(Ja.$$.fragment,ip),ip.forEach(s),rp.forEach(s),zo=c(to),Oo=o(to,"SPAN",{});var Tr=r(Oo);hi=a(Tr,"Boucle d'entra\xEEnement"),Tr.forEach(s),to.forEach(s),Ml=c(i),sn=o(i,"P",{});var no=r(sn);_i=a(no,"Nous sommes maintenant pr\xEAts \xE0 \xE9crire la boucle d\u2019entra\xEEnement compl\xE8te. Pour simplifier sa partie \xE9valuation, nous d\xE9finissons cette fonction "),Al=o(no,"CODE",{});var up=r(Al);ca=a(up,"postprocess()"),up.forEach(s),lr=a(no," qui prend les pr\xE9dictions et les \xE9tiquettes, et les convertit en listes de cha\xEEnes de caract\xE8res comme notre objet "),zt=o(no,"CODE",{});var Sr=r(zt);da=a(Sr,"metric"),Sr.forEach(s),Po=a(no," l\u2019attend :"),no.forEach(s),ma=c(i),w(Qa.$$.fragment,i),Nl=c(i),Tl=o(i,"P",{});var pp=r(Tl);or=a(pp,"Ensuite, nous pouvons \xE9crire la boucle d\u2019entra\xEEnement. Apr\xE8s avoir d\xE9fini une barre de progression pour suivre l\u2019\xE9volution de l\u2019entra\xEEnement, la boucle comporte trois parties :"),pp.forEach(s),fa=c(i),Ot=o(i,"UL",{});var ao=r(Ot);we=o(ao,"LI",{});var Xo=r(we);bi=a(Xo,"L\u2019entra\xEEnement proprement dit, qui est l\u2019it\xE9ration classique sur le "),el=o(Xo,"CODE",{});var ml=r(el);$i=a(ml,"train_dataloader"),ml.forEach(s),gi=a(Xo,", passage en avant, puis passage en arri\xE8re et \xE9tape d\u2019optimisation."),Xo.forEach(s),Sl=c(ao),Hs=o(ao,"LI",{});var Dt=r(Hs);Ei=a(Dt,"L\u2019\xE9valuation, dans laquelle il y a une nouveaut\xE9 apr\xE8s avoir obtenu les sorties de notre mod\xE8le sur un batch : puisque deux processus peuvent avoir padd\xE9 les entr\xE9es et les \xE9tiquettes \xE0 des formes diff\xE9rentes, nous devons utiliser "),sl=o(Dt,"CODE",{});var Ue=r(sl);qi=a(Ue,"accelerator.pad_across_processes()"),Ue.forEach(s),ki=a(Dt," pour rendre les pr\xE9dictions et les \xE9tiquettes de la m\xEAme forme avant d\u2019appeler la m\xE9thode "),tl=o(Dt,"CODE",{});var cp=r(tl);ji=a(cp,"gather()"),cp.forEach(s),wi=a(Dt,". Si nous ne le faisons pas, l\u2019\xE9valuation va soit se tromper, soit se bloquer pour toujours. Ensuite, nous envoyons les r\xE9sultats \xE0 "),nl=o(Dt,"CODE",{});var Lr=r(nl);xi=a(Lr,"metric.add_batch()"),Lr.forEach(s),Ci=a(Dt," et appelons "),Ll=o(Dt,"CODE",{});var dp=r(Ll);tn=a(dp,"metric.compute()"),dp.forEach(s),yi=a(Dt," une fois que la boucle d\u2019\xE9valuation est termin\xE9e."),Dt.forEach(s),Do=c(ao),Gs=o(ao,"LI",{});var rn=r(Gs);zi=a(rn,"Sauvegarde et t\xE9l\xE9chargement, o\xF9 nous sauvegardons d\u2019abord le mod\xE8le et le "),al=o(rn,"EM",{});var Ir=r(al);Oi=a(Ir,"tokenizer"),Ir.forEach(s),Pi=a(rn,", puis appelons "),Il=o(rn,"CODE",{});var mp=r(Il);ll=a(mp,"repo.push_to_hub()"),mp.forEach(s),rr=a(rn,". Remarquez que nous utilisons l\u2019argument "),ue=o(rn,"CODE",{});var fp=r(ue);Di=a(fp,"blocking=False"),fp.forEach(s),Mo=a(rn," pour indiquer \xE0 la biblioth\xE8que \u{1F917} "),Ao=o(rn,"EM",{});var Fr=r(Ao);Mi=a(Fr,"Hub"),Fr.forEach(s),ol=a(rn," de pousser dans un processus asynchrone. De cette fa\xE7on, l\u2019entra\xEEnement continue normalement et cette (longue) instruction est ex\xE9cut\xE9e en arri\xE8re-plan."),rn.forEach(s),ao.forEach(s),Fl=c(i),Rl=o(i,"P",{});var vp=r(Rl);Ai=a(vp,"Voici le code complet de la boucle d\u2019entra\xEEnement :"),vp.forEach(s),Bl=c(i),w(rl.$$.fragment,i),ir=c(i),nn=o(i,"P",{});var Rr=r(nn);Ni=a(Rr,"Au cas o\xF9 ce serait la premi\xE8re fois que vous verriez un mod\xE8le enregistr\xE9 avec \u{1F917} "),No=o(Rr,"EM",{});var Br=r(No);To=a(Br,"Accelerate"),Br.forEach(s),Ti=a(Rr,", prenons un moment pour inspecter les trois lignes de code qui l\u2019accompagnent :"),Rr.forEach(s),ur=c(i),w(Pt.$$.fragment,i),pr=c(i),xe=o(i,"P",{});var Ke=r(xe);So=a(Ke,"La premi\xE8re ligne est explicite : elle indique \xE0 tous les processus d\u2019attendre que tout le monde soit \xE0 ce stade avant de continuer. C\u2019est pour s\u2019assurer que nous avons le m\xEAme mod\xE8le dans chaque processus avant de sauvegarder. Ensuite, nous prenons le "),Lo=o(Ke,"CODE",{});var hp=r(Lo);Si=a(hp,"unwrapped_model"),hp.forEach(s),Io=a(Ke," qui est le mod\xE8le de base que nous avons d\xE9fini. La m\xE9thode "),Fo=o(Ke,"CODE",{});var Hr=r(Fo);Li=a(Hr,"accelerator.prepare()"),Hr.forEach(s),Ro=a(Ke," modifie le mod\xE8le pour qu\u2019il fonctionne dans l\u2019entra\xEEnement distribu\xE9, donc il n\u2019aura plus la m\xE9thode "),Bo=o(Ke,"CODE",{});var _p=r(Bo);Ii=a(_p,"save_pretrained()"),_p.forEach(s),cr=a(Ke," ; la m\xE9thode "),Bn=o(Ke,"CODE",{});var bp=r(Bn);dr=a(bp,"accelerator.unwrap_model()"),bp.forEach(s),il=a(Ke," annule cette \xE9tape. Enfin, nous appelons "),Hl=o(Ke,"CODE",{});var Gr=r(Hl);an=a(Gr,"save_pretrained()"),Gr.forEach(s),Fi=a(Ke," mais nous disons \xE0 cette m\xE9thode d\u2019utiliser "),ul=o(Ke,"CODE",{});var $p=r(ul);Ri=a($p,"accelerator.save()"),$p.forEach(s),Bi=a(Ke," au lieu de "),pl=o(Ke,"CODE",{});var gp=r(pl);Hi=a(gp,"torch.save()"),gp.forEach(s),Gi=a(Ke,"."),Ke.forEach(s),Ho=c(i),js=o(i,"P",{});var fl=r(js);mr=a(fl,"Une fois ceci fait, vous devriez avoir un mod\xE8le qui produit des r\xE9sultats assez similaires \xE0 celui entra\xEEn\xE9 avec le "),Hn=o(fl,"CODE",{});var lo=r(Hn);fr=a(lo,"Trainer"),lo.forEach(s),ve=a(fl,". Vous pouvez v\xE9rifier le mod\xE8le que nous avons form\xE9 en utilisant ce code \xE0 "),cl=o(fl,"A",{href:!0,rel:!0});var Ji=r(cl);dl=o(Ji,"EM",{});var Zo=r(dl);Ui=a(Zo,"huggingface-course/bert-finetuned-ner-accelerate"),Zo.forEach(s),Ji.forEach(s),Vi=a(fl,". Et si vous voulez tester des modifications de la boucle d\u2019entra\xEEnement, vous pouvez les impl\xE9menter directement en modifiant le code ci-dessus !"),fl.forEach(s),this.h()},h(){_(g,"id","dfinir-le-modle"),_(g,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(g,"href","#dfinir-le-modle"),_(d,"class","relative group"),_(te,"href","/course/fr/chapter3"),_(Le,"id","ifinetuningi-du-modle"),_(Le,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(Le,"href","#ifinetuningi-du-modle"),_(ye,"class","relative group"),_(ke,"href","https://huggingface.co/huggingface-course"),_(ke,"rel","nofollow"),_(be,"id","une-boucle-dentranement-personnalise"),_(be,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(be,"href","#une-boucle-dentranement-personnalise"),_(Ts,"class","relative group"),_(Xt,"href","/course/fr/chapter3/4"),_(fe,"id","prparer-tout-pour-lentranement"),_(fe,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(fe,"href","#prparer-tout-pour-lentranement"),_(Is,"class","relative group"),_(Rn,"id","boucle-dentranement"),_(Rn,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(Rn,"href","#boucle-dentranement"),_(Bs,"class","relative group"),_(cl,"href","https://huggingface.co/huggingface-course/bert-finetuned-ner-accelerate"),_(cl,"rel","nofollow")},m(i,h){u(i,d,h),e(d,g),e(g,v),x(q,v,null),e(d,O),e(d,E),e(E,k),u(i,D,h),u(i,y,h),e(y,z),e(y,B),e(B,N),e(y,R),e(y,I),e(I,P),e(y,T),e(y,W),e(W,G),e(y,S),e(y,X),e(X,J),e(y,ae),u(i,A,h),u(i,U,h),e(U,se),e(U,Y),e(Y,ee),e(U,F),e(U,K),e(K,de),e(U,Pe),u(i,he,h),x(H,i,h),u(i,le,h),u(i,Q,h),e(Q,re),e(Q,Z),e(Z,pe),e(Q,Qe),e(Q,_e),e(_e,ge),e(Q,ys),u(i,Ce,h),x(De,i,h),u(i,es,h),u(i,ne,h),e(ne,ms),e(ne,fs),e(fs,Mt),e(ne,qa),e(ne,te),e(te,ka),e(ne,dn),e(ne,zs),e(zs,ja),e(ne,wa),u(i,ut,h),x(ss,i,h),u(i,mn,h),x(Se,i,h),u(i,fn,h),x(ts,i,h),u(i,pt,h),u(i,ye,h),e(ye,Le),e(Le,Os),x(ns,Os,null),e(ye,xa),e(ye,as),e(as,ct),e(ct,Ca),e(as,vn),u(i,hn,h),u(i,ze,h),e(ze,_n),e(ze,dt),e(dt,ya),e(ze,Un),e(ze,vs),e(vs,Ws),e(ze,ls),u(i,Ps,h),x(Ds,i,h),u(i,At,h),u(i,Xs,h),e(Xs,bn),e(Xs,Nt),e(Nt,Zs),e(Xs,Vn),u(i,Ee,h),u(i,mt,h),e(mt,Wn),e(mt,qe),e(qe,Tt),e(mt,$n),u(i,ie,h),x(os,i,h),u(i,gn,h),u(i,Ks,h),e(Ks,ft),e(Ks,St),e(St,Xn),e(Ks,Ys),u(i,Lt,h),x(rs,i,h),u(i,It,h),u(i,me,h),e(me,za),e(me,Ft),e(Ft,hs),e(me,Ve),e(me,Js),e(Js,Me),e(me,Oa),e(me,Ms),e(Ms,Pa),e(me,Zn),e(me,ke),e(ke,En),e(En,qn),e(me,Kn),e(me,Ae),e(Ae,vt),e(me,kn),e(me,jn),e(jn,Yn),e(me,_s),u(i,wn,h),x(Ie,i,h),u(i,is,h),u(i,bs,h),e(bs,ht),e(bs,Rt),e(Rt,As),e(bs,Jn),u(i,je,h),x(Ne,i,h),u(i,Bt,h),u(i,$s,h),e($s,Da),e($s,Ns),e(Ns,_t),e($s,Ma),u(i,Qn,h),u(i,us,h),e(us,bt),e(us,Ht),e(Ht,gs),e(us,Aa),u(i,$t,h),x(Qs,i,h),u(i,et,h),u(i,st,h),e(st,We),u(i,xn,h),x(Fe,i,h),u(i,Cn,h),u(i,oe,h),e(oe,ea),e(oe,$e),e($e,Na),e(oe,yn),e(oe,gt),e(gt,Ta),e(oe,zn),e(oe,Et),e(Et,Sa),e(oe,On),e(oe,Gt),e(Gt,Ut),e(oe,Pn),u(i,Dn,h),u(i,Xe,h),e(Xe,Mn),e(Xe,f),e(f,L),e(Xe,An),u(i,La,h),u(i,Ts,h),e(Ts,be),e(be,Nn),x(Es,Nn,null),e(Ts,Ia),e(Ts,Ss),e(Ss,Vt),u(i,Tn,h),u(i,qt,h),e(qt,Wt),e(qt,Xt),e(Xt,Zt),e(qt,Ls),u(i,kt,h),u(i,Is,h),e(Is,fe),e(fe,Kt),x(tt,Kt,null),e(Is,wl),e(Is,Sn),e(Sn,sa),u(i,Ln,h),u(i,ps,h),e(ps,Yt),e(ps,ta),e(ta,na),e(ps,aa),e(ps,Ze),e(Ze,xl),e(ps,la),e(ps,oa),e(oa,Cl),e(ps,jt),u(i,wt,h),x(xt,i,h),u(i,Re,h),u(i,nt,h),e(nt,Fs),e(nt,ra),e(ra,Be),e(nt,yl),u(i,Fa,h),x(at,i,h),u(i,Ra,h),u(i,Rs,h),e(Rs,In),e(Rs,Oe),e(Oe,He),e(Rs,ia),e(Rs,ua),e(ua,zl),e(Rs,Ol),u(i,Ct,h),x(Fn,i,h),u(i,Qo,h),u(i,pa,h),e(pa,fo),e(pa,vo),e(vo,ei),e(pa,ho),u(i,er,h),x(Ba,i,h),u(i,sr,h),x(qs,i,h),u(i,Pl,h),u(i,lt,h),e(lt,si),e(lt,Ha),e(Ha,ti),e(lt,ni),e(lt,Ga),e(Ga,ai),e(lt,li),e(lt,_o),e(_o,Jt),e(lt,bo),u(i,tr,h),x(Ua,i,h),u(i,Dl,h),u(i,ks,h),e(ks,oi),e(ks,Va),e(Va,ri),e(ks,ii),e(ks,$o),e($o,Qt),e(ks,go),e(ks,Eo),e(Eo,ui),e(ks,qo),e(ks,ko),e(ko,pi),e(ks,jo),u(i,nr,h),x(Wa,i,h),u(i,wo,h),x(en,i,h),u(i,ar,h),u(i,Xa,h),e(Xa,Za),u(i,xo,h),x(yt,i,h),u(i,Co,h),u(i,Ge,h),e(Ge,ci),e(Ge,Ka),e(Ka,di),e(Ge,mi),e(Ge,Ya),e(Ya,fi),e(Ge,vi),u(i,yo,h),u(i,Bs,h),e(Bs,Rn),e(Rn,ot),x(Ja,ot,null),e(Bs,zo),e(Bs,Oo),e(Oo,hi),u(i,Ml,h),u(i,sn,h),e(sn,_i),e(sn,Al),e(Al,ca),e(sn,lr),e(sn,zt),e(zt,da),e(sn,Po),u(i,ma,h),x(Qa,i,h),u(i,Nl,h),u(i,Tl,h),e(Tl,or),u(i,fa,h),u(i,Ot,h),e(Ot,we),e(we,bi),e(we,el),e(el,$i),e(we,gi),e(Ot,Sl),e(Ot,Hs),e(Hs,Ei),e(Hs,sl),e(sl,qi),e(Hs,ki),e(Hs,tl),e(tl,ji),e(Hs,wi),e(Hs,nl),e(nl,xi),e(Hs,Ci),e(Hs,Ll),e(Ll,tn),e(Hs,yi),e(Ot,Do),e(Ot,Gs),e(Gs,zi),e(Gs,al),e(al,Oi),e(Gs,Pi),e(Gs,Il),e(Il,ll),e(Gs,rr),e(Gs,ue),e(ue,Di),e(Gs,Mo),e(Gs,Ao),e(Ao,Mi),e(Gs,ol),u(i,Fl,h),u(i,Rl,h),e(Rl,Ai),u(i,Bl,h),x(rl,i,h),u(i,ir,h),u(i,nn,h),e(nn,Ni),e(nn,No),e(No,To),e(nn,Ti),u(i,ur,h),x(Pt,i,h),u(i,pr,h),u(i,xe,h),e(xe,So),e(xe,Lo),e(Lo,Si),e(xe,Io),e(xe,Fo),e(Fo,Li),e(xe,Ro),e(xe,Bo),e(Bo,Ii),e(xe,cr),e(xe,Bn),e(Bn,dr),e(xe,il),e(xe,Hl),e(Hl,an),e(xe,Fi),e(xe,ul),e(ul,Ri),e(xe,Bi),e(xe,pl),e(pl,Hi),e(xe,Gi),u(i,Ho,h),u(i,js,h),e(js,mr),e(js,Hn),e(Hn,fr),e(js,ve),e(js,cl),e(cl,dl),e(dl,Ui),e(js,Vi),Gl=!0},i(i){Gl||(b(q.$$.fragment,i),b(H.$$.fragment,i),b(De.$$.fragment,i),b(ss.$$.fragment,i),b(Se.$$.fragment,i),b(ts.$$.fragment,i),b(ns.$$.fragment,i),b(Ds.$$.fragment,i),b(os.$$.fragment,i),b(rs.$$.fragment,i),b(Ie.$$.fragment,i),b(Ne.$$.fragment,i),b(Qs.$$.fragment,i),b(Fe.$$.fragment,i),b(Es.$$.fragment,i),b(tt.$$.fragment,i),b(xt.$$.fragment,i),b(at.$$.fragment,i),b(Fn.$$.fragment,i),b(Ba.$$.fragment,i),b(qs.$$.fragment,i),b(Ua.$$.fragment,i),b(Wa.$$.fragment,i),b(en.$$.fragment,i),b(yt.$$.fragment,i),b(Ja.$$.fragment,i),b(Qa.$$.fragment,i),b(rl.$$.fragment,i),b(Pt.$$.fragment,i),Gl=!0)},o(i){$(q.$$.fragment,i),$(H.$$.fragment,i),$(De.$$.fragment,i),$(ss.$$.fragment,i),$(Se.$$.fragment,i),$(ts.$$.fragment,i),$(ns.$$.fragment,i),$(Ds.$$.fragment,i),$(os.$$.fragment,i),$(rs.$$.fragment,i),$(Ie.$$.fragment,i),$(Ne.$$.fragment,i),$(Qs.$$.fragment,i),$(Fe.$$.fragment,i),$(Es.$$.fragment,i),$(tt.$$.fragment,i),$(xt.$$.fragment,i),$(at.$$.fragment,i),$(Fn.$$.fragment,i),$(Ba.$$.fragment,i),$(qs.$$.fragment,i),$(Ua.$$.fragment,i),$(Wa.$$.fragment,i),$(en.$$.fragment,i),$(yt.$$.fragment,i),$(Ja.$$.fragment,i),$(Qa.$$.fragment,i),$(rl.$$.fragment,i),$(Pt.$$.fragment,i),Gl=!1},d(i){i&&s(d),C(q),i&&s(D),i&&s(y),i&&s(A),i&&s(U),i&&s(he),C(H,i),i&&s(le),i&&s(Q),i&&s(Ce),C(De,i),i&&s(es),i&&s(ne),i&&s(ut),C(ss,i),i&&s(mn),C(Se,i),i&&s(fn),C(ts,i),i&&s(pt),i&&s(ye),C(ns),i&&s(hn),i&&s(ze),i&&s(Ps),C(Ds,i),i&&s(At),i&&s(Xs),i&&s(Ee),i&&s(mt),i&&s(ie),C(os,i),i&&s(gn),i&&s(Ks),i&&s(Lt),C(rs,i),i&&s(It),i&&s(me),i&&s(wn),C(Ie,i),i&&s(is),i&&s(bs),i&&s(je),C(Ne,i),i&&s(Bt),i&&s($s),i&&s(Qn),i&&s(us),i&&s($t),C(Qs,i),i&&s(et),i&&s(st),i&&s(xn),C(Fe,i),i&&s(Cn),i&&s(oe),i&&s(Dn),i&&s(Xe),i&&s(La),i&&s(Ts),C(Es),i&&s(Tn),i&&s(qt),i&&s(kt),i&&s(Is),C(tt),i&&s(Ln),i&&s(ps),i&&s(wt),C(xt,i),i&&s(Re),i&&s(nt),i&&s(Fa),C(at,i),i&&s(Ra),i&&s(Rs),i&&s(Ct),C(Fn,i),i&&s(Qo),i&&s(pa),i&&s(er),C(Ba,i),i&&s(sr),C(qs,i),i&&s(Pl),i&&s(lt),i&&s(tr),C(Ua,i),i&&s(Dl),i&&s(ks),i&&s(nr),C(Wa,i),i&&s(wo),C(en,i),i&&s(ar),i&&s(Xa),i&&s(xo),C(yt,i),i&&s(Co),i&&s(Ge),i&&s(yo),i&&s(Bs),C(Ja),i&&s(Ml),i&&s(sn),i&&s(ma),C(Qa,i),i&&s(Nl),i&&s(Tl),i&&s(fa),i&&s(Ot),i&&s(Fl),i&&s(Rl),i&&s(Bl),C(rl,i),i&&s(ir),i&&s(nn),i&&s(ur),C(Pt,i),i&&s(pr),i&&s(xe),i&&s(Ho),i&&s(js)}}}function _h(V){let d,g,v,q,O;return{c(){d=l("p"),g=n("\u26A0\uFE0F Si vous avez un mod\xE8le avec le mauvais nombre d\u2019\xE9tiquettes, vous obtiendrez une erreur obscure lors de l\u2019appel de la m\xE9thode "),v=l("code"),q=n("Trainer.train()"),O=n(" (quelque chose comme \u201CCUDA error : device-side assert triggered\u201D). C\u2019est la premi\xE8re cause de bogues signal\xE9s par les utilisateurs pour de telles erreurs, donc assurez-vous de faire cette v\xE9rification pour confirmer que vous avez le nombre d\u2019\xE9tiquettes attendu.")},l(E){d=o(E,"P",{});var k=r(d);g=a(k,"\u26A0\uFE0F Si vous avez un mod\xE8le avec le mauvais nombre d\u2019\xE9tiquettes, vous obtiendrez une erreur obscure lors de l\u2019appel de la m\xE9thode "),v=o(k,"CODE",{});var D=r(v);q=a(D,"Trainer.train()"),D.forEach(s),O=a(k," (quelque chose comme \u201CCUDA error : device-side assert triggered\u201D). C\u2019est la premi\xE8re cause de bogues signal\xE9s par les utilisateurs pour de telles erreurs, donc assurez-vous de faire cette v\xE9rification pour confirmer que vous avez le nombre d\u2019\xE9tiquettes attendu."),k.forEach(s)},m(E,k){u(E,d,k),e(d,g),e(d,v),e(v,q),e(d,O)},d(E){E&&s(d)}}}function bh(V){let d,g,v,q,O;return{c(){d=l("p"),g=n("\u{1F4A1} Si le r\xE9pertoire de sortie que vous utilisez existe d\xE9j\xE0, il doit \xEAtre un clone local du d\xE9p\xF4t vers lequel vous voulez pousser. S\u2019il ne l\u2019est pas, vous obtiendrez une erreur lors de la d\xE9finition de votre "),v=l("code"),q=n("Trainer"),O=n(" et devrez d\xE9finir un nouveau nom.")},l(E){d=o(E,"P",{});var k=r(d);g=a(k,"\u{1F4A1} Si le r\xE9pertoire de sortie que vous utilisez existe d\xE9j\xE0, il doit \xEAtre un clone local du d\xE9p\xF4t vers lequel vous voulez pousser. S\u2019il ne l\u2019est pas, vous obtiendrez une erreur lors de la d\xE9finition de votre "),v=o(k,"CODE",{});var D=r(v);q=a(D,"Trainer"),D.forEach(s),O=a(k," et devrez d\xE9finir un nouveau nom."),k.forEach(s)},m(E,k){u(E,d,k),e(d,g),e(d,v),e(v,q),e(d,O)},d(E){E&&s(d)}}}function $h(V){let d,g,v,q,O;return{c(){d=l("p"),g=n("\u{1F6A8} Si vous entra\xEEnez sur un TPU, vous devrez d\xE9placer tout le code \xE0 partir de la cellule ci-dessus dans une fonction d\u2019entra\xEEnement d\xE9di\xE9e. Voir le "),v=l("a"),q=n("chapitre 3"),O=n(" pour plus de d\xE9tails."),this.h()},l(E){d=o(E,"P",{});var k=r(d);g=a(k,"\u{1F6A8} Si vous entra\xEEnez sur un TPU, vous devrez d\xE9placer tout le code \xE0 partir de la cellule ci-dessus dans une fonction d\u2019entra\xEEnement d\xE9di\xE9e. Voir le "),v=o(k,"A",{href:!0});var D=r(v);q=a(D,"chapitre 3"),D.forEach(s),O=a(k," pour plus de d\xE9tails."),k.forEach(s),this.h()},h(){_(v,"href","/course/fr/chapter3")},m(E,k){u(E,d,k),e(d,g),e(d,v),e(v,q),e(d,O)},d(E){E&&s(d)}}}function gh(V){let d,g,v,q,O,E,k,D,y,z,B,N,R,I,P,T,W,G,S,X,J,ae,A,U,se,Y,ee,F,K,de,Pe,he,H,le,Q,re,Z,pe,Qe,_e,ge,ys,Ce,De,es,ne,ms,fs,Mt,qa,te,ka,dn,zs,ja,wa,ut,ss,mn,Se,fn,ts,pt,ye,Le,Os,ns,xa,as,ct,Ca,vn,hn,ze,_n,dt,ya,Un,vs,Ws,ls,Ps,Ds,At,Xs,bn,Nt,Zs,Vn,Ee,mt,Wn,qe,Tt,$n,ie,os,gn,Ks,ft,St,Xn,Ys,Lt,rs,It,me,za,Ft,hs,Ve,Js,Me,Oa,Ms,Pa,Zn,ke,En,qn,Kn,Ae,vt,kn,jn,Yn,_s,wn,Ie,is,bs,ht,Rt,As,Jn,je,Ne,Bt,$s,Da,Ns,_t,Ma,Qn,us,bt,Ht,gs,Aa,$t,Qs,et,st,We,xn,Fe,Cn,oe,ea,$e,Na,yn,gt,Ta,zn,Et,Sa,On,Gt,Ut,Pn,Dn,Xe,Mn,f,L,An,La,Ts,be,Nn,Es,Ia,Ss,Vt,Tn,qt,Wt,Xt,Zt,Ls,kt,Is,fe,Kt,tt,wl,Sn,sa,Ln,ps,Yt,ta,na,aa,Ze,xl,la,oa,Cl,jt,wt,xt,Re,nt,Fs,ra,Be,yl,Fa,at,Ra,Rs,In,Oe,He,ia,ua,zl,Ol,Ct,Fn,Qo,pa,fo,vo,ei,ho,er,Ba,sr,qs,Pl,lt,si,Ha,ti,ni,Ga,ai,li,_o,Jt,bo,tr,Ua,Dl,ks,oi,Va,ri,ii,$o,Qt,go,Eo,ui,qo,ko,pi,jo,nr,Wa,wo,en,ar,Xa,Za,xo,yt,Co,Ge,ci,Ka,di,mi,Ya,fi,vi,yo,Bs,Rn,ot,Ja,zo,Oo,hi,Ml,sn,_i,Al,ca,lr,zt,da,Po,ma,Qa,Nl,Tl,or,fa,Ot,we,bi,el,$i,gi,Sl,Hs,Ei,sl,qi,ki,tl,ji,wi,nl,xi,Ci,Ll,tn,yi,Do,Gs,zi,al,Oi,Pi,Il,ll,rr,ue,Di,Mo,Ao,Mi,ol,Fl,Rl,Ai,Bl,rl,ir,nn,Ni,No,To,Ti,ur,Pt,pr,xe,So,Lo,Si,Io,Fo,Li,Ro,Bo,Ii,cr,Bn,dr,il,Hl,an,Fi,ul,Ri,Bi,pl,Hi,Gi,Ho,js,mr,Hn,fr,ve,cl,dl,Ui,Vi,Gl,i,h,vr,xu,Cu,rt,yu,zu,hr,Ou,Ul,_r,Pu,Vl,br,Du,va,$r,Mu,Au,Wl,Nu,Tu,gr,Us,Xl,Er,Su,qr,kr,jr,Lu,Zl,Iu,ws,Go,Fu,Ru,Wi,Kl,Xi,Yl,Uo,ce,wr,xr,Cr,Bu,yr,ln,Hu,zr,Gu,Uu,Jl,Vu,Or,Pr,Wu,Xu,Ql,Zu,Dr,Mr,Ku,Yu,on,Ju,Qu,Ar,Nr,ep,ha,sp,tp,Vo,eo,Gn,Wo,np,Zi,xs,Ki,so,Yi,Vs,ap,_a,lp,op,to,rp,ip,Tr,no,up,Sr,pp,ao,Xo,ml,Dt,Ue,cp,Lr,dp,rn,Ir,mp,fp,Fr,vp,Rr,Br,Ke,hp,Hr,_p,bp,Gr,$p,gp,fl,lo,Ji,Zo,sd,fc,Ep,td,vc,Qi,hc,Ur,nd,qp,ad,ld,_c,vl,hl,kp,Ko,Vr,Kp,eu,od,Yp,rd,bc,un,id,Jp,ud,pd,jp,cd,dd,Qp,md,fd,ec,vd,hd,$c,ba,_d,su,sc,bd,$d,tc,gd,Ed,nc,qd,kd,gc,_l,bl,wp,xp,jd,Ec,tu,qc,nu,kc,Cp,wd,jc,au,wc,lu,xc,$l,gl,yp,zp,Yo,Wr,ac,ou,xd,lc,Cd,Cc,El,ql,Op,ru,yc,Pp,yd,zc,iu,Oc,uu,Pc,Dp,zd,Dc,pu,Mc,Mp,Od,Ac,cu,Nc,kl,jl,Ap,Np,Jo,Xr,oc,du,Pd,Tp,Dd,rc,Md,Tc,pn,Ad,ic,Nd,Td,uc,Sd,Ld,pc,Id,Fd,cc,Rd,Bd,Sc,mu,Lc,fu,Ic,Sp,Hd,Fc;v=new Qv({props:{fw:V[0]}}),D=new it({});const Wd=[sh,eh],vu=[];function Xd(t,m){return t[0]==="pt"?0:1}P=Xd(V),T=vu[P]=Wd[P](V),vs=new Gv({props:{id:"wVHdVlPScxA"}}),Me=new it({}),_s=new Qr({props:{$$slots:{default:[th]},$$scope:{ctx:V}}}),ht=new it({}),bt=new M({props:{code:`from datasets import load_dataset

raw_datasets = load_dataset("conll2003")`,highlighted:`<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> load_dataset

raw_datasets = load_dataset(<span class="hljs-string">&quot;conll2003&quot;</span>)`}}),We=new M({props:{code:"raw_datasets",highlighted:"raw_datasets"}}),Fe=new M({props:{code:`DatasetDict({
    train: Dataset({
        features: ['chunk_tags', 'id', 'ner_tags', 'pos_tags', 'tokens'],
        num_rows: 14041
    })
    validation: Dataset({
        features: ['chunk_tags', 'id', 'ner_tags', 'pos_tags', 'tokens'],
        num_rows: 3250
    })
    test: Dataset({
        features: ['chunk_tags', 'id', 'ner_tags', 'pos_tags', 'tokens'],
        num_rows: 3453
    })
})`,highlighted:`DatasetDict({
    train: Dataset({
        features: [<span class="hljs-string">&#x27;chunk_tags&#x27;</span>, <span class="hljs-string">&#x27;id&#x27;</span>, <span class="hljs-string">&#x27;ner_tags&#x27;</span>, <span class="hljs-string">&#x27;pos_tags&#x27;</span>, <span class="hljs-string">&#x27;tokens&#x27;</span>],
        num_rows: <span class="hljs-number">14041</span>
    })
    validation: Dataset({
        features: [<span class="hljs-string">&#x27;chunk_tags&#x27;</span>, <span class="hljs-string">&#x27;id&#x27;</span>, <span class="hljs-string">&#x27;ner_tags&#x27;</span>, <span class="hljs-string">&#x27;pos_tags&#x27;</span>, <span class="hljs-string">&#x27;tokens&#x27;</span>],
        num_rows: <span class="hljs-number">3250</span>
    })
    test: Dataset({
        features: [<span class="hljs-string">&#x27;chunk_tags&#x27;</span>, <span class="hljs-string">&#x27;id&#x27;</span>, <span class="hljs-string">&#x27;ner_tags&#x27;</span>, <span class="hljs-string">&#x27;pos_tags&#x27;</span>, <span class="hljs-string">&#x27;tokens&#x27;</span>],
        num_rows: <span class="hljs-number">3453</span>
    })
})`}}),Xe=new M({props:{code:'raw_datasets["train"][0]["tokens"]',highlighted:'raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;tokens&quot;</span>]'}}),f=new M({props:{code:"['EU', 'rejects', 'German', 'call', 'to', 'boycott', 'British', 'lamb', '.']",highlighted:'[<span class="hljs-string">&#x27;EU&#x27;</span>, <span class="hljs-string">&#x27;rejects&#x27;</span>, <span class="hljs-string">&#x27;German&#x27;</span>, <span class="hljs-string">&#x27;call&#x27;</span>, <span class="hljs-string">&#x27;to&#x27;</span>, <span class="hljs-string">&#x27;boycott&#x27;</span>, <span class="hljs-string">&#x27;British&#x27;</span>, <span class="hljs-string">&#x27;lamb&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>]'}}),be=new M({props:{code:'raw_datasets["train"][0]["ner_tags"]',highlighted:'raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;ner_tags&quot;</span>]'}}),Es=new M({props:{code:"[3, 0, 7, 0, 0, 0, 7, 0, 0]",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>]'}}),Zt=new M({props:{code:`ner_feature = raw_datasets["train"].features["ner_tags"]
ner_feature`,highlighted:`ner_feature = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>].features[<span class="hljs-string">&quot;ner_tags&quot;</span>]
ner_feature`}}),kt=new M({props:{code:"Sequence(feature=ClassLabel(num_classes=9, names=['O', 'B-PER', 'I-PER', 'B-ORG', 'I-ORG', 'B-LOC', 'I-LOC', 'B-MISC', 'I-MISC'], names_file=None, id=None), length=-1, id=None)",highlighted:'<span class="hljs-type">Sequence</span>(feature=ClassLabel(num_classes=<span class="hljs-number">9</span>, names=[<span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;B-PER&#x27;</span>, <span class="hljs-string">&#x27;I-PER&#x27;</span>, <span class="hljs-string">&#x27;B-ORG&#x27;</span>, <span class="hljs-string">&#x27;I-ORG&#x27;</span>, <span class="hljs-string">&#x27;B-LOC&#x27;</span>, <span class="hljs-string">&#x27;I-LOC&#x27;</span>, <span class="hljs-string">&#x27;B-MISC&#x27;</span>, <span class="hljs-string">&#x27;I-MISC&#x27;</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>)'}}),wt=new M({props:{code:`label_names = ner_feature.feature.names
label_names`,highlighted:`label_names = ner_feature.feature.names
label_names`}}),Re=new M({props:{code:"['O', 'B-PER', 'I-PER', 'B-ORG', 'I-ORG', 'B-LOC', 'I-LOC', 'B-MISC', 'I-MISC']",highlighted:'[<span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;B-PER&#x27;</span>, <span class="hljs-string">&#x27;I-PER&#x27;</span>, <span class="hljs-string">&#x27;B-ORG&#x27;</span>, <span class="hljs-string">&#x27;I-ORG&#x27;</span>, <span class="hljs-string">&#x27;B-LOC&#x27;</span>, <span class="hljs-string">&#x27;I-LOC&#x27;</span>, <span class="hljs-string">&#x27;B-MISC&#x27;</span>, <span class="hljs-string">&#x27;I-MISC&#x27;</span>]'}}),Za=new M({props:{code:`words = raw_datasets["train"][0]["tokens"]
labels = raw_datasets["train"][0]["ner_tags"]
line1 = ""
line2 = ""
for word, label in zip(words, labels):
    full_label = label_names[label]
    max_length = max(len(word), len(full_label))
    line1 += word + " " * (max_length - len(word) + 1)
    line2 += full_label + " " * (max_length - len(full_label) + 1)

print(line1)
print(line2)`,highlighted:`words = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;tokens&quot;</span>]
labels = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;ner_tags&quot;</span>]
line1 = <span class="hljs-string">&quot;&quot;</span>
line2 = <span class="hljs-string">&quot;&quot;</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">&quot; &quot;</span> * (max_length - <span class="hljs-built_in">len</span>(word) + <span class="hljs-number">1</span>)
    line2 += full_label + <span class="hljs-string">&quot; &quot;</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)`}}),yt=new M({props:{code:`'EU    rejects German call to boycott British lamb .'
'B-ORG O       B-MISC O    O  O       B-MISC  O    O'`,highlighted:`<span class="hljs-string">&#x27;EU    rejects German call to boycott British lamb .&#x27;</span>
<span class="hljs-string">&#x27;B-ORG O       B-MISC O    O  O       B-MISC  O    O&#x27;</span>`}}),Bs=new M({props:{code:`'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 .'
'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'`,highlighted:`<span class="hljs-string">&#x27;Germany \\&#x27;s representative to the European Union \\&#x27;s veterinary committee Werner Zwingmann said on Wednesday consumers should buy sheepmeat from countries other than Britain until the scientific advice was clearer .&#x27;</span>
<span class="hljs-string">&#x27;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&#x27;</span>`}}),ca=new Qr({props:{$$slots:{default:[nh]},$$scope:{ctx:V}}}),ma=new it({}),fa=new Gv({props:{id:"iY2AZYdZAr0"}}),ll=new M({props:{code:`from transformers import AutoTokenizer

model_checkpoint = "bert-base-cased"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer

model_checkpoint = <span class="hljs-string">&quot;bert-base-cased&quot;</span>
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)`}}),Bn=new M({props:{code:"tokenizer.is_fast",highlighted:"tokenizer.is_fast"}}),il=new M({props:{code:"True",highlighted:'<span class="hljs-literal">True</span>'}}),js=new M({props:{code:`inputs = tokenizer(raw_datasets["train"][0]["tokens"], is_split_into_words=True)
inputs.tokens()`,highlighted:`inputs = tokenizer(raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;tokens&quot;</span>], is_split_into_words=<span class="hljs-literal">True</span>)
inputs.tokens()`}}),Hn=new M({props:{code:"['[CLS]', 'EU', 'rejects', 'German', 'call', 'to', 'boycott', 'British', 'la', '##mb', '.', '[SEP]']",highlighted:'[<span class="hljs-string">&#x27;[CLS]&#x27;</span>, <span class="hljs-string">&#x27;EU&#x27;</span>, <span class="hljs-string">&#x27;rejects&#x27;</span>, <span class="hljs-string">&#x27;German&#x27;</span>, <span class="hljs-string">&#x27;call&#x27;</span>, <span class="hljs-string">&#x27;to&#x27;</span>, <span class="hljs-string">&#x27;boycott&#x27;</span>, <span class="hljs-string">&#x27;British&#x27;</span>, <span class="hljs-string">&#x27;la&#x27;</span>, <span class="hljs-string">&#x27;##mb&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>, <span class="hljs-string">&#x27;[SEP]&#x27;</span>]'}}),Kl=new M({props:{code:"inputs.word_ids()",highlighted:"inputs.word_ids()"}}),Yl=new M({props:{code:"[None, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, None]",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>]'}}),eo=new M({props:{code:`def align_labels_with_tokens(labels, word_ids):
    new_labels = []
    current_word = None
    for word_id in word_ids:
        if word_id != current_word:
            # D\xE9but d'un nouveau mot !
            current_word = word_id
            label = -100 if word_id is None else labels[word_id]
            new_labels.append(label)
        elif word_id is None:
            # Token sp\xE9cial
            new_labels.append(-100)
        else:
            # M\xEAme mot que le token pr\xE9c\xE9dent
            label = labels[word_id]
            # Si l'\xE9tiquette est B-XXX, nous la changeons en I-XXX
            if label % 2 == 1:
                label += 1
            new_labels.append(label)

    return new_labels`,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"># D\xE9but d&#x27;un nouveau mot !</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"># Token sp\xE9cial</span>
            new_labels.append(-<span class="hljs-number">100</span>)
        <span class="hljs-keyword">else</span>:
            <span class="hljs-comment"># M\xEAme mot que le token pr\xE9c\xE9dent</span>
            label = labels[word_id]
            <span class="hljs-comment"># Si l&#x27;\xE9tiquette est B-XXX, nous la changeons en 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`}}),xs=new M({props:{code:`labels = raw_datasets["train"][0]["ner_tags"]
word_ids = inputs.word_ids()
print(labels)
print(align_labels_with_tokens(labels, word_ids))`,highlighted:`labels = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;ner_tags&quot;</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))`}}),so=new M({props:{code:`[3, 0, 7, 0, 0, 0, 7, 0, 0]
[-100, 3, 0, 7, 0, 0, 0, 7, 0, 0, 0, -100]`,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>]`}}),ml=new Qr({props:{$$slots:{default:[ah]},$$scope:{ctx:V}}}),lo=new M({props:{code:`def tokenize_and_align_labels(examples):
    tokenized_inputs = tokenizer(
        examples["tokens"], truncation=True, is_split_into_words=True
    )
    all_labels = examples["ner_tags"]
    new_labels = []
    for i, labels in enumerate(all_labels):
        word_ids = tokenized_inputs.word_ids(i)
        new_labels.append(align_labels_with_tokens(labels, word_ids))

    tokenized_inputs["labels"] = new_labels
    return tokenized_inputs`,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">&quot;tokens&quot;</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">&quot;ner_tags&quot;</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">&quot;labels&quot;</span>] = new_labels
    <span class="hljs-keyword">return</span> tokenized_inputs`}}),Qi=new M({props:{code:`tokenized_datasets = raw_datasets.map(
    tokenize_and_align_labels,
    batched=True,
    remove_columns=raw_datasets["train"].column_names,
)`,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">&quot;train&quot;</span>].column_names,
)`}});const Zd=[oh,lh],hu=[];function Kd(t,m){return t[0]==="pt"?0:1}vl=Kd(V),hl=hu[vl]=Zd[vl](V),eu=new it({});const Yd=[ih,rh],_u=[];function Jd(t,m){return t[0]==="pt"?0:1}_l=Jd(V),bl=_u[_l]=Yd[_l](V),tu=new M({props:{code:`batch = data_collator([tokenized_datasets["train"][i] for i in range(2)])
batch["labels"]`,highlighted:`batch = data_collator([tokenized_datasets[<span class="hljs-string">&quot;train&quot;</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">&quot;labels&quot;</span>]`}}),nu=new M({props:{code:`tensor([[-100,    3,    0,    7,    0,    0,    0,    7,    0,    0,    0, -100],
        [-100,    1,    2, -100, -100, -100, -100, -100, -100, -100, -100, -100]])`,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>]])`}}),au=new M({props:{code:`for i in range(2):
    print(tokenized_datasets["train"][i]["labels"])`,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">&quot;train&quot;</span>][i][<span class="hljs-string">&quot;labels&quot;</span>])`}}),lu=new M({props:{code:`[-100, 3, 0, 7, 0, 0, 0, 7, 0, 0, 0, -100]
[-100, 1, 2, -100]`,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>]`}});const Qd=[ph,uh],bu=[];function em(t,m){return t[0]==="pt"?0:1}$l=em(V),gl=bu[$l]=Qd[$l](V);let cs=V[0]==="tf"&&Uv(V);ou=new it({});const sm=[fh,mh],$u=[];function tm(t,m){return t[0]==="pt"?0:1}El=tm(V),ql=$u[El]=sm[El](V),ru=new M({props:{code:`import evaluate

metric = evaluate.load("seqeval")`,highlighted:`<span class="hljs-keyword">import</span> evaluate

metric = evaluate.load(<span class="hljs-string">&quot;seqeval&quot;</span>)`}}),iu=new M({props:{code:`labels = raw_datasets["train"][0]["ner_tags"]
labels = [label_names[i] for i in labels]
labels`,highlighted:`labels = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-number">0</span>][<span class="hljs-string">&quot;ner_tags&quot;</span>]
labels = [label_names[i] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> labels]
labels`}}),uu=new M({props:{code:"['B-ORG', 'O', 'B-MISC', 'O', 'O', 'O', 'B-MISC', 'O', 'O']",highlighted:'[<span class="hljs-string">&#x27;B-ORG&#x27;</span>, <span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;B-MISC&#x27;</span>, <span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;B-MISC&#x27;</span>, <span class="hljs-string">&#x27;O&#x27;</span>, <span class="hljs-string">&#x27;O&#x27;</span>]'}}),pu=new M({props:{code:`predictions = labels.copy()
predictions[2] = "O"
metric.compute(predictions=[predictions], references=[labels])`,highlighted:`predictions = labels.copy()
predictions[<span class="hljs-number">2</span>] = <span class="hljs-string">&quot;O&quot;</span>
metric.compute(predictions=[predictions], references=[labels])`}}),cu=new M({props:{code:`{'MISC': {'precision': 1.0, 'recall': 0.5, 'f1': 0.67, 'number': 2},
 'ORG': {'precision': 1.0, 'recall': 1.0, 'f1': 1.0, 'number': 1},
 'overall_precision': 1.0,
 'overall_recall': 0.67,
 'overall_f1': 0.8,
 'overall_accuracy': 0.89}`,highlighted:`{<span class="hljs-string">&#x27;MISC&#x27;</span>: {<span class="hljs-string">&#x27;precision&#x27;</span>: <span class="hljs-number">1.0</span>, <span class="hljs-string">&#x27;recall&#x27;</span>: <span class="hljs-number">0.5</span>, <span class="hljs-string">&#x27;f1&#x27;</span>: <span class="hljs-number">0.67</span>, <span class="hljs-string">&#x27;number&#x27;</span>: <span class="hljs-number">2</span>},
 <span class="hljs-string">&#x27;ORG&#x27;</span>: {<span class="hljs-string">&#x27;precision&#x27;</span>: <span class="hljs-number">1.0</span>, <span class="hljs-string">&#x27;recall&#x27;</span>: <span class="hljs-number">1.0</span>, <span class="hljs-string">&#x27;f1&#x27;</span>: <span class="hljs-number">1.0</span>, <span class="hljs-string">&#x27;number&#x27;</span>: <span class="hljs-number">1</span>},
 <span class="hljs-string">&#x27;overall_precision&#x27;</span>: <span class="hljs-number">1.0</span>,
 <span class="hljs-string">&#x27;overall_recall&#x27;</span>: <span class="hljs-number">0.67</span>,
 <span class="hljs-string">&#x27;overall_f1&#x27;</span>: <span class="hljs-number">0.8</span>,
 <span class="hljs-string">&#x27;overall_accuracy&#x27;</span>: <span class="hljs-number">0.89</span>}`}});const nm=[hh,vh],gu=[];function am(t,m){return t[0]==="pt"?0:1}kl=am(V),jl=gu[kl]=nm[kl](V);let ds=V[0]==="pt"&&Vv(V);return du=new it({}),mu=new M({props:{code:`from transformers import pipeline

# Remplacez ceci par votre propre checkpoint
model_checkpoint = "huggingface-course/bert-finetuned-ner"
token_classifier = pipeline(
    "token-classification", model=model_checkpoint, aggregation_strategy="simple"
)
token_classifier("My name is Sylvain and I work at Hugging Face in Brooklyn.")`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline

<span class="hljs-comment"># Remplacez ceci par votre propre checkpoint</span>
model_checkpoint = <span class="hljs-string">&quot;huggingface-course/bert-finetuned-ner&quot;</span>
token_classifier = pipeline(
    <span class="hljs-string">&quot;token-classification&quot;</span>, model=model_checkpoint, aggregation_strategy=<span class="hljs-string">&quot;simple&quot;</span>
)
token_classifier(<span class="hljs-string">&quot;My name is Sylvain and I work at Hugging Face in Brooklyn.&quot;</span>)`}}),fu=new M({props:{code:`[{'entity_group': 'PER', 'score': 0.9988506, 'word': 'Sylvain', 'start': 11, 'end': 18},
 {'entity_group': 'ORG', 'score': 0.9647625, 'word': 'Hugging Face', 'start': 33, 'end': 45},
 {'entity_group': 'LOC', 'score': 0.9986118, 'word': 'Brooklyn', 'start': 49, 'end': 57}]`,highlighted:`[{<span class="hljs-string">&#x27;entity_group&#x27;</span>: <span class="hljs-string">&#x27;PER&#x27;</span>, <span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">0.9988506</span>, <span class="hljs-string">&#x27;word&#x27;</span>: <span class="hljs-string">&#x27;Sylvain&#x27;</span>, <span class="hljs-string">&#x27;start&#x27;</span>: <span class="hljs-number">11</span>, <span class="hljs-string">&#x27;end&#x27;</span>: <span class="hljs-number">18</span>},
 {<span class="hljs-string">&#x27;entity_group&#x27;</span>: <span class="hljs-string">&#x27;ORG&#x27;</span>, <span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">0.9647625</span>, <span class="hljs-string">&#x27;word&#x27;</span>: <span class="hljs-string">&#x27;Hugging Face&#x27;</span>, <span class="hljs-string">&#x27;start&#x27;</span>: <span class="hljs-number">33</span>, <span class="hljs-string">&#x27;end&#x27;</span>: <span class="hljs-number">45</span>},
 {<span class="hljs-string">&#x27;entity_group&#x27;</span>: <span class="hljs-string">&#x27;LOC&#x27;</span>, <span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">0.9986118</span>, <span class="hljs-string">&#x27;word&#x27;</span>: <span class="hljs-string">&#x27;Brooklyn&#x27;</span>, <span class="hljs-string">&#x27;start&#x27;</span>: <span class="hljs-number">49</span>, <span class="hljs-string">&#x27;end&#x27;</span>: <span class="hljs-number">57</span>}]`}}),{c(){d=l("meta"),g=p(),j(v.$$.fragment),q=p(),O=l("h1"),E=l("a"),k=l("span"),j(D.$$.fragment),y=p(),z=l("span"),B=n("Classification de "),N=l("i"),R=n("tokens"),I=p(),T.c(),W=p(),G=l("p"),S=n("La premi\xE8re application que nous allons explorer est la classification de "),X=l("em"),J=n("tokens"),ae=n(". Cette t\xE2che g\xE9n\xE9rique englobe tous les probl\xE8mes qui peuvent \xEAtre formul\xE9s comme l\u2019attribution d\u2019une \xE9tiquette \xE0 chaque "),A=l("em"),U=n("token"),se=n(" d\u2019une phrase, tels que :"),Y=p(),ee=l("ul"),F=l("li"),K=n("la "),de=l("strong"),Pe=n("reconnaissance d\u2019entit\xE9s nomm\xE9es (NER de l\u2019anglais "),he=l("em"),H=n("Named Entity Recognition"),le=n(")"),Q=n(", c\u2019est-\xE0-dire trouver les entit\xE9s (telles que des personnes, des lieux ou des organisations) dans une phrase. Ce t\xE2che peut \xEAtre formul\xE9e comme l\u2019attribution d\u2019une \xE9tiquette \xE0 chaque "),re=l("em"),Z=n("token"),pe=n(" faisant parti d\u2019une entit\xE9 en ayant une classe sp\xE9cifique par entit\xE9, et une classe pour les "),Qe=l("em"),_e=n("tokens"),ge=n(" ne faisant pas parti d\u2019entit\xE9."),ys=p(),Ce=l("li"),De=n("le "),es=l("strong"),ne=l("em"),ms=n("part-of-speech tagging"),fs=n(" (POS)"),Mt=n(", c\u2019est-\xE0-dire marquer chaque mot dans une phrase comme correspondant \xE0 une partie particuli\xE8re (comme un nom, un verbe, un adjectif, etc.)."),qa=p(),te=l("li"),ka=n("le "),dn=l("strong"),zs=l("em"),ja=n("chunking"),wa=n(", c\u2019est-\xE0-dire trouver les "),ut=l("em"),ss=n("tokens"),mn=n(" qui appartiennent \xE0 la m\xEAme entit\xE9. Cette t\xE2che (qui peut \xEAtre combin\xE9e avec le POS ou la NER) peut \xEAtre formul\xE9e comme l\u2019attribution d\u2019une \xE9tiquette (habituellement "),Se=l("code"),fn=n("B-"),ts=n(") \xE0 tous les "),pt=l("em"),ye=n("tokens"),Le=n(" qui sont au d\xE9but d\u2019un morceau, une autre \xE9tiquette (habituellement "),Os=l("code"),ns=n("I-"),xa=n(") aux "),as=l("em"),ct=n("tokens"),Ca=n(" qui sont \xE0 l\u2019int\xE9rieur d\u2019un morceau, et une troisi\xE8me \xE9tiquette (habituellement "),vn=l("code"),hn=n("O"),ze=n(") aux "),_n=l("em"),dt=n("tokens"),ya=n(" qui n\u2019appartiennent \xE0 aucun morceau."),Un=p(),j(vs.$$.fragment),Ws=p(),ls=l("p"),Ps=n("Bien s\xFBr, il existe de nombreux autres types de probl\xE8mes de classification de "),Ds=l("em"),At=n("tokens"),Xs=n(". Ce ne sont l\xE0 que quelques exemples repr\xE9sentatifs. Dans cette section, nous allons "),bn=l("em"),Nt=n("finetuner"),Zs=n(" un mod\xE8le (BERT) sur la t\xE2che de NER. Il sera alors capable de calculer des pr\xE9dictions comme celle-ci :"),Vn=p(),Ee=l("iframe"),Wn=p(),qe=l("iframe"),$n=p(),ie=l("a"),os=l("img"),Ks=p(),ft=l("img"),Xn=p(),Ys=l("p"),Lt=n("Vous pouvez trouver, t\xE9l\xE9charger et v\xE9rifier les pr\xE9cisions de ce mod\xE8le sur le "),rs=l("a"),It=l("em"),me=n("Hub"),za=n(" les pr\xE9dictions du mod\xE8le que nous allons entra\xEEner."),Ft=p(),hs=l("h2"),Ve=l("a"),Js=l("span"),j(Me.$$.fragment),Oa=p(),Ms=l("span"),Pa=n("Pr\xE9paration des donn\xE9es"),Zn=p(),ke=l("p"),En=n("Tout d\u2019abord, nous avons besoin d\u2019un jeu de donn\xE9es adapt\xE9 \xE0 la classification des "),qn=l("em"),Kn=n("tokens"),Ae=n(". Dans cette section, nous utiliserons le jeu de donn\xE9es "),vt=l("a"),kn=n("CoNLL-2003"),jn=n(", qui contient des articles de presse de Reuters."),Yn=p(),j(_s.$$.fragment),wn=p(),Ie=l("h3"),is=l("a"),bs=l("span"),j(ht.$$.fragment),Rt=p(),As=l("span"),Jn=n("Le jeu de donn\xE9es CoNLL-2003"),je=p(),Ne=l("p"),Bt=n("Pour charger le jeu de donn\xE9es CoNLL-2003, nous utilisons la m\xE9thode "),$s=l("code"),Da=n("load_dataset()"),Ns=n(" de la biblioth\xE8que \u{1F917} "),_t=l("em"),Ma=n("Datasets"),Qn=n(" :"),us=p(),j(bt.$$.fragment),Ht=p(),gs=l("p"),Aa=n("Cela va t\xE9l\xE9charger et mettre en cache le jeu de donn\xE9es, comme nous l\u2019avons vu dans "),$t=l("a"),Qs=n("chapitre 3"),et=n(" pour le jeu de donn\xE9es GLUE MRPC. L\u2019inspection de cet objet nous montre les colonnes pr\xE9sentes dans ce jeu de donn\xE9es et la r\xE9partition entre les ensembles d\u2019entra\xEEnement, de validation et de test :"),st=p(),j(We.$$.fragment),xn=p(),j(Fe.$$.fragment),Cn=p(),oe=l("p"),ea=n("En particulier, nous pouvons voir que le jeu de donn\xE9es contient des \xE9tiquettes pour les trois t\xE2ches que nous avons mentionn\xE9es pr\xE9c\xE9demment : NER, POS et "),$e=l("em"),Na=n("chunking"),yn=n(". Une grande diff\xE9rence avec les autres jeux de donn\xE9es est que les entr\xE9es textuelles ne sont pas pr\xE9sent\xE9s comme des phrases ou des documents, mais comme des listes de mots (la derni\xE8re colonne est appel\xE9e "),gt=l("code"),Ta=n("tokens"),zn=n(", mais elle contient des mots dans le sens o\xF9 ce sont des entr\xE9es pr\xE9tok\xE9nis\xE9es qui doivent encore passer par le "),Et=l("em"),Sa=n("tokenizer"),On=n(" pour la tokenisation en sous-mots)."),Gt=p(),Ut=l("p"),Pn=n("Regardons le premier \xE9l\xE9ment de l\u2019ensemble d\u2019entra\xEEnement :"),Dn=p(),j(Xe.$$.fragment),Mn=p(),j(f.$$.fragment),L=p(),An=l("p"),La=n("Puisque nous voulons effectuer reconna\xEEtre des entit\xE9s nomm\xE9es, nous allons examiner les balises NER :"),Ts=p(),j(be.$$.fragment),Nn=p(),j(Es.$$.fragment),Ia=p(),Ss=l("p"),Vt=n("Ce sont les \xE9tiquettes sous forme d\u2019entiers disponibles pour l\u2019entra\xEEnement mais ne sont pas n\xE9cessairement utiles lorsque nous voulons inspecter les donn\xE9es. Comme pour la classification de texte, nous pouvons acc\xE9der \xE0 la correspondance entre ces entiers et les noms des \xE9tiquettes en regardant l\u2019attribut "),Tn=l("code"),qt=n("features"),Wt=n(" de notre jeu de donn\xE9es :"),Xt=p(),j(Zt.$$.fragment),Ls=p(),j(kt.$$.fragment),Is=p(),fe=l("p"),Kt=n("Cette colonne contient donc des \xE9l\xE9ments qui sont des s\xE9quences de "),tt=l("code"),wl=n("ClassLabel"),Sn=n(". Le type des \xE9l\xE9ments de la s\xE9quence se trouve dans l\u2019attribut "),sa=l("code"),Ln=n("feature"),ps=n(" de cette "),Yt=l("code"),ta=n("ner_feature"),na=n(", et nous pouvons acc\xE9der \xE0 la liste des noms en regardant l\u2019attribut "),aa=l("code"),Ze=n("names"),xl=n(" de cette "),la=l("code"),oa=n("feature"),Cl=n(" :"),jt=p(),j(wt.$$.fragment),xt=p(),j(Re.$$.fragment),nt=p(),Fs=l("p"),ra=n("Nous avons d\xE9j\xE0 vu ces \xE9tiquettes au "),Be=l("a"),yl=n("chapitre 6"),Fa=n(" lorsque nous nous sommes int\xE9ress\xE9s au pipeline "),at=l("code"),Ra=n("token-classification"),Rs=n(" mais nosu pouvons tout de m\xEAme faire un rapide rappel :"),In=p(),Oe=l("ul"),He=l("li"),ia=l("code"),ua=n("O"),zl=n(" signifie que le mot ne correspond \xE0 aucune entit\xE9."),Ol=p(),Ct=l("li"),Fn=l("code"),Qo=n("B-PER"),pa=n("/"),fo=l("code"),vo=n("I-PER"),ei=n(" signifie que le mot correspond au d\xE9but/est \xE0 l\u2019int\xE9rieur d\u2019une entit\xE9 "),ho=l("em"),er=n("personne"),Ba=n("."),sr=p(),qs=l("li"),Pl=l("code"),lt=n("B-ORG"),si=n("/"),Ha=l("code"),ti=n("I-ORG"),ni=n(" signifie que le mot correspond au d\xE9but/est \xE0 l\u2019int\xE9rieur d\u2019une entit\xE9 "),Ga=l("em"),ai=n("organisation"),li=n("."),_o=p(),Jt=l("li"),bo=l("code"),tr=n("B-LOC"),Ua=n("/"),Dl=l("code"),ks=n("I-LOC"),oi=n(" signifie que le mot correspond au d\xE9but/est \xE0 l\u2019int\xE9rieur d\u2019une entit\xE9 "),Va=l("em"),ri=n("location"),ii=n("."),$o=p(),Qt=l("li"),go=l("code"),Eo=n("B-MISC"),ui=n("/"),qo=l("code"),ko=n("I-MISC"),pi=n(" signifie que le mot correspond au d\xE9but/est \xE0 l\u2019int\xE9rieur d\u2019une entit\xE9 "),jo=l("em"),nr=n("divers"),Wa=n("."),wo=p(),en=l("p"),ar=n("Maintenant, le d\xE9codage des \xE9tiquettes que nous avons vues pr\xE9c\xE9demment nous donne ceci :"),Xa=p(),j(Za.$$.fragment),xo=p(),j(yt.$$.fragment),Co=p(),Ge=l("p"),ci=n("Et pour un exemple m\xE9langeant les \xE9tiquettes "),Ka=l("code"),di=n("B-"),mi=n(" et "),Ya=l("code"),fi=n("I-"),vi=n(", voici ce que le m\xEAme code nous donne sur le quatri\xE8me \xE9l\xE9ment du jeu d\u2019entra\xEEnement :"),yo=p(),j(Bs.$$.fragment),Rn=p(),ot=l("p"),Ja=n("Comme on peut le voir, les entit\xE9s couvrant deux mots, comme \xAB European Union \xBB et \xAB Werner Zwingmann \xBB, se voient attribuer une \xE9tiquette "),zo=l("code"),Oo=n("B-"),hi=n(" pour le premier mot et une \xE9tiquette "),Ml=l("code"),sn=n("I-"),_i=n(" pour le second."),Al=p(),j(ca.$$.fragment),lr=p(),zt=l("h3"),da=l("a"),Po=l("span"),j(ma.$$.fragment),Qa=p(),Nl=l("span"),Tl=n("Traitement des donn\xE9es"),or=p(),j(fa.$$.fragment),Ot=p(),we=l("p"),bi=n("Comme d\u2019habitude, nos textes doivent \xEAtre convertis en identifiants de "),el=l("em"),$i=n("tokens"),gi=n(" avant que le mod\xE8le puisse leur donner un sens. Comme nous l\u2019avons vu au "),Sl=l("a"),Hs=n("chapitre 6"),Ei=n(", une grande diff\xE9rence dans le cas des t\xE2ches de classification de "),sl=l("em"),qi=n("tokens"),ki=n(" est que nous avons des entr\xE9es pr\xE9tok\xE9nis\xE9es. Heureusement, l\u2019API "),tl=l("code"),ji=n("tokenizer"),wi=n(" peut g\xE9rer cela assez facilement. Nous devons juste avertir le "),nl=l("code"),xi=n("tokenizer"),Ci=n(" avec un drapeau sp\xE9cial."),Ll=p(),tn=l("p"),yi=n("Pour commencer, nous allons cr\xE9er notre objet "),Do=l("code"),Gs=n("tokenizer"),zi=n(". Comme nous l\u2019avons dit pr\xE9c\xE9demment, nous allons utiliser un mod\xE8le BERT pr\xE9-entra\xEEn\xE9, donc nous allons commencer par t\xE9l\xE9charger et mettre en cache le "),al=l("em"),Oi=n("tokenizer"),Pi=n(" associ\xE9 :"),Il=p(),j(ll.$$.fragment),rr=p(),ue=l("p"),Di=n("Vous pouvez remplacer le "),Mo=l("code"),Ao=n("model_checkpoint"),Mi=n(" par tout autre mod\xE8le que vous pr\xE9f\xE9rez \xE0 partir du "),ol=l("a"),Fl=l("em"),Rl=n("Hub"),Ai=n(", ou par un dossier local dans lequel vous avez sauvegard\xE9 un mod\xE8le pr\xE9-entra\xEEn\xE9 et un "),Bl=l("em"),rl=n("tokenizer"),ir=n(". La seule contrainte est que le "),nn=l("em"),Ni=n("tokenizer"),No=n(" doit \xEAtre soutenu par la biblioth\xE8que \u{1F917} "),To=l("em"),Ti=n("Tokenizers"),ur=n(". Il y a donc une version rapide disponible. Vous pouvez voir toutes les architectures qui ont une version rapide dans "),Pt=l("a"),pr=n("ce tableau"),xe=n(", et pour v\xE9rifier que l\u2019objet "),So=l("code"),Lo=n("tokenizer"),Si=n(" que vous utilisez est bien soutenu par \u{1F917} "),Io=l("em"),Fo=n("Tokenizers"),Li=n(" vous pouvez regarder son attribut "),Ro=l("code"),Bo=n("is_fast"),Ii=n(" :"),cr=p(),j(Bn.$$.fragment),dr=p(),j(il.$$.fragment),Hl=p(),an=l("p"),Fi=n("Pour tokeniser une entr\xE9e pr\xE9tokenis\xE9e, nous pouvons utiliser notre "),ul=l("code"),Ri=n("tokenizer"),Bi=n(" comme d\u2019habitude et juste ajouter "),pl=l("code"),Hi=n("is_split_into_words=True"),Gi=n(" :"),Ho=p(),j(js.$$.fragment),mr=p(),j(Hn.$$.fragment),fr=p(),ve=l("p"),cl=n("Comme on peut le voir, le "),dl=l("em"),Ui=n("tokenizer"),Vi=n(" a ajout\xE9 les "),Gl=l("em"),i=n("tokens"),h=n(" sp\xE9ciaux utilis\xE9s par le mod\xE8le ("),vr=l("code"),xu=n("[CLS]"),Cu=n(" au d\xE9but et "),rt=l("code"),yu=n("[SEP]"),zu=n(" \xE0 la fin) et n\u2019a pas touch\xE9 \xE0 la plupart des mots. Le mot "),hr=l("code"),Ou=n("lamb"),Ul=n(", cependant, a \xE9t\xE9 tokenis\xE9 en deux sous-mots, "),_r=l("code"),Pu=n("la"),Vl=n(" et "),br=l("code"),Du=n("##mb"),va=n(". Cela introduit un d\xE9calage entre nos entr\xE9es et les \xE9tiquettes : la liste des \xE9tiquettes n\u2019a que 9 \xE9l\xE9ments, alors que notre entr\xE9e a maintenant 12 "),$r=l("em"),Mu=n("tokens"),Au=n(". Il est facile de tenir compte des "),Wl=l("em"),Nu=n("tokens"),Tu=n(" sp\xE9ciaux (nous savons qu\u2019ils sont au d\xE9but et \xE0 la fin), mais nous devons \xE9galement nous assurer que nous alignons toutes les \xE9tiquettes avec les mots appropri\xE9s."),gr=p(),Us=l("p"),Xl=n("Heureusement, comme nous utilisons un "),Er=l("em"),Su=n("tokenizer"),qr=n(" rapide, nous avons acc\xE8s aux superpouvoirs des \u{1F917} "),kr=l("em"),jr=n("Tokenizers"),Lu=n(", ce qui signifie que nous pouvons facilement faire correspondre chaque "),Zl=l("em"),Iu=n("token"),ws=n(" au mot correspondant (comme on le voit au "),Go=l("a"),Fu=n("chapitre 6"),Ru=n(") :"),Wi=p(),j(Kl.$$.fragment),Xi=p(),j(Yl.$$.fragment),Uo=p(),ce=l("p"),wr=n("Avec un peu de travail, nous pouvons \xE9tendre notre liste d\u2019\xE9tiquettes pour qu\u2019elle corresponde aux "),xr=l("em"),Cr=n("tokens"),Bu=n(". La premi\xE8re r\xE8gle que nous allons appliquer est que les "),yr=l("em"),ln=n("tokens"),Hu=n(" sp\xE9ciaux re\xE7oivent une \xE9tiquette de "),zr=l("code"),Gu=n("-100"),Uu=n(". En effet, par d\xE9faut, "),Jl=l("code"),Vu=n("-100"),Or=n(" est un indice qui est ignor\xE9 dans la fonction de perte que nous allons utiliser (l\u2019entropie crois\xE9e). Ensuite, chaque "),Pr=l("em"),Wu=n("token"),Xu=n(" re\xE7oit la m\xEAme \xE9tiquette que le "),Ql=l("em"),Zu=n("token"),Dr=n(" qui a commenc\xE9 le mot dans lequel il se trouve puisqu\u2019ils font partie de la m\xEAme entit\xE9. Pour les "),Mr=l("em"),Ku=n("tokens"),Yu=n(" \xE0 l\u2019int\xE9rieur d\u2019un mot mais pas au d\xE9but, nous rempla\xE7ons le "),on=l("code"),Ju=n("B-"),Qu=n(" par "),Ar=l("code"),Nr=n("I-"),ep=n(" (puisque le "),ha=l("em"),sp=n("token"),tp=n(" ne commence pas l\u2019entit\xE9) :"),Vo=p(),j(eo.$$.fragment),Gn=p(),Wo=l("p"),np=n("Essayons-le sur notre premi\xE8re phrase :"),Zi=p(),j(xs.$$.fragment),Ki=p(),j(so.$$.fragment),Yi=p(),Vs=l("p"),ap=n("Comme nous pouvons le voir, notre fonction a ajout\xE9 "),_a=l("code"),lp=n("-100"),op=n(" pour les deux "),to=l("em"),rp=n("tokens"),ip=n(" sp\xE9ciaux du d\xE9but et de fin, et un nouveau "),Tr=l("code"),no=n("0"),up=n(" pour notre mot qui a \xE9t\xE9 divis\xE9 en deux "),Sr=l("em"),pp=n("tokens"),ao=n("."),Xo=p(),j(ml.$$.fragment),Dt=p(),Ue=l("p"),cp=n("Pour pr\xE9traiter notre jeu de donn\xE9es, nous devons tokeniser toutes les entr\xE9es et appliquer "),Lr=l("code"),dp=n("align_labels_with_tokens()"),rn=n(" sur toutes les \xE9tiquettes. Pour profiter de la vitesse de notre "),Ir=l("em"),mp=n("tokenizer"),fp=n(" rapide, il est pr\xE9f\xE9rable de tokeniser beaucoup de textes en m\xEAme temps. Nous allons donc \xE9crire une fonction qui traite une liste d\u2019exemples et utiliser la m\xE9thode "),Fr=l("code"),vp=n("Dataset.map()"),Rr=n(" avec l\u2019option "),Br=l("code"),Ke=n("batched=True"),hp=n(". La seule chose qui diff\xE8re de notre exemple pr\xE9c\xE9dent est que la fonction "),Hr=l("code"),_p=n("word_ids()"),bp=n(" a besoin de r\xE9cup\xE9rer l\u2019index de l\u2019exemple dont nous voulons les identifiants de mots lorsque les entr\xE9es du "),Gr=l("em"),$p=n("tokenizer"),gp=n(" sont des listes de textes (ou dans notre cas, des listes de mots), donc nous l\u2019ajoutons aussi :"),fl=p(),j(lo.$$.fragment),Ji=p(),Zo=l("p"),sd=n("Notez que nous n\u2019avons pas encore rembourr\xE9 nos entr\xE9es. Nous le ferons plus tard lors de la cr\xE9ation des batchs avec un assembleur de donn\xE9es."),fc=p(),Ep=l("p"),td=n("Nous pouvons maintenant appliquer tout ce pr\xE9traitement en une seule fois sur les autres divisions de notre jeu de donn\xE9es :"),vc=p(),j(Qi.$$.fragment),hc=p(),Ur=l("p"),nd=n("Nous avons fait la partie la plus difficile ! Maintenant que les donn\xE9es ont \xE9t\xE9 pr\xE9trait\xE9es, l\u2019entra\xEEnement ressemblera beaucoup \xE0 ce que nous avons fait dans le "),qp=l("a"),ad=n("chapitre 3"),ld=n("."),_c=p(),hl.c(),kp=p(),Ko=l("h3"),Vr=l("a"),Kp=l("span"),j(eu.$$.fragment),od=p(),Yp=l("span"),rd=n("Assemblage des donn\xE9es"),bc=p(),un=l("p"),id=n("Nous ne pouvons pas simplement utiliser un "),Jp=l("code"),ud=n("DataCollatorWithPadding"),pd=n(" comme dans le "),jp=l("a"),cd=n("chapitre 3"),dd=n(" car cela ne fait que rembourrer les entr\xE9es (identifiants d\u2019entr\xE9e, masque d\u2019attention et "),Qp=l("em"),md=n("token"),fd=n(" de type identifiants). Ici, nos \xE9tiquettes doivent \xEAtre rembourr\xE9\xE9s exactement de la m\xEAme mani\xE8re que les entr\xE9es afin qu\u2019elles gardent la m\xEAme taille, en utilisant "),ec=l("code"),vd=n("-100"),hd=n(" comme valeur afin que les pr\xE9dictions correspondantes soient ignor\xE9es dans le calcul de la perte."),$c=p(),ba=l("p"),_d=n("Tout ceci est fait par un "),su=l("a"),sc=l("code"),bd=n("DataCollatorForTokenClassification"),$d=n(". Comme le "),tc=l("code"),gd=n("DataCollatorWithPadding"),Ed=n(", il prend le "),nc=l("code"),qd=n("tokenizer"),kd=n(" utilis\xE9 pour pr\xE9traiter les entr\xE9es :"),gc=p(),bl.c(),wp=p(),xp=l("p"),jd=n("Pour tester cette fonction sur quelques \xE9chantillons, nous pouvons simplement l\u2019appeler sur une liste d\u2019exemples provenant de notre jeu d\u2019entra\xEEnement tok\xE9nis\xE9 :"),Ec=p(),j(tu.$$.fragment),qc=p(),j(nu.$$.fragment),kc=p(),Cp=l("p"),wd=n("Comparons cela aux \xE9tiquettes des premier et deuxi\xE8me \xE9l\xE9ments de notre jeu de donn\xE9es :"),jc=p(),j(au.$$.fragment),wc=p(),j(lu.$$.fragment),xc=p(),gl.c(),yp=p(),cs&&cs.c(),zp=p(),Yo=l("h3"),Wr=l("a"),ac=l("span"),j(ou.$$.fragment),xd=p(),lc=l("span"),Cd=n("M\xE9triques"),Cc=p(),ql.c(),Op=p(),j(ru.$$.fragment),yc=p(),Pp=l("p"),yd=n("Cette m\xE9trique ne se comporte pas comme la pr\xE9cision standard : elle prend les listes d\u2019\xE9tiquettes comme des cha\xEEnes de caract\xE8res et non comme des entiers. Nous devrons donc d\xE9coder compl\xE8tement les pr\xE9dictions et les \xE9tiquettes avant de les transmettre \xE0 la m\xE9trique. Voyons comment cela fonctionne. Tout d\u2019abord, nous allons obtenir les \xE9tiquettes pour notre premier exemple d\u2019entra\xEEnement :"),zc=p(),j(iu.$$.fragment),Oc=p(),j(uu.$$.fragment),Pc=p(),Dp=l("p"),zd=n("Nous pouvons alors cr\xE9er de fausses pr\xE9dictions pour celles-ci en changeant simplement la valeur de l\u2019indice 2 :"),Dc=p(),j(pu.$$.fragment),Mc=p(),Mp=l("p"),Od=n("Notez que la m\xE9trique prend une liste de pr\xE9dictions (pas seulement une) et une liste d\u2019\xE9tiquettes. Voici la sortie :"),Ac=p(),j(cu.$$.fragment),Nc=p(),jl.c(),Ap=p(),ds&&ds.c(),Np=p(),Jo=l("h3"),Xr=l("a"),oc=l("span"),j(du.$$.fragment),Pd=p(),Tp=l("span"),Dd=n("Utilisation du mod\xE8le "),rc=l("i"),Md=n("finetun\xE9"),Tc=p(),pn=l("p"),Ad=n("Nous vous avons d\xE9j\xE0 montr\xE9 comment vous pouvez utiliser le mod\xE8le "),ic=l("em"),Nd=n("finetun\xE9"),Td=n(" sur le "),uc=l("em"),Sd=n("Hub"),Ld=n(" avec le "),pc=l("em"),Id=n("widget"),Fd=n(" d\u2019inf\xE9rence. Pour l\u2019utiliser localement dans un "),cc=l("code"),Rd=n("pipeline"),Bd=n(", vous devez juste sp\xE9cifier l\u2019identifiant de mod\xE8le appropri\xE9 :"),Sc=p(),j(mu.$$.fragment),Lc=p(),j(fu.$$.fragment),Ic=p(),Sp=l("p"),Hd=n("Super ! Notre mod\xE8le fonctionne aussi bien que le mod\xE8le par d\xE9faut pour ce pipeline !"),this.h()},l(t){const m=Yv('[data-svelte="svelte-1phssyn"]',document.head);d=o(m,"META",{name:!0,content:!0}),m.forEach(s),g=c(t),w(v.$$.fragment,t),q=c(t),O=o(t,"H1",{class:!0});var Eu=r(O);E=o(Eu,"A",{id:!0,class:!0,href:!0});var Lp=r(E);k=o(Lp,"SPAN",{});var dc=r(k);w(D.$$.fragment,dc),dc.forEach(s),Lp.forEach(s),y=c(Eu),z=o(Eu,"SPAN",{});var Ip=r(z);B=a(Ip,"Classification de "),N=o(Ip,"I",{});var mc=r(N);R=a(mc,"tokens"),mc.forEach(s),Ip.forEach(s),Eu.forEach(s),I=c(t),T.l(t),W=c(t),G=o(t,"P",{});var oo=r(G);S=a(oo,"La premi\xE8re application que nous allons explorer est la classification de "),X=o(oo,"EM",{});var Fp=r(X);J=a(Fp,"tokens"),Fp.forEach(s),ae=a(oo,". Cette t\xE2che g\xE9n\xE9rique englobe tous les probl\xE8mes qui peuvent \xEAtre formul\xE9s comme l\u2019attribution d\u2019une \xE9tiquette \xE0 chaque "),A=o(oo,"EM",{});var Rp=r(A);U=a(Rp,"token"),Rp.forEach(s),se=a(oo," d\u2019une phrase, tels que :"),oo.forEach(s),Y=c(t),ee=o(t,"UL",{});var ro=r(ee);F=o(ro,"LI",{});var $a=r(F);K=a($a,"la "),de=o($a,"STRONG",{});var Rc=r(de);Pe=a(Rc,"reconnaissance d\u2019entit\xE9s nomm\xE9es (NER de l\u2019anglais "),he=o(Rc,"EM",{});var lm=r(he);H=a(lm,"Named Entity Recognition"),lm.forEach(s),le=a(Rc,")"),Rc.forEach(s),Q=a($a,", c\u2019est-\xE0-dire trouver les entit\xE9s (telles que des personnes, des lieux ou des organisations) dans une phrase. Ce t\xE2che peut \xEAtre formul\xE9e comme l\u2019attribution d\u2019une \xE9tiquette \xE0 chaque "),re=o($a,"EM",{});var om=r(re);Z=a(om,"token"),om.forEach(s),pe=a($a," faisant parti d\u2019une entit\xE9 en ayant une classe sp\xE9cifique par entit\xE9, et une classe pour les "),Qe=o($a,"EM",{});var rm=r(Qe);_e=a(rm,"tokens"),rm.forEach(s),ge=a($a," ne faisant pas parti d\u2019entit\xE9."),$a.forEach(s),ys=c(ro),Ce=o(ro,"LI",{});var Bc=r(Ce);De=a(Bc,"le "),es=o(Bc,"STRONG",{});var Gd=r(es);ne=o(Gd,"EM",{});var im=r(ne);ms=a(im,"part-of-speech tagging"),im.forEach(s),fs=a(Gd," (POS)"),Gd.forEach(s),Mt=a(Bc,", c\u2019est-\xE0-dire marquer chaque mot dans une phrase comme correspondant \xE0 une partie particuli\xE8re (comme un nom, un verbe, un adjectif, etc.)."),Bc.forEach(s),qa=c(ro),te=o(ro,"LI",{});var Cs=r(te);ka=a(Cs,"le "),dn=o(Cs,"STRONG",{});var um=r(dn);zs=o(um,"EM",{});var pm=r(zs);ja=a(pm,"chunking"),pm.forEach(s),um.forEach(s),wa=a(Cs,", c\u2019est-\xE0-dire trouver les "),ut=o(Cs,"EM",{});var cm=r(ut);ss=a(cm,"tokens"),cm.forEach(s),mn=a(Cs," qui appartiennent \xE0 la m\xEAme entit\xE9. Cette t\xE2che (qui peut \xEAtre combin\xE9e avec le POS ou la NER) peut \xEAtre formul\xE9e comme l\u2019attribution d\u2019une \xE9tiquette (habituellement "),Se=o(Cs,"CODE",{});var dm=r(Se);fn=a(dm,"B-"),dm.forEach(s),ts=a(Cs,") \xE0 tous les "),pt=o(Cs,"EM",{});var mm=r(pt);ye=a(mm,"tokens"),mm.forEach(s),Le=a(Cs," qui sont au d\xE9but d\u2019un morceau, une autre \xE9tiquette (habituellement "),Os=o(Cs,"CODE",{});var fm=r(Os);ns=a(fm,"I-"),fm.forEach(s),xa=a(Cs,") aux "),as=o(Cs,"EM",{});var vm=r(as);ct=a(vm,"tokens"),vm.forEach(s),Ca=a(Cs," qui sont \xE0 l\u2019int\xE9rieur d\u2019un morceau, et une troisi\xE8me \xE9tiquette (habituellement "),vn=o(Cs,"CODE",{});var hm=r(vn);hn=a(hm,"O"),hm.forEach(s),ze=a(Cs,") aux "),_n=o(Cs,"EM",{});var _m=r(_n);dt=a(_m,"tokens"),_m.forEach(s),ya=a(Cs," qui n\u2019appartiennent \xE0 aucun morceau."),Cs.forEach(s),ro.forEach(s),Un=c(t),w(vs.$$.fragment,t),Ws=c(t),ls=o(t,"P",{});var Bp=r(ls);Ps=a(Bp,"Bien s\xFBr, il existe de nombreux autres types de probl\xE8mes de classification de "),Ds=o(Bp,"EM",{});var bm=r(Ds);At=a(bm,"tokens"),bm.forEach(s),Xs=a(Bp,". Ce ne sont l\xE0 que quelques exemples repr\xE9sentatifs. Dans cette section, nous allons "),bn=o(Bp,"EM",{});var $m=r(bn);Nt=a($m,"finetuner"),$m.forEach(s),Zs=a(Bp," un mod\xE8le (BERT) sur la t\xE2che de NER. Il sera alors capable de calculer des pr\xE9dictions comme celle-ci :"),Bp.forEach(s),Vn=c(t),Ee=o(t,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),r(Ee).forEach(s),Wn=c(t),qe=o(t,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),r(qe).forEach(s),$n=c(t),ie=o(t,"A",{class:!0,href:!0});var Hc=r(ie);os=o(Hc,"IMG",{class:!0,src:!0,alt:!0}),Ks=c(Hc),ft=o(Hc,"IMG",{class:!0,src:!0,alt:!0}),Hc.forEach(s),Xn=c(t),Ys=o(t,"P",{});var Gc=r(Ys);Lt=a(Gc,"Vous pouvez trouver, t\xE9l\xE9charger et v\xE9rifier les pr\xE9cisions de ce mod\xE8le sur le "),rs=o(Gc,"A",{href:!0,rel:!0});var gm=r(rs);It=o(gm,"EM",{});var Em=r(It);me=a(Em,"Hub"),Em.forEach(s),gm.forEach(s),za=a(Gc," les pr\xE9dictions du mod\xE8le que nous allons entra\xEEner."),Gc.forEach(s),Ft=c(t),hs=o(t,"H2",{class:!0});var Uc=r(hs);Ve=o(Uc,"A",{id:!0,class:!0,href:!0});var qm=r(Ve);Js=o(qm,"SPAN",{});var km=r(Js);w(Me.$$.fragment,km),km.forEach(s),qm.forEach(s),Oa=c(Uc),Ms=o(Uc,"SPAN",{});var jm=r(Ms);Pa=a(jm,"Pr\xE9paration des donn\xE9es"),jm.forEach(s),Uc.forEach(s),Zn=c(t),ke=o(t,"P",{});var Hp=r(ke);En=a(Hp,"Tout d\u2019abord, nous avons besoin d\u2019un jeu de donn\xE9es adapt\xE9 \xE0 la classification des "),qn=o(Hp,"EM",{});var wm=r(qn);Kn=a(wm,"tokens"),wm.forEach(s),Ae=a(Hp,". Dans cette section, nous utiliserons le jeu de donn\xE9es "),vt=o(Hp,"A",{href:!0,rel:!0});var xm=r(vt);kn=a(xm,"CoNLL-2003"),xm.forEach(s),jn=a(Hp,", qui contient des articles de presse de Reuters."),Hp.forEach(s),Yn=c(t),w(_s.$$.fragment,t),wn=c(t),Ie=o(t,"H3",{class:!0});var Vc=r(Ie);is=o(Vc,"A",{id:!0,class:!0,href:!0});var Cm=r(is);bs=o(Cm,"SPAN",{});var ym=r(bs);w(ht.$$.fragment,ym),ym.forEach(s),Cm.forEach(s),Rt=c(Vc),As=o(Vc,"SPAN",{});var zm=r(As);Jn=a(zm,"Le jeu de donn\xE9es CoNLL-2003"),zm.forEach(s),Vc.forEach(s),je=c(t),Ne=o(t,"P",{});var Gp=r(Ne);Bt=a(Gp,"Pour charger le jeu de donn\xE9es CoNLL-2003, nous utilisons la m\xE9thode "),$s=o(Gp,"CODE",{});var Om=r($s);Da=a(Om,"load_dataset()"),Om.forEach(s),Ns=a(Gp," de la biblioth\xE8que \u{1F917} "),_t=o(Gp,"EM",{});var Pm=r(_t);Ma=a(Pm,"Datasets"),Pm.forEach(s),Qn=a(Gp," :"),Gp.forEach(s),us=c(t),w(bt.$$.fragment,t),Ht=c(t),gs=o(t,"P",{});var Wc=r(gs);Aa=a(Wc,"Cela va t\xE9l\xE9charger et mettre en cache le jeu de donn\xE9es, comme nous l\u2019avons vu dans "),$t=o(Wc,"A",{href:!0});var Dm=r($t);Qs=a(Dm,"chapitre 3"),Dm.forEach(s),et=a(Wc," pour le jeu de donn\xE9es GLUE MRPC. L\u2019inspection de cet objet nous montre les colonnes pr\xE9sentes dans ce jeu de donn\xE9es et la r\xE9partition entre les ensembles d\u2019entra\xEEnement, de validation et de test :"),Wc.forEach(s),st=c(t),w(We.$$.fragment,t),xn=c(t),w(Fe.$$.fragment,t),Cn=c(t),oe=o(t,"P",{});var Zr=r(oe);ea=a(Zr,"En particulier, nous pouvons voir que le jeu de donn\xE9es contient des \xE9tiquettes pour les trois t\xE2ches que nous avons mentionn\xE9es pr\xE9c\xE9demment : NER, POS et "),$e=o(Zr,"EM",{});var Mm=r($e);Na=a(Mm,"chunking"),Mm.forEach(s),yn=a(Zr,". Une grande diff\xE9rence avec les autres jeux de donn\xE9es est que les entr\xE9es textuelles ne sont pas pr\xE9sent\xE9s comme des phrases ou des documents, mais comme des listes de mots (la derni\xE8re colonne est appel\xE9e "),gt=o(Zr,"CODE",{});var Am=r(gt);Ta=a(Am,"tokens"),Am.forEach(s),zn=a(Zr,", mais elle contient des mots dans le sens o\xF9 ce sont des entr\xE9es pr\xE9tok\xE9nis\xE9es qui doivent encore passer par le "),Et=o(Zr,"EM",{});var Nm=r(Et);Sa=a(Nm,"tokenizer"),Nm.forEach(s),On=a(Zr," pour la tokenisation en sous-mots)."),Zr.forEach(s),Gt=c(t),Ut=o(t,"P",{});var Tm=r(Ut);Pn=a(Tm,"Regardons le premier \xE9l\xE9ment de l\u2019ensemble d\u2019entra\xEEnement :"),Tm.forEach(s),Dn=c(t),w(Xe.$$.fragment,t),Mn=c(t),w(f.$$.fragment,t),L=c(t),An=o(t,"P",{});var Sm=r(An);La=a(Sm,"Puisque nous voulons effectuer reconna\xEEtre des entit\xE9s nomm\xE9es, nous allons examiner les balises NER :"),Sm.forEach(s),Ts=c(t),w(be.$$.fragment,t),Nn=c(t),w(Es.$$.fragment,t),Ia=c(t),Ss=o(t,"P",{});var Xc=r(Ss);Vt=a(Xc,"Ce sont les \xE9tiquettes sous forme d\u2019entiers disponibles pour l\u2019entra\xEEnement mais ne sont pas n\xE9cessairement utiles lorsque nous voulons inspecter les donn\xE9es. Comme pour la classification de texte, nous pouvons acc\xE9der \xE0 la correspondance entre ces entiers et les noms des \xE9tiquettes en regardant l\u2019attribut "),Tn=o(Xc,"CODE",{});var Lm=r(Tn);qt=a(Lm,"features"),Lm.forEach(s),Wt=a(Xc," de notre jeu de donn\xE9es :"),Xc.forEach(s),Xt=c(t),w(Zt.$$.fragment,t),Ls=c(t),w(kt.$$.fragment,t),Is=c(t),fe=o(t,"P",{});var ga=r(fe);Kt=a(ga,"Cette colonne contient donc des \xE9l\xE9ments qui sont des s\xE9quences de "),tt=o(ga,"CODE",{});var Im=r(tt);wl=a(Im,"ClassLabel"),Im.forEach(s),Sn=a(ga,". Le type des \xE9l\xE9ments de la s\xE9quence se trouve dans l\u2019attribut "),sa=o(ga,"CODE",{});var Fm=r(sa);Ln=a(Fm,"feature"),Fm.forEach(s),ps=a(ga," de cette "),Yt=o(ga,"CODE",{});var Rm=r(Yt);ta=a(Rm,"ner_feature"),Rm.forEach(s),na=a(ga,", et nous pouvons acc\xE9der \xE0 la liste des noms en regardant l\u2019attribut "),aa=o(ga,"CODE",{});var Bm=r(aa);Ze=a(Bm,"names"),Bm.forEach(s),xl=a(ga," de cette "),la=o(ga,"CODE",{});var Hm=r(la);oa=a(Hm,"feature"),Hm.forEach(s),Cl=a(ga," :"),ga.forEach(s),jt=c(t),w(wt.$$.fragment,t),xt=c(t),w(Re.$$.fragment,t),nt=c(t),Fs=o(t,"P",{});var Up=r(Fs);ra=a(Up,"Nous avons d\xE9j\xE0 vu ces \xE9tiquettes au "),Be=o(Up,"A",{href:!0});var Gm=r(Be);yl=a(Gm,"chapitre 6"),Gm.forEach(s),Fa=a(Up," lorsque nous nous sommes int\xE9ress\xE9s au pipeline "),at=o(Up,"CODE",{});var Um=r(at);Ra=a(Um,"token-classification"),Um.forEach(s),Rs=a(Up," mais nosu pouvons tout de m\xEAme faire un rapide rappel :"),Up.forEach(s),In=c(t),Oe=o(t,"UL",{});var io=r(Oe);He=o(io,"LI",{});var Ud=r(He);ia=o(Ud,"CODE",{});var Vm=r(ia);ua=a(Vm,"O"),Vm.forEach(s),zl=a(Ud," signifie que le mot ne correspond \xE0 aucune entit\xE9."),Ud.forEach(s),Ol=c(io),Ct=o(io,"LI",{});var qu=r(Ct);Fn=o(qu,"CODE",{});var Wm=r(Fn);Qo=a(Wm,"B-PER"),Wm.forEach(s),pa=a(qu,"/"),fo=o(qu,"CODE",{});var Xm=r(fo);vo=a(Xm,"I-PER"),Xm.forEach(s),ei=a(qu," signifie que le mot correspond au d\xE9but/est \xE0 l\u2019int\xE9rieur d\u2019une entit\xE9 "),ho=o(qu,"EM",{});var Zm=r(ho);er=a(Zm,"personne"),Zm.forEach(s),Ba=a(qu,"."),qu.forEach(s),sr=c(io),qs=o(io,"LI",{});var ku=r(qs);Pl=o(ku,"CODE",{});var Km=r(Pl);lt=a(Km,"B-ORG"),Km.forEach(s),si=a(ku,"/"),Ha=o(ku,"CODE",{});var Ym=r(Ha);ti=a(Ym,"I-ORG"),Ym.forEach(s),ni=a(ku," signifie que le mot correspond au d\xE9but/est \xE0 l\u2019int\xE9rieur d\u2019une entit\xE9 "),Ga=o(ku,"EM",{});var Jm=r(Ga);ai=a(Jm,"organisation"),Jm.forEach(s),li=a(ku,"."),ku.forEach(s),_o=c(io),Jt=o(io,"LI",{});var ju=r(Jt);bo=o(ju,"CODE",{});var Qm=r(bo);tr=a(Qm,"B-LOC"),Qm.forEach(s),Ua=a(ju,"/"),Dl=o(ju,"CODE",{});var ef=r(Dl);ks=a(ef,"I-LOC"),ef.forEach(s),oi=a(ju," signifie que le mot correspond au d\xE9but/est \xE0 l\u2019int\xE9rieur d\u2019une entit\xE9 "),Va=o(ju,"EM",{});var sf=r(Va);ri=a(sf,"location"),sf.forEach(s),ii=a(ju,"."),ju.forEach(s),$o=c(io),Qt=o(io,"LI",{});var wu=r(Qt);go=o(wu,"CODE",{});var tf=r(go);Eo=a(tf,"B-MISC"),tf.forEach(s),ui=a(wu,"/"),qo=o(wu,"CODE",{});var nf=r(qo);ko=a(nf,"I-MISC"),nf.forEach(s),pi=a(wu," signifie que le mot correspond au d\xE9but/est \xE0 l\u2019int\xE9rieur d\u2019une entit\xE9 "),jo=o(wu,"EM",{});var af=r(jo);nr=a(af,"divers"),af.forEach(s),Wa=a(wu,"."),wu.forEach(s),io.forEach(s),wo=c(t),en=o(t,"P",{});var lf=r(en);ar=a(lf,"Maintenant, le d\xE9codage des \xE9tiquettes que nous avons vues pr\xE9c\xE9demment nous donne ceci :"),lf.forEach(s),Xa=c(t),w(Za.$$.fragment,t),xo=c(t),w(yt.$$.fragment,t),Co=c(t),Ge=o(t,"P",{});var Vp=r(Ge);ci=a(Vp,"Et pour un exemple m\xE9langeant les \xE9tiquettes "),Ka=o(Vp,"CODE",{});var of=r(Ka);di=a(of,"B-"),of.forEach(s),mi=a(Vp," et "),Ya=o(Vp,"CODE",{});var rf=r(Ya);fi=a(rf,"I-"),rf.forEach(s),vi=a(Vp,", voici ce que le m\xEAme code nous donne sur le quatri\xE8me \xE9l\xE9ment du jeu d\u2019entra\xEEnement :"),Vp.forEach(s),yo=c(t),w(Bs.$$.fragment,t),Rn=c(t),ot=o(t,"P",{});var Wp=r(ot);Ja=a(Wp,"Comme on peut le voir, les entit\xE9s couvrant deux mots, comme \xAB European Union \xBB et \xAB Werner Zwingmann \xBB, se voient attribuer une \xE9tiquette "),zo=o(Wp,"CODE",{});var uf=r(zo);Oo=a(uf,"B-"),uf.forEach(s),hi=a(Wp," pour le premier mot et une \xE9tiquette "),Ml=o(Wp,"CODE",{});var pf=r(Ml);sn=a(pf,"I-"),pf.forEach(s),_i=a(Wp," pour le second."),Wp.forEach(s),Al=c(t),w(ca.$$.fragment,t),lr=c(t),zt=o(t,"H3",{class:!0});var Zc=r(zt);da=o(Zc,"A",{id:!0,class:!0,href:!0});var cf=r(da);Po=o(cf,"SPAN",{});var df=r(Po);w(ma.$$.fragment,df),df.forEach(s),cf.forEach(s),Qa=c(Zc),Nl=o(Zc,"SPAN",{});var mf=r(Nl);Tl=a(mf,"Traitement des donn\xE9es"),mf.forEach(s),Zc.forEach(s),or=c(t),w(fa.$$.fragment,t),Ot=c(t),we=o(t,"P",{});var Ea=r(we);bi=a(Ea,"Comme d\u2019habitude, nos textes doivent \xEAtre convertis en identifiants de "),el=o(Ea,"EM",{});var ff=r(el);$i=a(ff,"tokens"),ff.forEach(s),gi=a(Ea," avant que le mod\xE8le puisse leur donner un sens. Comme nous l\u2019avons vu au "),Sl=o(Ea,"A",{href:!0});var vf=r(Sl);Hs=a(vf,"chapitre 6"),vf.forEach(s),Ei=a(Ea,", une grande diff\xE9rence dans le cas des t\xE2ches de classification de "),sl=o(Ea,"EM",{});var hf=r(sl);qi=a(hf,"tokens"),hf.forEach(s),ki=a(Ea," est que nous avons des entr\xE9es pr\xE9tok\xE9nis\xE9es. Heureusement, l\u2019API "),tl=o(Ea,"CODE",{});var _f=r(tl);ji=a(_f,"tokenizer"),_f.forEach(s),wi=a(Ea," peut g\xE9rer cela assez facilement. Nous devons juste avertir le "),nl=o(Ea,"CODE",{});var bf=r(nl);xi=a(bf,"tokenizer"),bf.forEach(s),Ci=a(Ea," avec un drapeau sp\xE9cial."),Ea.forEach(s),Ll=c(t),tn=o(t,"P",{});var Xp=r(tn);yi=a(Xp,"Pour commencer, nous allons cr\xE9er notre objet "),Do=o(Xp,"CODE",{});var $f=r(Do);Gs=a($f,"tokenizer"),$f.forEach(s),zi=a(Xp,". Comme nous l\u2019avons dit pr\xE9c\xE9demment, nous allons utiliser un mod\xE8le BERT pr\xE9-entra\xEEn\xE9, donc nous allons commencer par t\xE9l\xE9charger et mettre en cache le "),al=o(Xp,"EM",{});var gf=r(al);Oi=a(gf,"tokenizer"),gf.forEach(s),Pi=a(Xp," associ\xE9 :"),Xp.forEach(s),Il=c(t),w(ll.$$.fragment,t),rr=c(t),ue=o(t,"P",{});var Ye=r(ue);Di=a(Ye,"Vous pouvez remplacer le "),Mo=o(Ye,"CODE",{});var Ef=r(Mo);Ao=a(Ef,"model_checkpoint"),Ef.forEach(s),Mi=a(Ye," par tout autre mod\xE8le que vous pr\xE9f\xE9rez \xE0 partir du "),ol=o(Ye,"A",{href:!0,rel:!0});var qf=r(ol);Fl=o(qf,"EM",{});var kf=r(Fl);Rl=a(kf,"Hub"),kf.forEach(s),qf.forEach(s),Ai=a(Ye,", ou par un dossier local dans lequel vous avez sauvegard\xE9 un mod\xE8le pr\xE9-entra\xEEn\xE9 et un "),Bl=o(Ye,"EM",{});var jf=r(Bl);rl=a(jf,"tokenizer"),jf.forEach(s),ir=a(Ye,". La seule contrainte est que le "),nn=o(Ye,"EM",{});var wf=r(nn);Ni=a(wf,"tokenizer"),wf.forEach(s),No=a(Ye," doit \xEAtre soutenu par la biblioth\xE8que \u{1F917} "),To=o(Ye,"EM",{});var xf=r(To);Ti=a(xf,"Tokenizers"),xf.forEach(s),ur=a(Ye,". Il y a donc une version rapide disponible. Vous pouvez voir toutes les architectures qui ont une version rapide dans "),Pt=o(Ye,"A",{href:!0,rel:!0});var Cf=r(Pt);pr=a(Cf,"ce tableau"),Cf.forEach(s),xe=a(Ye,", et pour v\xE9rifier que l\u2019objet "),So=o(Ye,"CODE",{});var yf=r(So);Lo=a(yf,"tokenizer"),yf.forEach(s),Si=a(Ye," que vous utilisez est bien soutenu par \u{1F917} "),Io=o(Ye,"EM",{});var zf=r(Io);Fo=a(zf,"Tokenizers"),zf.forEach(s),Li=a(Ye," vous pouvez regarder son attribut "),Ro=o(Ye,"CODE",{});var Of=r(Ro);Bo=a(Of,"is_fast"),Of.forEach(s),Ii=a(Ye," :"),Ye.forEach(s),cr=c(t),w(Bn.$$.fragment,t),dr=c(t),w(il.$$.fragment,t),Hl=c(t),an=o(t,"P",{});var Zp=r(an);Fi=a(Zp,"Pour tokeniser une entr\xE9e pr\xE9tokenis\xE9e, nous pouvons utiliser notre "),ul=o(Zp,"CODE",{});var Pf=r(ul);Ri=a(Pf,"tokenizer"),Pf.forEach(s),Bi=a(Zp," comme d\u2019habitude et juste ajouter "),pl=o(Zp,"CODE",{});var Df=r(pl);Hi=a(Df,"is_split_into_words=True"),Df.forEach(s),Gi=a(Zp," :"),Zp.forEach(s),Ho=c(t),w(js.$$.fragment,t),mr=c(t),w(Hn.$$.fragment,t),fr=c(t),ve=o(t,"P",{});var Je=r(ve);cl=a(Je,"Comme on peut le voir, le "),dl=o(Je,"EM",{});var Mf=r(dl);Ui=a(Mf,"tokenizer"),Mf.forEach(s),Vi=a(Je," a ajout\xE9 les "),Gl=o(Je,"EM",{});var Af=r(Gl);i=a(Af,"tokens"),Af.forEach(s),h=a(Je," sp\xE9ciaux utilis\xE9s par le mod\xE8le ("),vr=o(Je,"CODE",{});var Nf=r(vr);xu=a(Nf,"[CLS]"),Nf.forEach(s),Cu=a(Je," au d\xE9but et "),rt=o(Je,"CODE",{});var Tf=r(rt);yu=a(Tf,"[SEP]"),Tf.forEach(s),zu=a(Je," \xE0 la fin) et n\u2019a pas touch\xE9 \xE0 la plupart des mots. Le mot "),hr=o(Je,"CODE",{});var Sf=r(hr);Ou=a(Sf,"lamb"),Sf.forEach(s),Ul=a(Je,", cependant, a \xE9t\xE9 tokenis\xE9 en deux sous-mots, "),_r=o(Je,"CODE",{});var Lf=r(_r);Pu=a(Lf,"la"),Lf.forEach(s),Vl=a(Je," et "),br=o(Je,"CODE",{});var If=r(br);Du=a(If,"##mb"),If.forEach(s),va=a(Je,". Cela introduit un d\xE9calage entre nos entr\xE9es et les \xE9tiquettes : la liste des \xE9tiquettes n\u2019a que 9 \xE9l\xE9ments, alors que notre entr\xE9e a maintenant 12 "),$r=o(Je,"EM",{});var Ff=r($r);Mu=a(Ff,"tokens"),Ff.forEach(s),Au=a(Je,". Il est facile de tenir compte des "),Wl=o(Je,"EM",{});var Rf=r(Wl);Nu=a(Rf,"tokens"),Rf.forEach(s),Tu=a(Je," sp\xE9ciaux (nous savons qu\u2019ils sont au d\xE9but et \xE0 la fin), mais nous devons \xE9galement nous assurer que nous alignons toutes les \xE9tiquettes avec les mots appropri\xE9s."),Je.forEach(s),gr=c(t),Us=o(t,"P",{});var uo=r(Us);Xl=a(uo,"Heureusement, comme nous utilisons un "),Er=o(uo,"EM",{});var Bf=r(Er);Su=a(Bf,"tokenizer"),Bf.forEach(s),qr=a(uo," rapide, nous avons acc\xE8s aux superpouvoirs des \u{1F917} "),kr=o(uo,"EM",{});var Hf=r(kr);jr=a(Hf,"Tokenizers"),Hf.forEach(s),Lu=a(uo,", ce qui signifie que nous pouvons facilement faire correspondre chaque "),Zl=o(uo,"EM",{});var Gf=r(Zl);Iu=a(Gf,"token"),Gf.forEach(s),ws=a(uo," au mot correspondant (comme on le voit au "),Go=o(uo,"A",{href:!0});var Uf=r(Go);Fu=a(Uf,"chapitre 6"),Uf.forEach(s),Ru=a(uo,") :"),uo.forEach(s),Wi=c(t),w(Kl.$$.fragment,t),Xi=c(t),w(Yl.$$.fragment,t),Uo=c(t),ce=o(t,"P",{});var Te=r(ce);wr=a(Te,"Avec un peu de travail, nous pouvons \xE9tendre notre liste d\u2019\xE9tiquettes pour qu\u2019elle corresponde aux "),xr=o(Te,"EM",{});var Vf=r(xr);Cr=a(Vf,"tokens"),Vf.forEach(s),Bu=a(Te,". La premi\xE8re r\xE8gle que nous allons appliquer est que les "),yr=o(Te,"EM",{});var Wf=r(yr);ln=a(Wf,"tokens"),Wf.forEach(s),Hu=a(Te," sp\xE9ciaux re\xE7oivent une \xE9tiquette de "),zr=o(Te,"CODE",{});var Xf=r(zr);Gu=a(Xf,"-100"),Xf.forEach(s),Uu=a(Te,". En effet, par d\xE9faut, "),Jl=o(Te,"CODE",{});var Zf=r(Jl);Vu=a(Zf,"-100"),Zf.forEach(s),Or=a(Te," est un indice qui est ignor\xE9 dans la fonction de perte que nous allons utiliser (l\u2019entropie crois\xE9e). Ensuite, chaque "),Pr=o(Te,"EM",{});var Kf=r(Pr);Wu=a(Kf,"token"),Kf.forEach(s),Xu=a(Te," re\xE7oit la m\xEAme \xE9tiquette que le "),Ql=o(Te,"EM",{});var Yf=r(Ql);Zu=a(Yf,"token"),Yf.forEach(s),Dr=a(Te," qui a commenc\xE9 le mot dans lequel il se trouve puisqu\u2019ils font partie de la m\xEAme entit\xE9. Pour les "),Mr=o(Te,"EM",{});var Jf=r(Mr);Ku=a(Jf,"tokens"),Jf.forEach(s),Yu=a(Te," \xE0 l\u2019int\xE9rieur d\u2019un mot mais pas au d\xE9but, nous rempla\xE7ons le "),on=o(Te,"CODE",{});var Qf=r(on);Ju=a(Qf,"B-"),Qf.forEach(s),Qu=a(Te," par "),Ar=o(Te,"CODE",{});var ev=r(Ar);Nr=a(ev,"I-"),ev.forEach(s),ep=a(Te," (puisque le "),ha=o(Te,"EM",{});var sv=r(ha);sp=a(sv,"token"),sv.forEach(s),tp=a(Te," ne commence pas l\u2019entit\xE9) :"),Te.forEach(s),Vo=c(t),w(eo.$$.fragment,t),Gn=c(t),Wo=o(t,"P",{});var tv=r(Wo);np=a(tv,"Essayons-le sur notre premi\xE8re phrase :"),tv.forEach(s),Zi=c(t),w(xs.$$.fragment,t),Ki=c(t),w(so.$$.fragment,t),Yi=c(t),Vs=o(t,"P",{});var po=r(Vs);ap=a(po,"Comme nous pouvons le voir, notre fonction a ajout\xE9 "),_a=o(po,"CODE",{});var nv=r(_a);lp=a(nv,"-100"),nv.forEach(s),op=a(po," pour les deux "),to=o(po,"EM",{});var av=r(to);rp=a(av,"tokens"),av.forEach(s),ip=a(po," sp\xE9ciaux du d\xE9but et de fin, et un nouveau "),Tr=o(po,"CODE",{});var lv=r(Tr);no=a(lv,"0"),lv.forEach(s),up=a(po," pour notre mot qui a \xE9t\xE9 divis\xE9 en deux "),Sr=o(po,"EM",{});var ov=r(Sr);pp=a(ov,"tokens"),ov.forEach(s),ao=a(po,"."),po.forEach(s),Xo=c(t),w(ml.$$.fragment,t),Dt=c(t),Ue=o(t,"P",{});var cn=r(Ue);cp=a(cn,"Pour pr\xE9traiter notre jeu de donn\xE9es, nous devons tokeniser toutes les entr\xE9es et appliquer "),Lr=o(cn,"CODE",{});var rv=r(Lr);dp=a(rv,"align_labels_with_tokens()"),rv.forEach(s),rn=a(cn," sur toutes les \xE9tiquettes. Pour profiter de la vitesse de notre "),Ir=o(cn,"EM",{});var iv=r(Ir);mp=a(iv,"tokenizer"),iv.forEach(s),fp=a(cn," rapide, il est pr\xE9f\xE9rable de tokeniser beaucoup de textes en m\xEAme temps. Nous allons donc \xE9crire une fonction qui traite une liste d\u2019exemples et utiliser la m\xE9thode "),Fr=o(cn,"CODE",{});var uv=r(Fr);vp=a(uv,"Dataset.map()"),uv.forEach(s),Rr=a(cn," avec l\u2019option "),Br=o(cn,"CODE",{});var pv=r(Br);Ke=a(pv,"batched=True"),pv.forEach(s),hp=a(cn,". La seule chose qui diff\xE8re de notre exemple pr\xE9c\xE9dent est que la fonction "),Hr=o(cn,"CODE",{});var cv=r(Hr);_p=a(cv,"word_ids()"),cv.forEach(s),bp=a(cn," a besoin de r\xE9cup\xE9rer l\u2019index de l\u2019exemple dont nous voulons les identifiants de mots lorsque les entr\xE9es du "),Gr=o(cn,"EM",{});var dv=r(Gr);$p=a(dv,"tokenizer"),dv.forEach(s),gp=a(cn," sont des listes de textes (ou dans notre cas, des listes de mots), donc nous l\u2019ajoutons aussi :"),cn.forEach(s),fl=c(t),w(lo.$$.fragment,t),Ji=c(t),Zo=o(t,"P",{});var mv=r(Zo);sd=a(mv,"Notez que nous n\u2019avons pas encore rembourr\xE9 nos entr\xE9es. Nous le ferons plus tard lors de la cr\xE9ation des batchs avec un assembleur de donn\xE9es."),mv.forEach(s),fc=c(t),Ep=o(t,"P",{});var fv=r(Ep);td=a(fv,"Nous pouvons maintenant appliquer tout ce pr\xE9traitement en une seule fois sur les autres divisions de notre jeu de donn\xE9es :"),fv.forEach(s),vc=c(t),w(Qi.$$.fragment,t),hc=c(t),Ur=o(t,"P",{});var Kc=r(Ur);nd=a(Kc,"Nous avons fait la partie la plus difficile ! Maintenant que les donn\xE9es ont \xE9t\xE9 pr\xE9trait\xE9es, l\u2019entra\xEEnement ressemblera beaucoup \xE0 ce que nous avons fait dans le "),qp=o(Kc,"A",{href:!0});var vv=r(qp);ad=a(vv,"chapitre 3"),vv.forEach(s),ld=a(Kc,"."),Kc.forEach(s),_c=c(t),hl.l(t),kp=c(t),Ko=o(t,"H3",{class:!0});var Yc=r(Ko);Vr=o(Yc,"A",{id:!0,class:!0,href:!0});var hv=r(Vr);Kp=o(hv,"SPAN",{});var _v=r(Kp);w(eu.$$.fragment,_v),_v.forEach(s),hv.forEach(s),od=c(Yc),Yp=o(Yc,"SPAN",{});var bv=r(Yp);rd=a(bv,"Assemblage des donn\xE9es"),bv.forEach(s),Yc.forEach(s),bc=c(t),un=o(t,"P",{});var co=r(un);id=a(co,"Nous ne pouvons pas simplement utiliser un "),Jp=o(co,"CODE",{});var $v=r(Jp);ud=a($v,"DataCollatorWithPadding"),$v.forEach(s),pd=a(co," comme dans le "),jp=o(co,"A",{href:!0});var gv=r(jp);cd=a(gv,"chapitre 3"),gv.forEach(s),dd=a(co," car cela ne fait que rembourrer les entr\xE9es (identifiants d\u2019entr\xE9e, masque d\u2019attention et "),Qp=o(co,"EM",{});var Ev=r(Qp);md=a(Ev,"token"),Ev.forEach(s),fd=a(co," de type identifiants). Ici, nos \xE9tiquettes doivent \xEAtre rembourr\xE9\xE9s exactement de la m\xEAme mani\xE8re que les entr\xE9es afin qu\u2019elles gardent la m\xEAme taille, en utilisant "),ec=o(co,"CODE",{});var qv=r(ec);vd=a(qv,"-100"),qv.forEach(s),hd=a(co," comme valeur afin que les pr\xE9dictions correspondantes soient ignor\xE9es dans le calcul de la perte."),co.forEach(s),$c=c(t),ba=o(t,"P",{});var Kr=r(ba);_d=a(Kr,"Tout ceci est fait par un "),su=o(Kr,"A",{href:!0,rel:!0});var kv=r(su);sc=o(kv,"CODE",{});var jv=r(sc);bd=a(jv,"DataCollatorForTokenClassification"),jv.forEach(s),kv.forEach(s),$d=a(Kr,". Comme le "),tc=o(Kr,"CODE",{});var wv=r(tc);gd=a(wv,"DataCollatorWithPadding"),wv.forEach(s),Ed=a(Kr,", il prend le "),nc=o(Kr,"CODE",{});var xv=r(nc);qd=a(xv,"tokenizer"),xv.forEach(s),kd=a(Kr," utilis\xE9 pour pr\xE9traiter les entr\xE9es :"),Kr.forEach(s),gc=c(t),bl.l(t),wp=c(t),xp=o(t,"P",{});var Cv=r(xp);jd=a(Cv,"Pour tester cette fonction sur quelques \xE9chantillons, nous pouvons simplement l\u2019appeler sur une liste d\u2019exemples provenant de notre jeu d\u2019entra\xEEnement tok\xE9nis\xE9 :"),Cv.forEach(s),Ec=c(t),w(tu.$$.fragment,t),qc=c(t),w(nu.$$.fragment,t),kc=c(t),Cp=o(t,"P",{});var yv=r(Cp);wd=a(yv,"Comparons cela aux \xE9tiquettes des premier et deuxi\xE8me \xE9l\xE9ments de notre jeu de donn\xE9es :"),yv.forEach(s),jc=c(t),w(au.$$.fragment,t),wc=c(t),w(lu.$$.fragment,t),xc=c(t),gl.l(t),yp=c(t),cs&&cs.l(t),zp=c(t),Yo=o(t,"H3",{class:!0});var Jc=r(Yo);Wr=o(Jc,"A",{id:!0,class:!0,href:!0});var zv=r(Wr);ac=o(zv,"SPAN",{});var Ov=r(ac);w(ou.$$.fragment,Ov),Ov.forEach(s),zv.forEach(s),xd=c(Jc),lc=o(Jc,"SPAN",{});var Pv=r(lc);Cd=a(Pv,"M\xE9triques"),Pv.forEach(s),Jc.forEach(s),Cc=c(t),ql.l(t),Op=c(t),w(ru.$$.fragment,t),yc=c(t),Pp=o(t,"P",{});var Dv=r(Pp);yd=a(Dv,"Cette m\xE9trique ne se comporte pas comme la pr\xE9cision standard : elle prend les listes d\u2019\xE9tiquettes comme des cha\xEEnes de caract\xE8res et non comme des entiers. Nous devrons donc d\xE9coder compl\xE8tement les pr\xE9dictions et les \xE9tiquettes avant de les transmettre \xE0 la m\xE9trique. Voyons comment cela fonctionne. Tout d\u2019abord, nous allons obtenir les \xE9tiquettes pour notre premier exemple d\u2019entra\xEEnement :"),Dv.forEach(s),zc=c(t),w(iu.$$.fragment,t),Oc=c(t),w(uu.$$.fragment,t),Pc=c(t),Dp=o(t,"P",{});var Mv=r(Dp);zd=a(Mv,"Nous pouvons alors cr\xE9er de fausses pr\xE9dictions pour celles-ci en changeant simplement la valeur de l\u2019indice 2 :"),Mv.forEach(s),Dc=c(t),w(pu.$$.fragment,t),Mc=c(t),Mp=o(t,"P",{});var Av=r(Mp);Od=a(Av,"Notez que la m\xE9trique prend une liste de pr\xE9dictions (pas seulement une) et une liste d\u2019\xE9tiquettes. Voici la sortie :"),Av.forEach(s),Ac=c(t),w(cu.$$.fragment,t),Nc=c(t),jl.l(t),Ap=c(t),ds&&ds.l(t),Np=c(t),Jo=o(t,"H3",{class:!0});var Qc=r(Jo);Xr=o(Qc,"A",{id:!0,class:!0,href:!0});var Nv=r(Xr);oc=o(Nv,"SPAN",{});var Tv=r(oc);w(du.$$.fragment,Tv),Tv.forEach(s),Nv.forEach(s),Pd=c(Qc),Tp=o(Qc,"SPAN",{});var Vd=r(Tp);Dd=a(Vd,"Utilisation du mod\xE8le "),rc=o(Vd,"I",{});var Sv=r(rc);Md=a(Sv,"finetun\xE9"),Sv.forEach(s),Vd.forEach(s),Qc.forEach(s),Tc=c(t),pn=o(t,"P",{});var mo=r(pn);Ad=a(mo,"Nous vous avons d\xE9j\xE0 montr\xE9 comment vous pouvez utiliser le mod\xE8le "),ic=o(mo,"EM",{});var Lv=r(ic);Nd=a(Lv,"finetun\xE9"),Lv.forEach(s),Td=a(mo," sur le "),uc=o(mo,"EM",{});var Iv=r(uc);Sd=a(Iv,"Hub"),Iv.forEach(s),Ld=a(mo," avec le "),pc=o(mo,"EM",{});var Fv=r(pc);Id=a(Fv,"widget"),Fv.forEach(s),Fd=a(mo," d\u2019inf\xE9rence. Pour l\u2019utiliser localement dans un "),cc=o(mo,"CODE",{});var Rv=r(cc);Rd=a(Rv,"pipeline"),Rv.forEach(s),Bd=a(mo,", vous devez juste sp\xE9cifier l\u2019identifiant de mod\xE8le appropri\xE9 :"),mo.forEach(s),Sc=c(t),w(mu.$$.fragment,t),Lc=c(t),w(fu.$$.fragment,t),Ic=c(t),Sp=o(t,"P",{});var Bv=r(Sp);Hd=a(Bv,"Super ! Notre mod\xE8le fonctionne aussi bien que le mod\xE8le par d\xE9faut pour ce pipeline !"),Bv.forEach(s),this.h()},h(){_(d,"name","hf:doc:metadata"),_(d,"content",JSON.stringify(Eh)),_(E,"id","classification-de-itokensi"),_(E,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(E,"href","#classification-de-itokensi"),_(O,"class","relative group"),ed(Ee.src,mt="https://hf.space/gradioiframe/course-demos/bert-finetuned-ner/+")||_(Ee,"src",mt),_(Ee,"frameborder","0"),_(Ee,"height","350"),_(Ee,"title","Gradio app"),_(Ee,"class","block dark:hidden container p-0 flex-grow space-iframe"),_(Ee,"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"),_(Ee,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"),ed(qe.src,Tt="https://hf.space/gradioiframe/course-demos/bert-finetuned-ner-darkmode/+")||_(qe,"src",Tt),_(qe,"frameborder","0"),_(qe,"height","350"),_(qe,"title","Gradio app"),_(qe,"class","hidden dark:block container p-0 flex-grow space-iframe"),_(qe,"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"),_(qe,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"),_(os,"class","block dark:hidden lg:w-3/5"),ed(os.src,gn="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/model-eval-bert-finetuned-ner.png")||_(os,"src",gn),_(os,"alt","One-hot encoded labels for question answering."),_(ft,"class","hidden dark:block lg:w-3/5"),ed(ft.src,St="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter7/model-eval-bert-finetuned-ner-dark.png")||_(ft,"src",St),_(ft,"alt","One-hot encoded labels for question answering."),_(ie,"class","flex justify-center"),_(ie,"href","/huggingface-course/bert-finetuned-ner"),_(rs,"href","https://huggingface.co/huggingface-course/bert-finetuned-ner?text=My+nom+est+Sylvain+et+je+travaille+%C3%A0+Hugging+Face+in+Brooklyn"),_(rs,"rel","nofollow"),_(Ve,"id","prparation-des-donnes"),_(Ve,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(Ve,"href","#prparation-des-donnes"),_(hs,"class","relative group"),_(vt,"href","https://huggingface.co/datasets/conll2003"),_(vt,"rel","nofollow"),_(is,"id","le-jeu-de-donnes-conll2003"),_(is,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(is,"href","#le-jeu-de-donnes-conll2003"),_(Ie,"class","relative group"),_($t,"href","/course/fr/chapter3"),_(Be,"href","/course/fr/chapter6/3"),_(da,"id","traitement-des-donnes"),_(da,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(da,"href","#traitement-des-donnes"),_(zt,"class","relative group"),_(Sl,"href","/course/fr/chapter6/"),_(ol,"href","https://huggingface.co/models"),_(ol,"rel","nofollow"),_(Pt,"href","https://huggingface.co/transformers/#supported-frameworks"),_(Pt,"rel","nofollow"),_(Go,"href","/course/fr/chapter6/3"),_(qp,"href","/course/fr/chapter3"),_(Vr,"id","assemblage-des-donnes"),_(Vr,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(Vr,"href","#assemblage-des-donnes"),_(Ko,"class","relative group"),_(jp,"href","/course/fr/chapter3"),_(su,"href","https://huggingface.co/transformers/main_classes/data_collator.html#datacollatorfortokenclassification"),_(su,"rel","nofollow"),_(Wr,"id","mtriques"),_(Wr,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(Wr,"href","#mtriques"),_(Yo,"class","relative group"),_(Xr,"id","utilisation-du-modle-ifinetuni"),_(Xr,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),_(Xr,"href","#utilisation-du-modle-ifinetuni"),_(Jo,"class","relative group")},m(t,m){e(document.head,d),u(t,g,m),x(v,t,m),u(t,q,m),u(t,O,m),e(O,E),e(E,k),x(D,k,null),e(O,y),e(O,z),e(z,B),e(z,N),e(N,R),u(t,I,m),vu[P].m(t,m),u(t,W,m),u(t,G,m),e(G,S),e(G,X),e(X,J),e(G,ae),e(G,A),e(A,U),e(G,se),u(t,Y,m),u(t,ee,m),e(ee,F),e(F,K),e(F,de),e(de,Pe),e(de,he),e(he,H),e(de,le),e(F,Q),e(F,re),e(re,Z),e(F,pe),e(F,Qe),e(Qe,_e),e(F,ge),e(ee,ys),e(ee,Ce),e(Ce,De),e(Ce,es),e(es,ne),e(ne,ms),e(es,fs),e(Ce,Mt),e(ee,qa),e(ee,te),e(te,ka),e(te,dn),e(dn,zs),e(zs,ja),e(te,wa),e(te,ut),e(ut,ss),e(te,mn),e(te,Se),e(Se,fn),e(te,ts),e(te,pt),e(pt,ye),e(te,Le),e(te,Os),e(Os,ns),e(te,xa),e(te,as),e(as,ct),e(te,Ca),e(te,vn),e(vn,hn),e(te,ze),e(te,_n),e(_n,dt),e(te,ya),u(t,Un,m),x(vs,t,m),u(t,Ws,m),u(t,ls,m),e(ls,Ps),e(ls,Ds),e(Ds,At),e(ls,Xs),e(ls,bn),e(bn,Nt),e(ls,Zs),u(t,Vn,m),u(t,Ee,m),u(t,Wn,m),u(t,qe,m),u(t,$n,m),u(t,ie,m),e(ie,os),e(ie,Ks),e(ie,ft),u(t,Xn,m),u(t,Ys,m),e(Ys,Lt),e(Ys,rs),e(rs,It),e(It,me),e(Ys,za),u(t,Ft,m),u(t,hs,m),e(hs,Ve),e(Ve,Js),x(Me,Js,null),e(hs,Oa),e(hs,Ms),e(Ms,Pa),u(t,Zn,m),u(t,ke,m),e(ke,En),e(ke,qn),e(qn,Kn),e(ke,Ae),e(ke,vt),e(vt,kn),e(ke,jn),u(t,Yn,m),x(_s,t,m),u(t,wn,m),u(t,Ie,m),e(Ie,is),e(is,bs),x(ht,bs,null),e(Ie,Rt),e(Ie,As),e(As,Jn),u(t,je,m),u(t,Ne,m),e(Ne,Bt),e(Ne,$s),e($s,Da),e(Ne,Ns),e(Ne,_t),e(_t,Ma),e(Ne,Qn),u(t,us,m),x(bt,t,m),u(t,Ht,m),u(t,gs,m),e(gs,Aa),e(gs,$t),e($t,Qs),e(gs,et),u(t,st,m),x(We,t,m),u(t,xn,m),x(Fe,t,m),u(t,Cn,m),u(t,oe,m),e(oe,ea),e(oe,$e),e($e,Na),e(oe,yn),e(oe,gt),e(gt,Ta),e(oe,zn),e(oe,Et),e(Et,Sa),e(oe,On),u(t,Gt,m),u(t,Ut,m),e(Ut,Pn),u(t,Dn,m),x(Xe,t,m),u(t,Mn,m),x(f,t,m),u(t,L,m),u(t,An,m),e(An,La),u(t,Ts,m),x(be,t,m),u(t,Nn,m),x(Es,t,m),u(t,Ia,m),u(t,Ss,m),e(Ss,Vt),e(Ss,Tn),e(Tn,qt),e(Ss,Wt),u(t,Xt,m),x(Zt,t,m),u(t,Ls,m),x(kt,t,m),u(t,Is,m),u(t,fe,m),e(fe,Kt),e(fe,tt),e(tt,wl),e(fe,Sn),e(fe,sa),e(sa,Ln),e(fe,ps),e(fe,Yt),e(Yt,ta),e(fe,na),e(fe,aa),e(aa,Ze),e(fe,xl),e(fe,la),e(la,oa),e(fe,Cl),u(t,jt,m),x(wt,t,m),u(t,xt,m),x(Re,t,m),u(t,nt,m),u(t,Fs,m),e(Fs,ra),e(Fs,Be),e(Be,yl),e(Fs,Fa),e(Fs,at),e(at,Ra),e(Fs,Rs),u(t,In,m),u(t,Oe,m),e(Oe,He),e(He,ia),e(ia,ua),e(He,zl),e(Oe,Ol),e(Oe,Ct),e(Ct,Fn),e(Fn,Qo),e(Ct,pa),e(Ct,fo),e(fo,vo),e(Ct,ei),e(Ct,ho),e(ho,er),e(Ct,Ba),e(Oe,sr),e(Oe,qs),e(qs,Pl),e(Pl,lt),e(qs,si),e(qs,Ha),e(Ha,ti),e(qs,ni),e(qs,Ga),e(Ga,ai),e(qs,li),e(Oe,_o),e(Oe,Jt),e(Jt,bo),e(bo,tr),e(Jt,Ua),e(Jt,Dl),e(Dl,ks),e(Jt,oi),e(Jt,Va),e(Va,ri),e(Jt,ii),e(Oe,$o),e(Oe,Qt),e(Qt,go),e(go,Eo),e(Qt,ui),e(Qt,qo),e(qo,ko),e(Qt,pi),e(Qt,jo),e(jo,nr),e(Qt,Wa),u(t,wo,m),u(t,en,m),e(en,ar),u(t,Xa,m),x(Za,t,m),u(t,xo,m),x(yt,t,m),u(t,Co,m),u(t,Ge,m),e(Ge,ci),e(Ge,Ka),e(Ka,di),e(Ge,mi),e(Ge,Ya),e(Ya,fi),e(Ge,vi),u(t,yo,m),x(Bs,t,m),u(t,Rn,m),u(t,ot,m),e(ot,Ja),e(ot,zo),e(zo,Oo),e(ot,hi),e(ot,Ml),e(Ml,sn),e(ot,_i),u(t,Al,m),x(ca,t,m),u(t,lr,m),u(t,zt,m),e(zt,da),e(da,Po),x(ma,Po,null),e(zt,Qa),e(zt,Nl),e(Nl,Tl),u(t,or,m),x(fa,t,m),u(t,Ot,m),u(t,we,m),e(we,bi),e(we,el),e(el,$i),e(we,gi),e(we,Sl),e(Sl,Hs),e(we,Ei),e(we,sl),e(sl,qi),e(we,ki),e(we,tl),e(tl,ji),e(we,wi),e(we,nl),e(nl,xi),e(we,Ci),u(t,Ll,m),u(t,tn,m),e(tn,yi),e(tn,Do),e(Do,Gs),e(tn,zi),e(tn,al),e(al,Oi),e(tn,Pi),u(t,Il,m),x(ll,t,m),u(t,rr,m),u(t,ue,m),e(ue,Di),e(ue,Mo),e(Mo,Ao),e(ue,Mi),e(ue,ol),e(ol,Fl),e(Fl,Rl),e(ue,Ai),e(ue,Bl),e(Bl,rl),e(ue,ir),e(ue,nn),e(nn,Ni),e(ue,No),e(ue,To),e(To,Ti),e(ue,ur),e(ue,Pt),e(Pt,pr),e(ue,xe),e(ue,So),e(So,Lo),e(ue,Si),e(ue,Io),e(Io,Fo),e(ue,Li),e(ue,Ro),e(Ro,Bo),e(ue,Ii),u(t,cr,m),x(Bn,t,m),u(t,dr,m),x(il,t,m),u(t,Hl,m),u(t,an,m),e(an,Fi),e(an,ul),e(ul,Ri),e(an,Bi),e(an,pl),e(pl,Hi),e(an,Gi),u(t,Ho,m),x(js,t,m),u(t,mr,m),x(Hn,t,m),u(t,fr,m),u(t,ve,m),e(ve,cl),e(ve,dl),e(dl,Ui),e(ve,Vi),e(ve,Gl),e(Gl,i),e(ve,h),e(ve,vr),e(vr,xu),e(ve,Cu),e(ve,rt),e(rt,yu),e(ve,zu),e(ve,hr),e(hr,Ou),e(ve,Ul),e(ve,_r),e(_r,Pu),e(ve,Vl),e(ve,br),e(br,Du),e(ve,va),e(ve,$r),e($r,Mu),e(ve,Au),e(ve,Wl),e(Wl,Nu),e(ve,Tu),u(t,gr,m),u(t,Us,m),e(Us,Xl),e(Us,Er),e(Er,Su),e(Us,qr),e(Us,kr),e(kr,jr),e(Us,Lu),e(Us,Zl),e(Zl,Iu),e(Us,ws),e(Us,Go),e(Go,Fu),e(Us,Ru),u(t,Wi,m),x(Kl,t,m),u(t,Xi,m),x(Yl,t,m),u(t,Uo,m),u(t,ce,m),e(ce,wr),e(ce,xr),e(xr,Cr),e(ce,Bu),e(ce,yr),e(yr,ln),e(ce,Hu),e(ce,zr),e(zr,Gu),e(ce,Uu),e(ce,Jl),e(Jl,Vu),e(ce,Or),e(ce,Pr),e(Pr,Wu),e(ce,Xu),e(ce,Ql),e(Ql,Zu),e(ce,Dr),e(ce,Mr),e(Mr,Ku),e(ce,Yu),e(ce,on),e(on,Ju),e(ce,Qu),e(ce,Ar),e(Ar,Nr),e(ce,ep),e(ce,ha),e(ha,sp),e(ce,tp),u(t,Vo,m),x(eo,t,m),u(t,Gn,m),u(t,Wo,m),e(Wo,np),u(t,Zi,m),x(xs,t,m),u(t,Ki,m),x(so,t,m),u(t,Yi,m),u(t,Vs,m),e(Vs,ap),e(Vs,_a),e(_a,lp),e(Vs,op),e(Vs,to),e(to,rp),e(Vs,ip),e(Vs,Tr),e(Tr,no),e(Vs,up),e(Vs,Sr),e(Sr,pp),e(Vs,ao),u(t,Xo,m),x(ml,t,m),u(t,Dt,m),u(t,Ue,m),e(Ue,cp),e(Ue,Lr),e(Lr,dp),e(Ue,rn),e(Ue,Ir),e(Ir,mp),e(Ue,fp),e(Ue,Fr),e(Fr,vp),e(Ue,Rr),e(Ue,Br),e(Br,Ke),e(Ue,hp),e(Ue,Hr),e(Hr,_p),e(Ue,bp),e(Ue,Gr),e(Gr,$p),e(Ue,gp),u(t,fl,m),x(lo,t,m),u(t,Ji,m),u(t,Zo,m),e(Zo,sd),u(t,fc,m),u(t,Ep,m),e(Ep,td),u(t,vc,m),x(Qi,t,m),u(t,hc,m),u(t,Ur,m),e(Ur,nd),e(Ur,qp),e(qp,ad),e(Ur,ld),u(t,_c,m),hu[vl].m(t,m),u(t,kp,m),u(t,Ko,m),e(Ko,Vr),e(Vr,Kp),x(eu,Kp,null),e(Ko,od),e(Ko,Yp),e(Yp,rd),u(t,bc,m),u(t,un,m),e(un,id),e(un,Jp),e(Jp,ud),e(un,pd),e(un,jp),e(jp,cd),e(un,dd),e(un,Qp),e(Qp,md),e(un,fd),e(un,ec),e(ec,vd),e(un,hd),u(t,$c,m),u(t,ba,m),e(ba,_d),e(ba,su),e(su,sc),e(sc,bd),e(ba,$d),e(ba,tc),e(tc,gd),e(ba,Ed),e(ba,nc),e(nc,qd),e(ba,kd),u(t,gc,m),_u[_l].m(t,m),u(t,wp,m),u(t,xp,m),e(xp,jd),u(t,Ec,m),x(tu,t,m),u(t,qc,m),x(nu,t,m),u(t,kc,m),u(t,Cp,m),e(Cp,wd),u(t,jc,m),x(au,t,m),u(t,wc,m),x(lu,t,m),u(t,xc,m),bu[$l].m(t,m),u(t,yp,m),cs&&cs.m(t,m),u(t,zp,m),u(t,Yo,m),e(Yo,Wr),e(Wr,ac),x(ou,ac,null),e(Yo,xd),e(Yo,lc),e(lc,Cd),u(t,Cc,m),$u[El].m(t,m),u(t,Op,m),x(ru,t,m),u(t,yc,m),u(t,Pp,m),e(Pp,yd),u(t,zc,m),x(iu,t,m),u(t,Oc,m),x(uu,t,m),u(t,Pc,m),u(t,Dp,m),e(Dp,zd),u(t,Dc,m),x(pu,t,m),u(t,Mc,m),u(t,Mp,m),e(Mp,Od),u(t,Ac,m),x(cu,t,m),u(t,Nc,m),gu[kl].m(t,m),u(t,Ap,m),ds&&ds.m(t,m),u(t,Np,m),u(t,Jo,m),e(Jo,Xr),e(Xr,oc),x(du,oc,null),e(Jo,Pd),e(Jo,Tp),e(Tp,Dd),e(Tp,rc),e(rc,Md),u(t,Tc,m),u(t,pn,m),e(pn,Ad),e(pn,ic),e(ic,Nd),e(pn,Td),e(pn,uc),e(uc,Sd),e(pn,Ld),e(pn,pc),e(pc,Id),e(pn,Fd),e(pn,cc),e(cc,Rd),e(pn,Bd),u(t,Sc,m),x(mu,t,m),u(t,Lc,m),x(fu,t,m),u(t,Ic,m),u(t,Sp,m),e(Sp,Hd),Fc=!0},p(t,[m]){const Eu={};m&1&&(Eu.fw=t[0]),v.$set(Eu);let Lp=P;P=Xd(t),P!==Lp&&(Jr(),$(vu[Lp],1,1,()=>{vu[Lp]=null}),Yr(),T=vu[P],T||(T=vu[P]=Wd[P](t),T.c()),b(T,1),T.m(W.parentNode,W));const dc={};m&2&&(dc.$$scope={dirty:m,ctx:t}),_s.$set(dc);const Ip={};m&2&&(Ip.$$scope={dirty:m,ctx:t}),ca.$set(Ip);const mc={};m&2&&(mc.$$scope={dirty:m,ctx:t}),ml.$set(mc);let oo=vl;vl=Kd(t),vl!==oo&&(Jr(),$(hu[oo],1,1,()=>{hu[oo]=null}),Yr(),hl=hu[vl],hl||(hl=hu[vl]=Zd[vl](t),hl.c()),b(hl,1),hl.m(kp.parentNode,kp));let Fp=_l;_l=Jd(t),_l!==Fp&&(Jr(),$(_u[Fp],1,1,()=>{_u[Fp]=null}),Yr(),bl=_u[_l],bl||(bl=_u[_l]=Yd[_l](t),bl.c()),b(bl,1),bl.m(wp.parentNode,wp));let Rp=$l;$l=em(t),$l!==Rp&&(Jr(),$(bu[Rp],1,1,()=>{bu[Rp]=null}),Yr(),gl=bu[$l],gl||(gl=bu[$l]=Qd[$l](t),gl.c()),b(gl,1),gl.m(yp.parentNode,yp)),t[0]==="tf"?cs?m&1&&b(cs,1):(cs=Uv(t),cs.c(),b(cs,1),cs.m(zp.parentNode,zp)):cs&&(Jr(),$(cs,1,1,()=>{cs=null}),Yr());let ro=El;El=tm(t),El!==ro&&(Jr(),$($u[ro],1,1,()=>{$u[ro]=null}),Yr(),ql=$u[El],ql||(ql=$u[El]=sm[El](t),ql.c()),b(ql,1),ql.m(Op.parentNode,Op));let $a=kl;kl=am(t),kl!==$a&&(Jr(),$(gu[$a],1,1,()=>{gu[$a]=null}),Yr(),jl=gu[kl],jl||(jl=gu[kl]=nm[kl](t),jl.c()),b(jl,1),jl.m(Ap.parentNode,Ap)),t[0]==="pt"?ds?m&1&&b(ds,1):(ds=Vv(t),ds.c(),b(ds,1),ds.m(Np.parentNode,Np)):ds&&(Jr(),$(ds,1,1,()=>{ds=null}),Yr())},i(t){Fc||(b(v.$$.fragment,t),b(D.$$.fragment,t),b(T),b(vs.$$.fragment,t),b(Me.$$.fragment,t),b(_s.$$.fragment,t),b(ht.$$.fragment,t),b(bt.$$.fragment,t),b(We.$$.fragment,t),b(Fe.$$.fragment,t),b(Xe.$$.fragment,t),b(f.$$.fragment,t),b(be.$$.fragment,t),b(Es.$$.fragment,t),b(Zt.$$.fragment,t),b(kt.$$.fragment,t),b(wt.$$.fragment,t),b(Re.$$.fragment,t),b(Za.$$.fragment,t),b(yt.$$.fragment,t),b(Bs.$$.fragment,t),b(ca.$$.fragment,t),b(ma.$$.fragment,t),b(fa.$$.fragment,t),b(ll.$$.fragment,t),b(Bn.$$.fragment,t),b(il.$$.fragment,t),b(js.$$.fragment,t),b(Hn.$$.fragment,t),b(Kl.$$.fragment,t),b(Yl.$$.fragment,t),b(eo.$$.fragment,t),b(xs.$$.fragment,t),b(so.$$.fragment,t),b(ml.$$.fragment,t),b(lo.$$.fragment,t),b(Qi.$$.fragment,t),b(hl),b(eu.$$.fragment,t),b(bl),b(tu.$$.fragment,t),b(nu.$$.fragment,t),b(au.$$.fragment,t),b(lu.$$.fragment,t),b(gl),b(cs),b(ou.$$.fragment,t),b(ql),b(ru.$$.fragment,t),b(iu.$$.fragment,t),b(uu.$$.fragment,t),b(pu.$$.fragment,t),b(cu.$$.fragment,t),b(jl),b(ds),b(du.$$.fragment,t),b(mu.$$.fragment,t),b(fu.$$.fragment,t),Fc=!0)},o(t){$(v.$$.fragment,t),$(D.$$.fragment,t),$(T),$(vs.$$.fragment,t),$(Me.$$.fragment,t),$(_s.$$.fragment,t),$(ht.$$.fragment,t),$(bt.$$.fragment,t),$(We.$$.fragment,t),$(Fe.$$.fragment,t),$(Xe.$$.fragment,t),$(f.$$.fragment,t),$(be.$$.fragment,t),$(Es.$$.fragment,t),$(Zt.$$.fragment,t),$(kt.$$.fragment,t),$(wt.$$.fragment,t),$(Re.$$.fragment,t),$(Za.$$.fragment,t),$(yt.$$.fragment,t),$(Bs.$$.fragment,t),$(ca.$$.fragment,t),$(ma.$$.fragment,t),$(fa.$$.fragment,t),$(ll.$$.fragment,t),$(Bn.$$.fragment,t),$(il.$$.fragment,t),$(js.$$.fragment,t),$(Hn.$$.fragment,t),$(Kl.$$.fragment,t),$(Yl.$$.fragment,t),$(eo.$$.fragment,t),$(xs.$$.fragment,t),$(so.$$.fragment,t),$(ml.$$.fragment,t),$(lo.$$.fragment,t),$(Qi.$$.fragment,t),$(hl),$(eu.$$.fragment,t),$(bl),$(tu.$$.fragment,t),$(nu.$$.fragment,t),$(au.$$.fragment,t),$(lu.$$.fragment,t),$(gl),$(cs),$(ou.$$.fragment,t),$(ql),$(ru.$$.fragment,t),$(iu.$$.fragment,t),$(uu.$$.fragment,t),$(pu.$$.fragment,t),$(cu.$$.fragment,t),$(jl),$(ds),$(du.$$.fragment,t),$(mu.$$.fragment,t),$(fu.$$.fragment,t),Fc=!1},d(t){s(d),t&&s(g),C(v,t),t&&s(q),t&&s(O),C(D),t&&s(I),vu[P].d(t),t&&s(W),t&&s(G),t&&s(Y),t&&s(ee),t&&s(Un),C(vs,t),t&&s(Ws),t&&s(ls),t&&s(Vn),t&&s(Ee),t&&s(Wn),t&&s(qe),t&&s($n),t&&s(ie),t&&s(Xn),t&&s(Ys),t&&s(Ft),t&&s(hs),C(Me),t&&s(Zn),t&&s(ke),t&&s(Yn),C(_s,t),t&&s(wn),t&&s(Ie),C(ht),t&&s(je),t&&s(Ne),t&&s(us),C(bt,t),t&&s(Ht),t&&s(gs),t&&s(st),C(We,t),t&&s(xn),C(Fe,t),t&&s(Cn),t&&s(oe),t&&s(Gt),t&&s(Ut),t&&s(Dn),C(Xe,t),t&&s(Mn),C(f,t),t&&s(L),t&&s(An),t&&s(Ts),C(be,t),t&&s(Nn),C(Es,t),t&&s(Ia),t&&s(Ss),t&&s(Xt),C(Zt,t),t&&s(Ls),C(kt,t),t&&s(Is),t&&s(fe),t&&s(jt),C(wt,t),t&&s(xt),C(Re,t),t&&s(nt),t&&s(Fs),t&&s(In),t&&s(Oe),t&&s(wo),t&&s(en),t&&s(Xa),C(Za,t),t&&s(xo),C(yt,t),t&&s(Co),t&&s(Ge),t&&s(yo),C(Bs,t),t&&s(Rn),t&&s(ot),t&&s(Al),C(ca,t),t&&s(lr),t&&s(zt),C(ma),t&&s(or),C(fa,t),t&&s(Ot),t&&s(we),t&&s(Ll),t&&s(tn),t&&s(Il),C(ll,t),t&&s(rr),t&&s(ue),t&&s(cr),C(Bn,t),t&&s(dr),C(il,t),t&&s(Hl),t&&s(an),t&&s(Ho),C(js,t),t&&s(mr),C(Hn,t),t&&s(fr),t&&s(ve),t&&s(gr),t&&s(Us),t&&s(Wi),C(Kl,t),t&&s(Xi),C(Yl,t),t&&s(Uo),t&&s(ce),t&&s(Vo),C(eo,t),t&&s(Gn),t&&s(Wo),t&&s(Zi),C(xs,t),t&&s(Ki),C(so,t),t&&s(Yi),t&&s(Vs),t&&s(Xo),C(ml,t),t&&s(Dt),t&&s(Ue),t&&s(fl),C(lo,t),t&&s(Ji),t&&s(Zo),t&&s(fc),t&&s(Ep),t&&s(vc),C(Qi,t),t&&s(hc),t&&s(Ur),t&&s(_c),hu[vl].d(t),t&&s(kp),t&&s(Ko),C(eu),t&&s(bc),t&&s(un),t&&s($c),t&&s(ba),t&&s(gc),_u[_l].d(t),t&&s(wp),t&&s(xp),t&&s(Ec),C(tu,t),t&&s(qc),C(nu,t),t&&s(kc),t&&s(Cp),t&&s(jc),C(au,t),t&&s(wc),C(lu,t),t&&s(xc),bu[$l].d(t),t&&s(yp),cs&&cs.d(t),t&&s(zp),t&&s(Yo),C(ou),t&&s(Cc),$u[El].d(t),t&&s(Op),C(ru,t),t&&s(yc),t&&s(Pp),t&&s(zc),C(iu,t),t&&s(Oc),C(uu,t),t&&s(Pc),t&&s(Dp),t&&s(Dc),C(pu,t),t&&s(Mc),t&&s(Mp),t&&s(Ac),C(cu,t),t&&s(Nc),gu[kl].d(t),t&&s(Ap),ds&&ds.d(t),t&&s(Np),t&&s(Jo),C(du),t&&s(Tc),t&&s(pn),t&&s(Sc),C(mu,t),t&&s(Lc),C(fu,t),t&&s(Ic),t&&s(Sp)}}}const Eh={local:"classification-de-itokensi",sections:[{local:"prparation-des-donnes",sections:[{local:"le-jeu-de-donnes-conll2003",title:"Le jeu de donn\xE9es CoNLL-2003"},{local:"traitement-des-donnes",title:"Traitement des donn\xE9es"}],title:"Pr\xE9paration des donn\xE9es"},{local:"ifinetuningi-du-modle-avec-lapi-trainer",title:"<i>Finetuning</i> du mod\xE8le avec l'API `Trainer`"},{local:"ifinetuningi-du-modle-avec-keras",sections:[{local:"assemblage-des-donnes",title:"Assemblage des donn\xE9es"},{local:"dfinir-le-modle",title:"D\xE9finir le mod\xE8le"},{local:"ifinetuningi-du-modle",title:"<i>Finetuning</i> du mod\xE8le"},{local:"mtriques",title:"M\xE9triques"},{local:"dfinir-le-modle",title:"D\xE9finir le mod\xE8le"},{local:"ifinetuningi-du-modle",title:"<i>Finetuning</i> du mod\xE8le"}],title:"<i>Finetuning</i> du mod\xE8le avec Keras"},{local:"une-boucle-dentranement-personnalise",sections:[{local:"prparer-tout-pour-lentranement",title:"Pr\xE9parer tout pour l'entra\xEEnement"},{local:"boucle-dentranement",title:"Boucle d'entra\xEEnement"},{local:"utilisation-du-modle-ifinetuni",title:"Utilisation du mod\xE8le <i>finetun\xE9</i>"}],title:"Une boucle d'entra\xEEnement personnalis\xE9e"}],title:"Classification de <i>tokens</i>"};function qh(V,d,g){let v="pt";return Jv(()=>{const q=new URLSearchParams(window.location.search);g(0,v=q.get("fw")||"pt")}),[v]}class Oh extends Xv{constructor(d){super();Zv(this,d,qh,gh,Kv,{})}}export{Oh as default,Eh as metadata};
