Buckets:
| import{s as xt,o as It,n as Cl}from"../chunks/scheduler.37c15a92.js";import{S as Rt,i as Zt,g as y,s as i,r as d,A as Nt,h as m,f as n,c as r,j as $t,u as J,x as j,k as _t,y as At,a,v as h,t as u,b as Ks,d as M,w as U,m as Qt,n as Gt,p as Os}from"../chunks/index.2bf4358c.js";import{T as Ul}from"../chunks/Tip.363c041f.js";import{Y as ce}from"../chunks/Youtube.1e50a667.js";import{C as w}from"../chunks/CodeBlock.4e987730.js";import{C as gt}from"../chunks/CourseFloatingBanner.6add7356.js";import{F as vt}from"../chunks/FrameworkSwitchCourse.8d4d4ab6.js";import{H as fl,E as Bt}from"../chunks/getInferenceSnippets.24b50994.js";function Xt(f){let l,p;return l=new gt({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(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,c){h(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){u(l.$$.fragment,t),p=!1},d(t){U(l,t)}}}function zt(f){let l,p;return l=new gt({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(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,c){h(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){u(l.$$.fragment,t),p=!1},d(t){U(l,t)}}}function Vt(f){let l,p='เราจะยังคงใช้ตัวอย่างจากบทที่แล้ว <a href="/course/chapter2">previous chapter</a> โค้ดข้างล่างนี้คือวิธีการเทรนโมเดลสำหรับจำแนกลำดับ (sequence classifier) โดยใช้ข้อมูล 1 batch ใน TensorFlow:',t,c,T;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">"bert-base-uncased"</span> | |
| tokenizer = AutoTokenizer.from_pretrained(checkpoint) | |
| model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint) | |
| sequences = [ | |
| <span class="hljs-string">"I've been waiting for a HuggingFace course my whole life."</span>, | |
| <span class="hljs-string">"This course is amazing!"</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">"tf"</span>)) | |
| <span class="hljs-comment"># This is new</span> | |
| model.<span class="hljs-built_in">compile</span>(optimizer=<span class="hljs-string">"adam"</span>, loss=<span class="hljs-string">"sparse_categorical_crossentropy"</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(),d(c.$$.fragment)},l(o){l=m(o,"P",{"data-svelte-h":!0}),j(l)!=="svelte-1mvk20o"&&(l.innerHTML=p),t=r(o),J(c.$$.fragment,o)},m(o,k){a(o,l,k),a(o,t,k),h(c,o,k),T=!0},i(o){T||(M(c.$$.fragment,o),T=!0)},o(o){u(c.$$.fragment,o),T=!1},d(o){o&&(n(l),n(t)),U(c,o)}}}function Wt(f){let l,p='เราจะยังคงใช้ตัวอย่างจากบทที่แล้ว <a href="/course/chapter2">previous chapter</a> โค้ดข้างล่างนี้คือวิธีการเทรนโมเดลสำหรับจำแนกลำดับ (sequence classifier) โดยใช้ข้อมูล 1 batch ใน Pytorch:',t,c,T;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">"bert-base-uncased"</span> | |
| tokenizer = AutoTokenizer.from_pretrained(checkpoint) | |
| model = AutoModelForSequenceClassification.from_pretrained(checkpoint) | |
| sequences = [ | |
| <span class="hljs-string">"I've been waiting for a HuggingFace course my whole life."</span>, | |
| <span class="hljs-string">"This course is amazing!"</span>, | |
| ] | |
| batch = tokenizer(sequences, padding=<span class="hljs-literal">True</span>, truncation=<span class="hljs-literal">True</span>, return_tensors=<span class="hljs-string">"pt"</span>) | |
| <span class="hljs-comment"># This is new</span> | |
| batch[<span class="hljs-string">"labels"</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(),d(c.$$.fragment)},l(o){l=m(o,"P",{"data-svelte-h":!0}),j(l)!=="svelte-12fav1s"&&(l.innerHTML=p),t=r(o),J(c.$$.fragment,o)},m(o,k){a(o,l,k),a(o,t,k),h(c,o,k),T=!0},i(o){T||(M(c.$$.fragment,o),T=!0)},o(o){u(c.$$.fragment,o),T=!1},d(o){o&&(n(l),n(t)),U(c,o)}}}function Et(f){let l,p;return l=new ce({props:{id:"W_gMJF0xomE"}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,c){h(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){u(l.$$.fragment,t),p=!1},d(t){U(l,t)}}}function Ht(f){let l,p;return l=new ce({props:{id:"_BZearw7f0w"}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,c){h(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){u(l.$$.fragment,t),p=!1},d(t){U(l,t)}}}function St(f){let l;return{c(){l=Qt("⚠️ **คำเตือน** ตรวจสอบให้แน่ใจว่า `datasets` ได้ถูกติดตั้งโดยการรัน `pip install datasets` ก่อน จากนั้นโหลดชุดข้อมูล MRPC และพิมพ์เพื่อดูว่ามีอะไรบ้าง")},l(p){l=Gt(p,"⚠️ **คำเตือน** ตรวจสอบให้แน่ใจว่า `datasets` ได้ถูกติดตั้งโดยการรัน `pip install datasets` ก่อน จากนั้นโหลดชุดข้อมูล MRPC และพิมพ์เพื่อดูว่ามีอะไรบ้าง")},m(p,t){a(p,l,t)},d(p){p&&n(l)}}}function Yt(f){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}),j(l)!=="svelte-1l01kvz"&&(l.innerHTML=p)},m(t,c){a(t,l,c)},p:Cl,d(t){t&&n(l)}}}function Ft(f){let l,p;return l=new ce({props:{id:"P-rZWqcB6CE"}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,c){h(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){u(l.$$.fragment,t),p=!1},d(t){U(l,t)}}}function Dt(f){let l,p;return l=new ce({props:{id:"0u3ioSwev3s"}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,c){h(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){u(l.$$.fragment,t),p=!1},d(t){U(l,t)}}}function qt(f){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}),j(l)!=="svelte-1b0qrd9"&&(l.innerHTML=p)},m(t,c){a(t,l,c)},p:Cl,d(t){t&&n(l)}}}function Lt(f){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}),j(l)!=="svelte-1nsikbe"&&(l.innerHTML=p)},m(t,c){a(t,l,c)},d(t){t&&n(l)}}}function Pt(f){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}),j(l)!=="svelte-1lqxn3g"&&(l.innerHTML=p)},m(t,c){a(t,l,c)},d(t){t&&n(l)}}}function Kt(f){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">"tf"</span>)`,wrap:!1}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,c){h(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){u(l.$$.fragment,t),p=!1},d(t){U(l,t)}}}function Ot(f){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(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,c){h(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){u(l.$$.fragment,t),p=!1},d(t){U(l,t)}}}function sn(f){let l,p,t,c="ผลลัพธ์ออกมาดูดีเลย! ตอนนี้เราก็จัดการข้อมูลจาก raw text ให้เป็นชุดของ batch ที่โมเดลทำความเข้าใจได้แล้ว เราพร้อมที่จะ fine-tune แล้ว!",T;return l=new w({props:{code:"JTdCJ2F0dGVudGlvbl9tYXNrJyUzQSUyMHRvcmNoLlNpemUoJTVCOCUyQyUyMDY3JTVEKSUyQyUwQSUyMCdpbnB1dF9pZHMnJTNBJTIwdG9yY2guU2l6ZSglNUI4JTJDJTIwNjclNUQpJTJDJTBBJTIwJ3Rva2VuX3R5cGVfaWRzJyUzQSUyMHRvcmNoLlNpemUoJTVCOCUyQyUyMDY3JTVEKSUyQyUwQSUyMCdsYWJlbHMnJTNBJTIwdG9yY2guU2l6ZSglNUI4JTVEKSU3RA==",highlighted:`{<span class="hljs-string">'attention_mask'</span>: torch.Size([<span class="hljs-number">8</span>, <span class="hljs-number">67</span>]), | |
| <span class="hljs-string">'input_ids'</span>: torch.Size([<span class="hljs-number">8</span>, <span class="hljs-number">67</span>]), | |
| <span class="hljs-string">'token_type_ids'</span>: torch.Size([<span class="hljs-number">8</span>, <span class="hljs-number">67</span>]), | |
| <span class="hljs-string">'labels'</span>: torch.Size([<span class="hljs-number">8</span>])}`,wrap:!1}}),{c(){d(l.$$.fragment),p=i(),t=y("p"),t.textContent=c},l(o){J(l.$$.fragment,o),p=r(o),t=m(o,"P",{"data-svelte-h":!0}),j(t)!=="svelte-117lc0s"&&(t.textContent=c)},m(o,k){h(l,o,k),a(o,p,k),a(o,t,k),T=!0},i(o){T||(M(l.$$.fragment,o),T=!0)},o(o){u(l.$$.fragment,o),T=!1},d(o){o&&(n(p),n(t)),U(l,o)}}}function en(f){let l,p;return l=new w({props:{code:"JTdCJ2F0dGVudGlvbl9tYXNrJyUzQSUyMFRlbnNvclNoYXBlKCU1QjglMkMlMjA2NyU1RCklMkMlMEElMjAnaW5wdXRfaWRzJyUzQSUyMFRlbnNvclNoYXBlKCU1QjglMkMlMjA2NyU1RCklMkMlMEElMjAndG9rZW5fdHlwZV9pZHMnJTNBJTIwVGVuc29yU2hhcGUoJTVCOCUyQyUyMDY3JTVEKSUyQyUwQSUyMCdsYWJlbHMnJTNBJTIwVGVuc29yU2hhcGUoJTVCOCU1RCklN0Q=",highlighted:`{<span class="hljs-string">'attention_mask'</span>: TensorShape([<span class="hljs-number">8</span>, <span class="hljs-number">67</span>]), | |
| <span class="hljs-string">'input_ids'</span>: TensorShape([<span class="hljs-number">8</span>, <span class="hljs-number">67</span>]), | |
| <span class="hljs-string">'token_type_ids'</span>: TensorShape([<span class="hljs-number">8</span>, <span class="hljs-number">67</span>]), | |
| <span class="hljs-string">'labels'</span>: TensorShape([<span class="hljs-number">8</span>])}`,wrap:!1}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,c){h(l,t,c),p=!0},i(t){p||(M(l.$$.fragment,t),p=!0)},o(t){u(l.$$.fragment,t),p=!1},d(t){U(l,t)}}}function ln(f){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}),j(l)!=="svelte-v5ml91"&&(l.innerHTML=p)},m(t,c){a(t,l,c)},p:Cl,d(t){t&&n(l)}}}function Ct(f){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,T,o,k="เสร็จเรียบร้อย! เราสามารถนำ datasets พวกนี้ไปใช้ในบทเรียนต่อไปของเราได้เลย โดยการ training นั้นค่อนข้างตรงไปตรงมาไม่ซับซ้อนหลังจากที่เราทำงานอย่างหนักไปกกับการประมวลผลข้อมูลแล้ว",v;return c=new w({props:{code:"dGZfdHJhaW5fZGF0YXNldCUyMCUzRCUyMHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVELnRvX3RmX2RhdGFzZXQoJTBBJTIwJTIwJTIwJTIwY29sdW1ucyUzRCU1QiUyMmF0dGVudGlvbl9tYXNrJTIyJTJDJTIwJTIyaW5wdXRfaWRzJTIyJTJDJTIwJTIydG9rZW5fdHlwZV9pZHMlMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBsYWJlbF9jb2xzJTNEJTVCJTIybGFiZWxzJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwc2h1ZmZsZSUzRFRydWUlMkMlMEElMjAlMjAlMjAlMjBjb2xsYXRlX2ZuJTNEZGF0YV9jb2xsYXRvciUyQyUwQSUyMCUyMCUyMCUyMGJhdGNoX3NpemUlM0Q4JTJDJTBBKSUwQSUwQXRmX3ZhbGlkYXRpb25fZGF0YXNldCUyMCUzRCUyMHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnZhbGlkYXRpb24lMjIlNUQudG9fdGZfZGF0YXNldCglMEElMjAlMjAlMjAlMjBjb2x1bW5zJTNEJTVCJTIyYXR0ZW50aW9uX21hc2slMjIlMkMlMjAlMjJpbnB1dF9pZHMlMjIlMkMlMjAlMjJ0b2tlbl90eXBlX2lkcyUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMGxhYmVsX2NvbHMlM0QlNUIlMjJsYWJlbHMlMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBzaHVmZmxlJTNERmFsc2UlMkMlMEElMjAlMjAlMjAlMjBjb2xsYXRlX2ZuJTNEZGF0YV9jb2xsYXRvciUyQyUwQSUyMCUyMCUyMCUyMGJhdGNoX3NpemUlM0Q4JTJDJTBBKQ==",highlighted:`tf_train_dataset = tokenized_datasets[<span class="hljs-string">"train"</span>].to_tf_dataset( | |
| columns=[<span class="hljs-string">"attention_mask"</span>, <span class="hljs-string">"input_ids"</span>, <span class="hljs-string">"token_type_ids"</span>], | |
| label_cols=[<span class="hljs-string">"labels"</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">"validation"</span>].to_tf_dataset( | |
| columns=[<span class="hljs-string">"attention_mask"</span>, <span class="hljs-string">"input_ids"</span>, <span class="hljs-string">"token_type_ids"</span>], | |
| label_cols=[<span class="hljs-string">"labels"</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(),d(c.$$.fragment),T=i(),o=y("p"),o.textContent=k},l(b){l=m(b,"P",{"data-svelte-h":!0}),j(l)!=="svelte-bzg3o0"&&(l.innerHTML=p),t=r(b),J(c.$$.fragment,b),T=r(b),o=m(b,"P",{"data-svelte-h":!0}),j(o)!=="svelte-zai6vo"&&(o.textContent=k)},m(b,_){a(b,l,_),a(b,t,_),h(c,b,_),a(b,T,_),a(b,o,_),v=!0},i(b){v||(M(c.$$.fragment,b),v=!0)},o(b){u(c.$$.fragment,b),v=!1},d(b){b&&(n(l),n(t),n(T),n(o)),U(c,b)}}}function tn(f){let l,p,t,c,T,o,k,v,b,_,se,C,g,ee,E,gl="เป็นที่แน่นอนว่า ถ้าเราเทรนโมเดลโดยใช้ข้อมูลเพียง 2 ประโยคก็คงไม่ได้ผลลัพธ์ที่ดีเท่าไรนัก ถ้าคุณต้องการผลลัพธ์ที่ดีขึ้น คุณจะต้องเตรียมชุดข้อมูล (dataset) ที่มีขนาดใหญ่ขึ้น",Me,H,xl='ใน 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) หรือไม่ (ประโยคคู่นี้มีความหมายเดียวกันหรือไม่) เหตุผลที่เราเลือกชุดข้อมูลนี้ เนื่องจากมันเป็นชุดข้อมูลที่มีขนาดเล็ก จึงง่ายต่อการนำไปทดลองเทรนโมเดล',oe,S,ue,x,I,le,Y,Il='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 งาน',ye,F,Rl="ไลบรารี่ 🤗 Datasets library มีคำสั่งที่ใช้งานได้ง่ายมากในการดาวโหลดและ cache ชุดข้อมูลที่อยู่บน Hub เราสามารถดาวโหลดชุดข้อมูล MRPC ได้ดังนี้:",me,X,je,D,de,q,Je,L,Zl="คุณจะเห็นว่า เราจะได้อ็อบเจกต์ <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 คู่)",he,P,Nl="คำสั่งนี้จะดาวโหลดและเก็บ cache ของชุดข้อมูลไว้ โดยค่าเริ่มต้น (by default) จะเก็บ cache ไว้ที่ <em>~/.cache/huggingface/dataset</em> โดยใน Chapter 2 เราได้บอกวิธีไว้แล้วว่า คุณสามารถเปลี่ยนโฟลเดอร์ที่จะเก็บ cache ได้โดยการตั้งค่าตัวแปร environment ที่ชื่อ <code>HF_HOME</code>",Ue,K,Al="เราสามารถเข้าถึงข้อมูลประโยคแต่ละคู่ในอ็อบเจกต์ <code>raw_datasets</code> ของเราได้โดยการใช้ indexing แบบเดียวกับที่ใช้กับ dictionary:",fe,O,be,ss,Te,es,Ql="เราจะเห็นได้ว่าข้อมูล labels นั้นอยู่ในรูป integers อยู่แล้ว จึงไม่ได้ต้องทำการประมวลผลใด ๆ เพิ่มเติมกับ label ถ้าอยากรู้ว่า integer ตัวไหนตรงกับ label ตัวไหน เราสามารถเข้าไปดูได้ที่ <code>features</code> ของอ็อพเจกต์ <code>raw_train_dataset</code> ของเรา ซึ่งจะบอกชนิดของข้อมูลในแต่ละคอลัมน์:",we,ls,ke,ts,$e,ns,Gl="เราจะเห็นเบื้องหลังของ <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>",_e,z,Ce,as,ge,R,Z,te,ps,vl='ในขั้นตอนการประมวลผลชุดข้อมูล เราจะต้องแปลงตัวอักษรให้กลายเป็นตัวเลข เพื่อให้โมเดลสามารถทำความเข้าใจได้ ดังที่คุณได้เห็นแล้วใน <a href="/course/chapter2">previous chapter</a> ขั้นตอนการแปลงนี้สามารถทำได้โดยใช้ tokenizer โดยเราสามารถป้อนข้อมูลเข้า tokenizer เพียงแค่หนึ่งประโยค หรือจะป้อนข้อมูลเป็น list ของประโยคทั้งหมดเลยก็ได้ เราสามารถ tokenize ทั้งประโยคแรกและประโยคที่สองในแต่ละคู่ประโยคทุกคู่ได้ดังนี้:',xe,is,Ie,rs,Bl="อย่างไรก็ตาม การส่งเพียงข้อมูลสองลำดับ (sequences) ในลักษณะนี้เข้าไปยังไม่เพียงพอที่จะทำให้โมเดลสามารถเรียนรู้และทำนายว่าประโยคทั้งสองนี้เป็นประโยคที่เกิดจากการถอดความ (paraphrase) หรือไม่ เราจะต้องจัดการให้ประโยคทั้งสองเป็นคู่กันก่อนแล้วค่อยทำการประมวลผลให้เหมาะสม ซึ่งโชคดีมากที่ tokenizer สามารถรับข้อมูลคู่ของลำดับแล้วเตรียมข้อมูลให้อยู่ในรูปแบบที่เหมาะสมกับการป้อนเข้าโมเดล BERT ของเรา:",Re,cs,Ze,Ms,Ne,os,Xl='เราได้อธิบายเกี่ยวกับ 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 ที่เป็นประโยคแรก และส่วนไหนที่เป็นประโยคที่สอง',Ae,V,Qe,us,zl="ถ้าเรา decode ข้อมูล IDs ที่อยู่ใน <code>input_ids</code> กลับไปเป็นคำ:",Ge,ys,ve,ms,Vl="เราจะได้ผลลัพธ์:",Be,js,Xe,ds,Wl="เราจะเห็นได้ว่าถ้าเราจะป้อนข้อมูลเข้าไปทีละสองประโยค โมเดลจะต้องการรับข้อมูลในรูปของ <code>[CLS] ประโยคที่หนึ่ง [SEP] ประโยคที่สอง [SEP]</code> ซึ่งถ้าเราไปเรียงให้ตรงกับ <code>token_type_ids</code> เราจะได้:",ze,Js,Ve,hs,El="คุณจะเห็นได้ว่า input ในส่วนที่ตรงกับ <code>[CLS] ประโยคที่หนึ่ง [SEP]</code> จะมี token type ID มีค่าเป็น 0 ทั้งหมด ในขณะที่ input ส่วนที่เหลือซึ่งตรงกับ <code>ประโยคที่สอง [SEP]</code> จะมี token type ID มีค่าเป็น 1 ทั้งหมด",We,Us,Hl="ควรระวังไว้ว่า ถ้าคุณเลือก checkpoint อื่น ผลลัพธ์จากการ tokenize อาจจะไม่มี token_type_ids อยู่ด้วยก็ได้ (ยกตัวอย่างเช่น ถ้าคุณเลือกโมเดล DistilBERT ผลลัพธ์จากการ tokenize จะไม่มี token_type_ids) การ tokenize จะให้ token_type_ids ออกมาก็ต่อเมื่อโมเดลนั้นรู้ว่าต้องจัดการกับมันอย่างไร เพราะโมเดลเคยเห็นข้อมูลนี้มาแล้วในช่วง pretraining",Ee,fs,Sl='ในตัวอย่างนี้ โมเดล BERT ผ่านการ pretrain มาด้วย token type IDs แล้ว และนอกเหนือไปจากเป้าหมายในการเทรนให้โมเดลสามารถเติมคำที่ถูกปิดไว้ (masked langauge modeling objective) ที่เราได้คุยกันใน <a href="/course/chapter1">Chapter 1</a> โมเดล BERT ยังมีอีกเป้าหมายหนึ่งที่เรียกว่า <em>next sentence prediction</em> (การทำนายประโยคถัดไป) โดยมีเป้าหมายในการทำแบบจำลองความสัมพันธ์ระหว่างคู่ของประโยคต่าง ๆ',He,bs,Yl="ในการทำให้โมเดลสามารถบรรลุเป้าหมายการทำนายประโยคถัดไป ได้มีการป้อนคู่ของประโยคที่ถูกปิดไว้อย่างสุ่มจำนวนมาก (pairs of sentences with randomly masked tokens) เข้าไปในโมเดล แล้วให้โมเดลทำนายว่าประโยคที่สองเป็นประโยคที่ตามหลังประโยคแรกหรือไม่ เพื่อไม่ให้โมเดลเรียนรู้เฉพาะประโยคที่เรียงตามกันเพียงอย่างเดียว จึงมีการแบ่งข้อมูลให้ครึ่งหนึ่งของคู่ประโยคทั้งหมด เป็นประโยคที่เรียงตามกันจริง ๆ เหมือนในเอกสารต้นฉบับ และอีกครึ่งหนึ่งเป็นคู่ประโยคที่เกิดจากสองประโยคที่มาจากเอกสารคนละชิ้นกัน",Se,Ts,Fl="โดยทั่วไปแล้ว คุณไม่ต้องกังวลว่าจะมีข้อมูล <code>token_type_ids</code> ในผลลัพธ์จากการ toknize หรือไม่ ตราบเท่าที่คุณเลือกให้ tokenizer และโมเดลใช้ checkpoint ตัวเดียวกัน เพราะถ้า tokenizer รู้ว่าต้องป้อนข้อมูลอะไรเข้าโมเดล ก็จะไม่เกิดปัญหาใด ๆ",Ye,ws,Dl='ตอนนี้เราก็ได้เห็นแล้วว่า 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 ได้ดังนี้:',Fe,ks,De,$s,ql='ซึ่งการเขียนคำสั่งแบบนี้ก็ได้ผลลัพธ์ที่ถูกต้อง แต่จะมีจุดด้อยคือการทำแบบนี้จะได้ผลลัพธ์ออกมาเป็น 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 ได้)',qe,_s,Ll='เพื่อให้ข้อมูลของเรายังเป็นข้อมูลชนิด 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 ข้อมูลของเรากันก่อน:',Le,Cs,Pe,gs,Pl='ฟังก์ชั่นนี้จะรับ 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 ซึ่งจะทำงานได้รวดเร็วมากหากคุณป้อนข้อมูลเข้าไปจำนวนมากพร้อม ๆ กัน',Ke,xs,Kl="ควรสังเกตว่าเรายังไม่ได้ใส่อากิวเมนต์ <code>padding</code> เข้ามาในฟังก์ชั่น tokenize ของเราตอนนี้ เนื่องจากการเติม (padding) ข้อมูลทุก ๆ ตัวอย่างให้มีความยาวเท่ากับประโยคที่มีความยาวมากสุดนั้นไม่ค่อยมีประสิทธิภาพเท่าไรนัก วิธีการที่ดีกว่าคือให้เราเติม (pad) ข้อมูลเมื่อเรากำลังสร้าง batch ขึ้นมา ซึ่งเราก็จะต้องเติมให้ข้อมูลมีความยาวเท่ากับประโยคที่ยาวที่สุดใน batch นั้น ๆ ก็พอ ไม่จำเป็นต้องเติมให้ยาวเท่ากับประโยคที่ยาวที่สุดในทั้งชุดข้อมูล การทำเช่นนี้จะช่วยประหยัดเวลาและพลังในการประมวลผลได้อย่างมาก แม้ input ของเราจะมีความยาวที่แตกต่างกันมากก็ตาม!",Oe,Is,Ol="ต่อไปนี้คือวิธีการใช้ฟังก์ชั่น tokenize ให้ทำงานกับข้อมูลใน dataset ทุกชุดของเราในคราวเดียว โดยเราจะใส่ <code>batched=True</code> ตอนที่ call เมธอด <code>map</code> เพื่อให้ฟังก์ชั่นทำงานกับ elements หลาย ๆ ตัวใน dataset ของเราในคราวเดียว (ไม่ได้ทำทีละ element แยกกัน) ซึ่งการทำเช่นนี้จะช่วยให้เราประมวลผลข้อมูลได้เร็วขึ้นมาก",sl,Rs,el,Zs,st="ไลบรารี่ 🤗 Datasets จะทำการประมวลผลนี้โดยการเพิ่ม fields ใหม่เข้าไปยัง datasets ของเรา โดยเพิ่ม field ให้กับแต่ละ key ของ dictionary ที่ได้ออกมาจากฟังก์ชั่นประมวลผลของเรา",ll,Ns,tl,As,et="นอกจากนี้คุณยังสามารถใช้ multiprocessing ตอนที่คุณใช้ฟังก์ชั่น preprocess ของคุณกับ <code>map()</code> ได้โดยการใส่อากิวเมนต์ <code>num_proc</code> แต่ที่เราไม่ได้ทำให้ดูตรงนี้ เนื่องจากไลบรารี่ 🤗 Tokenizers นั้นมีการใช้ multiple threads เพื่อให้การ tokenize ตัวอย่างของเราเร็วขึ้นอยู่แล้ว แต่ถ้าคุณไม่ได้ใช้ fast tokenizer ที่เขียนไว้ในไลบรารี่นี้ การใช้ multiprocessing ก็อาจจะช่วยให้การประมวลผลชุดข้อมูลของคุณเร็วขึ้นได้",nl,Qs,lt="<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 ค่าใหม่ออกมา",al,Gs,tt="ขั้นตอนสุดท้ายที่ต้องทำก็คือการเติมชุดข้อมูลตัวอย่างของเราให้มีความยาวเท่ากับข้อมูลตัวที่มีความยาวมากที่สุดใน batch ซึ่งเทคนิคเราจะเรียกว่า <em>dynamic padding</em> (การเติมแบบพลวัต)",pl,vs,il,Bs,rl,ne,Xs,nt="ในทางปฏิบัติแล้ว เราจะต้องสร้างฟังก์ชั่น collate ที่จะทำการเติมข้อมูลในแต่ละ batch ของ dataset ด้วยจำนวนที่ถูกต้อง ซึ่งโชคดีที่ไลบรารี่ 🤗 Transformers ได้เตรียมฟังก์ชั่นนี้ไว้ให้แล้วในโมดูล <code>DataCollatorWithPadding</code> โดยจะรับข้อมูลเป็น tokenier (เพื่อให้รู้ว่าจะต้องเติมด้วย paddin token อะไร และเพื่อให้รู้ว่าโมเดลคาดหวังว่าจะต้องเติมไปทางซ้ายหรือทางขวามือของข้อมูล) และจะทำขั้นตอนทุกอย่างที่คุณต้องการ:",cl,N,A,ae,zs,at="เพื่อจะทดสอบของเล่นชิ้นใหม่นี้ ลองเลือกข้อมูลบางส่วนจากชุดข้อมูล training ของเรามาทดลองสร้างเป็น batch ซึ่งตรงนี้เราจะเอาคอลัมน์ idx, sentence1 และ sentence2 ออกไปเนื่องจากเราไม่จำเป็นต้องใช้ อีกทั้งคอลัมน์เหล่านี้ยังมี strings (ซึ่งเราไม่สามารถใช้ strings ในการสร้าง tensor ได้) แล้วลองดูความยาวของข้อมูลแต่ละตัวใน batch ของเรา:",Ml,Vs,ol,Ws,ul,Es,pt="เราเลือกได้ข้อมูลที่มีความยาวต่าง ๆ กัน ตั้งแต่ 32 ไปถึง 67 (ซึ่งก็ไม่น่าประหลาดใจอะไร) การทำ Dynamic padding ควรที่จะเติมข้อมูลทุกตัวใน batch นี้ให้มีความยาวเท่ากันเท่ากับ 67 (ซึ่งเป็นความยาวของข้อมูลที่ยาวที่สุดใน batch นี้) ถ้าไม่มีการทำ dynamic padding เราก็จะต้องเติมข้อมูลให้ยาวเท่ากับข้อมูลที่ยาวที่สุดใน dataset หรือไม่ก็เท่ากับความยาวสูงสุดที่โมเดลจะรับได้ ลองมาตรวจสอบกันดูว่า <code>data_collator</code> ของเรานั้นได้ทำการเติมแบบพลวัตให้กับข้อมูลใน batch ของเราอย่างถูกต้องเหมาะสม:",yl,Hs,ml,Q,G,pe,W,jl,ie,Ss,dl,re,Jl;T=new vt({props:{fw:f[0]}}),k=new fl({props:{title:"การประมวลผลข้อมูล",local:"การประมวลผลขอมล",headingTag:"h1"}});const it=[zt,Xt],Ys=[];function rt(s,e){return s[0]==="pt"?0:1}b=rt(f),_=Ys[b]=it[b](f);const ct=[Wt,Vt],Fs=[];function Mt(s,e){return s[0]==="pt"?0:1}C=Mt(f),g=Fs[C]=ct[C](f),S=new fl({props:{title:"วิธีการโหลดชุดข้อมูลจาก Hub",local:"วธการโหลดชดขอมลจาก-hub",headingTag:"h3"}});const ot=[Ht,Et],Ds=[];function ut(s,e){return s[0]==="pt"?0:1}x=ut(f),I=Ds[x]=ot[x](f),X=new Ul({props:{$$slots:{default:[St]},$$scope:{ctx:f}}}),D=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">"glue"</span>, <span class="hljs-string">"mrpc"</span>) | |
| raw_datasets`,wrap:!1}}),q=new w({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ3NlbnRlbmNlMSclMkMlMjAnc2VudGVuY2UyJyUyQyUyMCdsYWJlbCclMkMlMjAnaWR4JyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwMzY2OCUwQSUyMCUyMCUyMCUyMCU3RCklMEElMjAlMjAlMjAlMjB2YWxpZGF0aW9uJTNBJTIwRGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidzZW50ZW5jZTEnJTJDJTIwJ3NlbnRlbmNlMiclMkMlMjAnbGFiZWwnJTJDJTIwJ2lkeCclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDQwOCUwQSUyMCUyMCUyMCUyMCU3RCklMEElMjAlMjAlMjAlMjB0ZXN0JTNBJTIwRGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidzZW50ZW5jZTEnJTJDJTIwJ3NlbnRlbmNlMiclMkMlMjAnbGFiZWwnJTJDJTIwJ2lkeCclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDE3MjUlMEElMjAlMjAlMjAlMjAlN0QpJTBBJTdEKQ==",highlighted:`DatasetDict({ | |
| train: Dataset({ | |
| features: [<span class="hljs-string">'sentence1'</span>, <span class="hljs-string">'sentence2'</span>, <span class="hljs-string">'label'</span>, <span class="hljs-string">'idx'</span>], | |
| num_rows: <span class="hljs-number">3668</span> | |
| }) | |
| validation: Dataset({ | |
| features: [<span class="hljs-string">'sentence1'</span>, <span class="hljs-string">'sentence2'</span>, <span class="hljs-string">'label'</span>, <span class="hljs-string">'idx'</span>], | |
| num_rows: <span class="hljs-number">408</span> | |
| }) | |
| test: Dataset({ | |
| features: [<span class="hljs-string">'sentence1'</span>, <span class="hljs-string">'sentence2'</span>, <span class="hljs-string">'label'</span>, <span class="hljs-string">'idx'</span>], | |
| num_rows: <span class="hljs-number">1725</span> | |
| }) | |
| })`,wrap:!1}}),O=new w({props:{code:"cmF3X3RyYWluX2RhdGFzZXQlMjAlM0QlMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCUwQXJhd190cmFpbl9kYXRhc2V0JTVCMCU1RA==",highlighted:`raw_train_dataset = raw_datasets[<span class="hljs-string">"train"</span>] | |
| raw_train_dataset[<span class="hljs-number">0</span>]`,wrap:!1}}),ss=new w({props:{code:"JTdCJ2lkeCclM0ElMjAwJTJDJTBBJTIwJ2xhYmVsJyUzQSUyMDElMkMlMEElMjAnc2VudGVuY2UxJyUzQSUyMCdBbXJvemklMjBhY2N1c2VkJTIwaGlzJTIwYnJvdGhlciUyMCUyQyUyMHdob20lMjBoZSUyMGNhbGxlZCUyMCUyMiUyMHRoZSUyMHdpdG5lc3MlMjAlMjIlMjAlMkMlMjBvZiUyMGRlbGliZXJhdGVseSUyMGRpc3RvcnRpbmclMjBoaXMlMjBldmlkZW5jZSUyMC4nJTJDJTBBJTIwJ3NlbnRlbmNlMiclM0ElMjAnUmVmZXJyaW5nJTIwdG8lMjBoaW0lMjBhcyUyMG9ubHklMjAlMjIlMjB0aGUlMjB3aXRuZXNzJTIwJTIyJTIwJTJDJTIwQW1yb3ppJTIwYWNjdXNlZCUyMGhpcyUyMGJyb3RoZXIlMjBvZiUyMGRlbGliZXJhdGVseSUyMGRpc3RvcnRpbmclMjBoaXMlMjBldmlkZW5jZSUyMC4nJTdE",highlighted:`{<span class="hljs-string">'idx'</span>: <span class="hljs-number">0</span>, | |
| <span class="hljs-string">'label'</span>: <span class="hljs-number">1</span>, | |
| <span class="hljs-string">'sentence1'</span>: <span class="hljs-string">'Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .'</span>, | |
| <span class="hljs-string">'sentence2'</span>: <span class="hljs-string">'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .'</span>}`,wrap:!1}}),ls=new w({props:{code:"cmF3X3RyYWluX2RhdGFzZXQuZmVhdHVyZXM=",highlighted:"raw_train_dataset.features",wrap:!1}}),ts=new w({props:{code:"JTdCJ3NlbnRlbmNlMSclM0ElMjBWYWx1ZShkdHlwZSUzRCdzdHJpbmcnJTJDJTIwaWQlM0ROb25lKSUyQyUwQSUyMCdzZW50ZW5jZTInJTNBJTIwVmFsdWUoZHR5cGUlM0Qnc3RyaW5nJyUyQyUyMGlkJTNETm9uZSklMkMlMEElMjAnbGFiZWwnJTNBJTIwQ2xhc3NMYWJlbChudW1fY2xhc3NlcyUzRDIlMkMlMjBuYW1lcyUzRCU1Qidub3RfZXF1aXZhbGVudCclMkMlMjAnZXF1aXZhbGVudCclNUQlMkMlMjBuYW1lc19maWxlJTNETm9uZSUyQyUyMGlkJTNETm9uZSklMkMlMEElMjAnaWR4JyUzQSUyMFZhbHVlKGR0eXBlJTNEJ2ludDMyJyUyQyUyMGlkJTNETm9uZSklN0Q=",highlighted:`{<span class="hljs-string">'sentence1'</span>: Value(dtype=<span class="hljs-string">'string'</span>, <span class="hljs-built_in">id</span>=<span class="hljs-literal">None</span>), | |
| <span class="hljs-string">'sentence2'</span>: Value(dtype=<span class="hljs-string">'string'</span>, <span class="hljs-built_in">id</span>=<span class="hljs-literal">None</span>), | |
| <span class="hljs-string">'label'</span>: ClassLabel(num_classes=<span class="hljs-number">2</span>, names=[<span class="hljs-string">'not_equivalent'</span>, <span class="hljs-string">'equivalent'</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">'idx'</span>: Value(dtype=<span class="hljs-string">'int32'</span>, <span class="hljs-built_in">id</span>=<span class="hljs-literal">None</span>)}`,wrap:!1}}),z=new Ul({props:{$$slots:{default:[Yt]},$$scope:{ctx:f}}}),as=new fl({props:{title:"การประมวลผลชุดข้อมูล",local:"การประมวลผลชดขอมล",headingTag:"h3"}});const yt=[Dt,Ft],qs=[];function mt(s,e){return s[0]==="pt"?0:1}R=mt(f),Z=qs[R]=yt[R](f),is=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">"bert-base-uncased"</span> | |
| tokenizer = AutoTokenizer.from_pretrained(checkpoint) | |
| tokenized_sentences_1 = tokenizer(raw_datasets[<span class="hljs-string">"train"</span>][<span class="hljs-string">"sentence1"</span>]) | |
| tokenized_sentences_2 = tokenizer(raw_datasets[<span class="hljs-string">"train"</span>][<span class="hljs-string">"sentence2"</span>])`,wrap:!1}}),cs=new w({props:{code:"aW5wdXRzJTIwJTNEJTIwdG9rZW5pemVyKCUyMlRoaXMlMjBpcyUyMHRoZSUyMGZpcnN0JTIwc2VudGVuY2UuJTIyJTJDJTIwJTIyVGhpcyUyMGlzJTIwdGhlJTIwc2Vjb25kJTIwb25lLiUyMiklMEFpbnB1dHM=",highlighted:`inputs = tokenizer(<span class="hljs-string">"This is the first sentence."</span>, <span class="hljs-string">"This is the second one."</span>) | |
| inputs`,wrap:!1}}),Ms=new w({props:{code:"JTdCJTIwJTBBJTIwJTIwJ2lucHV0X2lkcyclM0ElMjAlNUIxMDElMkMlMjAyMDIzJTJDJTIwMjAwMyUyQyUyMDE5OTYlMkMlMjAyMDM0JTJDJTIwNjI1MSUyQyUyMDEwMTIlMkMlMjAxMDIlMkMlMjAyMDIzJTJDJTIwMjAwMyUyQyUyMDE5OTYlMkMlMjAyMTE3JTJDJTIwMjAyOCUyQyUyMDEwMTIlMkMlMjAxMDIlNUQlMkMlMEElMjAlMjAndG9rZW5fdHlwZV9pZHMnJTNBJTIwJTVCMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTVEJTJDJTBBJTIwJTIwJ2F0dGVudGlvbl9tYXNrJyUzQSUyMCU1QjElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElMkMlMjAxJTJDJTIwMSU1RCUwQSU3RA==",highlighted:`{ | |
| <span class="hljs-string">'input_ids'</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">'token_type_ids'</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">'attention_mask'</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}}),V=new Ul({props:{$$slots:{default:[qt]},$$scope:{ctx:f}}}),ys=new w({props:{code:"dG9rZW5pemVyLmNvbnZlcnRfaWRzX3RvX3Rva2VucyhpbnB1dHMlNUIlMjJpbnB1dF9pZHMlMjIlNUQp",highlighted:'tokenizer.convert_ids_to_tokens(inputs[<span class="hljs-string">"input_ids"</span>])',wrap:!1}}),js=new w({props:{code:"JTVCJyU1QkNMUyU1RCclMkMlMjAndGhpcyclMkMlMjAnaXMnJTJDJTIwJ3RoZSclMkMlMjAnZmlyc3QnJTJDJTIwJ3NlbnRlbmNlJyUyQyUyMCcuJyUyQyUyMCclNUJTRVAlNUQnJTJDJTIwJ3RoaXMnJTJDJTIwJ2lzJyUyQyUyMCd0aGUnJTJDJTIwJ3NlY29uZCclMkMlMjAnb25lJyUyQyUyMCcuJyUyQyUyMCclNUJTRVAlNUQnJTVE",highlighted:'[<span class="hljs-string">'[CLS]'</span>, <span class="hljs-string">'this'</span>, <span class="hljs-string">'is'</span>, <span class="hljs-string">'the'</span>, <span class="hljs-string">'first'</span>, <span class="hljs-string">'sentence'</span>, <span class="hljs-string">'.'</span>, <span class="hljs-string">'[SEP]'</span>, <span class="hljs-string">'this'</span>, <span class="hljs-string">'is'</span>, <span class="hljs-string">'the'</span>, <span class="hljs-string">'second'</span>, <span class="hljs-string">'one'</span>, <span class="hljs-string">'.'</span>, <span class="hljs-string">'[SEP]'</span>]',wrap:!1}}),Js=new w({props:{code:"JTVCJyU1QkNMUyU1RCclMkMlMjAndGhpcyclMkMlMjAnaXMnJTJDJTIwJ3RoZSclMkMlMjAnZmlyc3QnJTJDJTIwJ3NlbnRlbmNlJyUyQyUyMCcuJyUyQyUyMCclNUJTRVAlNUQnJTJDJTIwJ3RoaXMnJTJDJTIwJ2lzJyUyQyUyMCd0aGUnJTJDJTIwJ3NlY29uZCclMkMlMjAnb25lJyUyQyUyMCcuJyUyQyUyMCclNUJTRVAlNUQnJTVEJTBBJTVCJTIwJTIwJTIwJTIwJTIwJTIwMCUyQyUyMCUyMCUyMCUyMCUyMCUyMDAlMkMlMjAlMjAlMjAlMjAwJTJDJTIwJTIwJTIwJTIwJTIwMCUyQyUyMCUyMCUyMCUyMCUyMCUyMCUyMDAlMkMlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAwJTJDJTIwJTIwJTIwMCUyQyUyMCUyMCUyMCUyMCUyMCUyMCUyMDAlMkMlMjAlMjAlMjAlMjAlMjAlMjAxJTJDJTIwJTIwJTIwJTIwMSUyQyUyMCUyMCUyMCUyMCUyMDElMkMlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxJTJDJTIwJTIwJTIwJTIwJTIwMSUyQyUyMCUyMCUyMDElMkMlMjAlMjAlMjAlMjAlMjAlMjAlMjAxJTVE",highlighted:`[<span class="hljs-string">'[CLS]'</span>, <span class="hljs-string">'this'</span>, <span class="hljs-string">'is'</span>, <span class="hljs-string">'the'</span>, <span class="hljs-string">'first'</span>, <span class="hljs-string">'sentence'</span>, <span class="hljs-string">'.'</span>, <span class="hljs-string">'[SEP]'</span>, <span class="hljs-string">'this'</span>, <span class="hljs-string">'is'</span>, <span class="hljs-string">'the'</span>, <span class="hljs-string">'second'</span>, <span class="hljs-string">'one'</span>, <span class="hljs-string">'.'</span>, <span class="hljs-string">'[SEP]'</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}}),ks=new w({props:{code:"dG9rZW5pemVkX2RhdGFzZXQlMjAlM0QlMjB0b2tlbml6ZXIoJTBBJTIwJTIwJTIwJTIwcmF3X2RhdGFzZXRzJTVCJTIydHJhaW4lMjIlNUQlNUIlMjJzZW50ZW5jZTElMjIlNUQlMkMlMEElMjAlMjAlMjAlMjByYXdfZGF0YXNldHMlNUIlMjJ0cmFpbiUyMiU1RCU1QiUyMnNlbnRlbmNlMiUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMHBhZGRpbmclM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwdHJ1bmNhdGlvbiUzRFRydWUlMkMlMEEp",highlighted:`tokenized_dataset = tokenizer( | |
| raw_datasets[<span class="hljs-string">"train"</span>][<span class="hljs-string">"sentence1"</span>], | |
| raw_datasets[<span class="hljs-string">"train"</span>][<span class="hljs-string">"sentence2"</span>], | |
| padding=<span class="hljs-literal">True</span>, | |
| truncation=<span class="hljs-literal">True</span>, | |
| )`,wrap:!1}}),Cs=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">"sentence1"</span>], example[<span class="hljs-string">"sentence2"</span>], truncation=<span class="hljs-literal">True</span>)`,wrap:!1}}),Rs=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}}),Ns=new w({props:{code:"RGF0YXNldERpY3QoJTdCJTBBJTIwJTIwJTIwJTIwdHJhaW4lM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2F0dGVudGlvbl9tYXNrJyUyQyUyMCdpZHgnJTJDJTIwJ2lucHV0X2lkcyclMkMlMjAnbGFiZWwnJTJDJTIwJ3NlbnRlbmNlMSclMkMlMjAnc2VudGVuY2UyJyUyQyUyMCd0b2tlbl90eXBlX2lkcyclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDM2NjglMEElMjAlMjAlMjAlMjAlN0QpJTBBJTIwJTIwJTIwJTIwdmFsaWRhdGlvbiUzQSUyMERhdGFzZXQoJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZmVhdHVyZXMlM0ElMjAlNUInYXR0ZW50aW9uX21hc2snJTJDJTIwJ2lkeCclMkMlMjAnaW5wdXRfaWRzJyUyQyUyMCdsYWJlbCclMkMlMjAnc2VudGVuY2UxJyUyQyUyMCdzZW50ZW5jZTInJTJDJTIwJ3Rva2VuX3R5cGVfaWRzJyU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwNDA4JTBBJTIwJTIwJTIwJTIwJTdEKSUwQSUyMCUyMCUyMCUyMHRlc3QlM0ElMjBEYXRhc2V0KCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZlYXR1cmVzJTNBJTIwJTVCJ2F0dGVudGlvbl9tYXNrJyUyQyUyMCdpZHgnJTJDJTIwJ2lucHV0X2lkcyclMkMlMjAnbGFiZWwnJTJDJTIwJ3NlbnRlbmNlMSclMkMlMjAnc2VudGVuY2UyJyUyQyUyMCd0b2tlbl90eXBlX2lkcyclNUQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDE3MjUlMEElMjAlMjAlMjAlMjAlN0QpJTBBJTdEKQ==",highlighted:`DatasetDict({ | |
| train: Dataset({ | |
| features: [<span class="hljs-string">'attention_mask'</span>, <span class="hljs-string">'idx'</span>, <span class="hljs-string">'input_ids'</span>, <span class="hljs-string">'label'</span>, <span class="hljs-string">'sentence1'</span>, <span class="hljs-string">'sentence2'</span>, <span class="hljs-string">'token_type_ids'</span>], | |
| num_rows: <span class="hljs-number">3668</span> | |
| }) | |
| validation: Dataset({ | |
| features: [<span class="hljs-string">'attention_mask'</span>, <span class="hljs-string">'idx'</span>, <span class="hljs-string">'input_ids'</span>, <span class="hljs-string">'label'</span>, <span class="hljs-string">'sentence1'</span>, <span class="hljs-string">'sentence2'</span>, <span class="hljs-string">'token_type_ids'</span>], | |
| num_rows: <span class="hljs-number">408</span> | |
| }) | |
| test: Dataset({ | |
| features: [<span class="hljs-string">'attention_mask'</span>, <span class="hljs-string">'idx'</span>, <span class="hljs-string">'input_ids'</span>, <span class="hljs-string">'label'</span>, <span class="hljs-string">'sentence1'</span>, <span class="hljs-string">'sentence2'</span>, <span class="hljs-string">'token_type_ids'</span>], | |
| num_rows: <span class="hljs-number">1725</span> | |
| }) | |
| })`,wrap:!1}}),vs=new fl({props:{title:"Dynamic padding (การเติมแบบพลวัต)",local:"dynamic-padding-การเตมแบบพลวต",headingTag:"h3"}}),Bs=new ce({props:{id:"7q5NyFT8REg"}});function jt(s,e){return s[0]==="pt"?Pt:Lt}let hl=jt(f),B=hl(f);const dt=[Ot,Kt],Ls=[];function Jt(s,e){return s[0]==="pt"?0:1}N=Jt(f),A=Ls[N]=dt[N](f),Vs=new w({props:{code:"c2FtcGxlcyUyMCUzRCUyMHRva2VuaXplZF9kYXRhc2V0cyU1QiUyMnRyYWluJTIyJTVEJTVCJTNBOCU1RCUwQXNhbXBsZXMlMjAlM0QlMjAlN0JrJTNBJTIwdiUyMGZvciUyMGslMkMlMjB2JTIwaW4lMjBzYW1wbGVzLml0ZW1zKCklMjBpZiUyMGslMjBub3QlMjBpbiUyMCU1QiUyMmlkeCUyMiUyQyUyMCUyMnNlbnRlbmNlMSUyMiUyQyUyMCUyMnNlbnRlbmNlMiUyMiU1RCU3RCUwQSU1Qmxlbih4KSUyMGZvciUyMHglMjBpbiUyMHNhbXBsZXMlNUIlMjJpbnB1dF9pZHMlMjIlNUQlNUQ=",highlighted:`samples = tokenized_datasets[<span class="hljs-string">"train"</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">"idx"</span>, <span class="hljs-string">"sentence1"</span>, <span class="hljs-string">"sentence2"</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">"input_ids"</span>]]`,wrap:!1}}),Ws=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}}),Hs=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 ht=[en,sn],Ps=[];function Ut(s,e){return s[0]==="tf"?0:1}Q=Ut(f),G=Ps[Q]=ht[Q](f),W=new Ul({props:{$$slots:{default:[ln]},$$scope:{ctx:f}}});let $=f[0]==="tf"&&Ct();return Ss=new Bt({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(),d(T.$$.fragment),o=i(),d(k.$$.fragment),v=i(),_.c(),se=i(),g.c(),ee=i(),E=y("p"),E.textContent=gl,Me=i(),H=y("p"),H.innerHTML=xl,oe=i(),d(S.$$.fragment),ue=i(),I.c(),le=i(),Y=y("p"),Y.innerHTML=Il,ye=i(),F=y("p"),F.textContent=Rl,me=i(),d(X.$$.fragment),je=i(),d(D.$$.fragment),de=i(),d(q.$$.fragment),Je=i(),L=y("p"),L.innerHTML=Zl,he=i(),P=y("p"),P.innerHTML=Nl,Ue=i(),K=y("p"),K.innerHTML=Al,fe=i(),d(O.$$.fragment),be=i(),d(ss.$$.fragment),Te=i(),es=y("p"),es.innerHTML=Ql,we=i(),d(ls.$$.fragment),ke=i(),d(ts.$$.fragment),$e=i(),ns=y("p"),ns.innerHTML=Gl,_e=i(),d(z.$$.fragment),Ce=i(),d(as.$$.fragment),ge=i(),Z.c(),te=i(),ps=y("p"),ps.innerHTML=vl,xe=i(),d(is.$$.fragment),Ie=i(),rs=y("p"),rs.textContent=Bl,Re=i(),d(cs.$$.fragment),Ze=i(),d(Ms.$$.fragment),Ne=i(),os=y("p"),os.innerHTML=Xl,Ae=i(),d(V.$$.fragment),Qe=i(),us=y("p"),us.innerHTML=zl,Ge=i(),d(ys.$$.fragment),ve=i(),ms=y("p"),ms.textContent=Vl,Be=i(),d(js.$$.fragment),Xe=i(),ds=y("p"),ds.innerHTML=Wl,ze=i(),d(Js.$$.fragment),Ve=i(),hs=y("p"),hs.innerHTML=El,We=i(),Us=y("p"),Us.textContent=Hl,Ee=i(),fs=y("p"),fs.innerHTML=Sl,He=i(),bs=y("p"),bs.textContent=Yl,Se=i(),Ts=y("p"),Ts.innerHTML=Fl,Ye=i(),ws=y("p"),ws.innerHTML=Dl,Fe=i(),d(ks.$$.fragment),De=i(),$s=y("p"),$s.innerHTML=ql,qe=i(),_s=y("p"),_s.innerHTML=Ll,Le=i(),d(Cs.$$.fragment),Pe=i(),gs=y("p"),gs.innerHTML=Pl,Ke=i(),xs=y("p"),xs.innerHTML=Kl,Oe=i(),Is=y("p"),Is.innerHTML=Ol,sl=i(),d(Rs.$$.fragment),el=i(),Zs=y("p"),Zs.textContent=st,ll=i(),d(Ns.$$.fragment),tl=i(),As=y("p"),As.innerHTML=et,nl=i(),Qs=y("p"),Qs.innerHTML=lt,al=i(),Gs=y("p"),Gs.innerHTML=tt,pl=i(),d(vs.$$.fragment),il=i(),d(Bs.$$.fragment),rl=i(),B.c(),ne=i(),Xs=y("p"),Xs.innerHTML=nt,cl=i(),A.c(),ae=i(),zs=y("p"),zs.textContent=at,Ml=i(),d(Vs.$$.fragment),ol=i(),d(Ws.$$.fragment),ul=i(),Es=y("p"),Es.innerHTML=pt,yl=i(),d(Hs.$$.fragment),ml=i(),G.c(),pe=i(),d(W.$$.fragment),jl=i(),$&&$.c(),ie=i(),d(Ss.$$.fragment),dl=i(),re=y("p"),this.h()},l(s){const e=Nt("svelte-u9bgzb",document.head);l=m(e,"META",{name:!0,content:!0}),e.forEach(n),p=r(s),t=m(s,"P",{}),$t(t).forEach(n),c=r(s),J(T.$$.fragment,s),o=r(s),J(k.$$.fragment,s),v=r(s),_.l(s),se=r(s),g.l(s),ee=r(s),E=m(s,"P",{"data-svelte-h":!0}),j(E)!=="svelte-1x0uuug"&&(E.textContent=gl),Me=r(s),H=m(s,"P",{"data-svelte-h":!0}),j(H)!=="svelte-l34a0i"&&(H.innerHTML=xl),oe=r(s),J(S.$$.fragment,s),ue=r(s),I.l(s),le=r(s),Y=m(s,"P",{"data-svelte-h":!0}),j(Y)!=="svelte-5kjdet"&&(Y.innerHTML=Il),ye=r(s),F=m(s,"P",{"data-svelte-h":!0}),j(F)!=="svelte-1frmeq1"&&(F.textContent=Rl),me=r(s),J(X.$$.fragment,s),je=r(s),J(D.$$.fragment,s),de=r(s),J(q.$$.fragment,s),Je=r(s),L=m(s,"P",{"data-svelte-h":!0}),j(L)!=="svelte-1p2l4nq"&&(L.innerHTML=Zl),he=r(s),P=m(s,"P",{"data-svelte-h":!0}),j(P)!=="svelte-128v4um"&&(P.innerHTML=Nl),Ue=r(s),K=m(s,"P",{"data-svelte-h":!0}),j(K)!=="svelte-379gh7"&&(K.innerHTML=Al),fe=r(s),J(O.$$.fragment,s),be=r(s),J(ss.$$.fragment,s),Te=r(s),es=m(s,"P",{"data-svelte-h":!0}),j(es)!=="svelte-85u0vh"&&(es.innerHTML=Ql),we=r(s),J(ls.$$.fragment,s),ke=r(s),J(ts.$$.fragment,s),$e=r(s),ns=m(s,"P",{"data-svelte-h":!0}),j(ns)!=="svelte-fn52g3"&&(ns.innerHTML=Gl),_e=r(s),J(z.$$.fragment,s),Ce=r(s),J(as.$$.fragment,s),ge=r(s),Z.l(s),te=r(s),ps=m(s,"P",{"data-svelte-h":!0}),j(ps)!=="svelte-17otmwf"&&(ps.innerHTML=vl),xe=r(s),J(is.$$.fragment,s),Ie=r(s),rs=m(s,"P",{"data-svelte-h":!0}),j(rs)!=="svelte-108r3z"&&(rs.textContent=Bl),Re=r(s),J(cs.$$.fragment,s),Ze=r(s),J(Ms.$$.fragment,s),Ne=r(s),os=m(s,"P",{"data-svelte-h":!0}),j(os)!=="svelte-1fuy27o"&&(os.innerHTML=Xl),Ae=r(s),J(V.$$.fragment,s),Qe=r(s),us=m(s,"P",{"data-svelte-h":!0}),j(us)!=="svelte-u24s3p"&&(us.innerHTML=zl),Ge=r(s),J(ys.$$.fragment,s),ve=r(s),ms=m(s,"P",{"data-svelte-h":!0}),j(ms)!=="svelte-fyhuw7"&&(ms.textContent=Vl),Be=r(s),J(js.$$.fragment,s),Xe=r(s),ds=m(s,"P",{"data-svelte-h":!0}),j(ds)!=="svelte-oi73g0"&&(ds.innerHTML=Wl),ze=r(s),J(Js.$$.fragment,s),Ve=r(s),hs=m(s,"P",{"data-svelte-h":!0}),j(hs)!=="svelte-f2h3e9"&&(hs.innerHTML=El),We=r(s),Us=m(s,"P",{"data-svelte-h":!0}),j(Us)!=="svelte-15t697f"&&(Us.textContent=Hl),Ee=r(s),fs=m(s,"P",{"data-svelte-h":!0}),j(fs)!=="svelte-1ezbpr6"&&(fs.innerHTML=Sl),He=r(s),bs=m(s,"P",{"data-svelte-h":!0}),j(bs)!=="svelte-1h246f5"&&(bs.textContent=Yl),Se=r(s),Ts=m(s,"P",{"data-svelte-h":!0}),j(Ts)!=="svelte-1dqlxg0"&&(Ts.innerHTML=Fl),Ye=r(s),ws=m(s,"P",{"data-svelte-h":!0}),j(ws)!=="svelte-1rx0s16"&&(ws.innerHTML=Dl),Fe=r(s),J(ks.$$.fragment,s),De=r(s),$s=m(s,"P",{"data-svelte-h":!0}),j($s)!=="svelte-teohu1"&&($s.innerHTML=ql),qe=r(s),_s=m(s,"P",{"data-svelte-h":!0}),j(_s)!=="svelte-dwfma7"&&(_s.innerHTML=Ll),Le=r(s),J(Cs.$$.fragment,s),Pe=r(s),gs=m(s,"P",{"data-svelte-h":!0}),j(gs)!=="svelte-nxfcwb"&&(gs.innerHTML=Pl),Ke=r(s),xs=m(s,"P",{"data-svelte-h":!0}),j(xs)!=="svelte-flbh3n"&&(xs.innerHTML=Kl),Oe=r(s),Is=m(s,"P",{"data-svelte-h":!0}),j(Is)!=="svelte-1wkepm8"&&(Is.innerHTML=Ol),sl=r(s),J(Rs.$$.fragment,s),el=r(s),Zs=m(s,"P",{"data-svelte-h":!0}),j(Zs)!=="svelte-b5c00r"&&(Zs.textContent=st),ll=r(s),J(Ns.$$.fragment,s),tl=r(s),As=m(s,"P",{"data-svelte-h":!0}),j(As)!=="svelte-194dkwz"&&(As.innerHTML=et),nl=r(s),Qs=m(s,"P",{"data-svelte-h":!0}),j(Qs)!=="svelte-1yulgc2"&&(Qs.innerHTML=lt),al=r(s),Gs=m(s,"P",{"data-svelte-h":!0}),j(Gs)!=="svelte-1aq5zsd"&&(Gs.innerHTML=tt),pl=r(s),J(vs.$$.fragment,s),il=r(s),J(Bs.$$.fragment,s),rl=r(s),B.l(s),ne=r(s),Xs=m(s,"P",{"data-svelte-h":!0}),j(Xs)!=="svelte-j66kwv"&&(Xs.innerHTML=nt),cl=r(s),A.l(s),ae=r(s),zs=m(s,"P",{"data-svelte-h":!0}),j(zs)!=="svelte-sxp3sh"&&(zs.textContent=at),Ml=r(s),J(Vs.$$.fragment,s),ol=r(s),J(Ws.$$.fragment,s),ul=r(s),Es=m(s,"P",{"data-svelte-h":!0}),j(Es)!=="svelte-omjm79"&&(Es.innerHTML=pt),yl=r(s),J(Hs.$$.fragment,s),ml=r(s),G.l(s),pe=r(s),J(W.$$.fragment,s),jl=r(s),$&&$.l(s),ie=r(s),J(Ss.$$.fragment,s),dl=r(s),re=m(s,"P",{}),$t(re).forEach(n),this.h()},h(){_t(l,"name","hf:doc:metadata"),_t(l,"content",nn)},m(s,e){At(document.head,l),a(s,p,e),a(s,t,e),a(s,c,e),h(T,s,e),a(s,o,e),h(k,s,e),a(s,v,e),Ys[b].m(s,e),a(s,se,e),Fs[C].m(s,e),a(s,ee,e),a(s,E,e),a(s,Me,e),a(s,H,e),a(s,oe,e),h(S,s,e),a(s,ue,e),Ds[x].m(s,e),a(s,le,e),a(s,Y,e),a(s,ye,e),a(s,F,e),a(s,me,e),h(X,s,e),a(s,je,e),h(D,s,e),a(s,de,e),h(q,s,e),a(s,Je,e),a(s,L,e),a(s,he,e),a(s,P,e),a(s,Ue,e),a(s,K,e),a(s,fe,e),h(O,s,e),a(s,be,e),h(ss,s,e),a(s,Te,e),a(s,es,e),a(s,we,e),h(ls,s,e),a(s,ke,e),h(ts,s,e),a(s,$e,e),a(s,ns,e),a(s,_e,e),h(z,s,e),a(s,Ce,e),h(as,s,e),a(s,ge,e),qs[R].m(s,e),a(s,te,e),a(s,ps,e),a(s,xe,e),h(is,s,e),a(s,Ie,e),a(s,rs,e),a(s,Re,e),h(cs,s,e),a(s,Ze,e),h(Ms,s,e),a(s,Ne,e),a(s,os,e),a(s,Ae,e),h(V,s,e),a(s,Qe,e),a(s,us,e),a(s,Ge,e),h(ys,s,e),a(s,ve,e),a(s,ms,e),a(s,Be,e),h(js,s,e),a(s,Xe,e),a(s,ds,e),a(s,ze,e),h(Js,s,e),a(s,Ve,e),a(s,hs,e),a(s,We,e),a(s,Us,e),a(s,Ee,e),a(s,fs,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),h(ks,s,e),a(s,De,e),a(s,$s,e),a(s,qe,e),a(s,_s,e),a(s,Le,e),h(Cs,s,e),a(s,Pe,e),a(s,gs,e),a(s,Ke,e),a(s,xs,e),a(s,Oe,e),a(s,Is,e),a(s,sl,e),h(Rs,s,e),a(s,el,e),a(s,Zs,e),a(s,ll,e),h(Ns,s,e),a(s,tl,e),a(s,As,e),a(s,nl,e),a(s,Qs,e),a(s,al,e),a(s,Gs,e),a(s,pl,e),h(vs,s,e),a(s,il,e),h(Bs,s,e),a(s,rl,e),B.m(s,e),a(s,ne,e),a(s,Xs,e),a(s,cl,e),Ls[N].m(s,e),a(s,ae,e),a(s,zs,e),a(s,Ml,e),h(Vs,s,e),a(s,ol,e),h(Ws,s,e),a(s,ul,e),a(s,Es,e),a(s,yl,e),h(Hs,s,e),a(s,ml,e),Ps[Q].m(s,e),a(s,pe,e),h(W,s,e),a(s,jl,e),$&&$.m(s,e),a(s,ie,e),h(Ss,s,e),a(s,dl,e),a(s,re,e),Jl=!0},p(s,[e]){const ft={};e&1&&(ft.fw=s[0]),T.$set(ft);let bl=b;b=rt(s),b!==bl&&(Os(),u(Ys[bl],1,1,()=>{Ys[bl]=null}),Ks(),_=Ys[b],_||(_=Ys[b]=it[b](s),_.c()),M(_,1),_.m(se.parentNode,se));let Tl=C;C=Mt(s),C!==Tl&&(Os(),u(Fs[Tl],1,1,()=>{Fs[Tl]=null}),Ks(),g=Fs[C],g||(g=Fs[C]=ct[C](s),g.c()),M(g,1),g.m(ee.parentNode,ee));let wl=x;x=ut(s),x!==wl&&(Os(),u(Ds[wl],1,1,()=>{Ds[wl]=null}),Ks(),I=Ds[x],I||(I=Ds[x]=ot[x](s),I.c()),M(I,1),I.m(le.parentNode,le));const bt={};e&2&&(bt.$$scope={dirty:e,ctx:s}),X.$set(bt);const Tt={};e&2&&(Tt.$$scope={dirty:e,ctx:s}),z.$set(Tt);let kl=R;R=mt(s),R!==kl&&(Os(),u(qs[kl],1,1,()=>{qs[kl]=null}),Ks(),Z=qs[R],Z||(Z=qs[R]=yt[R](s),Z.c()),M(Z,1),Z.m(te.parentNode,te));const wt={};e&2&&(wt.$$scope={dirty:e,ctx:s}),V.$set(wt),hl!==(hl=jt(s))&&(B.d(1),B=hl(s),B&&(B.c(),B.m(ne.parentNode,ne)));let $l=N;N=Jt(s),N!==$l&&(Os(),u(Ls[$l],1,1,()=>{Ls[$l]=null}),Ks(),A=Ls[N],A||(A=Ls[N]=dt[N](s),A.c()),M(A,1),A.m(ae.parentNode,ae));let _l=Q;Q=Ut(s),Q!==_l&&(Os(),u(Ps[_l],1,1,()=>{Ps[_l]=null}),Ks(),G=Ps[Q],G||(G=Ps[Q]=ht[Q](s),G.c()),M(G,1),G.m(pe.parentNode,pe));const kt={};e&2&&(kt.$$scope={dirty:e,ctx:s}),W.$set(kt),s[0]==="tf"?$?e&1&&M($,1):($=Ct(),$.c(),M($,1),$.m(ie.parentNode,ie)):$&&(Os(),u($,1,1,()=>{$=null}),Ks())},i(s){Jl||(M(T.$$.fragment,s),M(k.$$.fragment,s),M(_),M(g),M(S.$$.fragment,s),M(I),M(X.$$.fragment,s),M(D.$$.fragment,s),M(q.$$.fragment,s),M(O.$$.fragment,s),M(ss.$$.fragment,s),M(ls.$$.fragment,s),M(ts.$$.fragment,s),M(z.$$.fragment,s),M(as.$$.fragment,s),M(Z),M(is.$$.fragment,s),M(cs.$$.fragment,s),M(Ms.$$.fragment,s),M(V.$$.fragment,s),M(ys.$$.fragment,s),M(js.$$.fragment,s),M(Js.$$.fragment,s),M(ks.$$.fragment,s),M(Cs.$$.fragment,s),M(Rs.$$.fragment,s),M(Ns.$$.fragment,s),M(vs.$$.fragment,s),M(Bs.$$.fragment,s),M(A),M(Vs.$$.fragment,s),M(Ws.$$.fragment,s),M(Hs.$$.fragment,s),M(G),M(W.$$.fragment,s),M($),M(Ss.$$.fragment,s),Jl=!0)},o(s){u(T.$$.fragment,s),u(k.$$.fragment,s),u(_),u(g),u(S.$$.fragment,s),u(I),u(X.$$.fragment,s),u(D.$$.fragment,s),u(q.$$.fragment,s),u(O.$$.fragment,s),u(ss.$$.fragment,s),u(ls.$$.fragment,s),u(ts.$$.fragment,s),u(z.$$.fragment,s),u(as.$$.fragment,s),u(Z),u(is.$$.fragment,s),u(cs.$$.fragment,s),u(Ms.$$.fragment,s),u(V.$$.fragment,s),u(ys.$$.fragment,s),u(js.$$.fragment,s),u(Js.$$.fragment,s),u(ks.$$.fragment,s),u(Cs.$$.fragment,s),u(Rs.$$.fragment,s),u(Ns.$$.fragment,s),u(vs.$$.fragment,s),u(Bs.$$.fragment,s),u(A),u(Vs.$$.fragment,s),u(Ws.$$.fragment,s),u(Hs.$$.fragment,s),u(G),u(W.$$.fragment,s),u($),u(Ss.$$.fragment,s),Jl=!1},d(s){s&&(n(p),n(t),n(c),n(o),n(v),n(se),n(ee),n(E),n(Me),n(H),n(oe),n(ue),n(le),n(Y),n(ye),n(F),n(me),n(je),n(de),n(Je),n(L),n(he),n(P),n(Ue),n(K),n(fe),n(be),n(Te),n(es),n(we),n(ke),n($e),n(ns),n(_e),n(Ce),n(ge),n(te),n(ps),n(xe),n(Ie),n(rs),n(Re),n(Ze),n(Ne),n(os),n(Ae),n(Qe),n(us),n(Ge),n(ve),n(ms),n(Be),n(Xe),n(ds),n(ze),n(Ve),n(hs),n(We),n(Us),n(Ee),n(fs),n(He),n(bs),n(Se),n(Ts),n(Ye),n(ws),n(Fe),n(De),n($s),n(qe),n(_s),n(Le),n(Pe),n(gs),n(Ke),n(xs),n(Oe),n(Is),n(sl),n(el),n(Zs),n(ll),n(tl),n(As),n(nl),n(Qs),n(al),n(Gs),n(pl),n(il),n(rl),n(ne),n(Xs),n(cl),n(ae),n(zs),n(Ml),n(ol),n(ul),n(Es),n(yl),n(ml),n(pe),n(jl),n(ie),n(dl),n(re)),n(l),U(T,s),U(k,s),Ys[b].d(s),Fs[C].d(s),U(S,s),Ds[x].d(s),U(X,s),U(D,s),U(q,s),U(O,s),U(ss,s),U(ls,s),U(ts,s),U(z,s),U(as,s),qs[R].d(s),U(is,s),U(cs,s),U(Ms,s),U(V,s),U(ys,s),U(js,s),U(Js,s),U(ks,s),U(Cs,s),U(Rs,s),U(Ns,s),U(vs,s),U(Bs,s),B.d(s),Ls[N].d(s),U(Vs,s),U(Ws,s),U(Hs,s),Ps[Q].d(s),U(W,s),$&&$.d(s),U(Ss,s)}}}const nn='{"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 an(f,l,p){let t="pt";return It(()=>{const c=new URLSearchParams(window.location.search);p(0,t=c.get("fw")||"pt")}),[t]}class jn extends Rt{constructor(l){super(),Zt(this,l,an,tn,xt,{})}}export{jn as component}; | |
Xet Storage Details
- Size:
- 84.8 kB
- Xet hash:
- 2601d66a44789eb746a30dc9650a1e7630aa599f0f8a64da1381c4cdae0f82d9
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.