import{s as _l,o as bl}from"../chunks/scheduler.37c15a92.js";import{S as dl,i as Jl,g as M,s as c,r as d,A as Cl,h as _,f as r,c as p,j as fl,u as J,x as b,k as ml,y as Ul,a as i,v as C,t as f,b as Te,d as m,w as U,p as ge}from"../chunks/index.2bf4358c.js";import{Y as ul}from"../chunks/Youtube.1e50a667.js";import{C as w}from"../chunks/CodeBlock.4f5fc1ad.js";import{C as Ml}from"../chunks/CourseFloatingBanner.15ba07e6.js";import{F as $l}from"../chunks/FrameworkSwitchCourse.8d4d4ab6.js";import{H as xe}from"../chunks/Heading.8ada512a.js";function yl(u){let l,s;return l=new Ml({props:{chapter:2,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/chapter2/section3_tf.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/th/chapter2/section3_tf.ipynb"}]}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,o){C(l,t,o),s=!0},i(t){s||(m(l.$$.fragment,t),s=!0)},o(t){f(l.$$.fragment,t),s=!1},d(t){U(l,t)}}}function wl(u){let l,s;return l=new Ml({props:{chapter:2,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/chapter2/section3_pt.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/th/chapter2/section3_pt.ipynb"}]}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,o){C(l,t,o),s=!0},i(t){s||(m(l.$$.fragment,t),s=!0)},o(t){f(l.$$.fragment,t),s=!1},d(t){U(l,t)}}}function kl(u){let l,s;return l=new ul({props:{id:"d3JVgghSOew"}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,o){C(l,t,o),s=!0},i(t){s||(m(l.$$.fragment,t),s=!0)},o(t){f(l.$$.fragment,t),s=!1},d(t){U(l,t)}}}function Tl(u){let l,s;return l=new ul({props:{id:"AhChOFRegn4"}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,o){C(l,t,o),s=!0},i(t){s||(m(l.$$.fragment,t),s=!0)},o(t){f(l.$$.fragment,t),s=!1},d(t){U(l,t)}}}function gl(u){let l,s="ใน section นี้เราจะมาดูวิธีการสร้างและการใช้งานโมเดล เราจะใช้คลาส <code>TFAutoModel</code> ซึ่งเป็นประโยชน์มากหากเราต้องการสร้างโมเดลใดๆ จาก checkpoint หนึ่งๆ",t,o,$="คลาส <code>TFAutoModel</code> และส่วนประกอบของมันทั้งหมดนั้น จริงๆแล้วก็เป็นเพียง wrapper ของโมเดลต่างๆที่มีอยู่ใน library มันเป็น wrapper ที่ฉลาดโดยที่มันสามารถเดาสถาปัตยกรรมของโมเดลที่เหมาะสมสำหรับ checkpoint ของคุณได้ และสร้างโมเดลด้วยสถาปัตยกรรมนั้น";return{c(){l=M("p"),l.innerHTML=s,t=c(),o=M("p"),o.innerHTML=$},l(a){l=_(a,"P",{"data-svelte-h":!0}),b(l)!=="svelte-fk2xs6"&&(l.innerHTML=s),t=p(a),o=_(a,"P",{"data-svelte-h":!0}),b(o)!=="svelte-1eu6r0e"&&(o.innerHTML=$)},m(a,y){i(a,l,y),i(a,t,y),i(a,o,y)},d(a){a&&(r(l),r(t),r(o))}}}function hl(u){let l,s="ใน section นี้ เราจะมาดูวิธีการสร้างและการใช้งานโมเดล เราจะใช้คลาส <code>AutoModel</code> ซึ่งเป็นประโยชน์มากหากเราต้องการสร้างโมเดลใดๆ จาก checkpoint หนึ่งๆ",t,o,$="คลาส <code>AutoModel</code> และส่วนประกอบของมันทั้งหมดนั้น จริงๆแล้วก็เป็นเพียง wrapper ของโมเดลต่างๆที่มีอยู่ใน library มันเป็น wrapper ที่ฉลาดโดยที่มันสามารถเดาสถาปัตยกรรมของโมเดลที่เหมาะสมสำหรับ checkpoint ของคุณได้ และสร้างโมเดลด้วยสถาปัตยกรรมนั้น";return{c(){l=M("p"),l.innerHTML=s,t=c(),o=M("p"),o.innerHTML=$},l(a){l=_(a,"P",{"data-svelte-h":!0}),b(l)!=="svelte-tm8gzo"&&(l.innerHTML=s),t=p(a),o=_(a,"P",{"data-svelte-h":!0}),b(o)!=="svelte-fxdzdo"&&(o.innerHTML=$)},m(a,y){i(a,l,y),i(a,t,y),i(a,o,y)},d(a){a&&(r(l),r(t),r(o))}}}function Vl(u){let l,s;return l=new w({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEJlcnRDb25maWclMkMlMjBURkJlcnRNb2RlbCUwQSUwQSUyMyUyMEJ1aWxkaW5nJTIwdGhlJTIwY29uZmlnJTBBY29uZmlnJTIwJTNEJTIwQmVydENvbmZpZygpJTBBJTBBJTIzJTIwQnVpbGRpbmclMjB0aGUlMjBtb2RlbCUyMGZyb20lMjB0aGUlMjBjb25maWclMEFtb2RlbCUyMCUzRCUyMFRGQmVydE1vZGVsKGNvbmZpZyk=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> BertConfig, TFBertModel

<span class="hljs-comment"># Building the config</span>
config = BertConfig()

<span class="hljs-comment"># Building the model from the config</span>
model = TFBertModel(config)`,wrap:!1}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,o){C(l,t,o),s=!0},i(t){s||(m(l.$$.fragment,t),s=!0)},o(t){f(l.$$.fragment,t),s=!1},d(t){U(l,t)}}}function jl(u){let l,s;return l=new w({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEJlcnRDb25maWclMkMlMjBCZXJ0TW9kZWwlMEElMEElMjMlMjBCdWlsZGluZyUyMHRoZSUyMGNvbmZpZyUwQWNvbmZpZyUyMCUzRCUyMEJlcnRDb25maWcoKSUwQSUwQSUyMyUyMEJ1aWxkaW5nJTIwdGhlJTIwbW9kZWwlMjBmcm9tJTIwdGhlJTIwY29uZmlnJTBBbW9kZWwlMjAlM0QlMjBCZXJ0TW9kZWwoY29uZmlnKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> BertConfig, BertModel

<span class="hljs-comment"># Building the config</span>
config = BertConfig()

<span class="hljs-comment"># Building the model from the config</span>
model = BertModel(config)`,wrap:!1}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,o){C(l,t,o),s=!0},i(t){s||(m(l.$$.fragment,t),s=!0)},o(t){f(l.$$.fragment,t),s=!1},d(t){U(l,t)}}}function Il(u){let l,s;return l=new w({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEJlcnRDb25maWclMkMlMjBURkJlcnRNb2RlbCUwQSUwQWNvbmZpZyUyMCUzRCUyMEJlcnRDb25maWcoKSUwQW1vZGVsJTIwJTNEJTIwVEZCZXJ0TW9kZWwoY29uZmlnKSUwQSUwQSUyMyUyMCVFMCVCOSU4MiVFMCVCOCVBMSVFMCVCOSU4MCVFMCVCOCU5NCVFMCVCOCVBNSVFMCVCOCU5NiVFMCVCOCVCOSVFMCVCOCU4MSVFMCVCOCU4MSVFMCVCOCVCMyVFMCVCOCVBQiVFMCVCOCU5OSVFMCVCOCU5NCVFMCVCOCU4NCVFMCVCOSU4OCVFMCVCOCVCMiVFMCVCOSU4MCVFMCVCOCVBMyVFMCVCOCVCNCVFMCVCOSU4OCVFMCVCOCVBMSVFMCVCOCU5NSVFMCVCOSU4OSVFMCVCOCU5OSVFMCVCOCU5NCVFMCVCOSU4OSVFMCVCOCVBNyVFMCVCOCVBMiVFMCVCOCU4MSVFMCVCOCVCMiVFMCVCOCVBMyVFMCVCOCVBQSVFMCVCOCVCOCVFMCVCOSU4OCVFMCVCOCVBMSE=",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> BertConfig, TFBertModel

config = BertConfig()
model = TFBertModel(config)

<span class="hljs-comment"># โมเดลถูกกำหนดค่าเริ่มต้นด้วยการสุ่ม!</span>`,wrap:!1}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,o){C(l,t,o),s=!0},i(t){s||(m(l.$$.fragment,t),s=!0)},o(t){f(l.$$.fragment,t),s=!1},d(t){U(l,t)}}}function vl(u){let l,s;return l=new w({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEJlcnRDb25maWclMkMlMjBCZXJ0TW9kZWwlMEElMEFjb25maWclMjAlM0QlMjBCZXJ0Q29uZmlnKCklMEFtb2RlbCUyMCUzRCUyMEJlcnRNb2RlbChjb25maWcpJTBBJTBBJTIzJTIwJUUwJUI5JTgyJUUwJUI4JUExJUUwJUI5JTgwJUUwJUI4JTk0JUUwJUI4JUE1JUUwJUI4JTk2JUUwJUI4JUI5JUUwJUI4JTgxJUUwJUI4JTgxJUUwJUI4JUIzJUUwJUI4JUFCJUUwJUI4JTk5JUUwJUI4JTk0JUUwJUI4JTg0JUUwJUI5JTg4JUUwJUI4JUIyJUUwJUI5JTgwJUUwJUI4JUEzJUUwJUI4JUI0JUUwJUI5JTg4JUUwJUI4JUExJUUwJUI4JTk1JUUwJUI5JTg5JUUwJUI4JTk5JUUwJUI4JTk0JUUwJUI5JTg5JUUwJUI4JUE3JUUwJUI4JUEyJUUwJUI4JTgxJUUwJUI4JUIyJUUwJUI4JUEzJUUwJUI4JUFBJUUwJUI4JUI4JUUwJUI5JTg4JUUwJUI4JUExIQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> BertConfig, BertModel

config = BertConfig()
model = BertModel(config)

<span class="hljs-comment"># โมเดลถูกกำหนดค่าเริ่มต้นด้วยการสุ่ม!</span>`,wrap:!1}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,o){C(l,t,o),s=!0},i(t){s||(m(l.$$.fragment,t),s=!0)},o(t){f(l.$$.fragment,t),s=!1},d(t){U(l,t)}}}function Bl(u){let l,s,t,o="เหมือนที่คุณเห็นก่อนหน้านี้ เราสามารถที่จะแทนค่า <code>TFBertModel</code> ด้วยคลาส <code>TFAutoModel</code> ที่คล้ายคลึงกัน จากนี้ไปเราจะใช้วิธีการนี้เพื่อเป็นการสร้างโค้ด checkpoint-agnostic; ถ้าโค้ดของคุณสามารถใช้งานได้กับหนึ่ง checkpoint มันก็ควรที่จะสามารถใช้กับอันอื่นได้ด้วย ซึ่งก็รวมถึง ไม่ว่าสถาปัตยกรรมจะแตกต่างกัน ตราบใดที่ checkpoint นั้นถูกเทรนมาสำหรับงานที่เหมือนกันก็ควรใช้ได้เหมือนกัน (ยกตัวอย่างเช่น งาน sentiment analysis)",$;return l=new w({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRGQmVydE1vZGVsJTBBJTBBbW9kZWwlMjAlM0QlMjBURkJlcnRNb2RlbC5mcm9tX3ByZXRyYWluZWQoJTIyYmVydC1iYXNlLWNhc2VkJTIyKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> TFBertModel

model = TFBertModel.from_pretrained(<span class="hljs-string">&quot;bert-base-cased&quot;</span>)`,wrap:!1}}),{c(){d(l.$$.fragment),s=c(),t=M("p"),t.innerHTML=o},l(a){J(l.$$.fragment,a),s=p(a),t=_(a,"P",{"data-svelte-h":!0}),b(t)!=="svelte-nyx661"&&(t.innerHTML=o)},m(a,y){C(l,a,y),i(a,s,y),i(a,t,y),$=!0},i(a){$||(m(l.$$.fragment,a),$=!0)},o(a){f(l.$$.fragment,a),$=!1},d(a){a&&(r(s),r(t)),U(l,a)}}}function Zl(u){let l,s,t,o="เหมือนที่คุณเห็นก่อนหน้านี้ เราสามารถที่จะแทนค่า <code>BertModel</code> ด้วยคลาส AutoModel` ที่คล้ายคลึงกัน จากนี้ไปเราจะใช้วิธีการนี้เพื่อเป็นการสร้างโค้ด checkpoint-agnostic; ถ้าโค้ดของคุณสามารถใช้งานได้กับหนึ่ง checkpoint มันก็ควรที่จะสามารถใช้กับอันอื่นได้ด้วย ซึ่งก็รวมถึง ไม่ว่าสถาปัตยกรรมจะแตกต่างกัน ตราบใดที่ checkpoint นั้นถูกเทรนมาสำหรับงานที่เหมือนกันก็ควรใช้ได้เหมือนกัน (ยกตัวอย่างเช่น งาน sentiment analysis)",$;return l=new w({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEJlcnRNb2RlbCUwQSUwQW1vZGVsJTIwJTNEJTIwQmVydE1vZGVsLmZyb21fcHJldHJhaW5lZCglMjJiZXJ0LWJhc2UtY2FzZWQlMjIp",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> BertModel

model = BertModel.from_pretrained(<span class="hljs-string">&quot;bert-base-cased&quot;</span>)`,wrap:!1}}),{c(){d(l.$$.fragment),s=c(),t=M("p"),t.innerHTML=o},l(a){J(l.$$.fragment,a),s=p(a),t=_(a,"P",{"data-svelte-h":!0}),b(t)!=="svelte-o3ioay"&&(t.innerHTML=o)},m(a,y){C(l,a,y),i(a,s,y),i(a,t,y),$=!0},i(a){$||(m(l.$$.fragment,a),$=!0)},o(a){f(l.$$.fragment,a),$=!1},d(a){a&&(r(s),r(t)),U(l,a)}}}function El(u){let l,s;return l=new w({props:{code:"bHMlMjBkaXJlY3Rvcnlfb25fbXlfY29tcHV0ZXIlMEElMEFjb25maWcuanNvbiUyMHRmX21vZGVsLmg1",highlighted:`ls <span class="hljs-keyword">directory_on_my_computer
</span>
<span class="hljs-built_in">config</span>.<span class="hljs-keyword">json </span>tf_model.h5`,wrap:!1}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,o){C(l,t,o),s=!0},i(t){s||(m(l.$$.fragment,t),s=!0)},o(t){f(l.$$.fragment,t),s=!1},d(t){U(l,t)}}}function Wl(u){let l,s;return l=new w({props:{code:"bHMlMjBkaXJlY3Rvcnlfb25fbXlfY29tcHV0ZXIlMEElMEFjb25maWcuanNvbiUyMHB5dG9yY2hfbW9kZWwuYmlu",highlighted:`ls <span class="hljs-keyword">directory_on_my_computer
</span>
<span class="hljs-built_in">config</span>.<span class="hljs-keyword">json </span>pytorch_model.<span class="hljs-keyword">bin</span>`,wrap:!1}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,o){C(l,t,o),s=!0},i(t){s||(m(l.$$.fragment,t),s=!0)},o(t){f(l.$$.fragment,t),s=!1},d(t){U(l,t)}}}function xl(u){let l,s="ไฟล์ <em>tf_model.h5</em> เป็นที่รู้จักในนาม <em>state dictionary</em>; มันประกอบด้วย weights ทัั้งหมดของโมเดลคุณ  สองไฟล์ที่มีความเชื่อมโยงกัน ไฟล์ configuration จำเป็นที่จะต้องรู้สถาปัตยกรรมของโมเดลของคุณ ในขณะที่ weights ของโมเดลคุณ ก็คือ ตัวแปร(parameters) ของโมเดลคุณ";return{c(){l=M("p"),l.innerHTML=s},l(t){l=_(t,"P",{"data-svelte-h":!0}),b(l)!=="svelte-18aat1m"&&(l.innerHTML=s)},m(t,o){i(t,l,o)},d(t){t&&r(l)}}}function Fl(u){let l,s="ไฟล์ <em>pytorch_model.bin</em> เป็นที่รู้จักในนาม <em>state dictionary</em>; มันประกอบด้วย weights ทัั้งหมดของโมเดลคุณ  สองไฟล์ที่มีความเชื่อมโยงกัน ไฟล์ configuration จำเป็นที่จะต้องรู้สถาปัตยกรรมของโมเดลของคุณ ในขณะที่ weights ของโมเดลคุณ ก็คือ ตัวแปร(parameters) ของโมเดลคุณ";return{c(){l=M("p"),l.innerHTML=s},l(t){l=_(t,"P",{"data-svelte-h":!0}),b(l)!=="svelte-13s37qj"&&(l.innerHTML=s)},m(t,o){i(t,l,o)},d(t){t&&r(l)}}}function Rl(u){let l,s;return l=new w({props:{code:"aW1wb3J0JTIwdGVuc29yZmxvdyUyMGFzJTIwdGYlMEElMEFtb2RlbF9pbnB1dHMlMjAlM0QlMjB0Zi5jb25zdGFudChlbmNvZGVkX3NlcXVlbmNlcyk=",highlighted:`<span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf

model_inputs = tf.constant(encoded_sequences)`,wrap:!1}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,o){C(l,t,o),s=!0},i(t){s||(m(l.$$.fragment,t),s=!0)},o(t){f(l.$$.fragment,t),s=!1},d(t){U(l,t)}}}function Hl(u){let l,s;return l=new w({props:{code:"aW1wb3J0JTIwdG9yY2glMEElMEFtb2RlbF9pbnB1dHMlMjAlM0QlMjB0b3JjaC50ZW5zb3IoZW5jb2RlZF9zZXF1ZW5jZXMp",highlighted:`<span class="hljs-keyword">import</span> torch

model_inputs = torch.tensor(encoded_sequences)`,wrap:!1}}),{c(){d(l.$$.fragment)},l(t){J(l.$$.fragment,t)},m(t,o){C(l,t,o),s=!0},i(t){s||(m(l.$$.fragment,t),s=!0)},o(t){f(l.$$.fragment,t),s=!1},d(t){U(l,t)}}}function Nl(u){let l,s,t,o,$,a,y,Re,k,T,he,g,h,Ve,je,N,ht="แต่อย่างไรก็ตาม ถ้าคุณรู้ว่าคุณต้องการใช้โมเดลประเภทใด คุณสามารถใช้คลาสที่นิยามสถาปัตยกรรมนั้นได้โดยตรง เรามาดูกันว่ามันทำงานยังไงกับโมเดล BERT",He,O,Ne,S,Vt="สิ่งแรกที่เราจำเป็นต้องทำในการเริ่มสร้างโมเดล BERT นั้นก็คือการโหลดวัตถุกำหนดค่า(configuration object):",Oe,V,j,Ie,G,jt="ใน configuration นั้นประกอบด้วยค่าของคุณสมบัติ(attributes) หลายอย่างๆ ที่ใช้สำหรับสร้างโมเดล:",Se,z,Ge,Q,ze,L,It="ในขณะที่คุณยังไม่เห็นว่าคุณสมบัติต่างๆ เหล่าทำอะไรบ้าง คุณน่าจะพอจำบางส่วนได้: <code>hidden_size</code> ที่นิยามขนาดของเวคเตอร์ <code>hidden_states</code>, และ <code>num_hidden_layers</code> ที่นิยามจำนวนของเลเยอร์ที่โมเดล Transformer มี",Qe,A,Le,q,vt="สร้างโมเดลจาก configuration พื้นฐาน และตั้งค่าเริ่มต้นด้วยค่าสุ่ม(random values):",Ae,I,v,ve,P,Bt='โมเดลสามารถอยู่ในสถานะนี้ได้ แต่มันจะให้ผลลัพธ์ที่แย่ออกมา; มันจำเป็นต้องผ่านการเรียนรู้ก่อน เราสามารถเทรนโมเดลจากโมเดลเปล่าๆ กับงานที่เรามีได้ แต่อย่างที่คุณเห็นใน <a href="/course/chapter1">Chapter 1</a>, มันใช้เวลานานและข้อมูลจำนวนมาก โดยที่ไม่ได้มีประโยชน์อะไรเพิ่มขึ้นมาก เพื่อลดขึ้นตอนที่ไม่จำเป็นต่างๆ มันสำคัญอย่างยิ่งที่เราจะสามารถแชร์และนำโมเดลที่ผ่านการเทรนมาแล้วมาใช้ใหม่',qe,X,Zt="การโหลดโมเดล Transformer ที่ผ่านการเทรนมาแล้วนั้นง่ายมาก เราสามารถเรียกใช้ <code>from_pretrained()</code>:",Pe,B,Z,Be,Y,Et='ในตัวอย่างโค้ดด้านบน เราไม่ได้ใช้ <code>BertConfig</code>, แต่ใช้งานโมเดลที่ผ่านการเทรนมาแล้ว(pretrained) ผ่าน <code>bert-base-cased</code> identifier ซึ่งนี่เป็น checkpoint ของโมเดลที่โดนเทรนด้วยผู้ที่ประดิษฐ์ BERT เอง; คุณสามารถดูรายละเอียดเพิ่มเติมได้ที่ <a href="https://huggingface.co/bert-base-cased" rel="nofollow">model card</a>.',Xe,D,Wt="ถึงตอนนี้โมเดลนี้ได้ถูกสร้างและมีค่าตั้งต้นเท่ากับ weights ของ checkpoint มันสามารถถูกนำไปใช้สำหรับการอนุมาน(inference)ได้ทันทีกับงานที่มันถูกเทรนมา และมันสามารถถูกนำมาปรับจูนเพิ่มเติมให้เข้ากับงานใหม่ได้ การเทรนโมเดลที่ใช้ weights ของโมเดลที่ผ่านการเทรนมาแล้ว แทนที่การเทรนจากไม่มีอะไรเลยนั้น ทำให้เราได้ผลลัพธ์ที่ดีในเวลาอันรวดเร็ว",Ye,K,xt="weights ได้ถูกดาวน์โหลด และ เก็บไว้ในโฟลเดอร์ cache(เมื่อเราทำการเรียกใช้งาน <code>from_pretrained()</code> อีกในอนาคต weights เหล่านี้จะไม่ถูกดาวน์โหลดซ้ำอีก) โดยโฟลเดอร์มีค่าเริ่มต้น(default) อยู่ที่ <em>~/.cache/huggingface/transformers</em> คุณสามารถปรับเปลี่ยนโฟลเดอร์ cache ได้โดยตั้งค่า <code>HF_HOME</code> ใน environment variable",De,ee,Ft='identifier ที่ใช้สำหรับโหลดโมเดลสามารถใช้ identifier ของโมเดลใดก็ได้บน Model Hub ตราบใดที่มันเข้ากันได้กับสถาปัตยกรรม BERT ลิสท์ของ BERT checkpoints ทั้งหมดที่มีอยู่สามารถดูได้จาก <a href="https://huggingface.co/models?filter=bert" rel="nofollow">ที่นี่</a>.',Ke,te,et,le,Rt="การบันทึกโมเดลนั้นเป็นอะไรง่ายพอๆกับการโหลด - เราใช้ <code>save_pretrained()</code> ซึ่งก็เปรียบเสมือนกับ <code>from_pretrained()</code>:",tt,ne,lt,se,Ht="นี่เป็นการบันทึกสองไฟล์ลงไปที่ฮาร์ดดิสของคุณ:",nt,E,W,Ze,re,Nt="ุุ้ถ้าคุณไปดูที่ไฟล์ <em>config.json</em> คุณจะพอนึกออกถึงคุณสมบัติ(attributes) ที่จำเป็นในการสร้างสถาปัตยกรรมของโมเดล ไฟล์นี้ประกอบด้วย metadata เช่น checkpoint เกิดมาจากที่ใด และ 🤗 Transformers เวอร์ชันใดที่คุณใช้ในการบันทึก checkpoint ล่าสุด",st,Ee,ie,rt,oe,Ot="ุถึงตรงนี้คุณรู้วิธีการโหลดและบันทึกโมเดลแล้ว งั้นมาลองใช้มันทำนายอะไรบางอย่างดูกัน โมดล Transformer นั้นสามารถประมวลผลตัวเลขได้อย่างเดียว ซึ่งตัวเลขเหล่านี้ก็ได้มาจากการสร้างขึ้นมาโดยใช้ tokenizer แต่ก่อนที่เราจะไปอธิบายกันถึง tokenizer เรามาลองค้นหากันดูว่าอินพุตแบบไหนที่สามารถใส่เข้าไปในโมเดลได้บ้าง",it,ae,St="Tokenizers นั้นสามารถที่จะแปลงอินพุตไปเป็น tensors ที่เหมาะสมสำหรับ framework นั้นๆ แต่เพื่อช่วยให้คุณเข้าใจสิ่งที่เกิดขึ้น เราจะมาดูกันว่าอะไรที่จำเป็นต้องทำก่อนที่เราจะส่งอินพุตเข้าไปในโมเดล",ot,ce,Gt="สมมติว่าเรามีคำ สอง สาม คำ:",at,pe,ct,fe,zt="tokenizer จะทำการแปลงคำเหล่านี้ไปเป็นดัชนีคำศัพท์(vocabulary indices) ซึ่งปกติจะเรียกว่า <em>input IDs</em> โดยตอนนี้แต่ละคำกลายเป็นลิสท์ของตัวเลข ผลลัพธ์ที่ได้ก็คือ:",pt,me,ft,ue,Qt="นี่เป็นลิสท์ของคำที่ผ่านการเข้ารหัส(encoded): a list of lists, Tensors สามารถมีขนาดเป็นสี่เหลี่ยมจตุรัสเท่านั้น(ลองนึกถึงแมทริกซ์), “array” นี้มีขนาดเป็นสี่เหลี่ยมจตุรัสอยู่แล้ว ดังนั้นการแปลงมันไปเป็น tensor นั้นง่ายมาก:",mt,x,F,We,Me,ut,_e,Lt="การใช้งาน tensor กับโมเดลนั้นง่ายมากๆ - เราก็แค่เรียกโมเดลพร้อมกับใส่อินพุต:",Mt,be,_t,de,At=`ในขณะที่โมเดลสามารถรับตัวแปร(arguments) ต่างๆได้มากมาย แค่ input IDs เท่านั้นที่จำเป็น เดี๋ยวเราจะอธิบายกันอีกทีว่าตัวแปรตัวอื่นๆเอาไว้ทำอะไร และจำเป็นต้องใช้เมื่อไหร่,
แต่ขั้นแรกเราต้องเข้าใจ Tokenizers ที่ใช้สร้างอินพุตที่โมเดล Transformer สามารถเข้าใจได้ก่อน`,bt,Fe,dt;$=new $l({props:{fw:u[0]}}),y=new xe({props:{title:"โมเดล",local:"โมเดล",headingTag:"h1"}});const qt=[wl,yl],Je=[];function Pt(e,n){return e[0]==="pt"?0:1}k=Pt(u),T=Je[k]=qt[k](u);const Xt=[Tl,kl],Ce=[];function Yt(e,n){return e[0]==="pt"?0:1}g=Yt(u),h=Ce[g]=Xt[g](u);function Dt(e,n){return e[0]==="pt"?hl:gl}let Jt=Dt(u),R=Jt(u);O=new xe({props:{title:"สร้าง Transformer",local:"สราง-transformer",headingTag:"h2"}});const Kt=[jl,Vl],Ue=[];function el(e,n){return e[0]==="pt"?0:1}V=el(u),j=Ue[V]=Kt[V](u),z=new w({props:{code:"cHJpbnQoY29uZmlnKQ==",highlighted:'<span class="hljs-built_in">print</span>(config)',wrap:!1}}),Q=new w({props:{code:"QmVydENvbmZpZyUyMCU3QiUwQSUyMCUyMCU1Qi4uLiU1RCUwQSUyMCUyMCUyMmhpZGRlbl9zaXplJTIyJTNBJTIwNzY4JTJDJTBBJTIwJTIwJTIyaW50ZXJtZWRpYXRlX3NpemUlMjIlM0ElMjAzMDcyJTJDJTBBJTIwJTIwJTIybWF4X3Bvc2l0aW9uX2VtYmVkZGluZ3MlMjIlM0ElMjA1MTIlMkMlMEElMjAlMjAlMjJudW1fYXR0ZW50aW9uX2hlYWRzJTIyJTNBJTIwMTIlMkMlMEElMjAlMjAlMjJudW1faGlkZGVuX2xheWVycyUyMiUzQSUyMDEyJTJDJTBBJTIwJTIwJTVCLi4uJTVEJTBBJTdE",highlighted:`BertConfig {
  [...]
  <span class="hljs-string">&quot;hidden_size&quot;</span>: <span class="hljs-number">768</span>,
  <span class="hljs-string">&quot;intermediate_size&quot;</span>: <span class="hljs-number">3072</span>,
  <span class="hljs-string">&quot;max_position_embeddings&quot;</span>: <span class="hljs-number">512</span>,
  <span class="hljs-string">&quot;num_attention_heads&quot;</span>: <span class="hljs-number">12</span>,
  <span class="hljs-string">&quot;num_hidden_layers&quot;</span>: <span class="hljs-number">12</span>,
  [...]
}`,wrap:!1}}),A=new xe({props:{title:"วิธีการต่างๆในการโหลด",local:"วธการตางๆในการโหลด",headingTag:"h3"}});const tl=[vl,Il],$e=[];function ll(e,n){return e[0]==="pt"?0:1}I=ll(u),v=$e[I]=tl[I](u);const nl=[Zl,Bl],ye=[];function sl(e,n){return e[0]==="pt"?0:1}B=sl(u),Z=ye[B]=nl[B](u),te=new xe({props:{title:"วิธีสำหรับการบันทึก",local:"วธสำหรบการบนทก",headingTag:"h3"}}),ne=new w({props:{code:"bW9kZWwuc2F2ZV9wcmV0cmFpbmVkKCUyMmRpcmVjdG9yeV9vbl9teV9jb21wdXRlciUyMik=",highlighted:'model.save_pretrained(<span class="hljs-string">&quot;directory_on_my_computer&quot;</span>)',wrap:!1}});const rl=[Wl,El],we=[];function il(e,n){return e[0]==="pt"?0:1}E=il(u),W=we[E]=rl[E](u);function ol(e,n){return e[0]==="pt"?Fl:xl}let Ct=ol(u),H=Ct(u);ie=new xe({props:{title:"ใชโมเดล Transformer สำหรับการอนุมาน(inference)",local:"ใชโมเดล-transformer-สำหรบการอนมานinference",headingTag:"h2"}}),pe=new w({props:{code:"c2VxdWVuY2VzJTIwJTNEJTIwJTVCJTIySGVsbG8hJTIyJTJDJTIwJTIyQ29vbC4lMjIlMkMlMjAlMjJOaWNlISUyMiU1RA==",highlighted:'sequences = [<span class="hljs-string">&quot;Hello!&quot;</span>, <span class="hljs-string">&quot;Cool.&quot;</span>, <span class="hljs-string">&quot;Nice!&quot;</span>]',wrap:!1}}),me=new w({props:{code:"ZW5jb2RlZF9zZXF1ZW5jZXMlMjAlM0QlMjAlNUIlMEElMjAlMjAlMjAlMjAlNUIxMDElMkMlMjA3NTkyJTJDJTIwOTk5JTJDJTIwMTAyJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTVCMTAxJTJDJTIwNDY1OCUyQyUyMDEwMTIlMkMlMjAxMDIlNUQlMkMlMEElMjAlMjAlMjAlMjAlNUIxMDElMkMlMjAzODM1JTJDJTIwOTk5JTJDJTIwMTAyJTVEJTJDJTBBJTVE",highlighted:`encoded_sequences = [
    [<span class="hljs-number">101</span>, <span class="hljs-number">7592</span>, <span class="hljs-number">999</span>, <span class="hljs-number">102</span>],
    [<span class="hljs-number">101</span>, <span class="hljs-number">4658</span>, <span class="hljs-number">1012</span>, <span class="hljs-number">102</span>],
    [<span class="hljs-number">101</span>, <span class="hljs-number">3835</span>, <span class="hljs-number">999</span>, <span class="hljs-number">102</span>],
]`,wrap:!1}});const al=[Hl,Rl],ke=[];function cl(e,n){return e[0]==="pt"?0:1}return x=cl(u),F=ke[x]=al[x](u),Me=new xe({props:{title:"ใช้ tensors เป็นอินพุตเข้าไปยังโมเดล",local:"ใช-tensors-เปนอนพตเขาไปยงโมเดล",headingTag:"h3"}}),be=new w({props:{code:"b3V0cHV0JTIwJTNEJTIwbW9kZWwobW9kZWxfaW5wdXRzKQ==",highlighted:"output = model(model_inputs)",wrap:!1}}),{c(){l=M("meta"),s=c(),t=M("p"),o=c(),d($.$$.fragment),a=c(),d(y.$$.fragment),Re=c(),T.c(),he=c(),h.c(),Ve=c(),R.c(),je=c(),N=M("p"),N.textContent=ht,He=c(),d(O.$$.fragment),Ne=c(),S=M("p"),S.textContent=Vt,Oe=c(),j.c(),Ie=c(),G=M("p"),G.textContent=jt,Se=c(),d(z.$$.fragment),Ge=c(),d(Q.$$.fragment),ze=c(),L=M("p"),L.innerHTML=It,Qe=c(),d(A.$$.fragment),Le=c(),q=M("p"),q.textContent=vt,Ae=c(),v.c(),ve=c(),P=M("p"),P.innerHTML=Bt,qe=c(),X=M("p"),X.innerHTML=Zt,Pe=c(),Z.c(),Be=c(),Y=M("p"),Y.innerHTML=Et,Xe=c(),D=M("p"),D.textContent=Wt,Ye=c(),K=M("p"),K.innerHTML=xt,De=c(),ee=M("p"),ee.innerHTML=Ft,Ke=c(),d(te.$$.fragment),et=c(),le=M("p"),le.innerHTML=Rt,tt=c(),d(ne.$$.fragment),lt=c(),se=M("p"),se.textContent=Ht,nt=c(),W.c(),Ze=c(),re=M("p"),re.innerHTML=Nt,st=c(),H.c(),Ee=c(),d(ie.$$.fragment),rt=c(),oe=M("p"),oe.textContent=Ot,it=c(),ae=M("p"),ae.textContent=St,ot=c(),ce=M("p"),ce.textContent=Gt,at=c(),d(pe.$$.fragment),ct=c(),fe=M("p"),fe.innerHTML=zt,pt=c(),d(me.$$.fragment),ft=c(),ue=M("p"),ue.textContent=Qt,mt=c(),F.c(),We=c(),d(Me.$$.fragment),ut=c(),_e=M("p"),_e.textContent=Lt,Mt=c(),d(be.$$.fragment),_t=c(),de=M("p"),de.textContent=At,bt=c(),Fe=M("p"),this.h()},l(e){const n=Cl("svelte-u9bgzb",document.head);l=_(n,"META",{name:!0,content:!0}),n.forEach(r),s=p(e),t=_(e,"P",{}),fl(t).forEach(r),o=p(e),J($.$$.fragment,e),a=p(e),J(y.$$.fragment,e),Re=p(e),T.l(e),he=p(e),h.l(e),Ve=p(e),R.l(e),je=p(e),N=_(e,"P",{"data-svelte-h":!0}),b(N)!=="svelte-1umt4q3"&&(N.textContent=ht),He=p(e),J(O.$$.fragment,e),Ne=p(e),S=_(e,"P",{"data-svelte-h":!0}),b(S)!=="svelte-1mcwioc"&&(S.textContent=Vt),Oe=p(e),j.l(e),Ie=p(e),G=_(e,"P",{"data-svelte-h":!0}),b(G)!=="svelte-1ddii7r"&&(G.textContent=jt),Se=p(e),J(z.$$.fragment,e),Ge=p(e),J(Q.$$.fragment,e),ze=p(e),L=_(e,"P",{"data-svelte-h":!0}),b(L)!=="svelte-1mefga2"&&(L.innerHTML=It),Qe=p(e),J(A.$$.fragment,e),Le=p(e),q=_(e,"P",{"data-svelte-h":!0}),b(q)!=="svelte-ef9ays"&&(q.textContent=vt),Ae=p(e),v.l(e),ve=p(e),P=_(e,"P",{"data-svelte-h":!0}),b(P)!=="svelte-llg1g8"&&(P.innerHTML=Bt),qe=p(e),X=_(e,"P",{"data-svelte-h":!0}),b(X)!=="svelte-w49kl2"&&(X.innerHTML=Zt),Pe=p(e),Z.l(e),Be=p(e),Y=_(e,"P",{"data-svelte-h":!0}),b(Y)!=="svelte-oiqscb"&&(Y.innerHTML=Et),Xe=p(e),D=_(e,"P",{"data-svelte-h":!0}),b(D)!=="svelte-31hwgr"&&(D.textContent=Wt),Ye=p(e),K=_(e,"P",{"data-svelte-h":!0}),b(K)!=="svelte-1m85ixk"&&(K.innerHTML=xt),De=p(e),ee=_(e,"P",{"data-svelte-h":!0}),b(ee)!=="svelte-kqv3sx"&&(ee.innerHTML=Ft),Ke=p(e),J(te.$$.fragment,e),et=p(e),le=_(e,"P",{"data-svelte-h":!0}),b(le)!=="svelte-1xapuix"&&(le.innerHTML=Rt),tt=p(e),J(ne.$$.fragment,e),lt=p(e),se=_(e,"P",{"data-svelte-h":!0}),b(se)!=="svelte-9izvk0"&&(se.textContent=Ht),nt=p(e),W.l(e),Ze=p(e),re=_(e,"P",{"data-svelte-h":!0}),b(re)!=="svelte-c255j6"&&(re.innerHTML=Nt),st=p(e),H.l(e),Ee=p(e),J(ie.$$.fragment,e),rt=p(e),oe=_(e,"P",{"data-svelte-h":!0}),b(oe)!=="svelte-1ctaqwt"&&(oe.textContent=Ot),it=p(e),ae=_(e,"P",{"data-svelte-h":!0}),b(ae)!=="svelte-4me1kk"&&(ae.textContent=St),ot=p(e),ce=_(e,"P",{"data-svelte-h":!0}),b(ce)!=="svelte-1o8yqy2"&&(ce.textContent=Gt),at=p(e),J(pe.$$.fragment,e),ct=p(e),fe=_(e,"P",{"data-svelte-h":!0}),b(fe)!=="svelte-1lfjhco"&&(fe.innerHTML=zt),pt=p(e),J(me.$$.fragment,e),ft=p(e),ue=_(e,"P",{"data-svelte-h":!0}),b(ue)!=="svelte-19qbd7p"&&(ue.textContent=Qt),mt=p(e),F.l(e),We=p(e),J(Me.$$.fragment,e),ut=p(e),_e=_(e,"P",{"data-svelte-h":!0}),b(_e)!=="svelte-12zpsmu"&&(_e.textContent=Lt),Mt=p(e),J(be.$$.fragment,e),_t=p(e),de=_(e,"P",{"data-svelte-h":!0}),b(de)!=="svelte-1x2oj54"&&(de.textContent=At),bt=p(e),Fe=_(e,"P",{}),fl(Fe).forEach(r),this.h()},h(){ml(l,"name","hf:doc:metadata"),ml(l,"content",Ol)},m(e,n){Ul(document.head,l),i(e,s,n),i(e,t,n),i(e,o,n),C($,e,n),i(e,a,n),C(y,e,n),i(e,Re,n),Je[k].m(e,n),i(e,he,n),Ce[g].m(e,n),i(e,Ve,n),R.m(e,n),i(e,je,n),i(e,N,n),i(e,He,n),C(O,e,n),i(e,Ne,n),i(e,S,n),i(e,Oe,n),Ue[V].m(e,n),i(e,Ie,n),i(e,G,n),i(e,Se,n),C(z,e,n),i(e,Ge,n),C(Q,e,n),i(e,ze,n),i(e,L,n),i(e,Qe,n),C(A,e,n),i(e,Le,n),i(e,q,n),i(e,Ae,n),$e[I].m(e,n),i(e,ve,n),i(e,P,n),i(e,qe,n),i(e,X,n),i(e,Pe,n),ye[B].m(e,n),i(e,Be,n),i(e,Y,n),i(e,Xe,n),i(e,D,n),i(e,Ye,n),i(e,K,n),i(e,De,n),i(e,ee,n),i(e,Ke,n),C(te,e,n),i(e,et,n),i(e,le,n),i(e,tt,n),C(ne,e,n),i(e,lt,n),i(e,se,n),i(e,nt,n),we[E].m(e,n),i(e,Ze,n),i(e,re,n),i(e,st,n),H.m(e,n),i(e,Ee,n),C(ie,e,n),i(e,rt,n),i(e,oe,n),i(e,it,n),i(e,ae,n),i(e,ot,n),i(e,ce,n),i(e,at,n),C(pe,e,n),i(e,ct,n),i(e,fe,n),i(e,pt,n),C(me,e,n),i(e,ft,n),i(e,ue,n),i(e,mt,n),ke[x].m(e,n),i(e,We,n),C(Me,e,n),i(e,ut,n),i(e,_e,n),i(e,Mt,n),C(be,e,n),i(e,_t,n),i(e,de,n),i(e,bt,n),i(e,Fe,n),dt=!0},p(e,[n]){const pl={};n&1&&(pl.fw=e[0]),$.$set(pl);let Ut=k;k=Pt(e),k!==Ut&&(ge(),f(Je[Ut],1,1,()=>{Je[Ut]=null}),Te(),T=Je[k],T||(T=Je[k]=qt[k](e),T.c()),m(T,1),T.m(he.parentNode,he));let $t=g;g=Yt(e),g!==$t&&(ge(),f(Ce[$t],1,1,()=>{Ce[$t]=null}),Te(),h=Ce[g],h||(h=Ce[g]=Xt[g](e),h.c()),m(h,1),h.m(Ve.parentNode,Ve)),Jt!==(Jt=Dt(e))&&(R.d(1),R=Jt(e),R&&(R.c(),R.m(je.parentNode,je)));let yt=V;V=el(e),V!==yt&&(ge(),f(Ue[yt],1,1,()=>{Ue[yt]=null}),Te(),j=Ue[V],j||(j=Ue[V]=Kt[V](e),j.c()),m(j,1),j.m(Ie.parentNode,Ie));let wt=I;I=ll(e),I!==wt&&(ge(),f($e[wt],1,1,()=>{$e[wt]=null}),Te(),v=$e[I],v||(v=$e[I]=tl[I](e),v.c()),m(v,1),v.m(ve.parentNode,ve));let kt=B;B=sl(e),B!==kt&&(ge(),f(ye[kt],1,1,()=>{ye[kt]=null}),Te(),Z=ye[B],Z||(Z=ye[B]=nl[B](e),Z.c()),m(Z,1),Z.m(Be.parentNode,Be));let Tt=E;E=il(e),E!==Tt&&(ge(),f(we[Tt],1,1,()=>{we[Tt]=null}),Te(),W=we[E],W||(W=we[E]=rl[E](e),W.c()),m(W,1),W.m(Ze.parentNode,Ze)),Ct!==(Ct=ol(e))&&(H.d(1),H=Ct(e),H&&(H.c(),H.m(Ee.parentNode,Ee)));let gt=x;x=cl(e),x!==gt&&(ge(),f(ke[gt],1,1,()=>{ke[gt]=null}),Te(),F=ke[x],F||(F=ke[x]=al[x](e),F.c()),m(F,1),F.m(We.parentNode,We))},i(e){dt||(m($.$$.fragment,e),m(y.$$.fragment,e),m(T),m(h),m(O.$$.fragment,e),m(j),m(z.$$.fragment,e),m(Q.$$.fragment,e),m(A.$$.fragment,e),m(v),m(Z),m(te.$$.fragment,e),m(ne.$$.fragment,e),m(W),m(ie.$$.fragment,e),m(pe.$$.fragment,e),m(me.$$.fragment,e),m(F),m(Me.$$.fragment,e),m(be.$$.fragment,e),dt=!0)},o(e){f($.$$.fragment,e),f(y.$$.fragment,e),f(T),f(h),f(O.$$.fragment,e),f(j),f(z.$$.fragment,e),f(Q.$$.fragment,e),f(A.$$.fragment,e),f(v),f(Z),f(te.$$.fragment,e),f(ne.$$.fragment,e),f(W),f(ie.$$.fragment,e),f(pe.$$.fragment,e),f(me.$$.fragment,e),f(F),f(Me.$$.fragment,e),f(be.$$.fragment,e),dt=!1},d(e){e&&(r(s),r(t),r(o),r(a),r(Re),r(he),r(Ve),r(je),r(N),r(He),r(Ne),r(S),r(Oe),r(Ie),r(G),r(Se),r(Ge),r(ze),r(L),r(Qe),r(Le),r(q),r(Ae),r(ve),r(P),r(qe),r(X),r(Pe),r(Be),r(Y),r(Xe),r(D),r(Ye),r(K),r(De),r(ee),r(Ke),r(et),r(le),r(tt),r(lt),r(se),r(nt),r(Ze),r(re),r(st),r(Ee),r(rt),r(oe),r(it),r(ae),r(ot),r(ce),r(at),r(ct),r(fe),r(pt),r(ft),r(ue),r(mt),r(We),r(ut),r(_e),r(Mt),r(_t),r(de),r(bt),r(Fe)),r(l),U($,e),U(y,e),Je[k].d(e),Ce[g].d(e),R.d(e),U(O,e),Ue[V].d(e),U(z,e),U(Q,e),U(A,e),$e[I].d(e),ye[B].d(e),U(te,e),U(ne,e),we[E].d(e),H.d(e),U(ie,e),U(pe,e),U(me,e),ke[x].d(e),U(Me,e),U(be,e)}}}const Ol='{"title":"โมเดล","local":"โมเดล","sections":[{"title":"สร้าง Transformer","local":"สราง-transformer","sections":[{"title":"วิธีการต่างๆในการโหลด","local":"วธการตางๆในการโหลด","sections":[],"depth":3},{"title":"วิธีสำหรับการบันทึก","local":"วธสำหรบการบนทก","sections":[],"depth":3}],"depth":2},{"title":"ใชโมเดล Transformer สำหรับการอนุมาน(inference)","local":"ใชโมเดล-transformer-สำหรบการอนมานinference","sections":[{"title":"ใช้ tensors เป็นอินพุตเข้าไปยังโมเดล","local":"ใช-tensors-เปนอนพตเขาไปยงโมเดล","sections":[],"depth":3}],"depth":2}],"depth":1}';function Sl(u,l,s){let t="pt";return bl(()=>{const o=new URLSearchParams(window.location.search);s(0,t=o.get("fw")||"pt")}),[t]}class Xl extends dl{constructor(l){super(),Jl(this,l,Sl,Nl,_l,{})}}export{Xl as component};
