Buckets:

rtrm's picture
download
raw
83.9 kB
import{s as $t,o as It}from"../chunks/scheduler.505acc25.js";import{S as Rt,i as Zt,e as u,s as p,c as d,h as Nt,a as m,d as n,b as i,f as Ct,g as J,j,k as Ml,l as Qt,m as a,n as h,o as y,q as sl,t as o,p as U,r as ll}from"../chunks/index.17dd9071.js";import{C as At,H as Te,E as Gt}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.65fa0d06.js";import{Y as yl}from"../chunks/Youtube.793fe4bf.js";import{C as w}from"../chunks/CodeBlock.6dcd2368.js";import{C as xt}from"../chunks/CourseFloatingBanner.9496b79e.js";import{F as vt}from"../chunks/FrameworkSwitchCourse.7aa4b983.js";function Bt(b){let t,r;return t=new xt({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(){d(t.$$.fragment)},l(e){J(t.$$.fragment,e)},m(e,M){h(t,e,M),r=!0},i(e){r||(o(t.$$.fragment,e),r=!0)},o(e){y(t.$$.fragment,e),r=!1},d(e){U(t,e)}}}function Xt(b){let t,r;return t=new xt({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(){d(t.$$.fragment)},l(e){J(t.$$.fragment,e)},m(e,M){h(t,e,M),r=!0},i(e){r||(o(t.$$.fragment,e),r=!0)},o(e){y(t.$$.fragment,e),r=!1},d(e){U(t,e)}}}function zt(b){let t,r='เราจะยังคงใช้ตัวอย่างจากบทที่แล้ว <a href="/course/chapter2">previous chapter</a> โค้ดข้างล่างนี้คือวิธีการเทรนโมเดลสำหรับจำแนกลำดับ (sequence classifier) โดยใช้ข้อมูล 1 batch ใน TensorFlow:',e,M,f;return M=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(){t=u("p"),t.innerHTML=r,e=p(),d(M.$$.fragment)},l(c){t=m(c,"P",{"data-svelte-h":!0}),j(t)!=="svelte-1mvk20o"&&(t.innerHTML=r),e=i(c),J(M.$$.fragment,c)},m(c,k){a(c,t,k),a(c,e,k),h(M,c,k),f=!0},i(c){f||(o(M.$$.fragment,c),f=!0)},o(c){y(M.$$.fragment,c),f=!1},d(c){c&&(n(t),n(e)),U(M,c)}}}function Vt(b){let t,r='เราจะยังคงใช้ตัวอย่างจากบทที่แล้ว <a href="/course/chapter2">previous chapter</a> โค้ดข้างล่างนี้คือวิธีการเทรนโมเดลสำหรับจำแนกลำดับ (sequence classifier) โดยใช้ข้อมูล 1 batch ใน Pytorch:',e,M,f;return M=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(){t=u("p"),t.innerHTML=r,e=p(),d(M.$$.fragment)},l(c){t=m(c,"P",{"data-svelte-h":!0}),j(t)!=="svelte-12fav1s"&&(t.innerHTML=r),e=i(c),J(M.$$.fragment,c)},m(c,k){a(c,t,k),a(c,e,k),h(M,c,k),f=!0},i(c){f||(o(M.$$.fragment,c),f=!0)},o(c){y(M.$$.fragment,c),f=!1},d(c){c&&(n(t),n(e)),U(M,c)}}}function Wt(b){let t,r;return t=new yl({props:{id:"W_gMJF0xomE"}}),{c(){d(t.$$.fragment)},l(e){J(t.$$.fragment,e)},m(e,M){h(t,e,M),r=!0},i(e){r||(o(t.$$.fragment,e),r=!0)},o(e){y(t.$$.fragment,e),r=!1},d(e){U(t,e)}}}function Et(b){let t,r;return t=new yl({props:{id:"_BZearw7f0w"}}),{c(){d(t.$$.fragment)},l(e){J(t.$$.fragment,e)},m(e,M){h(t,e,M),r=!0},i(e){r||(o(t.$$.fragment,e),r=!0)},o(e){y(t.$$.fragment,e),r=!1},d(e){U(t,e)}}}function Ht(b){let t,r;return t=new yl({props:{id:"P-rZWqcB6CE"}}),{c(){d(t.$$.fragment)},l(e){J(t.$$.fragment,e)},m(e,M){h(t,e,M),r=!0},i(e){r||(o(t.$$.fragment,e),r=!0)},o(e){y(t.$$.fragment,e),r=!1},d(e){U(t,e)}}}function St(b){let t,r;return t=new yl({props:{id:"0u3ioSwev3s"}}),{c(){d(t.$$.fragment)},l(e){J(t.$$.fragment,e)},m(e,M){h(t,e,M),r=!0},i(e){r||(o(t.$$.fragment,e),r=!0)},o(e){y(t.$$.fragment,e),r=!1},d(e){U(t,e)}}}function Yt(b){let t,r="ฟังก์ชั่นที่ทำหน้าที่เก็บข้อมูลตัวอย่างเข้ามาทำเป็น batch เรียกว่า <em>collate function</em> ซึ่งมีการตั้งค่าเริ่มต้นเป็นฟังก์ชั่นที่ทำหน้าที่เพียงแปลงข้อมูลตัวอย่างของคุณให้เป็น tf.Tensor และนำมา concatenate ต่อกัน (แบบ recursive ถ้าหากคุณป้อนข้อมูลเป็น lists, tuples หรือ dictionaries) ซึ่งในกรณีตัวอย่างของเรานี้จะทำแบบนั้นไม่ได้ เนื่องจากข้อมูลป้อนเข้าแต่ละตัวของเรามีขนาดไม่เท่ากัน ซึ่งเราก็ได้จงใจที่ยังไม่ทำการเติม (padding) มาจนถึงตอนนี้ เพื่อที่จะทำการเติมเท่าที่จำเป็นต้องทำในแต่ละ batch เพื่อหลีกเลี่ยงการเติมข้อมูลให้มีความยาวเกินจำเป็น ซึ่งการทำแบบนี้จะช่วยให้การ training เร็วขึ้นค่อนข้างมาก แต่ควรระวังไว้ว่าถ้าคุณ train บน TPU การทำแบบนี้อาจสร้างปัญหาได้ เนื่องจาก TPUs นั้นชอบข้อมูลที่มี shape คงที่มากกว่า แม้ว่าจะต้องเติมข้อมูลให้ยาวมากก็ตาม";return{c(){t=u("p"),t.innerHTML=r},l(e){t=m(e,"P",{"data-svelte-h":!0}),j(t)!=="svelte-1nsikbe"&&(t.innerHTML=r)},m(e,M){a(e,t,M)},d(e){e&&n(t)}}}function Ft(b){let t,r="ฟังก์ชั่นที่ทำหน้าที่เก็บข้อมูลตัวอย่างเข้ามาทำเป็น batch เรียกว่า <em>collate function</em> ซึ่งเป็นอากิวเมนต์ที่คุณสามารถใส่เพิ่มได้เมื่อคุณสร้าง <code>DataLoader</code> โดยการตั้งค่าเริ่มต้นจะเป็นฟังก์ชั่นที่ทำหน้าที่เพียงแปลงข้อมูลตัวอย่างของคุณให้เป็น Pytorch tensors และนำมา concatenate ต่อกัน (แบบ recursive ถ้าหากคุณป้อนข้อมูลเป็น lists, tuples หรือ dictionaries) ซึ่งในกรณีตัวอย่างของเรานี้จะทำแบบนั้นไม่ได้ เนื่องจากข้อมูลป้อนเข้าแต่ละตัวของเรามีขนาดไม่เท่ากัน ซึ่งเราก็ได้จงใจที่ยังไม่ทำการเติม (padding) มาจนถึงตอนนี้ เพื่อที่จะทำการเติมเท่าที่จำเป็นต้องทำในแต่ละ batch เพื่อหลีกเลี่ยงการเติมข้อมูลให้มีความยาวเกินจำเป็น ซึ่งการทำแบบนี้จะช่วยให้การ training เร็วขึ้นค่อนข้างมาก แต่ควรระวังไว้ว่าถ้าคุณ train บน TPU การทำแบบนี้อาจสร้างปัญหาได้ เนื่องจาก TPUs นั้นชอบข้อมูลที่มี shape คงที่มากกว่า แม้ว่าจะต้องเติมข้อมูลให้ยาวมากก็ตาม";return{c(){t=u("p"),t.innerHTML=r},l(e){t=m(e,"P",{"data-svelte-h":!0}),j(t)!=="svelte-1lqxn3g"&&(t.innerHTML=r)},m(e,M){a(e,t,M)},d(e){e&&n(t)}}}function Dt(b){let t,r;return t=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(){d(t.$$.fragment)},l(e){J(t.$$.fragment,e)},m(e,M){h(t,e,M),r=!0},i(e){r||(o(t.$$.fragment,e),r=!0)},o(e){y(t.$$.fragment,e),r=!1},d(e){U(t,e)}}}function qt(b){let t,r;return t=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(){d(t.$$.fragment)},l(e){J(t.$$.fragment,e)},m(e,M){h(t,e,M),r=!0},i(e){r||(o(t.$$.fragment,e),r=!0)},o(e){y(t.$$.fragment,e),r=!1},d(e){U(t,e)}}}function Lt(b){let t,r,e,M="ผลลัพธ์ออกมาดูดีเลย! ตอนนี้เราก็จัดการข้อมูลจาก raw text ให้เป็นชุดของ batch ที่โมเดลทำความเข้าใจได้แล้ว เราพร้อมที่จะ fine-tune แล้ว!",f;return t=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(){d(t.$$.fragment),r=p(),e=u("p"),e.textContent=M},l(c){J(t.$$.fragment,c),r=i(c),e=m(c,"P",{"data-svelte-h":!0}),j(e)!=="svelte-117lc0s"&&(e.textContent=M)},m(c,k){h(t,c,k),a(c,r,k),a(c,e,k),f=!0},i(c){f||(o(t.$$.fragment,c),f=!0)},o(c){y(t.$$.fragment,c),f=!1},d(c){c&&(n(r),n(e)),U(t,c)}}}function Pt(b){let t,r;return t=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(){d(t.$$.fragment)},l(e){J(t.$$.fragment,e)},m(e,M){h(t,e,M),r=!0},i(e){r||(o(t.$$.fragment,e),r=!0)},o(e){y(t.$$.fragment,e),r=!1},d(e){U(t,e)}}}function gt(b){let t,r="ตอนนี้เราก็ได้ 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 ของเรากันเลย!",e,M,f,c,k="เสร็จเรียบร้อย! เราสามารถนำ datasets พวกนี้ไปใช้ในบทเรียนต่อไปของเราได้เลย โดยการ training นั้นค่อนข้างตรงไปตรงมาไม่ซับซ้อนหลังจากที่เราทำงานอย่างหนักไปกกับการประมวลผลข้อมูลแล้ว",X;return M=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(){t=u("p"),t.innerHTML=r,e=p(),d(M.$$.fragment),f=p(),c=u("p"),c.textContent=k},l(T){t=m(T,"P",{"data-svelte-h":!0}),j(t)!=="svelte-bzg3o0"&&(t.innerHTML=r),e=i(T),J(M.$$.fragment,T),f=i(T),c=m(T,"P",{"data-svelte-h":!0}),j(c)!=="svelte-zai6vo"&&(c.textContent=k)},m(T,B){a(T,t,B),a(T,e,B),h(M,T,B),a(T,f,B),a(T,c,B),X=!0},i(T){X||(o(M.$$.fragment,T),X=!0)},o(T){y(M.$$.fragment,T),X=!1},d(T){T&&(n(t),n(e),n(f),n(c)),U(M,T)}}}function Kt(b){let t,r,e,M,f,c,k,X,T,B,C,g,el,x,$,tl,S,$e="เป็นที่แน่นอนว่า ถ้าเราเทรนโมเดลโดยใช้ข้อมูลเพียง 2 ประโยคก็คงไม่ได้ผลลัพธ์ที่ดีเท่าไรนัก ถ้าคุณต้องการผลลัพธ์ที่ดีขึ้น คุณจะต้องเตรียมชุดข้อมูล (dataset) ที่มีขนาดใหญ่ขึ้น",ul,Y,Ie='ใน 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) หรือไม่ (ประโยคคู่นี้มีความหมายเดียวกันหรือไม่) เหตุผลที่เราเลือกชุดข้อมูลนี้ เนื่องจากมันเป็นชุดข้อมูลที่มีขนาดเล็ก จึงง่ายต่อการนำไปทดลองเทรนโมเดล',ml,F,jl,I,R,nl,D,Re='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 งาน',dl,q,Ze="ไลบรารี่ 🤗 Datasets library มีคำสั่งที่ใช้งานได้ง่ายมากในการดาวโหลดและ cache ชุดข้อมูลที่อยู่บน Hub เราสามารถดาวโหลดชุดข้อมูล MRPC ได้ดังนี้:",Jl,V,Ne="<p>⚠️ <strong>คำเตือน</strong> ตรวจสอบให้แน่ใจว่า <code>datasets</code> ได้ถูกติดตั้งโดยการรัน <code>pip install datasets</code> ก่อน จากนั้นโหลดชุดข้อมูล MRPC และพิมพ์เพื่อดูว่ามีอะไรบ้าง</p>",hl,L,Ul,P,bl,K,Qe="คุณจะเห็นว่า เราจะได้อ็อบเจกต์ <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 คู่)",fl,O,Ae="คำสั่งนี้จะดาวโหลดและเก็บ cache ของชุดข้อมูลไว้ โดยค่าเริ่มต้น (by default) จะเก็บ cache ไว้ที่ <em>~/.cache/huggingface/dataset</em> โดยใน Chapter 2 เราได้บอกวิธีไว้แล้วว่า คุณสามารถเปลี่ยนโฟลเดอร์ที่จะเก็บ cache ได้โดยการตั้งค่าตัวแปร environment ที่ชื่อ <code>HF_HOME</code>",Tl,ss,Ge="เราสามารถเข้าถึงข้อมูลประโยคแต่ละคู่ในอ็อบเจกต์ <code>raw_datasets</code> ของเราได้โดยการใช้ indexing แบบเดียวกับที่ใช้กับ dictionary:",wl,ls,kl,es,_l,ts,ve="เราจะเห็นได้ว่าข้อมูล labels นั้นอยู่ในรูป integers อยู่แล้ว จึงไม่ได้ต้องทำการประมวลผลใด ๆ เพิ่มเติมกับ label ถ้าอยากรู้ว่า integer ตัวไหนตรงกับ label ตัวไหน เราสามารถเข้าไปดูได้ที่ <code>features</code> ของอ็อพเจกต์ <code>raw_train_dataset</code> ของเรา ซึ่งจะบอกชนิดของข้อมูลในแต่ละคอลัมน์:",Cl,ns,gl,as,xl,ps,Be="เราจะเห็นเบื้องหลังของ <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>",$l,W,Xe="<p>✏️ <strong>ลองเลย!</strong> ลองดูที่ element 15 ของ training set และ element 87 ของ validation set ว่ามี label เป็นอะไร?</p>",Il,is,Rl,Z,N,al,rs,ze='ในขั้นตอนการประมวลผลชุดข้อมูล เราจะต้องแปลงตัวอักษรให้กลายเป็นตัวเลข เพื่อให้โมเดลสามารถทำความเข้าใจได้ ดังที่คุณได้เห็นแล้วใน <a href="/course/chapter2">previous chapter</a> ขั้นตอนการแปลงนี้สามารถทำได้โดยใช้ tokenizer โดยเราสามารถป้อนข้อมูลเข้า tokenizer เพียงแค่หนึ่งประโยค หรือจะป้อนข้อมูลเป็น list ของประโยคทั้งหมดเลยก็ได้ เราสามารถ tokenize ทั้งประโยคแรกและประโยคที่สองในแต่ละคู่ประโยคทุกคู่ได้ดังนี้:',Zl,cs,Nl,Ms,Ve="อย่างไรก็ตาม การส่งเพียงข้อมูลสองลำดับ (sequences) ในลักษณะนี้เข้าไปยังไม่เพียงพอที่จะทำให้โมเดลสามารถเรียนรู้และทำนายว่าประโยคทั้งสองนี้เป็นประโยคที่เกิดจากการถอดความ (paraphrase) หรือไม่ เราจะต้องจัดการให้ประโยคทั้งสองเป็นคู่กันก่อนแล้วค่อยทำการประมวลผลให้เหมาะสม ซึ่งโชคดีมากที่ tokenizer สามารถรับข้อมูลคู่ของลำดับแล้วเตรียมข้อมูลให้อยู่ในรูปแบบที่เหมาะสมกับการป้อนเข้าโมเดล BERT ของเรา:",Ql,os,Al,ys,Gl,us,We='เราได้อธิบายเกี่ยวกับ 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 ที่เป็นประโยคแรก และส่วนไหนที่เป็นประโยคที่สอง',vl,E,Ee="<p>✏️ <strong>ลองเลย!</strong> ลองเลือก element 15 ของ training set มาลอง tokenize ประโยคทั้งสองแยกกันทีละประโยค และลอง tokenize เป็นคู่มาเทียบกันดู การ tokenize สองแบบนี้ให้ผลลัพธ์ที่ต่างกันอย่างไร?</p>",Bl,ms,He="ถ้าเรา decode ข้อมูล IDs ที่อยู่ใน <code>input_ids</code> กลับไปเป็นคำ:",Xl,js,zl,ds,Se="เราจะได้ผลลัพธ์:",Vl,Js,Wl,hs,Ye="เราจะเห็นได้ว่าถ้าเราจะป้อนข้อมูลเข้าไปทีละสองประโยค โมเดลจะต้องการรับข้อมูลในรูปของ <code>[CLS] ประโยคที่หนึ่ง [SEP] ประโยคที่สอง [SEP]</code> ซึ่งถ้าเราไปเรียงให้ตรงกับ <code>token_type_ids</code> เราจะได้:",El,Us,Hl,bs,Fe="คุณจะเห็นได้ว่า input ในส่วนที่ตรงกับ <code>[CLS] ประโยคที่หนึ่ง [SEP]</code> จะมี token type ID มีค่าเป็น 0 ทั้งหมด ในขณะที่ input ส่วนที่เหลือซึ่งตรงกับ <code>ประโยคที่สอง [SEP]</code> จะมี token type ID มีค่าเป็น 1 ทั้งหมด",Sl,fs,De="ควรระวังไว้ว่า ถ้าคุณเลือก checkpoint อื่น ผลลัพธ์จากการ tokenize อาจจะไม่มี token_type_ids อยู่ด้วยก็ได้ (ยกตัวอย่างเช่น ถ้าคุณเลือกโมเดล DistilBERT ผลลัพธ์จากการ tokenize จะไม่มี token_type_ids) การ tokenize จะให้ token_type_ids ออกมาก็ต่อเมื่อโมเดลนั้นรู้ว่าต้องจัดการกับมันอย่างไร เพราะโมเดลเคยเห็นข้อมูลนี้มาแล้วในช่วง pretraining",Yl,Ts,qe='ในตัวอย่างนี้ โมเดล BERT ผ่านการ pretrain มาด้วย token type IDs แล้ว และนอกเหนือไปจากเป้าหมายในการเทรนให้โมเดลสามารถเติมคำที่ถูกปิดไว้ (masked langauge modeling objective) ที่เราได้คุยกันใน <a href="/course/chapter1">Chapter 1</a> โมเดล BERT ยังมีอีกเป้าหมายหนึ่งที่เรียกว่า <em>next sentence prediction</em> (การทำนายประโยคถัดไป) โดยมีเป้าหมายในการทำแบบจำลองความสัมพันธ์ระหว่างคู่ของประโยคต่าง ๆ',Fl,ws,Le="ในการทำให้โมเดลสามารถบรรลุเป้าหมายการทำนายประโยคถัดไป ได้มีการป้อนคู่ของประโยคที่ถูกปิดไว้อย่างสุ่มจำนวนมาก (pairs of sentences with randomly masked tokens) เข้าไปในโมเดล แล้วให้โมเดลทำนายว่าประโยคที่สองเป็นประโยคที่ตามหลังประโยคแรกหรือไม่ เพื่อไม่ให้โมเดลเรียนรู้เฉพาะประโยคที่เรียงตามกันเพียงอย่างเดียว จึงมีการแบ่งข้อมูลให้ครึ่งหนึ่งของคู่ประโยคทั้งหมด เป็นประโยคที่เรียงตามกันจริง ๆ เหมือนในเอกสารต้นฉบับ และอีกครึ่งหนึ่งเป็นคู่ประโยคที่เกิดจากสองประโยคที่มาจากเอกสารคนละชิ้นกัน",Dl,ks,Pe="โดยทั่วไปแล้ว คุณไม่ต้องกังวลว่าจะมีข้อมูล <code>token_type_ids</code> ในผลลัพธ์จากการ toknize หรือไม่ ตราบเท่าที่คุณเลือกให้ tokenizer และโมเดลใช้ checkpoint ตัวเดียวกัน เพราะถ้า tokenizer รู้ว่าต้องป้อนข้อมูลอะไรเข้าโมเดล ก็จะไม่เกิดปัญหาใด ๆ",ql,_s,Ke='ตอนนี้เราก็ได้เห็นแล้วว่า 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 ได้ดังนี้:',Ll,Cs,Pl,gs,Oe='ซึ่งการเขียนคำสั่งแบบนี้ก็ได้ผลลัพธ์ที่ถูกต้อง แต่จะมีจุดด้อยคือการทำแบบนี้จะได้ผลลัพธ์ออกมาเป็น 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 ได้)',Kl,xs,st='เพื่อให้ข้อมูลของเรายังเป็นข้อมูลชนิด 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 ข้อมูลของเรากันก่อน:',Ol,$s,se,Is,lt='ฟังก์ชั่นนี้จะรับ 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 ซึ่งจะทำงานได้รวดเร็วมากหากคุณป้อนข้อมูลเข้าไปจำนวนมากพร้อม ๆ กัน',le,Rs,et="ควรสังเกตว่าเรายังไม่ได้ใส่อากิวเมนต์ <code>padding</code> เข้ามาในฟังก์ชั่น tokenize ของเราตอนนี้ เนื่องจากการเติม (padding) ข้อมูลทุก ๆ ตัวอย่างให้มีความยาวเท่ากับประโยคที่มีความยาวมากสุดนั้นไม่ค่อยมีประสิทธิภาพเท่าไรนัก วิธีการที่ดีกว่าคือให้เราเติม (pad) ข้อมูลเมื่อเรากำลังสร้าง batch ขึ้นมา ซึ่งเราก็จะต้องเติมให้ข้อมูลมีความยาวเท่ากับประโยคที่ยาวที่สุดใน batch นั้น ๆ ก็พอ ไม่จำเป็นต้องเติมให้ยาวเท่ากับประโยคที่ยาวที่สุดในทั้งชุดข้อมูล การทำเช่นนี้จะช่วยประหยัดเวลาและพลังในการประมวลผลได้อย่างมาก แม้ input ของเราจะมีความยาวที่แตกต่างกันมากก็ตาม!",ee,Zs,tt="ต่อไปนี้คือวิธีการใช้ฟังก์ชั่น tokenize ให้ทำงานกับข้อมูลใน dataset ทุกชุดของเราในคราวเดียว โดยเราจะใส่ <code>batched=True</code> ตอนที่ call เมธอด <code>map</code> เพื่อให้ฟังก์ชั่นทำงานกับ elements หลาย ๆ ตัวใน dataset ของเราในคราวเดียว (ไม่ได้ทำทีละ element แยกกัน) ซึ่งการทำเช่นนี้จะช่วยให้เราประมวลผลข้อมูลได้เร็วขึ้นมาก",te,Ns,ne,Qs,nt="ไลบรารี่ 🤗 Datasets จะทำการประมวลผลนี้โดยการเพิ่ม fields ใหม่เข้าไปยัง datasets ของเรา โดยเพิ่ม field ให้กับแต่ละ key ของ dictionary ที่ได้ออกมาจากฟังก์ชั่นประมวลผลของเรา",ae,As,pe,Gs,at="นอกจากนี้คุณยังสามารถใช้ multiprocessing ตอนที่คุณใช้ฟังก์ชั่น preprocess ของคุณกับ <code>map()</code> ได้โดยการใส่อากิวเมนต์ <code>num_proc</code> แต่ที่เราไม่ได้ทำให้ดูตรงนี้ เนื่องจากไลบรารี่ 🤗 Tokenizers นั้นมีการใช้ multiple threads เพื่อให้การ tokenize ตัวอย่างของเราเร็วขึ้นอยู่แล้ว แต่ถ้าคุณไม่ได้ใช้ fast tokenizer ที่เขียนไว้ในไลบรารี่นี้ การใช้ multiprocessing ก็อาจจะช่วยให้การประมวลผลชุดข้อมูลของคุณเร็วขึ้นได้",ie,vs,pt="<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 ค่าใหม่ออกมา",re,Bs,it="ขั้นตอนสุดท้ายที่ต้องทำก็คือการเติมชุดข้อมูลตัวอย่างของเราให้มีความยาวเท่ากับข้อมูลตัวที่มีความยาวมากที่สุดใน batch ซึ่งเทคนิคเราจะเรียกว่า <em>dynamic padding</em> (การเติมแบบพลวัต)",ce,Xs,Me,zs,oe,pl,Vs,rt="ในทางปฏิบัติแล้ว เราจะต้องสร้างฟังก์ชั่น collate ที่จะทำการเติมข้อมูลในแต่ละ batch ของ dataset ด้วยจำนวนที่ถูกต้อง ซึ่งโชคดีที่ไลบรารี่ 🤗 Transformers ได้เตรียมฟังก์ชั่นนี้ไว้ให้แล้วในโมดูล <code>DataCollatorWithPadding</code> โดยจะรับข้อมูลเป็น tokenier (เพื่อให้รู้ว่าจะต้องเติมด้วย paddin token อะไร และเพื่อให้รู้ว่าโมเดลคาดหวังว่าจะต้องเติมไปทางซ้ายหรือทางขวามือของข้อมูล) และจะทำขั้นตอนทุกอย่างที่คุณต้องการ:",ye,Q,A,il,Ws,ct="เพื่อจะทดสอบของเล่นชิ้นใหม่นี้ ลองเลือกข้อมูลบางส่วนจากชุดข้อมูล training ของเรามาทดลองสร้างเป็น batch ซึ่งตรงนี้เราจะเอาคอลัมน์ idx, sentence1 และ sentence2 ออกไปเนื่องจากเราไม่จำเป็นต้องใช้ อีกทั้งคอลัมน์เหล่านี้ยังมี strings (ซึ่งเราไม่สามารถใช้ strings ในการสร้าง tensor ได้) แล้วลองดูความยาวของข้อมูลแต่ละตัวใน batch ของเรา:",ue,Es,me,Hs,je,Ss,Mt="เราเลือกได้ข้อมูลที่มีความยาวต่าง ๆ กัน ตั้งแต่ 32 ไปถึง 67 (ซึ่งก็ไม่น่าประหลาดใจอะไร) การทำ Dynamic padding ควรที่จะเติมข้อมูลทุกตัวใน batch นี้ให้มีความยาวเท่ากันเท่ากับ 67 (ซึ่งเป็นความยาวของข้อมูลที่ยาวที่สุดใน batch นี้) ถ้าไม่มีการทำ dynamic padding เราก็จะต้องเติมข้อมูลให้ยาวเท่ากับข้อมูลที่ยาวที่สุดใน dataset หรือไม่ก็เท่ากับความยาวสูงสุดที่โมเดลจะรับได้ ลองมาตรวจสอบกันดูว่า <code>data_collator</code> ของเรานั้นได้ทำการเติมแบบพลวัตให้กับข้อมูลใน batch ของเราอย่างถูกต้องเหมาะสม:",de,Ys,Je,G,v,rl,H,ot="<p>✏️ <strong>ลองเลย!</strong> ลองทำการประมวลผลแบบนี้กับชุดข้อมูล GLUE SST-2 ดู มันจะต่างจากตัวอย่างนี้เล็กน้อย เนื่องจากชุดข้อมูลนั้นประกอบไปด้วยประโยคเดียวแทนที่จะเป็นคู่ประโยค แต่ส่วนที่เหลือก็เหมือนกัน ถ้าอยากลองความท้าทายที่ยากขึ้นไปอีก ให้ลองเขียนฟังก์ชั่นประมวลผลที่ใช้กับ GLUE tasks ได้ทุก task ดูสิ</p>",he,cl,Fs,Ue,ol,be;f=new vt({props:{fw:b[0]}}),k=new At({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),T=new Te({props:{title:"การประมวลผลข้อมูล",local:"การประมวลผลขอมล",headingTag:"h1"}});const yt=[Xt,Bt],Ds=[];function ut(s,l){return s[0]==="pt"?0:1}C=ut(b),g=Ds[C]=yt[C](b);const mt=[Vt,zt],qs=[];function jt(s,l){return s[0]==="pt"?0:1}x=jt(b),$=qs[x]=mt[x](b),F=new Te({props:{title:"วิธีการโหลดชุดข้อมูลจาก Hub",local:"วธการโหลดชดขอมลจาก-hub",headingTag:"h3"}});const dt=[Et,Wt],Ls=[];function Jt(s,l){return s[0]==="pt"?0:1}I=Jt(b),R=Ls[I]=dt[I](b),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}}),ls=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}}),es=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}}),is=new Te({props:{title:"การประมวลผลชุดข้อมูล",local:"การประมวลผลชดขอมล",headingTag:"h3"}});const ht=[St,Ht],Ps=[];function Ut(s,l){return s[0]==="pt"?0:1}Z=Ut(b),N=Ps[Z]=ht[Z](b),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}}),ys=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}}),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}}),Us=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}}),Cs=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}}),$s=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}}),As=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 Te({props:{title:"Dynamic padding (การเติมแบบพลวัต)",local:"dynamic-padding-การเตมแบบพลวต",headingTag:"h3"}}),zs=new yl({props:{id:"7q5NyFT8REg"}});function bt(s,l){return s[0]==="pt"?Ft:Yt}let fe=bt(b),z=fe(b);const ft=[qt,Dt],Ks=[];function Tt(s,l){return s[0]==="pt"?0:1}Q=Tt(b),A=Ks[Q]=ft[Q](b),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 wt=[Pt,Lt],Os=[];function kt(s,l){return s[0]==="tf"?0:1}G=kt(b),v=Os[G]=wt[G](b);let _=b[0]==="tf"&&gt();return Fs=new Gt({props:{source:"https://github.com/huggingface/course/blob/main/chapters/th/chapter3/2.mdx"}}),{c(){t=u("meta"),r=p(),e=u("p"),M=p(),d(f.$$.fragment),c=p(),d(k.$$.fragment),X=p(),d(T.$$.fragment),B=p(),g.c(),el=p(),$.c(),tl=p(),S=u("p"),S.textContent=$e,ul=p(),Y=u("p"),Y.innerHTML=Ie,ml=p(),d(F.$$.fragment),jl=p(),R.c(),nl=p(),D=u("p"),D.innerHTML=Re,dl=p(),q=u("p"),q.textContent=Ze,Jl=p(),V=u("blockquote"),V.innerHTML=Ne,hl=p(),d(L.$$.fragment),Ul=p(),d(P.$$.fragment),bl=p(),K=u("p"),K.innerHTML=Qe,fl=p(),O=u("p"),O.innerHTML=Ae,Tl=p(),ss=u("p"),ss.innerHTML=Ge,wl=p(),d(ls.$$.fragment),kl=p(),d(es.$$.fragment),_l=p(),ts=u("p"),ts.innerHTML=ve,Cl=p(),d(ns.$$.fragment),gl=p(),d(as.$$.fragment),xl=p(),ps=u("p"),ps.innerHTML=Be,$l=p(),W=u("blockquote"),W.innerHTML=Xe,Il=p(),d(is.$$.fragment),Rl=p(),N.c(),al=p(),rs=u("p"),rs.innerHTML=ze,Zl=p(),d(cs.$$.fragment),Nl=p(),Ms=u("p"),Ms.textContent=Ve,Ql=p(),d(os.$$.fragment),Al=p(),d(ys.$$.fragment),Gl=p(),us=u("p"),us.innerHTML=We,vl=p(),E=u("blockquote"),E.innerHTML=Ee,Bl=p(),ms=u("p"),ms.innerHTML=He,Xl=p(),d(js.$$.fragment),zl=p(),ds=u("p"),ds.textContent=Se,Vl=p(),d(Js.$$.fragment),Wl=p(),hs=u("p"),hs.innerHTML=Ye,El=p(),d(Us.$$.fragment),Hl=p(),bs=u("p"),bs.innerHTML=Fe,Sl=p(),fs=u("p"),fs.textContent=De,Yl=p(),Ts=u("p"),Ts.innerHTML=qe,Fl=p(),ws=u("p"),ws.textContent=Le,Dl=p(),ks=u("p"),ks.innerHTML=Pe,ql=p(),_s=u("p"),_s.innerHTML=Ke,Ll=p(),d(Cs.$$.fragment),Pl=p(),gs=u("p"),gs.innerHTML=Oe,Kl=p(),xs=u("p"),xs.innerHTML=st,Ol=p(),d($s.$$.fragment),se=p(),Is=u("p"),Is.innerHTML=lt,le=p(),Rs=u("p"),Rs.innerHTML=et,ee=p(),Zs=u("p"),Zs.innerHTML=tt,te=p(),d(Ns.$$.fragment),ne=p(),Qs=u("p"),Qs.textContent=nt,ae=p(),d(As.$$.fragment),pe=p(),Gs=u("p"),Gs.innerHTML=at,ie=p(),vs=u("p"),vs.innerHTML=pt,re=p(),Bs=u("p"),Bs.innerHTML=it,ce=p(),d(Xs.$$.fragment),Me=p(),d(zs.$$.fragment),oe=p(),z.c(),pl=p(),Vs=u("p"),Vs.innerHTML=rt,ye=p(),A.c(),il=p(),Ws=u("p"),Ws.textContent=ct,ue=p(),d(Es.$$.fragment),me=p(),d(Hs.$$.fragment),je=p(),Ss=u("p"),Ss.innerHTML=Mt,de=p(),d(Ys.$$.fragment),Je=p(),v.c(),rl=p(),H=u("blockquote"),H.innerHTML=ot,he=p(),_&&_.c(),cl=p(),d(Fs.$$.fragment),Ue=p(),ol=u("p"),this.h()},l(s){const l=Nt("svelte-u9bgzb",document.head);t=m(l,"META",{name:!0,content:!0}),l.forEach(n),r=i(s),e=m(s,"P",{}),Ct(e).forEach(n),M=i(s),J(f.$$.fragment,s),c=i(s),J(k.$$.fragment,s),X=i(s),J(T.$$.fragment,s),B=i(s),g.l(s),el=i(s),$.l(s),tl=i(s),S=m(s,"P",{"data-svelte-h":!0}),j(S)!=="svelte-1x0uuug"&&(S.textContent=$e),ul=i(s),Y=m(s,"P",{"data-svelte-h":!0}),j(Y)!=="svelte-l34a0i"&&(Y.innerHTML=Ie),ml=i(s),J(F.$$.fragment,s),jl=i(s),R.l(s),nl=i(s),D=m(s,"P",{"data-svelte-h":!0}),j(D)!=="svelte-5kjdet"&&(D.innerHTML=Re),dl=i(s),q=m(s,"P",{"data-svelte-h":!0}),j(q)!=="svelte-1frmeq1"&&(q.textContent=Ze),Jl=i(s),V=m(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),j(V)!=="svelte-4yjgo6"&&(V.innerHTML=Ne),hl=i(s),J(L.$$.fragment,s),Ul=i(s),J(P.$$.fragment,s),bl=i(s),K=m(s,"P",{"data-svelte-h":!0}),j(K)!=="svelte-1p2l4nq"&&(K.innerHTML=Qe),fl=i(s),O=m(s,"P",{"data-svelte-h":!0}),j(O)!=="svelte-128v4um"&&(O.innerHTML=Ae),Tl=i(s),ss=m(s,"P",{"data-svelte-h":!0}),j(ss)!=="svelte-379gh7"&&(ss.innerHTML=Ge),wl=i(s),J(ls.$$.fragment,s),kl=i(s),J(es.$$.fragment,s),_l=i(s),ts=m(s,"P",{"data-svelte-h":!0}),j(ts)!=="svelte-85u0vh"&&(ts.innerHTML=ve),Cl=i(s),J(ns.$$.fragment,s),gl=i(s),J(as.$$.fragment,s),xl=i(s),ps=m(s,"P",{"data-svelte-h":!0}),j(ps)!=="svelte-fn52g3"&&(ps.innerHTML=Be),$l=i(s),W=m(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),j(W)!=="svelte-1e80hkg"&&(W.innerHTML=Xe),Il=i(s),J(is.$$.fragment,s),Rl=i(s),N.l(s),al=i(s),rs=m(s,"P",{"data-svelte-h":!0}),j(rs)!=="svelte-17otmwf"&&(rs.innerHTML=ze),Zl=i(s),J(cs.$$.fragment,s),Nl=i(s),Ms=m(s,"P",{"data-svelte-h":!0}),j(Ms)!=="svelte-108r3z"&&(Ms.textContent=Ve),Ql=i(s),J(os.$$.fragment,s),Al=i(s),J(ys.$$.fragment,s),Gl=i(s),us=m(s,"P",{"data-svelte-h":!0}),j(us)!=="svelte-1fuy27o"&&(us.innerHTML=We),vl=i(s),E=m(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),j(E)!=="svelte-nsvbtq"&&(E.innerHTML=Ee),Bl=i(s),ms=m(s,"P",{"data-svelte-h":!0}),j(ms)!=="svelte-u24s3p"&&(ms.innerHTML=He),Xl=i(s),J(js.$$.fragment,s),zl=i(s),ds=m(s,"P",{"data-svelte-h":!0}),j(ds)!=="svelte-fyhuw7"&&(ds.textContent=Se),Vl=i(s),J(Js.$$.fragment,s),Wl=i(s),hs=m(s,"P",{"data-svelte-h":!0}),j(hs)!=="svelte-oi73g0"&&(hs.innerHTML=Ye),El=i(s),J(Us.$$.fragment,s),Hl=i(s),bs=m(s,"P",{"data-svelte-h":!0}),j(bs)!=="svelte-f2h3e9"&&(bs.innerHTML=Fe),Sl=i(s),fs=m(s,"P",{"data-svelte-h":!0}),j(fs)!=="svelte-15t697f"&&(fs.textContent=De),Yl=i(s),Ts=m(s,"P",{"data-svelte-h":!0}),j(Ts)!=="svelte-1ezbpr6"&&(Ts.innerHTML=qe),Fl=i(s),ws=m(s,"P",{"data-svelte-h":!0}),j(ws)!=="svelte-1h246f5"&&(ws.textContent=Le),Dl=i(s),ks=m(s,"P",{"data-svelte-h":!0}),j(ks)!=="svelte-1dqlxg0"&&(ks.innerHTML=Pe),ql=i(s),_s=m(s,"P",{"data-svelte-h":!0}),j(_s)!=="svelte-1rx0s16"&&(_s.innerHTML=Ke),Ll=i(s),J(Cs.$$.fragment,s),Pl=i(s),gs=m(s,"P",{"data-svelte-h":!0}),j(gs)!=="svelte-teohu1"&&(gs.innerHTML=Oe),Kl=i(s),xs=m(s,"P",{"data-svelte-h":!0}),j(xs)!=="svelte-dwfma7"&&(xs.innerHTML=st),Ol=i(s),J($s.$$.fragment,s),se=i(s),Is=m(s,"P",{"data-svelte-h":!0}),j(Is)!=="svelte-nxfcwb"&&(Is.innerHTML=lt),le=i(s),Rs=m(s,"P",{"data-svelte-h":!0}),j(Rs)!=="svelte-flbh3n"&&(Rs.innerHTML=et),ee=i(s),Zs=m(s,"P",{"data-svelte-h":!0}),j(Zs)!=="svelte-1wkepm8"&&(Zs.innerHTML=tt),te=i(s),J(Ns.$$.fragment,s),ne=i(s),Qs=m(s,"P",{"data-svelte-h":!0}),j(Qs)!=="svelte-b5c00r"&&(Qs.textContent=nt),ae=i(s),J(As.$$.fragment,s),pe=i(s),Gs=m(s,"P",{"data-svelte-h":!0}),j(Gs)!=="svelte-194dkwz"&&(Gs.innerHTML=at),ie=i(s),vs=m(s,"P",{"data-svelte-h":!0}),j(vs)!=="svelte-1yulgc2"&&(vs.innerHTML=pt),re=i(s),Bs=m(s,"P",{"data-svelte-h":!0}),j(Bs)!=="svelte-1aq5zsd"&&(Bs.innerHTML=it),ce=i(s),J(Xs.$$.fragment,s),Me=i(s),J(zs.$$.fragment,s),oe=i(s),z.l(s),pl=i(s),Vs=m(s,"P",{"data-svelte-h":!0}),j(Vs)!=="svelte-j66kwv"&&(Vs.innerHTML=rt),ye=i(s),A.l(s),il=i(s),Ws=m(s,"P",{"data-svelte-h":!0}),j(Ws)!=="svelte-sxp3sh"&&(Ws.textContent=ct),ue=i(s),J(Es.$$.fragment,s),me=i(s),J(Hs.$$.fragment,s),je=i(s),Ss=m(s,"P",{"data-svelte-h":!0}),j(Ss)!=="svelte-omjm79"&&(Ss.innerHTML=Mt),de=i(s),J(Ys.$$.fragment,s),Je=i(s),v.l(s),rl=i(s),H=m(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),j(H)!=="svelte-u9m7zi"&&(H.innerHTML=ot),he=i(s),_&&_.l(s),cl=i(s),J(Fs.$$.fragment,s),Ue=i(s),ol=m(s,"P",{}),Ct(ol).forEach(n),this.h()},h(){Ml(t,"name","hf:doc:metadata"),Ml(t,"content",Ot),Ml(V,"class","tip"),Ml(W,"class","tip"),Ml(E,"class","tip"),Ml(H,"class","tip")},m(s,l){Qt(document.head,t),a(s,r,l),a(s,e,l),a(s,M,l),h(f,s,l),a(s,c,l),h(k,s,l),a(s,X,l),h(T,s,l),a(s,B,l),Ds[C].m(s,l),a(s,el,l),qs[x].m(s,l),a(s,tl,l),a(s,S,l),a(s,ul,l),a(s,Y,l),a(s,ml,l),h(F,s,l),a(s,jl,l),Ls[I].m(s,l),a(s,nl,l),a(s,D,l),a(s,dl,l),a(s,q,l),a(s,Jl,l),a(s,V,l),a(s,hl,l),h(L,s,l),a(s,Ul,l),h(P,s,l),a(s,bl,l),a(s,K,l),a(s,fl,l),a(s,O,l),a(s,Tl,l),a(s,ss,l),a(s,wl,l),h(ls,s,l),a(s,kl,l),h(es,s,l),a(s,_l,l),a(s,ts,l),a(s,Cl,l),h(ns,s,l),a(s,gl,l),h(as,s,l),a(s,xl,l),a(s,ps,l),a(s,$l,l),a(s,W,l),a(s,Il,l),h(is,s,l),a(s,Rl,l),Ps[Z].m(s,l),a(s,al,l),a(s,rs,l),a(s,Zl,l),h(cs,s,l),a(s,Nl,l),a(s,Ms,l),a(s,Ql,l),h(os,s,l),a(s,Al,l),h(ys,s,l),a(s,Gl,l),a(s,us,l),a(s,vl,l),a(s,E,l),a(s,Bl,l),a(s,ms,l),a(s,Xl,l),h(js,s,l),a(s,zl,l),a(s,ds,l),a(s,Vl,l),h(Js,s,l),a(s,Wl,l),a(s,hs,l),a(s,El,l),h(Us,s,l),a(s,Hl,l),a(s,bs,l),a(s,Sl,l),a(s,fs,l),a(s,Yl,l),a(s,Ts,l),a(s,Fl,l),a(s,ws,l),a(s,Dl,l),a(s,ks,l),a(s,ql,l),a(s,_s,l),a(s,Ll,l),h(Cs,s,l),a(s,Pl,l),a(s,gs,l),a(s,Kl,l),a(s,xs,l),a(s,Ol,l),h($s,s,l),a(s,se,l),a(s,Is,l),a(s,le,l),a(s,Rs,l),a(s,ee,l),a(s,Zs,l),a(s,te,l),h(Ns,s,l),a(s,ne,l),a(s,Qs,l),a(s,ae,l),h(As,s,l),a(s,pe,l),a(s,Gs,l),a(s,ie,l),a(s,vs,l),a(s,re,l),a(s,Bs,l),a(s,ce,l),h(Xs,s,l),a(s,Me,l),h(zs,s,l),a(s,oe,l),z.m(s,l),a(s,pl,l),a(s,Vs,l),a(s,ye,l),Ks[Q].m(s,l),a(s,il,l),a(s,Ws,l),a(s,ue,l),h(Es,s,l),a(s,me,l),h(Hs,s,l),a(s,je,l),a(s,Ss,l),a(s,de,l),h(Ys,s,l),a(s,Je,l),Os[G].m(s,l),a(s,rl,l),a(s,H,l),a(s,he,l),_&&_.m(s,l),a(s,cl,l),h(Fs,s,l),a(s,Ue,l),a(s,ol,l),be=!0},p(s,[l]){const _t={};l&1&&(_t.fw=s[0]),f.$set(_t);let we=C;C=ut(s),C!==we&&(ll(),y(Ds[we],1,1,()=>{Ds[we]=null}),sl(),g=Ds[C],g||(g=Ds[C]=yt[C](s),g.c()),o(g,1),g.m(el.parentNode,el));let ke=x;x=jt(s),x!==ke&&(ll(),y(qs[ke],1,1,()=>{qs[ke]=null}),sl(),$=qs[x],$||($=qs[x]=mt[x](s),$.c()),o($,1),$.m(tl.parentNode,tl));let _e=I;I=Jt(s),I!==_e&&(ll(),y(Ls[_e],1,1,()=>{Ls[_e]=null}),sl(),R=Ls[I],R||(R=Ls[I]=dt[I](s),R.c()),o(R,1),R.m(nl.parentNode,nl));let Ce=Z;Z=Ut(s),Z!==Ce&&(ll(),y(Ps[Ce],1,1,()=>{Ps[Ce]=null}),sl(),N=Ps[Z],N||(N=Ps[Z]=ht[Z](s),N.c()),o(N,1),N.m(al.parentNode,al)),fe!==(fe=bt(s))&&(z.d(1),z=fe(s),z&&(z.c(),z.m(pl.parentNode,pl)));let ge=Q;Q=Tt(s),Q!==ge&&(ll(),y(Ks[ge],1,1,()=>{Ks[ge]=null}),sl(),A=Ks[Q],A||(A=Ks[Q]=ft[Q](s),A.c()),o(A,1),A.m(il.parentNode,il));let xe=G;G=kt(s),G!==xe&&(ll(),y(Os[xe],1,1,()=>{Os[xe]=null}),sl(),v=Os[G],v||(v=Os[G]=wt[G](s),v.c()),o(v,1),v.m(rl.parentNode,rl)),s[0]==="tf"?_?l&1&&o(_,1):(_=gt(),_.c(),o(_,1),_.m(cl.parentNode,cl)):_&&(ll(),y(_,1,1,()=>{_=null}),sl())},i(s){be||(o(f.$$.fragment,s),o(k.$$.fragment,s),o(T.$$.fragment,s),o(g),o($),o(F.$$.fragment,s),o(R),o(L.$$.fragment,s),o(P.$$.fragment,s),o(ls.$$.fragment,s),o(es.$$.fragment,s),o(ns.$$.fragment,s),o(as.$$.fragment,s),o(is.$$.fragment,s),o(N),o(cs.$$.fragment,s),o(os.$$.fragment,s),o(ys.$$.fragment,s),o(js.$$.fragment,s),o(Js.$$.fragment,s),o(Us.$$.fragment,s),o(Cs.$$.fragment,s),o($s.$$.fragment,s),o(Ns.$$.fragment,s),o(As.$$.fragment,s),o(Xs.$$.fragment,s),o(zs.$$.fragment,s),o(A),o(Es.$$.fragment,s),o(Hs.$$.fragment,s),o(Ys.$$.fragment,s),o(v),o(_),o(Fs.$$.fragment,s),be=!0)},o(s){y(f.$$.fragment,s),y(k.$$.fragment,s),y(T.$$.fragment,s),y(g),y($),y(F.$$.fragment,s),y(R),y(L.$$.fragment,s),y(P.$$.fragment,s),y(ls.$$.fragment,s),y(es.$$.fragment,s),y(ns.$$.fragment,s),y(as.$$.fragment,s),y(is.$$.fragment,s),y(N),y(cs.$$.fragment,s),y(os.$$.fragment,s),y(ys.$$.fragment,s),y(js.$$.fragment,s),y(Js.$$.fragment,s),y(Us.$$.fragment,s),y(Cs.$$.fragment,s),y($s.$$.fragment,s),y(Ns.$$.fragment,s),y(As.$$.fragment,s),y(Xs.$$.fragment,s),y(zs.$$.fragment,s),y(A),y(Es.$$.fragment,s),y(Hs.$$.fragment,s),y(Ys.$$.fragment,s),y(v),y(_),y(Fs.$$.fragment,s),be=!1},d(s){s&&(n(r),n(e),n(M),n(c),n(X),n(B),n(el),n(tl),n(S),n(ul),n(Y),n(ml),n(jl),n(nl),n(D),n(dl),n(q),n(Jl),n(V),n(hl),n(Ul),n(bl),n(K),n(fl),n(O),n(Tl),n(ss),n(wl),n(kl),n(_l),n(ts),n(Cl),n(gl),n(xl),n(ps),n($l),n(W),n(Il),n(Rl),n(al),n(rs),n(Zl),n(Nl),n(Ms),n(Ql),n(Al),n(Gl),n(us),n(vl),n(E),n(Bl),n(ms),n(Xl),n(zl),n(ds),n(Vl),n(Wl),n(hs),n(El),n(Hl),n(bs),n(Sl),n(fs),n(Yl),n(Ts),n(Fl),n(ws),n(Dl),n(ks),n(ql),n(_s),n(Ll),n(Pl),n(gs),n(Kl),n(xs),n(Ol),n(se),n(Is),n(le),n(Rs),n(ee),n(Zs),n(te),n(ne),n(Qs),n(ae),n(pe),n(Gs),n(ie),n(vs),n(re),n(Bs),n(ce),n(Me),n(oe),n(pl),n(Vs),n(ye),n(il),n(Ws),n(ue),n(me),n(je),n(Ss),n(de),n(Je),n(rl),n(H),n(he),n(cl),n(Ue),n(ol)),n(t),U(f,s),U(k,s),U(T,s),Ds[C].d(s),qs[x].d(s),U(F,s),Ls[I].d(s),U(L,s),U(P,s),U(ls,s),U(es,s),U(ns,s),U(as,s),U(is,s),Ps[Z].d(s),U(cs,s),U(os,s),U(ys,s),U(js,s),U(Js,s),U(Us,s),U(Cs,s),U($s,s),U(Ns,s),U(As,s),U(Xs,s),U(zs,s),z.d(s),Ks[Q].d(s),U(Es,s),U(Hs,s),U(Ys,s),Os[G].d(s),_&&_.d(s),U(Fs,s)}}}const Ot='{"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 sn(b,t,r){let e="pt";return It(()=>{const M=new URLSearchParams(window.location.search);r(0,e=M.get("fw")||"pt")}),[e]}class cn extends Rt{constructor(t){super(),Zt(this,t,sn,Kt,$t,{})}}export{cn as component};

Xet Storage Details

Size:
83.9 kB
·
Xet hash:
2a434fdcc7b120a618e18dffce4dace78f1948f3df89464890d0c30b0be8295e

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.