import{s as Rt,o as Zt,n as xl}from"../chunks/scheduler.cc52f4b9.js";import{S as Nt,i as At,e as y,s as i,c as j,h as Qt,a as m,d as n,b as r,f as Ct,g as d,j as h,k as gt,l as Gt,m as a,n as J,o,u as se,t as M,p as f,q as vt,r as Bt,v as ee}from"../chunks/index.85964560.js";import{T as bl}from"../chunks/Tip.72f3abad.js";import{C as Xt,H as Tl,E as zt}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.4cab8d21.js";import{Y as oe}from"../chunks/Youtube.2feacd03.js";import{C as w}from"../chunks/CodeBlock.b43b1e5c.js";import{C as It}from"../chunks/CourseFloatingBanner.d24cbe55.js";import{F as Vt}from"../chunks/FrameworkSwitchCourse.17523e75.js";function Wt(U){let l,p;return l=new It({props:{chapter:3,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/th/chapter3/section2_tf.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/th/chapter3/section2_tf.ipynb"}]}}),{c(){j(l.$$.fragment)},l(t){d(l.$$.fragment,t)},m(t,c){J(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){o(l.$$.fragment,t),p=!1},d(t){f(l,t)}}}function Et(U){let l,p;return l=new It({props:{chapter:3,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/th/chapter3/section2_pt.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/th/chapter3/section2_pt.ipynb"}]}}),{c(){j(l.$$.fragment)},l(t){d(l.$$.fragment,t)},m(t,c){J(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){o(l.$$.fragment,t),p=!1},d(t){f(l,t)}}}function Ht(U){let l,p='เราจะยังคงใช้ตัวอย่างจากบทที่แล้ว <a href="/course/chapter2">previous chapter</a> โค้ดข้างล่างนี้คือวิธีการเทรนโมเดลสำหรับจำแนกลำดับ (sequence classifier) โดยใช้ข้อมูล 1 batch ใน TensorFlow:',t,c,b;return c=new w({props:{code:"aW1wb3J0JTIwdGVuc29yZmxvdyUyMGFzJTIwdGYlMEFpbXBvcnQlMjBudW1weSUyMGFzJTIwbnAlMEFmcm9tJTIwdHJhbnNmb3JtZXJzJTIwaW1wb3J0JTIwQXV0b1Rva2VuaXplciUyQyUyMFRGQXV0b01vZGVsRm9yU2VxdWVuY2VDbGFzc2lmaWNhdGlvbiUwQSUwQSUyMyUyMFNhbWUlMjBhcyUyMGJlZm9yZSUwQWNoZWNrcG9pbnQlMjAlM0QlMjAlMjJiZXJ0LWJhc2UtdW5jYXNlZCUyMiUwQXRva2VuaXplciUyMCUzRCUyMEF1dG9Ub2tlbml6ZXIuZnJvbV9wcmV0cmFpbmVkKGNoZWNrcG9pbnQpJTBBbW9kZWwlMjAlM0QlMjBURkF1dG9Nb2RlbEZvclNlcXVlbmNlQ2xhc3NpZmljYXRpb24uZnJvbV9wcmV0cmFpbmVkKGNoZWNrcG9pbnQpJTBBc2VxdWVuY2VzJTIwJTNEJTIwJTVCJTBBJTIwJTIwJTIwJTIwJTIySSd2ZSUyMGJlZW4lMjB3YWl0aW5nJTIwZm9yJTIwYSUyMEh1Z2dpbmdGYWNlJTIwY291cnNlJTIwbXklMjB3aG9sZSUyMGxpZmUuJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIyVGhpcyUyMGNvdXJzZSUyMGlzJTIwYW1hemluZyElMjIlMkMlMEElNUQlMEFiYXRjaCUyMCUzRCUyMGRpY3QodG9rZW5pemVyKHNlcXVlbmNlcyUyQyUyMHBhZGRpbmclM0RUcnVlJTJDJTIwdHJ1bmNhdGlvbiUzRFRydWUlMkMlMjByZXR1cm5fdGVuc29ycyUzRCUyMnRmJTIyKSklMEElMEElMjMlMjBUaGlzJTIwaXMlMjBuZXclMEFtb2RlbC5jb21waWxlKG9wdGltaXplciUzRCUyMmFkYW0lMjIlMkMlMjBsb3NzJTNEJTIyc3BhcnNlX2NhdGVnb3JpY2FsX2Nyb3NzZW50cm9weSUyMiklMEFsYWJlbHMlMjAlM0QlMjB0Zi5jb252ZXJ0X3RvX3RlbnNvciglNUIxJTJDJTIwMSU1RCklMEFtb2RlbC50cmFpbl9vbl9iYXRjaChiYXRjaCUyQyUyMGxhYmVscyk=",highlighted:`<span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer, TFAutoModelForSequenceClassification

<span class="hljs-comment"># Same as before</span>
checkpoint = <span class="hljs-string">&quot;bert-base-uncased&quot;</span>
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint)
sequences = [
    <span class="hljs-string">&quot;I&#x27;ve been waiting for a HuggingFace course my whole life.&quot;</span>,
    <span class="hljs-string">&quot;This course is amazing!&quot;</span>,
]
batch = <span class="hljs-built_in">dict</span>(tokenizer(sequences, padding=<span class="hljs-literal">True</span>, truncation=<span class="hljs-literal">True</span>, return_tensors=<span class="hljs-string">&quot;tf&quot;</span>))

<span class="hljs-comment"># This is new</span>
model.<span class="hljs-built_in">compile</span>(optimizer=<span class="hljs-string">&quot;adam&quot;</span>, loss=<span class="hljs-string">&quot;sparse_categorical_crossentropy&quot;</span>)
labels = tf.convert_to_tensor([<span class="hljs-number">1</span>, <span class="hljs-number">1</span>])
model.train_on_batch(batch, labels)`,wrap:!1}}),{c(){l=y("p"),l.innerHTML=p,t=i(),j(c.$$.fragment)},l(u){l=m(u,"P",{"data-svelte-h":!0}),h(l)!=="svelte-1mvk20o"&&(l.innerHTML=p),t=r(u),d(c.$$.fragment,u)},m(u,k){a(u,l,k),a(u,t,k),J(c,u,k),b=!0},i(u){b||(M(c.$$.fragment,u),b=!0)},o(u){o(c.$$.fragment,u),b=!1},d(u){u&&(n(l),n(t)),f(c,u)}}}function St(U){let l,p='เราจะยังคงใช้ตัวอย่างจากบทที่แล้ว <a href="/course/chapter2">previous chapter</a> โค้ดข้างล่างนี้คือวิธีการเทรนโมเดลสำหรับจำแนกลำดับ (sequence classifier) โดยใช้ข้อมูล 1 batch ใน Pytorch:',t,c,b;return c=new w({props:{code:"aW1wb3J0JTIwdG9yY2glMEFmcm9tJTIwdG9yY2gub3B0aW0lMjBpbXBvcnQlMjBBZGFtVyUwQWZyb20lMjB0cmFuc2Zvcm1lcnMlMjBpbXBvcnQlMjBBdXRvVG9rZW5pemVyJTJDJTIwQXV0b01vZGVsRm9yU2VxdWVuY2VDbGFzc2lmaWNhdGlvbiUwQSUwQSUyMyUyMFNhbWUlMjBhcyUyMGJlZm9yZSUwQWNoZWNrcG9pbnQlMjAlM0QlMjAlMjJiZXJ0LWJhc2UtdW5jYXNlZCUyMiUwQXRva2VuaXplciUyMCUzRCUyMEF1dG9Ub2tlbml6ZXIuZnJvbV9wcmV0cmFpbmVkKGNoZWNrcG9pbnQpJTBBbW9kZWwlMjAlM0QlMjBBdXRvTW9kZWxGb3JTZXF1ZW5jZUNsYXNzaWZpY2F0aW9uLmZyb21fcHJldHJhaW5lZChjaGVja3BvaW50KSUwQXNlcXVlbmNlcyUyMCUzRCUyMCU1QiUwQSUyMCUyMCUyMCUyMCUyMkkndmUlMjBiZWVuJTIwd2FpdGluZyUyMGZvciUyMGElMjBIdWdnaW5nRmFjZSUyMGNvdXJzZSUyMG15JTIwd2hvbGUlMjBsaWZlLiUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMlRoaXMlMjBjb3Vyc2UlMjBpcyUyMGFtYXppbmchJTIyJTJDJTBBJTVEJTBBYmF0Y2glMjAlM0QlMjB0b2tlbml6ZXIoc2VxdWVuY2VzJTJDJTIwcGFkZGluZyUzRFRydWUlMkMlMjB0cnVuY2F0aW9uJTNEVHJ1ZSUyQyUyMHJldHVybl90ZW5zb3JzJTNEJTIycHQlMjIpJTBBJTBBJTIzJTIwVGhpcyUyMGlzJTIwbmV3JTBBYmF0Y2glNUIlMjJsYWJlbHMlMjIlNUQlMjAlM0QlMjB0b3JjaC50ZW5zb3IoJTVCMSUyQyUyMDElNUQpJTBBJTBBb3B0aW1pemVyJTIwJTNEJTIwQWRhbVcobW9kZWwucGFyYW1ldGVycygpKSUwQWxvc3MlMjAlM0QlMjBtb2RlbCgqKmJhdGNoKS5sb3NzJTBBbG9zcy5iYWNrd2FyZCgpJTBBb3B0aW1pemVyLnN0ZXAoKQ==",highlighted:`<span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">from</span> torch.optim <span class="hljs-keyword">import</span> AdamW
<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer, AutoModelForSequenceClassification

<span class="hljs-comment"># Same as before</span>
checkpoint = <span class="hljs-string">&quot;bert-base-uncased&quot;</span>
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForSequenceClassification.from_pretrained(checkpoint)
sequences = [
    <span class="hljs-string">&quot;I&#x27;ve been waiting for a HuggingFace course my whole life.&quot;</span>,
    <span class="hljs-string">&quot;This course is amazing!&quot;</span>,
]
batch = tokenizer(sequences, padding=<span class="hljs-literal">True</span>, truncation=<span class="hljs-literal">True</span>, return_tensors=<span class="hljs-string">&quot;pt&quot;</span>)

<span class="hljs-comment"># This is new</span>
batch[<span class="hljs-string">&quot;labels&quot;</span>] = torch.tensor([<span class="hljs-number">1</span>, <span class="hljs-number">1</span>])

optimizer = AdamW(model.parameters())
loss = model(**batch).loss
loss.backward()
optimizer.step()`,wrap:!1}}),{c(){l=y("p"),l.innerHTML=p,t=i(),j(c.$$.fragment)},l(u){l=m(u,"P",{"data-svelte-h":!0}),h(l)!=="svelte-12fav1s"&&(l.innerHTML=p),t=r(u),d(c.$$.fragment,u)},m(u,k){a(u,l,k),a(u,t,k),J(c,u,k),b=!0},i(u){b||(M(c.$$.fragment,u),b=!0)},o(u){o(c.$$.fragment,u),b=!1},d(u){u&&(n(l),n(t)),f(c,u)}}}function Yt(U){let l,p;return l=new oe({props:{id:"W_gMJF0xomE"}}),{c(){j(l.$$.fragment)},l(t){d(l.$$.fragment,t)},m(t,c){J(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){o(l.$$.fragment,t),p=!1},d(t){f(l,t)}}}function Ft(U){let l,p;return l=new oe({props:{id:"_BZearw7f0w"}}),{c(){j(l.$$.fragment)},l(t){d(l.$$.fragment,t)},m(t,c){J(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){o(l.$$.fragment,t),p=!1},d(t){f(l,t)}}}function Dt(U){let l;return{c(){l=vt("⚠️ **คำเตือน** ตรวจสอบให้แน่ใจว่า `datasets` ได้ถูกติดตั้งโดยการรัน `pip install datasets` ก่อน จากนั้นโหลดชุดข้อมูล MRPC และพิมพ์เพื่อดูว่ามีอะไรบ้าง")},l(p){l=Bt(p,"⚠️ **คำเตือน** ตรวจสอบให้แน่ใจว่า `datasets` ได้ถูกติดตั้งโดยการรัน `pip install datasets` ก่อน จากนั้นโหลดชุดข้อมูล MRPC และพิมพ์เพื่อดูว่ามีอะไรบ้าง")},m(p,t){a(p,l,t)},d(p){p&&n(l)}}}function qt(U){let l,p="✏️ <strong>ลองเลย!</strong> ลองดูที่ element 15 ของ training set และ element 87 ของ validation set ว่ามี label เป็นอะไร?";return{c(){l=y("p"),l.innerHTML=p},l(t){l=m(t,"P",{"data-svelte-h":!0}),h(l)!=="svelte-1l01kvz"&&(l.innerHTML=p)},m(t,c){a(t,l,c)},p:xl,d(t){t&&n(l)}}}function Lt(U){let l,p;return l=new oe({props:{id:"P-rZWqcB6CE"}}),{c(){j(l.$$.fragment)},l(t){d(l.$$.fragment,t)},m(t,c){J(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){o(l.$$.fragment,t),p=!1},d(t){f(l,t)}}}function Pt(U){let l,p;return l=new oe({props:{id:"0u3ioSwev3s"}}),{c(){j(l.$$.fragment)},l(t){d(l.$$.fragment,t)},m(t,c){J(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){o(l.$$.fragment,t),p=!1},d(t){f(l,t)}}}function Kt(U){let l,p="✏️ <strong>ลองเลย!</strong> ลองเลือก element 15 ของ training set มาลอง tokenize ประโยคทั้งสองแยกกันทีละประโยค และลอง tokenize เป็นคู่มาเทียบกันดู การ tokenize สองแบบนี้ให้ผลลัพธ์ที่ต่างกันอย่างไร?";return{c(){l=y("p"),l.innerHTML=p},l(t){l=m(t,"P",{"data-svelte-h":!0}),h(l)!=="svelte-1b0qrd9"&&(l.innerHTML=p)},m(t,c){a(t,l,c)},p:xl,d(t){t&&n(l)}}}function Ot(U){let l,p="ฟังก์ชั่นที่ทำหน้าที่เก็บข้อมูลตัวอย่างเข้ามาทำเป็น batch เรียกว่า <em>collate function</em> ซึ่งมีการตั้งค่าเริ่มต้นเป็นฟังก์ชั่นที่ทำหน้าที่เพียงแปลงข้อมูลตัวอย่างของคุณให้เป็น tf.Tensor และนำมา concatenate ต่อกัน (แบบ recursive ถ้าหากคุณป้อนข้อมูลเป็น lists, tuples หรือ dictionaries) ซึ่งในกรณีตัวอย่างของเรานี้จะทำแบบนั้นไม่ได้ เนื่องจากข้อมูลป้อนเข้าแต่ละตัวของเรามีขนาดไม่เท่ากัน ซึ่งเราก็ได้จงใจที่ยังไม่ทำการเติม (padding) มาจนถึงตอนนี้ เพื่อที่จะทำการเติมเท่าที่จำเป็นต้องทำในแต่ละ batch เพื่อหลีกเลี่ยงการเติมข้อมูลให้มีความยาวเกินจำเป็น ซึ่งการทำแบบนี้จะช่วยให้การ training เร็วขึ้นค่อนข้างมาก แต่ควรระวังไว้ว่าถ้าคุณ train บน TPU การทำแบบนี้อาจสร้างปัญหาได้ เนื่องจาก TPUs นั้นชอบข้อมูลที่มี shape คงที่มากกว่า แม้ว่าจะต้องเติมข้อมูลให้ยาวมากก็ตาม";return{c(){l=y("p"),l.innerHTML=p},l(t){l=m(t,"P",{"data-svelte-h":!0}),h(l)!=="svelte-1nsikbe"&&(l.innerHTML=p)},m(t,c){a(t,l,c)},d(t){t&&n(l)}}}function sn(U){let l,p="ฟังก์ชั่นที่ทำหน้าที่เก็บข้อมูลตัวอย่างเข้ามาทำเป็น batch เรียกว่า <em>collate function</em> ซึ่งเป็นอากิวเมนต์ที่คุณสามารถใส่เพิ่มได้เมื่อคุณสร้าง <code>DataLoader</code> โดยการตั้งค่าเริ่มต้นจะเป็นฟังก์ชั่นที่ทำหน้าที่เพียงแปลงข้อมูลตัวอย่างของคุณให้เป็น Pytorch tensors และนำมา concatenate ต่อกัน (แบบ recursive ถ้าหากคุณป้อนข้อมูลเป็น lists, tuples หรือ dictionaries) ซึ่งในกรณีตัวอย่างของเรานี้จะทำแบบนั้นไม่ได้ เนื่องจากข้อมูลป้อนเข้าแต่ละตัวของเรามีขนาดไม่เท่ากัน ซึ่งเราก็ได้จงใจที่ยังไม่ทำการเติม (padding) มาจนถึงตอนนี้ เพื่อที่จะทำการเติมเท่าที่จำเป็นต้องทำในแต่ละ batch เพื่อหลีกเลี่ยงการเติมข้อมูลให้มีความยาวเกินจำเป็น ซึ่งการทำแบบนี้จะช่วยให้การ training เร็วขึ้นค่อนข้างมาก แต่ควรระวังไว้ว่าถ้าคุณ train บน TPU การทำแบบนี้อาจสร้างปัญหาได้ เนื่องจาก TPUs นั้นชอบข้อมูลที่มี shape คงที่มากกว่า แม้ว่าจะต้องเติมข้อมูลให้ยาวมากก็ตาม";return{c(){l=y("p"),l.innerHTML=p},l(t){l=m(t,"P",{"data-svelte-h":!0}),h(l)!=="svelte-1lqxn3g"&&(l.innerHTML=p)},m(t,c){a(t,l,c)},d(t){t&&n(l)}}}function en(U){let l,p;return l=new w({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMERhdGFDb2xsYXRvcldpdGhQYWRkaW5nJTBBJTBBZGF0YV9jb2xsYXRvciUyMCUzRCUyMERhdGFDb2xsYXRvcldpdGhQYWRkaW5nKHRva2VuaXplciUzRHRva2VuaXplciUyQyUyMHJldHVybl90ZW5zb3JzJTNEJTIydGYlMjIp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> DataCollatorWithPadding

data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors=<span class="hljs-string">&quot;tf&quot;</span>)`,wrap:!1}}),{c(){j(l.$$.fragment)},l(t){d(l.$$.fragment,t)},m(t,c){J(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){o(l.$$.fragment,t),p=!1},d(t){f(l,t)}}}function ln(U){let l,p;return l=new w({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMERhdGFDb2xsYXRvcldpdGhQYWRkaW5nJTBBJTBBZGF0YV9jb2xsYXRvciUyMCUzRCUyMERhdGFDb2xsYXRvcldpdGhQYWRkaW5nKHRva2VuaXplciUzRHRva2VuaXplcik=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> DataCollatorWithPadding

data_collator = DataCollatorWithPadding(tokenizer=tokenizer)`,wrap:!1}}),{c(){j(l.$$.fragment)},l(t){d(l.$$.fragment,t)},m(t,c){J(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){o(l.$$.fragment,t),p=!1},d(t){f(l,t)}}}function tn(U){let l,p,t,c="ผลลัพธ์ออกมาดูดีเลย! ตอนนี้เราก็จัดการข้อมูลจาก raw text ให้เป็นชุดของ batch ที่โมเดลทำความเข้าใจได้แล้ว เราพร้อมที่จะ fine-tune แล้ว!",b;return l=new w({props:{code:"JTdCJ2F0dGVudGlvbl9tYXNrJyUzQSUyMHRvcmNoLlNpemUoJTVCOCUyQyUyMDY3JTVEKSUyQyUwQSUyMCdpbnB1dF9pZHMnJTNBJTIwdG9yY2guU2l6ZSglNUI4JTJDJTIwNjclNUQpJTJDJTBBJTIwJ3Rva2VuX3R5cGVfaWRzJyUzQSUyMHRvcmNoLlNpemUoJTVCOCUyQyUyMDY3JTVEKSUyQyUwQSUyMCdsYWJlbHMnJTNBJTIwdG9yY2guU2l6ZSglNUI4JTVEKSU3RA==",highlighted:`{<span class="hljs-string">&#x27;attention_mask&#x27;</span>: torch.Size([<span class="hljs-number">8</span>, <span class="hljs-number">67</span>]),
 <span class="hljs-string">&#x27;input_ids&#x27;</span>: torch.Size([<span class="hljs-number">8</span>, <span class="hljs-number">67</span>]),
 <span class="hljs-string">&#x27;token_type_ids&#x27;</span>: torch.Size([<span class="hljs-number">8</span>, <span class="hljs-number">67</span>]),
 <span class="hljs-string">&#x27;labels&#x27;</span>: torch.Size([<span class="hljs-number">8</span>])}`,wrap:!1}}),{c(){j(l.$$.fragment),p=i(),t=y("p"),t.textContent=c},l(u){d(l.$$.fragment,u),p=r(u),t=m(u,"P",{"data-svelte-h":!0}),h(t)!=="svelte-117lc0s"&&(t.textContent=c)},m(u,k){J(l,u,k),a(u,p,k),a(u,t,k),b=!0},i(u){b||(M(l.$$.fragment,u),b=!0)},o(u){o(l.$$.fragment,u),b=!1},d(u){u&&(n(p),n(t)),f(l,u)}}}function nn(U){let l,p;return l=new w({props:{code:"JTdCJ2F0dGVudGlvbl9tYXNrJyUzQSUyMFRlbnNvclNoYXBlKCU1QjglMkMlMjA2NyU1RCklMkMlMEElMjAnaW5wdXRfaWRzJyUzQSUyMFRlbnNvclNoYXBlKCU1QjglMkMlMjA2NyU1RCklMkMlMEElMjAndG9rZW5fdHlwZV9pZHMnJTNBJTIwVGVuc29yU2hhcGUoJTVCOCUyQyUyMDY3JTVEKSUyQyUwQSUyMCdsYWJlbHMnJTNBJTIwVGVuc29yU2hhcGUoJTVCOCU1RCklN0Q=",highlighted:`{<span class="hljs-string">&#x27;attention_mask&#x27;</span>: TensorShape([<span class="hljs-number">8</span>, <span class="hljs-number">67</span>]),
 <span class="hljs-string">&#x27;input_ids&#x27;</span>: TensorShape([<span class="hljs-number">8</span>, <span class="hljs-number">67</span>]),
 <span class="hljs-string">&#x27;token_type_ids&#x27;</span>: TensorShape([<span class="hljs-number">8</span>, <span class="hljs-number">67</span>]),
 <span class="hljs-string">&#x27;labels&#x27;</span>: TensorShape([<span class="hljs-number">8</span>])}`,wrap:!1}}),{c(){j(l.$$.fragment)},l(t){d(l.$$.fragment,t)},m(t,c){J(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){o(l.$$.fragment,t),p=!1},d(t){f(l,t)}}}function an(U){let l,p="✏️ <strong>ลองเลย!</strong> ลองทำการประมวลผลแบบนี้กับชุดข้อมูล GLUE SST-2 ดู มันจะต่างจากตัวอย่างนี้เล็กน้อย เนื่องจากชุดข้อมูลนั้นประกอบไปด้วยประโยคเดียวแทนที่จะเป็นคู่ประโยค แต่ส่วนที่เหลือก็เหมือนกัน ถ้าอยากลองความท้าทายที่ยากขึ้นไปอีก ให้ลองเขียนฟังก์ชั่นประมวลผลที่ใช้กับ GLUE tasks ได้ทุก task ดูสิ";return{c(){l=y("p"),l.innerHTML=p},l(t){l=m(t,"P",{"data-svelte-h":!0}),h(l)!=="svelte-v5ml91"&&(l.innerHTML=p)},m(t,c){a(t,l,c)},p:xl,d(t){t&&n(l)}}}function xt(U){let l,p="ตอนนี้เราก็ได้ dataset และ data collator แล้ว เราจะต้องนำมันมาต่อเข้าด้วยกัน โดยเราอาจจะโหลด batch และ collate มันแบบ manual ก็ได้ แต่นั่นเป็นงานที่หนักมากและไม่ค่อยมีประสิทธิภาพนัก เราอาจเลือกใช้เมธอด <code>to_tf_dataset()</code> ในการแก้ปัญหานี้อย่างมีประสิทธิภาพ โดยเมธอดนี้จะ wrap <code>tf.data.Dataset</code> เข้ากับ dataset ของคุณและคุณสามารถใส่ collation function เข้าไปด้วยได้ โดย <code>tf.data.Dataset</code> นั้นเป็น native TensorFlow format ซึ่ง Keras สามารถใช้ร่วมกับ <code>model.fit()</code> ได้ ดังนั้นเมธอดนี้จะแปลง 🤗 Dataset ให้เป็น format ที่พร้อมสำหรับการ training แล้ว ลองมาดูการเทรนโมเดลด้วย dataset ของเรากันเลย!",t,c,b,u,k="เสร็จเรียบร้อย! เราสามารถนำ datasets พวกนี้ไปใช้ในบทเรียนต่อไปของเราได้เลย โดยการ training นั้นค่อนข้างตรงไปตรงมาไม่ซับซ้อนหลังจากที่เราทำงานอย่างหนักไปกกับการประมวลผลข้อมูลแล้ว",X;return c=new w({props:{code:"dGZfdHJhaW5fZGF0YXNldCUyMCUzRCUyMHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVELnRvX3RmX2RhdGFzZXQoJTBBJTIwJTIwJTIwJTIwY29sdW1ucyUzRCU1QiUyMmF0dGVudGlvbl9tYXNrJTIyJTJDJTIwJTIyaW5wdXRfaWRzJTIyJTJDJTIwJTIydG9rZW5fdHlwZV9pZHMlMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBsYWJlbF9jb2xzJTNEJTVCJTIybGFiZWxzJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwc2h1ZmZsZSUzRFRydWUlMkMlMEElMjAlMjAlMjAlMjBjb2xsYXRlX2ZuJTNEZGF0YV9jb2xsYXRvciUyQyUwQSUyMCUyMCUyMCUyMGJhdGNoX3NpemUlM0Q4JTJDJTBBKSUwQSUwQXRmX3ZhbGlkYXRpb25fZGF0YXNldCUyMCUzRCUyMHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnZhbGlkYXRpb24lMjIlNUQudG9fdGZfZGF0YXNldCglMEElMjAlMjAlMjAlMjBjb2x1bW5zJTNEJTVCJTIyYXR0ZW50aW9uX21hc2slMjIlMkMlMjAlMjJpbnB1dF9pZHMlMjIlMkMlMjAlMjJ0b2tlbl90eXBlX2lkcyUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMGxhYmVsX2NvbHMlM0QlNUIlMjJsYWJlbHMlMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBzaHVmZmxlJTNERmFsc2UlMkMlMEElMjAlMjAlMjAlMjBjb2xsYXRlX2ZuJTNEZGF0YV9jb2xsYXRvciUyQyUwQSUyMCUyMCUyMCUyMGJhdGNoX3NpemUlM0Q4JTJDJTBBKQ==",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;token_type_ids&quot;</span>],
    label_cols=[<span class="hljs-string">&quot;labels&quot;</span>],
    shuffle=<span class="hljs-literal">True</span>,
    collate_fn=data_collator,
    batch_size=<span class="hljs-number">8</span>,
)

tf_validation_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;token_type_ids&quot;</span>],
    label_cols=[<span class="hljs-string">&quot;labels&quot;</span>],
    shuffle=<span class="hljs-literal">False</span>,
    collate_fn=data_collator,
    batch_size=<span class="hljs-number">8</span>,
)`,wrap:!1}}),{c(){l=y("p"),l.innerHTML=p,t=i(),j(c.$$.fragment),b=i(),u=y("p"),u.textContent=k},l(T){l=m(T,"P",{"data-svelte-h":!0}),h(l)!=="svelte-bzg3o0"&&(l.innerHTML=p),t=r(T),d(c.$$.fragment,T),b=r(T),u=m(T,"P",{"data-svelte-h":!0}),h(u)!=="svelte-zai6vo"&&(u.textContent=k)},m(T,B){a(T,l,B),a(T,t,B),J(c,T,B),a(T,b,B),a(T,u,B),X=!0},i(T){X||(M(c.$$.fragment,T),X=!0)},o(T){o(c.$$.fragment,T),X=!1},d(T){T&&(n(l),n(t),n(b),n(u)),f(c,T)}}}function pn(U){let l,p,t,c,b,u,k,X,T,B,_,C,le,g,x,te,S,Il="เป็นที่แน่นอนว่า ถ้าเราเทรนโมเดลโดยใช้ข้อมูลเพียง 2 ประโยคก็คงไม่ได้ผลลัพธ์ที่ดีเท่าไรนัก ถ้าคุณต้องการผลลัพธ์ที่ดีขึ้น คุณจะต้องเตรียมชุดข้อมูล (dataset) ที่มีขนาดใหญ่ขึ้น",ue,Y,Rl='ใน section นี้ เราจะใช้ชุดข้อมูล MRPC (Microsoft Research Paraphrase Corpus) มารันให้ดูเป็นตัวอย่าง ชุดข้อมูลนี้มีการนำเสนอใน <a href="https://www.aclweb.org/anthology/I05-5002.pdf" rel="nofollow">paper</a> โดย William B. Dolan and Chris Brockett โดยชุดข้อมูลนี้ประกอบด้วยคู่ของประโยคจำนวน 5,801 คู่ โดยมีข้อมูล label บ่งบอกว่าประโยคแต่ละคู่เกิดจากการถอความ (paraphrase) หรือไม่ (ประโยคคู่นี้มีความหมายเดียวกันหรือไม่) เหตุผลที่เราเลือกชุดข้อมูลนี้ เนื่องจากมันเป็นชุดข้อมูลที่มีขนาดเล็ก จึงง่ายต่อการนำไปทดลองเทรนโมเดล',ye,F,me,I,R,ne,D,Zl='Hub นั้นไม่ได้เก็บเพียงแค่โมเดล แต่ยังเก็บชุดข้อมูลในหลากหลายภาษาไว้เป็นจำนวนมาก คุณสามารถเลือกดูชุดข้อมูลต่าง ๆ ได้ที่ <a href="https://huggingface.co/datasets" rel="nofollow">here</a> และเราขอแนะนำให้คุณลองโหลดและประมวลผลชุดข้อมูลชุดใหม่หลังจากที่คุณเรียน section นี้จบแล้ว (ดูเอกสารข้อมูลทั่วไปได้ที่ <a href="https://huggingface.co/docs/datasets/loading" rel="nofollow">here</a>) แต่ตอนนี้เรามาสนใจกับชุดข้อมูล MRPC กันก่อนนะ! ชุดข้อมูลนี้เป็นหนึ่งในสิบของชุดข้อมูลที่ใช้วัดผลใน <a href="https://gluebenchmark.com/" rel="nofollow">GLUE benchmark</a> ซึ่งเป็นตัววัดผลทางวิชาการ (academic benchmark) ที่ใช้วัดประสิทธิภาพของโมเดล ML โดยให้โมเดลทำงานจำแนกข้อความแบบต่าง ๆ กัน รวม 10 งาน',je,q,Nl="ไลบรารี่ 🤗 Datasets library มีคำสั่งที่ใช้งานได้ง่ายมากในการดาวโหลดและ cache ชุดข้อมูลที่อยู่บน Hub เราสามารถดาวโหลดชุดข้อมูล MRPC ได้ดังนี้:",de,V,Je,L,fe,P,he,K,Al="คุณจะเห็นว่า เราจะได้อ็อบเจกต์ <code>DatasetDict</code> ซึ่งเก็บข้อมูลของ training set (ชุดข้อมูลที่ใช้เทรน) validation set (ชุดข้อมูลที่ใช้ตรวจสอบ) และ test set (ชุดข้อมูลที่ใช้ทดสอบ) ซึ่งในแต่ละชุดก็ประกอบด้วยหลายคอลัมน์ (<code>sentence1</code>, <code>sentence2</code>, <code>label</code>, and <code>idx</code>) และมีตัวแปร num_rows เก็บจำนวนข้อมูลของแต่ละชุด (ใน training set มีคู่ประโยคจำนวน 3,668 คู่ ส่วนใน validation set มี 408 คู่ และใน test set มี 1,725 คู่)",Ue,O,Ql="คำสั่งนี้จะดาวโหลดและเก็บ cache ของชุดข้อมูลไว้ โดยค่าเริ่มต้น (by default) จะเก็บ cache ไว้ที่ <em>~/.cache/huggingface/dataset</em> โดยใน Chapter 2 เราได้บอกวิธีไว้แล้วว่า คุณสามารถเปลี่ยนโฟลเดอร์ที่จะเก็บ cache ได้โดยการตั้งค่าตัวแปร environment ที่ชื่อ <code>HF_HOME</code>",be,ss,Gl="เราสามารถเข้าถึงข้อมูลประโยคแต่ละคู่ในอ็อบเจกต์ <code>raw_datasets</code> ของเราได้โดยการใช้ indexing แบบเดียวกับที่ใช้กับ dictionary:",Te,es,we,ls,ke,ts,vl="เราจะเห็นได้ว่าข้อมูล labels นั้นอยู่ในรูป integers อยู่แล้ว จึงไม่ได้ต้องทำการประมวลผลใด ๆ เพิ่มเติมกับ label ถ้าอยากรู้ว่า integer ตัวไหนตรงกับ label ตัวไหน เราสามารถเข้าไปดูได้ที่ <code>features</code> ของอ็อพเจกต์ <code>raw_train_dataset</code> ของเรา ซึ่งจะบอกชนิดของข้อมูลในแต่ละคอลัมน์:",$e,ns,_e,as,Ce,ps,Bl="เราจะเห็นเบื้องหลังของ <code>label</code> ว่าเป็นข้อมูลชนิด <code>ClassLabel</code> โดยข้อมูลการ mapping integers เข้ากับชื่อ label นั้นเก็บอยู่ในโฟลเดอร์ <em>names</em> โดย <code>0</code> จะตรงกับ <code>not_equivalent</code> และ <code>1</code> ตรงกับ <code>equivalent</code>",ge,W,xe,is,Ie,Z,N,ae,rs,Xl='ในขั้นตอนการประมวลผลชุดข้อมูล เราจะต้องแปลงตัวอักษรให้กลายเป็นตัวเลข เพื่อให้โมเดลสามารถทำความเข้าใจได้ ดังที่คุณได้เห็นแล้วใน <a href="/course/chapter2">previous chapter</a> ขั้นตอนการแปลงนี้สามารถทำได้โดยใช้ tokenizer โดยเราสามารถป้อนข้อมูลเข้า tokenizer เพียงแค่หนึ่งประโยค หรือจะป้อนข้อมูลเป็น list ของประโยคทั้งหมดเลยก็ได้ เราสามารถ tokenize ทั้งประโยคแรกและประโยคที่สองในแต่ละคู่ประโยคทุกคู่ได้ดังนี้:',Re,cs,Ze,Ms,zl="อย่างไรก็ตาม การส่งเพียงข้อมูลสองลำดับ (sequences) ในลักษณะนี้เข้าไปยังไม่เพียงพอที่จะทำให้โมเดลสามารถเรียนรู้และทำนายว่าประโยคทั้งสองนี้เป็นประโยคที่เกิดจากการถอดความ (paraphrase) หรือไม่ เราจะต้องจัดการให้ประโยคทั้งสองเป็นคู่กันก่อนแล้วค่อยทำการประมวลผลให้เหมาะสม ซึ่งโชคดีมากที่ tokenizer สามารถรับข้อมูลคู่ของลำดับแล้วเตรียมข้อมูลให้อยู่ในรูปแบบที่เหมาะสมกับการป้อนเข้าโมเดล BERT ของเรา:",Ne,os,Ae,us,Qe,ys,Vl='เราได้อธิบายเกี่ยวกับ keys ที่ชื่อ <code>input_ids</code> และ <code>attention_mask</code> ไปแล้วใน <a href="/course/chapter2">Chapter 2</a> แต่เรายังไม่ได้พูดถึง <code>token_type_ids</code> ซึ่งในตัวอย่างนี้ ตัว token_type_ids นี่เองที่เป็นตัวบอกโมเดลว่าส่วนไหนของ input ที่เป็นประโยคแรก และส่วนไหนที่เป็นประโยคที่สอง',Ge,E,ve,ms,Wl="ถ้าเรา decode ข้อมูล IDs ที่อยู่ใน <code>input_ids</code> กลับไปเป็นคำ:",Be,js,Xe,ds,El="เราจะได้ผลลัพธ์:",ze,Js,Ve,fs,Hl="เราจะเห็นได้ว่าถ้าเราจะป้อนข้อมูลเข้าไปทีละสองประโยค โมเดลจะต้องการรับข้อมูลในรูปของ <code>[CLS] ประโยคที่หนึ่ง [SEP] ประโยคที่สอง [SEP]</code> ซึ่งถ้าเราไปเรียงให้ตรงกับ <code>token_type_ids</code> เราจะได้:",We,hs,Ee,Us,Sl="คุณจะเห็นได้ว่า input ในส่วนที่ตรงกับ <code>[CLS] ประโยคที่หนึ่ง [SEP]</code> จะมี token type ID มีค่าเป็น 0 ทั้งหมด ในขณะที่ input ส่วนที่เหลือซึ่งตรงกับ <code>ประโยคที่สอง [SEP]</code> จะมี token type ID มีค่าเป็น 1 ทั้งหมด",He,bs,Yl="ควรระวังไว้ว่า ถ้าคุณเลือก checkpoint อื่น ผลลัพธ์จากการ tokenize อาจจะไม่มี token_type_ids อยู่ด้วยก็ได้ (ยกตัวอย่างเช่น ถ้าคุณเลือกโมเดล DistilBERT ผลลัพธ์จากการ tokenize จะไม่มี token_type_ids) การ tokenize จะให้ token_type_ids ออกมาก็ต่อเมื่อโมเดลนั้นรู้ว่าต้องจัดการกับมันอย่างไร เพราะโมเดลเคยเห็นข้อมูลนี้มาแล้วในช่วง pretraining",Se,Ts,Fl='ในตัวอย่างนี้ โมเดล BERT ผ่านการ pretrain มาด้วย token type IDs แล้ว และนอกเหนือไปจากเป้าหมายในการเทรนให้โมเดลสามารถเติมคำที่ถูกปิดไว้ (masked langauge modeling objective) ที่เราได้คุยกันใน <a href="/course/chapter1">Chapter 1</a> โมเดล BERT ยังมีอีกเป้าหมายหนึ่งที่เรียกว่า <em>next sentence prediction</em> (การทำนายประโยคถัดไป) โดยมีเป้าหมายในการทำแบบจำลองความสัมพันธ์ระหว่างคู่ของประโยคต่าง ๆ',Ye,ws,Dl="ในการทำให้โมเดลสามารถบรรลุเป้าหมายการทำนายประโยคถัดไป ได้มีการป้อนคู่ของประโยคที่ถูกปิดไว้อย่างสุ่มจำนวนมาก (pairs of sentences with randomly masked tokens) เข้าไปในโมเดล แล้วให้โมเดลทำนายว่าประโยคที่สองเป็นประโยคที่ตามหลังประโยคแรกหรือไม่ เพื่อไม่ให้โมเดลเรียนรู้เฉพาะประโยคที่เรียงตามกันเพียงอย่างเดียว จึงมีการแบ่งข้อมูลให้ครึ่งหนึ่งของคู่ประโยคทั้งหมด เป็นประโยคที่เรียงตามกันจริง ๆ เหมือนในเอกสารต้นฉบับ และอีกครึ่งหนึ่งเป็นคู่ประโยคที่เกิดจากสองประโยคที่มาจากเอกสารคนละชิ้นกัน",Fe,ks,ql="โดยทั่วไปแล้ว คุณไม่ต้องกังวลว่าจะมีข้อมูล <code>token_type_ids</code> ในผลลัพธ์จากการ toknize หรือไม่ ตราบเท่าที่คุณเลือกให้ tokenizer และโมเดลใช้ checkpoint ตัวเดียวกัน เพราะถ้า tokenizer รู้ว่าต้องป้อนข้อมูลอะไรเข้าโมเดล ก็จะไม่เกิดปัญหาใด ๆ",De,$s,Ll='ตอนนี้เราก็ได้เห็นแล้วว่า tokenizer ของเราสามารถรับข้อมูลคู่ประโยคเพียงคู่เดียวก็ได้ หรือสามารถ tokenize คู่ประโยคทั้งหมดที่มีอยู่ในชุดข้อมูลของเราเลยก็ได้: เหมือนกับที่เราทำใน <a href="/course/chapter2">previous chapter</a> เราสามารถป้อนข้อมูลเป็น list ของคู่ประโยคต่าง ๆ เข้าไปใน tokenizer ได้ โดยป้อนข้อมูล list ของประโยคแรก แล้วตามด้วย list ของประโยคที่สอง และยังสามารถทำการเติมและตัด (padding and truncation) เหมือนกับที่เราทำใน <a href="/course/chapter2">Chapter 2</a> ได้ เราอาจจะเขียนคำสั่งในการประมวลผลชุดข้อมูล training set ได้ดังนี้:',qe,_s,Le,Cs,Pl='ซึ่งการเขียนคำสั่งแบบนี้ก็ได้ผลลัพธ์ที่ถูกต้อง แต่จะมีจุดด้อยคือการทำแบบนี้จะได้ผลลัพธ์ออกมาเป็น dictionary (โดยมี keys ต่าง ๆ คือ  <code>input_ids</code>, <code>attention_mask</code> และ <code>token_type_ids</code> และมี values เป็น lists ของ lists) วิธีการนี้จะใช้การได้ก็ต่อเมื่อคอมพิวเตอร์ของคุณมี RAM เพียงพอที่จะเก็บข้อมูลของทั้งชุดข้อมูลในตอนที่ทำการ tokenize ชุดข้อมูลทั้งหมด (ในขณะที่ dataset ที่ได้จากไลบรารี่ 🤗 Datasets จะเป็นไฟล์ <a href="https://arrow.apache.org/" rel="nofollow">Apache Arrow</a> ซึ่งจะเก็บข้อมูลไว้ใน disk คุณจึงสามารถโหลดเฉพาะข้อมูลที่ต้องการมาเก็บไว้ใน memory ได้)',Pe,gs,Kl='เพื่อให้ข้อมูลของเรายังเป็นข้อมูลชนิด dataset เราจะใช้เมธอด <a href="https://huggingface.co/docs/datasets/package_reference/main_classes#datasets.Dataset.map" rel="nofollow"><code>Dataset.map()</code></a> ซึ่งจะช่วยให้เราเลือกได้ว่าเราจะทำการประมวลผลอื่น ๆ นอกเหนือจากการ tokenize หรือไม่ โดยเมธอด <code>map()</code> ทำงานโดยการเรียกใช้ฟังก์ชั่นกับแต่ละ element ของชุดข้อมูล เรามาสร้างฟังก์ชั่นสำหรับ tokenize ข้อมูลของเรากันก่อน:',Ke,xs,Oe,Is,Ol='ฟังก์ชั่นนี้จะรับ dictionary (เหมือนกับแต่ละ item ของชุดข้อมูลของเรา) และให้ผลลัพธ์เป็น dictionary ตัวใหม่ที่มี keys เป็น <code>input_ids</code>, <code>attention_mask</code> และ <code>token_type_ids</code> ควรสังเกตว่าถึงแม้ <code>example</code> dictionary จะประกอบไปด้วยข้อมูลหลายชุด (แต่ละ key เป็น list ของประโยคต่าง ๆ ) ฟังก์ชั่นนี้ก็ยังทำงานได้ เนื่องจาก <code>tokenizer</code> สามารถรับข้อมูลเป็น list ของคู่ประโยคต่าง ๆ ได้ดังที่ได้เห็นแล้วข้างต้น และการเขียนฟังก์ชั่นแบบนี้ยังทำให้เราสามารถใช้ตัวเลือก <code>batched=True</code> ตอนที่เราเรียกใช้เมธอด <code>map()</code> ได้อีกด้วย ซึ่งจะช่วยให้การ tokenize เร็วขึ้นอย่างมาก เนื่องจาก tokenizer ในไลบรารี่ <a href="https://github.com/huggingface/tokenizers" rel="nofollow">🤗 Tokenizers</a> นั้นเขียนโดยใช้ภาษา Rust ซึ่งจะทำงานได้รวดเร็วมากหากคุณป้อนข้อมูลเข้าไปจำนวนมากพร้อม ๆ กัน',sl,Rs,st="ควรสังเกตว่าเรายังไม่ได้ใส่อากิวเมนต์ <code>padding</code> เข้ามาในฟังก์ชั่น tokenize ของเราตอนนี้ เนื่องจากการเติม (padding) ข้อมูลทุก ๆ ตัวอย่างให้มีความยาวเท่ากับประโยคที่มีความยาวมากสุดนั้นไม่ค่อยมีประสิทธิภาพเท่าไรนัก วิธีการที่ดีกว่าคือให้เราเติม (pad) ข้อมูลเมื่อเรากำลังสร้าง batch ขึ้นมา ซึ่งเราก็จะต้องเติมให้ข้อมูลมีความยาวเท่ากับประโยคที่ยาวที่สุดใน batch นั้น ๆ ก็พอ ไม่จำเป็นต้องเติมให้ยาวเท่ากับประโยคที่ยาวที่สุดในทั้งชุดข้อมูล การทำเช่นนี้จะช่วยประหยัดเวลาและพลังในการประมวลผลได้อย่างมาก แม้ input ของเราจะมีความยาวที่แตกต่างกันมากก็ตาม!",el,Zs,et="ต่อไปนี้คือวิธีการใช้ฟังก์ชั่น tokenize ให้ทำงานกับข้อมูลใน dataset ทุกชุดของเราในคราวเดียว โดยเราจะใส่ <code>batched=True</code> ตอนที่ call เมธอด <code>map</code> เพื่อให้ฟังก์ชั่นทำงานกับ elements หลาย ๆ ตัวใน dataset ของเราในคราวเดียว (ไม่ได้ทำทีละ element แยกกัน) ซึ่งการทำเช่นนี้จะช่วยให้เราประมวลผลข้อมูลได้เร็วขึ้นมาก",ll,Ns,tl,As,lt="ไลบรารี่ 🤗 Datasets จะทำการประมวลผลนี้โดยการเพิ่ม fields ใหม่เข้าไปยัง datasets ของเรา โดยเพิ่ม field ให้กับแต่ละ key ของ dictionary ที่ได้ออกมาจากฟังก์ชั่นประมวลผลของเรา",nl,Qs,al,Gs,tt="นอกจากนี้คุณยังสามารถใช้ multiprocessing ตอนที่คุณใช้ฟังก์ชั่น preprocess ของคุณกับ <code>map()</code> ได้โดยการใส่อากิวเมนต์ <code>num_proc</code> แต่ที่เราไม่ได้ทำให้ดูตรงนี้ เนื่องจากไลบรารี่ 🤗 Tokenizers นั้นมีการใช้ multiple threads เพื่อให้การ tokenize ตัวอย่างของเราเร็วขึ้นอยู่แล้ว แต่ถ้าคุณไม่ได้ใช้ fast tokenizer ที่เขียนไว้ในไลบรารี่นี้ การใช้ multiprocessing ก็อาจจะช่วยให้การประมวลผลชุดข้อมูลของคุณเร็วขึ้นได้",pl,vs,nt="<code>tokenize_function</code> ของเราให้ผลลัพธ์เป็น dictionary โดยมี keys ต่าง ๆ ได้แก่ <code>input_ids</code>, <code>attention_mask</code> และ <code>token_type_ids</code> เพื่อให้ทั้งสาม field นี้ถูกเพิ่มเข้าไปใน dataset ทั้งสาม split คุณควรจำไว้ว่าเราอาจจะเปลี่ยน filed ที่มีอยู่แล้วก็ได้ ถ้าหากว่าคุณเลือกเขียนฟังก์ชั่นให้เปลี่ยนค่าใน key เดิมใน dataset ที่เราจะทำการ map และให้ฟังก์ชั่น return ค่าใหม่ออกมา",il,Bs,at="ขั้นตอนสุดท้ายที่ต้องทำก็คือการเติมชุดข้อมูลตัวอย่างของเราให้มีความยาวเท่ากับข้อมูลตัวที่มีความยาวมากที่สุดใน batch ซึ่งเทคนิคเราจะเรียกว่า <em>dynamic padding</em> (การเติมแบบพลวัต)",rl,Xs,cl,zs,Ml,pe,Vs,pt="ในทางปฏิบัติแล้ว เราจะต้องสร้างฟังก์ชั่น collate ที่จะทำการเติมข้อมูลในแต่ละ batch ของ dataset ด้วยจำนวนที่ถูกต้อง ซึ่งโชคดีที่ไลบรารี่ 🤗 Transformers ได้เตรียมฟังก์ชั่นนี้ไว้ให้แล้วในโมดูล <code>DataCollatorWithPadding</code> โดยจะรับข้อมูลเป็น tokenier (เพื่อให้รู้ว่าจะต้องเติมด้วย paddin token อะไร และเพื่อให้รู้ว่าโมเดลคาดหวังว่าจะต้องเติมไปทางซ้ายหรือทางขวามือของข้อมูล) และจะทำขั้นตอนทุกอย่างที่คุณต้องการ:",ol,A,Q,ie,Ws,it="เพื่อจะทดสอบของเล่นชิ้นใหม่นี้ ลองเลือกข้อมูลบางส่วนจากชุดข้อมูล training ของเรามาทดลองสร้างเป็น batch ซึ่งตรงนี้เราจะเอาคอลัมน์ idx, sentence1 และ sentence2 ออกไปเนื่องจากเราไม่จำเป็นต้องใช้ อีกทั้งคอลัมน์เหล่านี้ยังมี strings (ซึ่งเราไม่สามารถใช้ strings ในการสร้าง tensor ได้) แล้วลองดูความยาวของข้อมูลแต่ละตัวใน batch ของเรา:",ul,Es,yl,Hs,ml,Ss,rt="เราเลือกได้ข้อมูลที่มีความยาวต่าง ๆ กัน ตั้งแต่ 32 ไปถึง 67 (ซึ่งก็ไม่น่าประหลาดใจอะไร) การทำ Dynamic padding ควรที่จะเติมข้อมูลทุกตัวใน batch นี้ให้มีความยาวเท่ากันเท่ากับ 67 (ซึ่งเป็นความยาวของข้อมูลที่ยาวที่สุดใน batch นี้) ถ้าไม่มีการทำ dynamic padding เราก็จะต้องเติมข้อมูลให้ยาวเท่ากับข้อมูลที่ยาวที่สุดใน dataset หรือไม่ก็เท่ากับความยาวสูงสุดที่โมเดลจะรับได้ ลองมาตรวจสอบกันดูว่า <code>data_collator</code> ของเรานั้นได้ทำการเติมแบบพลวัตให้กับข้อมูลใน batch ของเราอย่างถูกต้องเหมาะสม:",jl,Ys,dl,G,v,re,H,Jl,ce,Fs,fl,Me,hl;b=new Vt({props:{fw:U[0]}}),k=new Xt({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),T=new Tl({props:{title:"การประมวลผลข้อมูล",local:"การประมวลผลขอมล",headingTag:"h1"}});const ct=[Et,Wt],Ds=[];function Mt(s,e){return s[0]==="pt"?0:1}_=Mt(U),C=Ds[_]=ct[_](U);const ot=[St,Ht],qs=[];function ut(s,e){return s[0]==="pt"?0:1}g=ut(U),x=qs[g]=ot[g](U),F=new Tl({props:{title:"วิธีการโหลดชุดข้อมูลจาก Hub",local:"วธการโหลดชดขอมลจาก-hub",headingTag:"h3"}});const yt=[Ft,Yt],Ls=[];function mt(s,e){return s[0]==="pt"?0:1}I=mt(U),R=Ls[I]=yt[I](U),V=new bl({props:{$$slots:{default:[Dt]},$$scope:{ctx:U}}}),L=new w({props:{code:"ZnJvbSUyMGRhdGFzZXRzJTIwaW1wb3J0JTIwbG9hZF9kYXRhc2V0JTBBJTBBcmF3X2RhdGFzZXRzJTIwJTNEJTIwbG9hZF9kYXRhc2V0KCUyMmdsdWUlMjIlMkMlMjAlMjJtcnBjJTIyKSUwQXJhd19kYXRhc2V0cw==",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;glue&quot;</span>, <span class="hljs-string">&quot;mrpc&quot;</span>)
raw_datasets`,wrap:!1}}),P=new w({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ3NlbnRlbmNlMSclMkMlMjAnc2VudGVuY2UyJyUyQyUyMCdsYWJlbCclMkMlMjAnaWR4JyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwMzY2OCUwQSUyMCUyMCUyMCUyMCU3RCklMEElMjAlMjAlMjAlMjB2YWxpZGF0aW9uJTNBJTIwRGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidzZW50ZW5jZTEnJTJDJTIwJ3NlbnRlbmNlMiclMkMlMjAnbGFiZWwnJTJDJTIwJ2lkeCclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDQwOCUwQSUyMCUyMCUyMCUyMCU3RCklMEElMjAlMjAlMjAlMjB0ZXN0JTNBJTIwRGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidzZW50ZW5jZTEnJTJDJTIwJ3NlbnRlbmNlMiclMkMlMjAnbGFiZWwnJTJDJTIwJ2lkeCclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDE3MjUlMEElMjAlMjAlMjAlMjAlN0QpJTBBJTdEKQ==",highlighted:`DatasetDict({
    train: Dataset({
        features: [<span class="hljs-string">&#x27;sentence1&#x27;</span>, <span class="hljs-string">&#x27;sentence2&#x27;</span>, <span class="hljs-string">&#x27;label&#x27;</span>, <span class="hljs-string">&#x27;idx&#x27;</span>],
        num_rows: <span class="hljs-number">3668</span>
    })
    validation: Dataset({
        features: [<span class="hljs-string">&#x27;sentence1&#x27;</span>, <span class="hljs-string">&#x27;sentence2&#x27;</span>, <span class="hljs-string">&#x27;label&#x27;</span>, <span class="hljs-string">&#x27;idx&#x27;</span>],
        num_rows: <span class="hljs-number">408</span>
    })
    test: Dataset({
        features: [<span class="hljs-string">&#x27;sentence1&#x27;</span>, <span class="hljs-string">&#x27;sentence2&#x27;</span>, <span class="hljs-string">&#x27;label&#x27;</span>, <span class="hljs-string">&#x27;idx&#x27;</span>],
        num_rows: <span class="hljs-number">1725</span>
    })
})`,wrap:!1}}),es=new w({props:{code:"cmF3X3RyYWluX2RhdGFzZXQlMjAlM0QlMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCUwQXJhd190cmFpbl9kYXRhc2V0JTVCMCU1RA==",highlighted:`raw_train_dataset = raw_datasets[<span class="hljs-string">&quot;train&quot;</span>]
raw_train_dataset[<span class="hljs-number">0</span>]`,wrap:!1}}),ls=new w({props:{code:"JTdCJ2lkeCclM0ElMjAwJTJDJTBBJTIwJ2xhYmVsJyUzQSUyMDElMkMlMEElMjAnc2VudGVuY2UxJyUzQSUyMCdBbXJvemklMjBhY2N1c2VkJTIwaGlzJTIwYnJvdGhlciUyMCUyQyUyMHdob20lMjBoZSUyMGNhbGxlZCUyMCUyMiUyMHRoZSUyMHdpdG5lc3MlMjAlMjIlMjAlMkMlMjBvZiUyMGRlbGliZXJhdGVseSUyMGRpc3RvcnRpbmclMjBoaXMlMjBldmlkZW5jZSUyMC4nJTJDJTBBJTIwJ3NlbnRlbmNlMiclM0ElMjAnUmVmZXJyaW5nJTIwdG8lMjBoaW0lMjBhcyUyMG9ubHklMjAlMjIlMjB0aGUlMjB3aXRuZXNzJTIwJTIyJTIwJTJDJTIwQW1yb3ppJTIwYWNjdXNlZCUyMGhpcyUyMGJyb3RoZXIlMjBvZiUyMGRlbGliZXJhdGVseSUyMGRpc3RvcnRpbmclMjBoaXMlMjBldmlkZW5jZSUyMC4nJTdE",highlighted:`{<span class="hljs-string">&#x27;idx&#x27;</span>: <span class="hljs-number">0</span>,
 <span class="hljs-string">&#x27;label&#x27;</span>: <span class="hljs-number">1</span>,
 <span class="hljs-string">&#x27;sentence1&#x27;</span>: <span class="hljs-string">&#x27;Amrozi accused his brother , whom he called &quot; the witness &quot; , of deliberately distorting his evidence .&#x27;</span>,
 <span class="hljs-string">&#x27;sentence2&#x27;</span>: <span class="hljs-string">&#x27;Referring to him as only &quot; the witness &quot; , Amrozi accused his brother of deliberately distorting his evidence .&#x27;</span>}`,wrap:!1}}),ns=new w({props:{code:"cmF3X3RyYWluX2RhdGFzZXQuZmVhdHVyZXM=",highlighted:"raw_train_dataset.features",wrap:!1}}),as=new w({props:{code:"JTdCJ3NlbnRlbmNlMSclM0ElMjBWYWx1ZShkdHlwZSUzRCdzdHJpbmcnJTJDJTIwaWQlM0ROb25lKSUyQyUwQSUyMCdzZW50ZW5jZTInJTNBJTIwVmFsdWUoZHR5cGUlM0Qnc3RyaW5nJyUyQyUyMGlkJTNETm9uZSklMkMlMEElMjAnbGFiZWwnJTNBJTIwQ2xhc3NMYWJlbChudW1fY2xhc3NlcyUzRDIlMkMlMjBuYW1lcyUzRCU1Qidub3RfZXF1aXZhbGVudCclMkMlMjAnZXF1aXZhbGVudCclNUQlMkMlMjBuYW1lc19maWxlJTNETm9uZSUyQyUyMGlkJTNETm9uZSklMkMlMEElMjAnaWR4JyUzQSUyMFZhbHVlKGR0eXBlJTNEJ2ludDMyJyUyQyUyMGlkJTNETm9uZSklN0Q=",highlighted:`{<span class="hljs-string">&#x27;sentence1&#x27;</span>: Value(dtype=<span class="hljs-string">&#x27;string&#x27;</span>, <span class="hljs-built_in">id</span>=<span class="hljs-literal">None</span>),
 <span class="hljs-string">&#x27;sentence2&#x27;</span>: Value(dtype=<span class="hljs-string">&#x27;string&#x27;</span>, <span class="hljs-built_in">id</span>=<span class="hljs-literal">None</span>),
 <span class="hljs-string">&#x27;label&#x27;</span>: ClassLabel(num_classes=<span class="hljs-number">2</span>, names=[<span class="hljs-string">&#x27;not_equivalent&#x27;</span>, <span class="hljs-string">&#x27;equivalent&#x27;</span>], names_file=<span class="hljs-literal">None</span>, <span class="hljs-built_in">id</span>=<span class="hljs-literal">None</span>),
 <span class="hljs-string">&#x27;idx&#x27;</span>: Value(dtype=<span class="hljs-string">&#x27;int32&#x27;</span>, <span class="hljs-built_in">id</span>=<span class="hljs-literal">None</span>)}`,wrap:!1}}),W=new bl({props:{$$slots:{default:[qt]},$$scope:{ctx:U}}}),is=new Tl({props:{title:"การประมวลผลชุดข้อมูล",local:"การประมวลผลชดขอมล",headingTag:"h3"}});const jt=[Pt,Lt],Ps=[];function dt(s,e){return s[0]==="pt"?0:1}Z=dt(U),N=Ps[Z]=jt[Z](U),cs=new w({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMEElMEFjaGVja3BvaW50JTIwJTNEJTIwJTIyYmVydC1iYXNlLXVuY2FzZWQlMjIlMEF0b2tlbml6ZXIlMjAlM0QlMjBBdXRvVG9rZW5pemVyLmZyb21fcHJldHJhaW5lZChjaGVja3BvaW50KSUwQXRva2VuaXplZF9zZW50ZW5jZXNfMSUyMCUzRCUyMHRva2VuaXplcihyYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QiUyMnNlbnRlbmNlMSUyMiU1RCklMEF0b2tlbml6ZWRfc2VudGVuY2VzXzIlMjAlM0QlMjB0b2tlbml6ZXIocmF3X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIlMjJzZW50ZW5jZTIlMjIlNUQp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer

checkpoint = <span class="hljs-string">&quot;bert-base-uncased&quot;</span>
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
tokenized_sentences_1 = tokenizer(raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-string">&quot;sentence1&quot;</span>])
tokenized_sentences_2 = tokenizer(raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-string">&quot;sentence2&quot;</span>])`,wrap:!1}}),os=new w({props:{code:"aW5wdXRzJTIwJTNEJTIwdG9rZW5pemVyKCUyMlRoaXMlMjBpcyUyMHRoZSUyMGZpcnN0JTIwc2VudGVuY2UuJTIyJTJDJTIwJTIyVGhpcyUyMGlzJTIwdGhlJTIwc2Vjb25kJTIwb25lLiUyMiklMEFpbnB1dHM=",highlighted:`inputs = tokenizer(<span class="hljs-string">&quot;This is the first sentence.&quot;</span>, <span class="hljs-string">&quot;This is the second one.&quot;</span>)
inputs`,wrap:!1}}),us=new w({props:{code:"JTdCJTIwJTBBJTIwJTIwJ2lucHV0X2lkcyclM0ElMjAlNUIxMDElMkMlMjAyMDIzJTJDJTIwMjAwMyUyQyUyMDE5OTYlMkMlMjAyMDM0JTJDJTIwNjI1MSUyQyUyMDEwMTIlMkMlMjAxMDIlMkMlMjAyMDIzJTJDJTIwMjAwMyUyQyUyMDE5OTYlMkMlMjAyMTE3JTJDJTIwMjAyOCUyQyUyMDEwMTIlMkMlMjAxMDIlNUQlMkMlMEElMjAlMjAndG9rZW5fdHlwZV9pZHMnJTNBJTIwJTVCMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTVEJTJDJTBBJTIwJTIwJ2F0dGVudGlvbl9tYXNrJyUzQSUyMCU1QjElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSU1RCUwQSU3RA==",highlighted:`{ 
  <span class="hljs-string">&#x27;input_ids&#x27;</span>: [<span class="hljs-number">101</span>, <span class="hljs-number">2023</span>, <span class="hljs-number">2003</span>, <span class="hljs-number">1996</span>, <span class="hljs-number">2034</span>, <span class="hljs-number">6251</span>, <span class="hljs-number">1012</span>, <span class="hljs-number">102</span>, <span class="hljs-number">2023</span>, <span class="hljs-number">2003</span>, <span class="hljs-number">1996</span>, <span class="hljs-number">2117</span>, <span class="hljs-number">2028</span>, <span class="hljs-number">1012</span>, <span class="hljs-number">102</span>],
  <span class="hljs-string">&#x27;token_type_ids&#x27;</span>: [<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>],
  <span class="hljs-string">&#x27;attention_mask&#x27;</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>]
}`,wrap:!1}}),E=new bl({props:{$$slots:{default:[Kt]},$$scope:{ctx:U}}}),js=new w({props:{code:"dG9rZW5pemVyLmNvbnZlcnRfaWRzX3RvX3Rva2VucyhpbnB1dHMlNUIlMjJpbnB1dF9pZHMlMjIlNUQp",highlighted:'tokenizer.convert_ids_to_tokens(inputs[<span class="hljs-string">&quot;input_ids&quot;</span>])',wrap:!1}}),Js=new w({props:{code:"JTVCJyU1QkNMUyU1RCclMkMlMjAndGhpcyclMkMlMjAnaXMnJTJDJTIwJ3RoZSclMkMlMjAnZmlyc3QnJTJDJTIwJ3NlbnRlbmNlJyUyQyUyMCcuJyUyQyUyMCclNUJTRVAlNUQnJTJDJTIwJ3RoaXMnJTJDJTIwJ2lzJyUyQyUyMCd0aGUnJTJDJTIwJ3NlY29uZCclMkMlMjAnb25lJyUyQyUyMCcuJyUyQyUyMCclNUJTRVAlNUQnJTVE",highlighted:'[<span class="hljs-string">&#x27;[CLS]&#x27;</span>, <span class="hljs-string">&#x27;this&#x27;</span>, <span class="hljs-string">&#x27;is&#x27;</span>, <span class="hljs-string">&#x27;the&#x27;</span>, <span class="hljs-string">&#x27;first&#x27;</span>, <span class="hljs-string">&#x27;sentence&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>, <span class="hljs-string">&#x27;[SEP]&#x27;</span>, <span class="hljs-string">&#x27;this&#x27;</span>, <span class="hljs-string">&#x27;is&#x27;</span>, <span class="hljs-string">&#x27;the&#x27;</span>, <span class="hljs-string">&#x27;second&#x27;</span>, <span class="hljs-string">&#x27;one&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>, <span class="hljs-string">&#x27;[SEP]&#x27;</span>]',wrap:!1}}),hs=new w({props:{code:"JTVCJyU1QkNMUyU1RCclMkMlMjAndGhpcyclMkMlMjAnaXMnJTJDJTIwJ3RoZSclMkMlMjAnZmlyc3QnJTJDJTIwJ3NlbnRlbmNlJyUyQyUyMCcuJyUyQyUyMCclNUJTRVAlNUQnJTJDJTIwJ3RoaXMnJTJDJTIwJ2lzJyUyQyUyMCd0aGUnJTJDJTIwJ3NlY29uZCclMkMlMjAnb25lJyUyQyUyMCcuJyUyQyUyMCclNUJTRVAlNUQnJTVEJTBBJTVCJTIwJTIwJTIwJTIwJTIwJTIwMCUyQyUyMCUyMCUyMCUyMCUyMCUyMDAlMkMlMjAlMjAlMjAlMjAwJTJDJTIwJTIwJTIwJTIwJTIwMCUyQyUyMCUyMCUyMCUyMCUyMCUyMCUyMDAlMkMlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAwJTJDJTIwJTIwJTIwMCUyQyUyMCUyMCUyMCUyMCUyMCUyMCUyMDAlMkMlMjAlMjAlMjAlMjAlMjAlMjAxJTJDJTIwJTIwJTIwJTIwMSUyQyUyMCUyMCUyMCUyMCUyMDElMkMlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxJTJDJTIwJTIwJTIwJTIwJTIwMSUyQyUyMCUyMCUyMDElMkMlMjAlMjAlMjAlMjAlMjAlMjAlMjAxJTVE",highlighted:`[<span class="hljs-string">&#x27;[CLS]&#x27;</span>, <span class="hljs-string">&#x27;this&#x27;</span>, <span class="hljs-string">&#x27;is&#x27;</span>, <span class="hljs-string">&#x27;the&#x27;</span>, <span class="hljs-string">&#x27;first&#x27;</span>, <span class="hljs-string">&#x27;sentence&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>, <span class="hljs-string">&#x27;[SEP]&#x27;</span>, <span class="hljs-string">&#x27;this&#x27;</span>, <span class="hljs-string">&#x27;is&#x27;</span>, <span class="hljs-string">&#x27;the&#x27;</span>, <span class="hljs-string">&#x27;second&#x27;</span>, <span class="hljs-string">&#x27;one&#x27;</span>, <span class="hljs-string">&#x27;.&#x27;</span>, <span class="hljs-string">&#x27;[SEP]&#x27;</span>]
[      <span class="hljs-number">0</span>,      <span class="hljs-number">0</span>,    <span class="hljs-number">0</span>,     <span class="hljs-number">0</span>,       <span class="hljs-number">0</span>,          <span class="hljs-number">0</span>,   <span class="hljs-number">0</span>,       <span class="hljs-number">0</span>,      <span class="hljs-number">1</span>,    <span class="hljs-number">1</span>,     <span class="hljs-number">1</span>,        <span class="hljs-number">1</span>,     <span class="hljs-number">1</span>,   <span class="hljs-number">1</span>,       <span class="hljs-number">1</span>]`,wrap:!1}}),_s=new w({props:{code:"dG9rZW5pemVkX2RhdGFzZXQlMjAlM0QlMjB0b2tlbml6ZXIoJTBBJTIwJTIwJTIwJTIwcmF3X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIlMjJzZW50ZW5jZTElMjIlNUQlMkMlMEElMjAlMjAlMjAlMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QiUyMnNlbnRlbmNlMiUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMHBhZGRpbmclM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwdHJ1bmNhdGlvbiUzRFRydWUlMkMlMEEp",highlighted:`tokenized_dataset = tokenizer(
    raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-string">&quot;sentence1&quot;</span>],
    raw_datasets[<span class="hljs-string">&quot;train&quot;</span>][<span class="hljs-string">&quot;sentence2&quot;</span>],
    padding=<span class="hljs-literal">True</span>,
    truncation=<span class="hljs-literal">True</span>,
)`,wrap:!1}}),xs=new w({props:{code:"ZGVmJTIwdG9rZW5pemVfZnVuY3Rpb24oZXhhbXBsZSklM0ElMEElMjAlMjAlMjAlMjByZXR1cm4lMjB0b2tlbml6ZXIoZXhhbXBsZSU1QiUyMnNlbnRlbmNlMSUyMiU1RCUyQyUyMGV4YW1wbGUlNUIlMjJzZW50ZW5jZTIlMjIlNUQlMkMlMjB0cnVuY2F0aW9uJTNEVHJ1ZSk=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">tokenize_function</span>(<span class="hljs-params">example</span>):
    <span class="hljs-keyword">return</span> tokenizer(example[<span class="hljs-string">&quot;sentence1&quot;</span>], example[<span class="hljs-string">&quot;sentence2&quot;</span>], truncation=<span class="hljs-literal">True</span>)`,wrap:!1}}),Ns=new w({props:{code:"dG9rZW5pemVkX2RhdGFzZXRzJTIwJTNEJTIwcmF3X2RhdGFzZXRzLm1hcCh0b2tlbml6ZV9mdW5jdGlvbiUyQyUyMGJhdGNoZWQlM0RUcnVlKSUwQXRva2VuaXplZF9kYXRhc2V0cw==",highlighted:`tokenized_datasets = raw_datasets.<span class="hljs-built_in">map</span>(tokenize_function, batched=<span class="hljs-literal">True</span>)
tokenized_datasets`,wrap:!1}}),Qs=new w({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2F0dGVudGlvbl9tYXNrJyUyQyUyMCdpZHgnJTJDJTIwJ2lucHV0X2lkcyclMkMlMjAnbGFiZWwnJTJDJTIwJ3NlbnRlbmNlMSclMkMlMjAnc2VudGVuY2UyJyUyQyUyMCd0b2tlbl90eXBlX2lkcyclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDM2NjglMEElMjAlMjAlMjAlMjAlN0QpJTBBJTIwJTIwJTIwJTIwdmFsaWRhdGlvbiUzQSUyMERhdGFzZXQoJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZmVhdHVyZXMlM0ElMjAlNUInYXR0ZW50aW9uX21hc2snJTJDJTIwJ2lkeCclMkMlMjAnaW5wdXRfaWRzJyUyQyUyMCdsYWJlbCclMkMlMjAnc2VudGVuY2UxJyUyQyUyMCdzZW50ZW5jZTInJTJDJTIwJ3Rva2VuX3R5cGVfaWRzJyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwNDA4JTBBJTIwJTIwJTIwJTIwJTdEKSUwQSUyMCUyMCUyMCUyMHRlc3QlM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2F0dGVudGlvbl9tYXNrJyUyQyUyMCdpZHgnJTJDJTIwJ2lucHV0X2lkcyclMkMlMjAnbGFiZWwnJTJDJTIwJ3NlbnRlbmNlMSclMkMlMjAnc2VudGVuY2UyJyUyQyUyMCd0b2tlbl90eXBlX2lkcyclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDE3MjUlMEElMjAlMjAlMjAlMjAlN0QpJTBBJTdEKQ==",highlighted:`DatasetDict({
    train: Dataset({
        features: [<span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;idx&#x27;</span>, <span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;label&#x27;</span>, <span class="hljs-string">&#x27;sentence1&#x27;</span>, <span class="hljs-string">&#x27;sentence2&#x27;</span>, <span class="hljs-string">&#x27;token_type_ids&#x27;</span>],
        num_rows: <span class="hljs-number">3668</span>
    })
    validation: Dataset({
        features: [<span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;idx&#x27;</span>, <span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;label&#x27;</span>, <span class="hljs-string">&#x27;sentence1&#x27;</span>, <span class="hljs-string">&#x27;sentence2&#x27;</span>, <span class="hljs-string">&#x27;token_type_ids&#x27;</span>],
        num_rows: <span class="hljs-number">408</span>
    })
    test: Dataset({
        features: [<span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;idx&#x27;</span>, <span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;label&#x27;</span>, <span class="hljs-string">&#x27;sentence1&#x27;</span>, <span class="hljs-string">&#x27;sentence2&#x27;</span>, <span class="hljs-string">&#x27;token_type_ids&#x27;</span>],
        num_rows: <span class="hljs-number">1725</span>
    })
})`,wrap:!1}}),Xs=new Tl({props:{title:"Dynamic padding (การเติมแบบพลวัต)",local:"dynamic-padding-การเตมแบบพลวต",headingTag:"h3"}}),zs=new oe({props:{id:"7q5NyFT8REg"}});function Jt(s,e){return s[0]==="pt"?sn:Ot}let Ul=Jt(U),z=Ul(U);const ft=[ln,en],Ks=[];function ht(s,e){return s[0]==="pt"?0:1}A=ht(U),Q=Ks[A]=ft[A](U),Es=new w({props:{code:"c2FtcGxlcyUyMCUzRCUyMHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVEJTVCJTNBOCU1RCUwQXNhbXBsZXMlMjAlM0QlMjAlN0JrJTNBJTIwdiUyMGZvciUyMGslMkMlMjB2JTIwaW4lMjBzYW1wbGVzLml0ZW1zKCklMjBpZiUyMGslMjBub3QlMjBpbiUyMCU1QiUyMmlkeCUyMiUyQyUyMCUyMnNlbnRlbmNlMSUyMiUyQyUyMCUyMnNlbnRlbmNlMiUyMiU1RCU3RCUwQSU1Qmxlbih4KSUyMGZvciUyMHglMjBpbiUyMHNhbXBsZXMlNUIlMjJpbnB1dF9pZHMlMjIlNUQlNUQ=",highlighted:`samples = tokenized_datasets[<span class="hljs-string">&quot;train&quot;</span>][:<span class="hljs-number">8</span>]
samples = {k: v <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> samples.items() <span class="hljs-keyword">if</span> k <span class="hljs-keyword">not</span> <span class="hljs-keyword">in</span> [<span class="hljs-string">&quot;idx&quot;</span>, <span class="hljs-string">&quot;sentence1&quot;</span>, <span class="hljs-string">&quot;sentence2&quot;</span>]}
[<span class="hljs-built_in">len</span>(x) <span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> samples[<span class="hljs-string">&quot;input_ids&quot;</span>]]`,wrap:!1}}),Hs=new w({props:{code:"JTVCNTAlMkMlMjA1OSUyQyUyMDQ3JTJDJTIwNjclMkMlMjA1OSUyQyUyMDUwJTJDJTIwNjIlMkMlMjAzMiU1RA==",highlighted:'[<span class="hljs-number">50</span>, <span class="hljs-number">59</span>, <span class="hljs-number">47</span>, <span class="hljs-number">67</span>, <span class="hljs-number">59</span>, <span class="hljs-number">50</span>, <span class="hljs-number">62</span>, <span class="hljs-number">32</span>]',wrap:!1}}),Ys=new w({props:{code:"YmF0Y2glMjAlM0QlMjBkYXRhX2NvbGxhdG9yKHNhbXBsZXMpJTBBJTdCayUzQSUyMHYuc2hhcGUlMjBmb3IlMjBrJTJDJTIwdiUyMGluJTIwYmF0Y2guaXRlbXMoKSU3RA==",highlighted:`batch = data_collator(samples)
{k: v.shape <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> batch.items()}`,wrap:!1}});const Ut=[nn,tn],Os=[];function bt(s,e){return s[0]==="tf"?0:1}G=bt(U),v=Os[G]=Ut[G](U),H=new bl({props:{$$slots:{default:[an]},$$scope:{ctx:U}}});let $=U[0]==="tf"&&xt();return Fs=new zt({props:{source:"https://github.com/huggingface/course/blob/main/chapters/th/chapter3/2.mdx"}}),{c(){l=y("meta"),p=i(),t=y("p"),c=i(),j(b.$$.fragment),u=i(),j(k.$$.fragment),X=i(),j(T.$$.fragment),B=i(),C.c(),le=i(),x.c(),te=i(),S=y("p"),S.textContent=Il,ue=i(),Y=y("p"),Y.innerHTML=Rl,ye=i(),j(F.$$.fragment),me=i(),R.c(),ne=i(),D=y("p"),D.innerHTML=Zl,je=i(),q=y("p"),q.textContent=Nl,de=i(),j(V.$$.fragment),Je=i(),j(L.$$.fragment),fe=i(),j(P.$$.fragment),he=i(),K=y("p"),K.innerHTML=Al,Ue=i(),O=y("p"),O.innerHTML=Ql,be=i(),ss=y("p"),ss.innerHTML=Gl,Te=i(),j(es.$$.fragment),we=i(),j(ls.$$.fragment),ke=i(),ts=y("p"),ts.innerHTML=vl,$e=i(),j(ns.$$.fragment),_e=i(),j(as.$$.fragment),Ce=i(),ps=y("p"),ps.innerHTML=Bl,ge=i(),j(W.$$.fragment),xe=i(),j(is.$$.fragment),Ie=i(),N.c(),ae=i(),rs=y("p"),rs.innerHTML=Xl,Re=i(),j(cs.$$.fragment),Ze=i(),Ms=y("p"),Ms.textContent=zl,Ne=i(),j(os.$$.fragment),Ae=i(),j(us.$$.fragment),Qe=i(),ys=y("p"),ys.innerHTML=Vl,Ge=i(),j(E.$$.fragment),ve=i(),ms=y("p"),ms.innerHTML=Wl,Be=i(),j(js.$$.fragment),Xe=i(),ds=y("p"),ds.textContent=El,ze=i(),j(Js.$$.fragment),Ve=i(),fs=y("p"),fs.innerHTML=Hl,We=i(),j(hs.$$.fragment),Ee=i(),Us=y("p"),Us.innerHTML=Sl,He=i(),bs=y("p"),bs.textContent=Yl,Se=i(),Ts=y("p"),Ts.innerHTML=Fl,Ye=i(),ws=y("p"),ws.textContent=Dl,Fe=i(),ks=y("p"),ks.innerHTML=ql,De=i(),$s=y("p"),$s.innerHTML=Ll,qe=i(),j(_s.$$.fragment),Le=i(),Cs=y("p"),Cs.innerHTML=Pl,Pe=i(),gs=y("p"),gs.innerHTML=Kl,Ke=i(),j(xs.$$.fragment),Oe=i(),Is=y("p"),Is.innerHTML=Ol,sl=i(),Rs=y("p"),Rs.innerHTML=st,el=i(),Zs=y("p"),Zs.innerHTML=et,ll=i(),j(Ns.$$.fragment),tl=i(),As=y("p"),As.textContent=lt,nl=i(),j(Qs.$$.fragment),al=i(),Gs=y("p"),Gs.innerHTML=tt,pl=i(),vs=y("p"),vs.innerHTML=nt,il=i(),Bs=y("p"),Bs.innerHTML=at,rl=i(),j(Xs.$$.fragment),cl=i(),j(zs.$$.fragment),Ml=i(),z.c(),pe=i(),Vs=y("p"),Vs.innerHTML=pt,ol=i(),Q.c(),ie=i(),Ws=y("p"),Ws.textContent=it,ul=i(),j(Es.$$.fragment),yl=i(),j(Hs.$$.fragment),ml=i(),Ss=y("p"),Ss.innerHTML=rt,jl=i(),j(Ys.$$.fragment),dl=i(),v.c(),re=i(),j(H.$$.fragment),Jl=i(),$&&$.c(),ce=i(),j(Fs.$$.fragment),fl=i(),Me=y("p"),this.h()},l(s){const e=Qt("svelte-u9bgzb",document.head);l=m(e,"META",{name:!0,content:!0}),e.forEach(n),p=r(s),t=m(s,"P",{}),Ct(t).forEach(n),c=r(s),d(b.$$.fragment,s),u=r(s),d(k.$$.fragment,s),X=r(s),d(T.$$.fragment,s),B=r(s),C.l(s),le=r(s),x.l(s),te=r(s),S=m(s,"P",{"data-svelte-h":!0}),h(S)!=="svelte-1x0uuug"&&(S.textContent=Il),ue=r(s),Y=m(s,"P",{"data-svelte-h":!0}),h(Y)!=="svelte-l34a0i"&&(Y.innerHTML=Rl),ye=r(s),d(F.$$.fragment,s),me=r(s),R.l(s),ne=r(s),D=m(s,"P",{"data-svelte-h":!0}),h(D)!=="svelte-5kjdet"&&(D.innerHTML=Zl),je=r(s),q=m(s,"P",{"data-svelte-h":!0}),h(q)!=="svelte-1frmeq1"&&(q.textContent=Nl),de=r(s),d(V.$$.fragment,s),Je=r(s),d(L.$$.fragment,s),fe=r(s),d(P.$$.fragment,s),he=r(s),K=m(s,"P",{"data-svelte-h":!0}),h(K)!=="svelte-1p2l4nq"&&(K.innerHTML=Al),Ue=r(s),O=m(s,"P",{"data-svelte-h":!0}),h(O)!=="svelte-128v4um"&&(O.innerHTML=Ql),be=r(s),ss=m(s,"P",{"data-svelte-h":!0}),h(ss)!=="svelte-379gh7"&&(ss.innerHTML=Gl),Te=r(s),d(es.$$.fragment,s),we=r(s),d(ls.$$.fragment,s),ke=r(s),ts=m(s,"P",{"data-svelte-h":!0}),h(ts)!=="svelte-85u0vh"&&(ts.innerHTML=vl),$e=r(s),d(ns.$$.fragment,s),_e=r(s),d(as.$$.fragment,s),Ce=r(s),ps=m(s,"P",{"data-svelte-h":!0}),h(ps)!=="svelte-fn52g3"&&(ps.innerHTML=Bl),ge=r(s),d(W.$$.fragment,s),xe=r(s),d(is.$$.fragment,s),Ie=r(s),N.l(s),ae=r(s),rs=m(s,"P",{"data-svelte-h":!0}),h(rs)!=="svelte-17otmwf"&&(rs.innerHTML=Xl),Re=r(s),d(cs.$$.fragment,s),Ze=r(s),Ms=m(s,"P",{"data-svelte-h":!0}),h(Ms)!=="svelte-108r3z"&&(Ms.textContent=zl),Ne=r(s),d(os.$$.fragment,s),Ae=r(s),d(us.$$.fragment,s),Qe=r(s),ys=m(s,"P",{"data-svelte-h":!0}),h(ys)!=="svelte-1fuy27o"&&(ys.innerHTML=Vl),Ge=r(s),d(E.$$.fragment,s),ve=r(s),ms=m(s,"P",{"data-svelte-h":!0}),h(ms)!=="svelte-u24s3p"&&(ms.innerHTML=Wl),Be=r(s),d(js.$$.fragment,s),Xe=r(s),ds=m(s,"P",{"data-svelte-h":!0}),h(ds)!=="svelte-fyhuw7"&&(ds.textContent=El),ze=r(s),d(Js.$$.fragment,s),Ve=r(s),fs=m(s,"P",{"data-svelte-h":!0}),h(fs)!=="svelte-oi73g0"&&(fs.innerHTML=Hl),We=r(s),d(hs.$$.fragment,s),Ee=r(s),Us=m(s,"P",{"data-svelte-h":!0}),h(Us)!=="svelte-f2h3e9"&&(Us.innerHTML=Sl),He=r(s),bs=m(s,"P",{"data-svelte-h":!0}),h(bs)!=="svelte-15t697f"&&(bs.textContent=Yl),Se=r(s),Ts=m(s,"P",{"data-svelte-h":!0}),h(Ts)!=="svelte-1ezbpr6"&&(Ts.innerHTML=Fl),Ye=r(s),ws=m(s,"P",{"data-svelte-h":!0}),h(ws)!=="svelte-1h246f5"&&(ws.textContent=Dl),Fe=r(s),ks=m(s,"P",{"data-svelte-h":!0}),h(ks)!=="svelte-1dqlxg0"&&(ks.innerHTML=ql),De=r(s),$s=m(s,"P",{"data-svelte-h":!0}),h($s)!=="svelte-1rx0s16"&&($s.innerHTML=Ll),qe=r(s),d(_s.$$.fragment,s),Le=r(s),Cs=m(s,"P",{"data-svelte-h":!0}),h(Cs)!=="svelte-teohu1"&&(Cs.innerHTML=Pl),Pe=r(s),gs=m(s,"P",{"data-svelte-h":!0}),h(gs)!=="svelte-dwfma7"&&(gs.innerHTML=Kl),Ke=r(s),d(xs.$$.fragment,s),Oe=r(s),Is=m(s,"P",{"data-svelte-h":!0}),h(Is)!=="svelte-nxfcwb"&&(Is.innerHTML=Ol),sl=r(s),Rs=m(s,"P",{"data-svelte-h":!0}),h(Rs)!=="svelte-flbh3n"&&(Rs.innerHTML=st),el=r(s),Zs=m(s,"P",{"data-svelte-h":!0}),h(Zs)!=="svelte-1wkepm8"&&(Zs.innerHTML=et),ll=r(s),d(Ns.$$.fragment,s),tl=r(s),As=m(s,"P",{"data-svelte-h":!0}),h(As)!=="svelte-b5c00r"&&(As.textContent=lt),nl=r(s),d(Qs.$$.fragment,s),al=r(s),Gs=m(s,"P",{"data-svelte-h":!0}),h(Gs)!=="svelte-194dkwz"&&(Gs.innerHTML=tt),pl=r(s),vs=m(s,"P",{"data-svelte-h":!0}),h(vs)!=="svelte-1yulgc2"&&(vs.innerHTML=nt),il=r(s),Bs=m(s,"P",{"data-svelte-h":!0}),h(Bs)!=="svelte-1aq5zsd"&&(Bs.innerHTML=at),rl=r(s),d(Xs.$$.fragment,s),cl=r(s),d(zs.$$.fragment,s),Ml=r(s),z.l(s),pe=r(s),Vs=m(s,"P",{"data-svelte-h":!0}),h(Vs)!=="svelte-j66kwv"&&(Vs.innerHTML=pt),ol=r(s),Q.l(s),ie=r(s),Ws=m(s,"P",{"data-svelte-h":!0}),h(Ws)!=="svelte-sxp3sh"&&(Ws.textContent=it),ul=r(s),d(Es.$$.fragment,s),yl=r(s),d(Hs.$$.fragment,s),ml=r(s),Ss=m(s,"P",{"data-svelte-h":!0}),h(Ss)!=="svelte-omjm79"&&(Ss.innerHTML=rt),jl=r(s),d(Ys.$$.fragment,s),dl=r(s),v.l(s),re=r(s),d(H.$$.fragment,s),Jl=r(s),$&&$.l(s),ce=r(s),d(Fs.$$.fragment,s),fl=r(s),Me=m(s,"P",{}),Ct(Me).forEach(n),this.h()},h(){gt(l,"name","hf:doc:metadata"),gt(l,"content",rn)},m(s,e){Gt(document.head,l),a(s,p,e),a(s,t,e),a(s,c,e),J(b,s,e),a(s,u,e),J(k,s,e),a(s,X,e),J(T,s,e),a(s,B,e),Ds[_].m(s,e),a(s,le,e),qs[g].m(s,e),a(s,te,e),a(s,S,e),a(s,ue,e),a(s,Y,e),a(s,ye,e),J(F,s,e),a(s,me,e),Ls[I].m(s,e),a(s,ne,e),a(s,D,e),a(s,je,e),a(s,q,e),a(s,de,e),J(V,s,e),a(s,Je,e),J(L,s,e),a(s,fe,e),J(P,s,e),a(s,he,e),a(s,K,e),a(s,Ue,e),a(s,O,e),a(s,be,e),a(s,ss,e),a(s,Te,e),J(es,s,e),a(s,we,e),J(ls,s,e),a(s,ke,e),a(s,ts,e),a(s,$e,e),J(ns,s,e),a(s,_e,e),J(as,s,e),a(s,Ce,e),a(s,ps,e),a(s,ge,e),J(W,s,e),a(s,xe,e),J(is,s,e),a(s,Ie,e),Ps[Z].m(s,e),a(s,ae,e),a(s,rs,e),a(s,Re,e),J(cs,s,e),a(s,Ze,e),a(s,Ms,e),a(s,Ne,e),J(os,s,e),a(s,Ae,e),J(us,s,e),a(s,Qe,e),a(s,ys,e),a(s,Ge,e),J(E,s,e),a(s,ve,e),a(s,ms,e),a(s,Be,e),J(js,s,e),a(s,Xe,e),a(s,ds,e),a(s,ze,e),J(Js,s,e),a(s,Ve,e),a(s,fs,e),a(s,We,e),J(hs,s,e),a(s,Ee,e),a(s,Us,e),a(s,He,e),a(s,bs,e),a(s,Se,e),a(s,Ts,e),a(s,Ye,e),a(s,ws,e),a(s,Fe,e),a(s,ks,e),a(s,De,e),a(s,$s,e),a(s,qe,e),J(_s,s,e),a(s,Le,e),a(s,Cs,e),a(s,Pe,e),a(s,gs,e),a(s,Ke,e),J(xs,s,e),a(s,Oe,e),a(s,Is,e),a(s,sl,e),a(s,Rs,e),a(s,el,e),a(s,Zs,e),a(s,ll,e),J(Ns,s,e),a(s,tl,e),a(s,As,e),a(s,nl,e),J(Qs,s,e),a(s,al,e),a(s,Gs,e),a(s,pl,e),a(s,vs,e),a(s,il,e),a(s,Bs,e),a(s,rl,e),J(Xs,s,e),a(s,cl,e),J(zs,s,e),a(s,Ml,e),z.m(s,e),a(s,pe,e),a(s,Vs,e),a(s,ol,e),Ks[A].m(s,e),a(s,ie,e),a(s,Ws,e),a(s,ul,e),J(Es,s,e),a(s,yl,e),J(Hs,s,e),a(s,ml,e),a(s,Ss,e),a(s,jl,e),J(Ys,s,e),a(s,dl,e),Os[G].m(s,e),a(s,re,e),J(H,s,e),a(s,Jl,e),$&&$.m(s,e),a(s,ce,e),J(Fs,s,e),a(s,fl,e),a(s,Me,e),hl=!0},p(s,[e]){const Tt={};e&1&&(Tt.fw=s[0]),b.$set(Tt);let wl=_;_=Mt(s),_!==wl&&(ee(),o(Ds[wl],1,1,()=>{Ds[wl]=null}),se(),C=Ds[_],C||(C=Ds[_]=ct[_](s),C.c()),M(C,1),C.m(le.parentNode,le));let kl=g;g=ut(s),g!==kl&&(ee(),o(qs[kl],1,1,()=>{qs[kl]=null}),se(),x=qs[g],x||(x=qs[g]=ot[g](s),x.c()),M(x,1),x.m(te.parentNode,te));let $l=I;I=mt(s),I!==$l&&(ee(),o(Ls[$l],1,1,()=>{Ls[$l]=null}),se(),R=Ls[I],R||(R=Ls[I]=yt[I](s),R.c()),M(R,1),R.m(ne.parentNode,ne));const wt={};e&2&&(wt.$$scope={dirty:e,ctx:s}),V.$set(wt);const kt={};e&2&&(kt.$$scope={dirty:e,ctx:s}),W.$set(kt);let _l=Z;Z=dt(s),Z!==_l&&(ee(),o(Ps[_l],1,1,()=>{Ps[_l]=null}),se(),N=Ps[Z],N||(N=Ps[Z]=jt[Z](s),N.c()),M(N,1),N.m(ae.parentNode,ae));const $t={};e&2&&($t.$$scope={dirty:e,ctx:s}),E.$set($t),Ul!==(Ul=Jt(s))&&(z.d(1),z=Ul(s),z&&(z.c(),z.m(pe.parentNode,pe)));let Cl=A;A=ht(s),A!==Cl&&(ee(),o(Ks[Cl],1,1,()=>{Ks[Cl]=null}),se(),Q=Ks[A],Q||(Q=Ks[A]=ft[A](s),Q.c()),M(Q,1),Q.m(ie.parentNode,ie));let gl=G;G=bt(s),G!==gl&&(ee(),o(Os[gl],1,1,()=>{Os[gl]=null}),se(),v=Os[G],v||(v=Os[G]=Ut[G](s),v.c()),M(v,1),v.m(re.parentNode,re));const _t={};e&2&&(_t.$$scope={dirty:e,ctx:s}),H.$set(_t),s[0]==="tf"?$?e&1&&M($,1):($=xt(),$.c(),M($,1),$.m(ce.parentNode,ce)):$&&(ee(),o($,1,1,()=>{$=null}),se())},i(s){hl||(M(b.$$.fragment,s),M(k.$$.fragment,s),M(T.$$.fragment,s),M(C),M(x),M(F.$$.fragment,s),M(R),M(V.$$.fragment,s),M(L.$$.fragment,s),M(P.$$.fragment,s),M(es.$$.fragment,s),M(ls.$$.fragment,s),M(ns.$$.fragment,s),M(as.$$.fragment,s),M(W.$$.fragment,s),M(is.$$.fragment,s),M(N),M(cs.$$.fragment,s),M(os.$$.fragment,s),M(us.$$.fragment,s),M(E.$$.fragment,s),M(js.$$.fragment,s),M(Js.$$.fragment,s),M(hs.$$.fragment,s),M(_s.$$.fragment,s),M(xs.$$.fragment,s),M(Ns.$$.fragment,s),M(Qs.$$.fragment,s),M(Xs.$$.fragment,s),M(zs.$$.fragment,s),M(Q),M(Es.$$.fragment,s),M(Hs.$$.fragment,s),M(Ys.$$.fragment,s),M(v),M(H.$$.fragment,s),M($),M(Fs.$$.fragment,s),hl=!0)},o(s){o(b.$$.fragment,s),o(k.$$.fragment,s),o(T.$$.fragment,s),o(C),o(x),o(F.$$.fragment,s),o(R),o(V.$$.fragment,s),o(L.$$.fragment,s),o(P.$$.fragment,s),o(es.$$.fragment,s),o(ls.$$.fragment,s),o(ns.$$.fragment,s),o(as.$$.fragment,s),o(W.$$.fragment,s),o(is.$$.fragment,s),o(N),o(cs.$$.fragment,s),o(os.$$.fragment,s),o(us.$$.fragment,s),o(E.$$.fragment,s),o(js.$$.fragment,s),o(Js.$$.fragment,s),o(hs.$$.fragment,s),o(_s.$$.fragment,s),o(xs.$$.fragment,s),o(Ns.$$.fragment,s),o(Qs.$$.fragment,s),o(Xs.$$.fragment,s),o(zs.$$.fragment,s),o(Q),o(Es.$$.fragment,s),o(Hs.$$.fragment,s),o(Ys.$$.fragment,s),o(v),o(H.$$.fragment,s),o($),o(Fs.$$.fragment,s),hl=!1},d(s){s&&(n(p),n(t),n(c),n(u),n(X),n(B),n(le),n(te),n(S),n(ue),n(Y),n(ye),n(me),n(ne),n(D),n(je),n(q),n(de),n(Je),n(fe),n(he),n(K),n(Ue),n(O),n(be),n(ss),n(Te),n(we),n(ke),n(ts),n($e),n(_e),n(Ce),n(ps),n(ge),n(xe),n(Ie),n(ae),n(rs),n(Re),n(Ze),n(Ms),n(Ne),n(Ae),n(Qe),n(ys),n(Ge),n(ve),n(ms),n(Be),n(Xe),n(ds),n(ze),n(Ve),n(fs),n(We),n(Ee),n(Us),n(He),n(bs),n(Se),n(Ts),n(Ye),n(ws),n(Fe),n(ks),n(De),n($s),n(qe),n(Le),n(Cs),n(Pe),n(gs),n(Ke),n(Oe),n(Is),n(sl),n(Rs),n(el),n(Zs),n(ll),n(tl),n(As),n(nl),n(al),n(Gs),n(pl),n(vs),n(il),n(Bs),n(rl),n(cl),n(Ml),n(pe),n(Vs),n(ol),n(ie),n(Ws),n(ul),n(yl),n(ml),n(Ss),n(jl),n(dl),n(re),n(Jl),n(ce),n(fl),n(Me)),n(l),f(b,s),f(k,s),f(T,s),Ds[_].d(s),qs[g].d(s),f(F,s),Ls[I].d(s),f(V,s),f(L,s),f(P,s),f(es,s),f(ls,s),f(ns,s),f(as,s),f(W,s),f(is,s),Ps[Z].d(s),f(cs,s),f(os,s),f(us,s),f(E,s),f(js,s),f(Js,s),f(hs,s),f(_s,s),f(xs,s),f(Ns,s),f(Qs,s),f(Xs,s),f(zs,s),z.d(s),Ks[A].d(s),f(Es,s),f(Hs,s),f(Ys,s),Os[G].d(s),f(H,s),$&&$.d(s),f(Fs,s)}}}const rn='{"title":"การประมวลผลข้อมูล","local":"การประมวลผลขอมล","sections":[{"title":"วิธีการโหลดชุดข้อมูลจาก Hub","local":"วธการโหลดชดขอมลจาก-hub","sections":[],"depth":3},{"title":"การประมวลผลชุดข้อมูล","local":"การประมวลผลชดขอมล","sections":[],"depth":3},{"title":"Dynamic padding (การเติมแบบพลวัต)","local":"dynamic-padding-การเตมแบบพลวต","sections":[],"depth":3}],"depth":1}';function cn(U,l,p){let t="pt";return Zt(()=>{const c=new URLSearchParams(window.location.search);p(0,t=c.get("fw")||"pt")}),[t]}class fn extends Nt{constructor(l){super(),At(this,l,cn,pn,Rt,{})}}export{fn as component};
