<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>AI와 데이터의 모든 것</title>
    <link>https://kyull-it.tistory.com/</link>
    <description>주니어입니다. 
겸손하게 불도저처럼 나아가겠습니다☄️</description>
    <language>ko</language>
    <pubDate>Mon, 27 Jul 2026 15:32:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>방황하는 데이터불도저</managingEditor>
    <image>
      <title>AI와 데이터의 모든 것</title>
      <url>https://tistory1.daumcdn.net/tistory/4617596/attach/1a19c6fd40ab4f1eaef90c9865a0bf6f</url>
      <link>https://kyull-it.tistory.com</link>
    </image>
    <item>
      <title>Image Segmentation이란? Image Matting과의 차이</title>
      <link>https://kyull-it.tistory.com/216</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이미지 분할 모델은 이미지 분류(Image Classification) 모델과 달리 이미지에 대해 하나의 정답레이블을 가지는 것이 아니라 이미지의 구체적인 정보를 알고자하는 모델이다. &lt;b&gt;정확히&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; 객체가 어떤 모양인지&lt;/b&gt; 또는 특정 픽셀이 어느 객체에 포함되어있는지를 알고자 하기때문에 Image Segmentation 모델의 데이터셋을 보면 이미지 픽셀마다 label이 할당된 것을 볼 수 있다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서, Image Segmentation은 이미지에서 중요한 객체의 정확한 형태를 파악하고, 그 위치를 경계로 객체를 분할하기 위한 기술이다. 이미지 분할 기술은 위성영상, 자율주행을 위한 도로영상, 의학 촬영영상 등에서 많이 사용되고 있으며, 더 나아가 최근에는 탐지된 객체를 삭제하고 빈 공간을 생성형 이미지로 채우는 등 다양한 분야에서 많이 활용되고 있다.&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Dataset for Image Segmentation Task&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Image Segmentation에 사용되는 데이터셋을 보면 더 잘 이해할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://www.robots.ox.ac.uk/%7Evgg/data/pets/&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;Oxford-IIIT Pet Dataset&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;애완동물 37가지 종(breeds)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;한 종류당 200개의 이미지. (학습용, 테스트용 100개씩)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;annotation 정보&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;종 이름&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;동물의 머리영역 ROI&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;픽셀단위 foreground(object)-background 분할 (Trimap; 트라이맵)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8aK6t/btsHvwb2DiL/Fg97PpGkXwE5RqOdg4B2Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8aK6t/btsHvwb2DiL/Fg97PpGkXwE5RqOdg4B2Ok/img.png&quot; width=&quot;414&quot; height=&quot;299&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;359&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.2611%; margin-right: 10px;&quot; data-widthpercent=&quot;49.84&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8aK6t/btsHvwb2DiL/Fg97PpGkXwE5RqOdg4B2Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8aK6t%2FbtsHvwb2DiL%2FFg97PpGkXwE5RqOdg4B2Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;496&quot; height=&quot;359&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tmwy8/btsHvZd1jUI/mYddKKFDpiLDXLQnIPGEjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tmwy8/btsHvZd1jUI/mYddKKFDpiLDXLQnIPGEjK/img.png&quot; width=&quot;413&quot; height=&quot;297&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;356&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.5761%;&quot; data-widthpercent=&quot;50.16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tmwy8/btsHvZd1jUI/mYddKKFDpiLDXLQnIPGEjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftmwy8%2FbtsHvZd1jUI%2FmYddKKFDpiLDXLQnIPGEjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* 트라이맵 (Trimap)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;foreground, background, unknown 3가지 영역으로 이미지를 분할한 것을 표현한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/On41J/btsHvXmXNmn/OsK78u7rbZy8CskZGKSEMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/On41J/btsHvXmXNmn/OsK78u7rbZy8CskZGKSEMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/On41J/btsHvXmXNmn/OsK78u7rbZy8CskZGKSEMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOn41J%2FbtsHvXmXNmn%2FOsK78u7rbZy8CskZGKSEMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;403&quot; height=&quot;268&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;해당 이미지를 만드는 코드는 &lt;a href=&quot;https://github.com/kyull-it/image-segmentation-snippets&quot;&gt;Github&lt;/a&gt;에서 확인할 수 있습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;위의 데이터셋을 통해서 우리는 이미지 속 객체가 box형태가 아닌 정확히 객체의 형태로 그 객체의 위치를 알 수 있다. 더불어 객체가 고양이인지 개인지, 어떤 종인지, 동물의 머리는 어느 위치에 있는지도 학습시킬 수 있도록 데이터를 제공한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Image Matting&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Image Segmentation과 비슷하지만 Image Matting은 좀 더 세분화된 개념으로 전경(foreground)과 배경(background)이 비슷한 색상이거나 복잡한 질감이어도 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전경을 정확히 분할해내는 데에 의의&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://arxiv.org/pdf/1703.03872&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;Deep Image Matting, 2017, Adobe Research&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;기존에는 low-level features만 사용가능했으며, high-level context에 대한 정보는 부족했다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;모델1의 Inputs : &lt;b&gt;원본이미지와 trimap&lt;/b&gt; &amp;rarr; Output : &lt;b&gt;the alpha matte&lt;/b&gt; of the image&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;모델2에서는 &lt;b&gt;a small CNN&lt;/b&gt;으로 좀 더 정확히 객체의 edge를 예측하기 위해 alpha matte 값을 정제하였다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;alpha matte란?&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;흔히 이미지에서 alpha란 각 픽셀에 대한 투명도를 나타내는 것이다. 이를 차용하여 일반적으로 grayscale 이미지로 0에서 1사이의 실수값으로 표현되며, 0은 완전 투명(배경), 1은 불투명(전경)을 의미한다. 따라서 alpha값에 따라 전경과 배경을 분리하는데 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;수학적으로는 아래와 같은 식을 사용한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;$$ I&amp;nbsp;=&amp;nbsp;\alpha&amp;nbsp;F&amp;nbsp;+&amp;nbsp;(1-\alpha&amp;nbsp;)B $$&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;각 픽셀값 I는 전경 픽셀 F, 배경 픽셀 B의 혼합으로 표현된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;여기에서 $ \alpha $는 alpha matte 값이다. 배경에 가까운지, 전경에 가까운지를 나타낸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/Computer Vision</category>
      <category>Computer Vision</category>
      <category>image matting</category>
      <category>image segmentation</category>
      <author>방황하는 데이터불도저</author>
      <guid isPermaLink="true">https://kyull-it.tistory.com/216</guid>
      <comments>https://kyull-it.tistory.com/216#entry216comment</comments>
      <pubDate>Tue, 21 May 2024 01:03:41 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬] Python에서 XML 파일 다루는법 - XPath에 대해서 알아보자.</title>
      <link>https://kyull-it.tistory.com/215</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;XML 파일을 그냥 읽으면 parsing되지않고, 모두 이어진 텍스트로 읽혀 가독성이 매우 좋지않다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1545&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMsS2y/btsHqbmo8k4/kSMTvycS00VxKqz7h5eXS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMsS2y/btsHqbmo8k4/kSMTvycS00VxKqz7h5eXS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMsS2y/btsHqbmo8k4/kSMTvycS00VxKqz7h5eXS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMsS2y%2FbtsHqbmo8k4%2FkSMTvycS00VxKqz7h5eXS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1545&quot; height=&quot;142&quot; data-origin-width=&quot;1545&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 가독성 좋게 읽기 위해서는 우선 python에서 지원하는 xml parsing 도구를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보편적으로 아래와 같은 코드로 xml 파일을 읽어들이게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1715838791859&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import xml.etree.ElementTree as ET

tree = ET.parse(xml_path)
root = tree.getroot()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 코드로 root에 저장된 내용을 각 계층에 맞게 출력해주면 가독성 좋은 텍스트로 출력할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715839019257&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def print_xml_structure(elem, level=0):

    indent = '\t' * level
    print(f&quot;{indent}&amp;lt;{elem.tag}&quot;, end='')
    
    if elem.attrib:
        print(&quot; &quot; + &quot; &quot;.join([f'{k}=&quot;{v}&quot;' for k, v in elem.attrib.items()]), end=&quot;&quot;)
    
    # Print closing bracket
    print(&quot;&amp;gt;&quot;)
    
    if elem.text:
        print(f&quot;{indent}  {elem.text.strip()}&quot;)
    
    # 재귀적으로 호출하여 모든 계층의 자식노드까지 출력해준다.
    for child in elem:
        print_xml_structure(child, level+1)
    
    print(f&quot;{indent}&amp;lt;/{elem.tag}&amp;gt;&quot;)

print_xml_structure(root)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가독성 좋은 xml&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1715839212544&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;annotation&amp;gt;
	&amp;lt;folder&amp;gt;
	&amp;nbsp; OXIIIT
	&amp;lt;/folder&amp;gt;
	&amp;lt;filename&amp;gt;
	&amp;nbsp; Abyssinian_1.jpg
	&amp;lt;/filename&amp;gt;
	&amp;lt;source&amp;gt;
		&amp;lt;database&amp;gt;
		&amp;nbsp; OXFORD-IIIT Pet Dataset
		&amp;lt;/database&amp;gt;
		&amp;lt;annotation&amp;gt;
		&amp;nbsp; OXIIIT
		&amp;lt;/annotation&amp;gt;
		&amp;lt;image&amp;gt;
		&amp;nbsp; flickr
		&amp;lt;/image&amp;gt;
	&amp;lt;/source&amp;gt;
	&amp;lt;size&amp;gt;
		&amp;lt;width&amp;gt;
		&amp;nbsp; 600
		&amp;lt;/width&amp;gt;
		&amp;lt;height&amp;gt;
		&amp;nbsp; 400
		&amp;lt;/height&amp;gt;
		&amp;lt;depth&amp;gt;
		&amp;nbsp; 3
		&amp;lt;/depth&amp;gt;
	&amp;lt;/size&amp;gt;
	&amp;lt;segmented&amp;gt;
	&amp;nbsp; 0
	&amp;lt;/segmented&amp;gt;
	&amp;lt;object&amp;gt;
		&amp;lt;name&amp;gt;
		&amp;nbsp; cat
		&amp;lt;/name&amp;gt;
		&amp;lt;pose&amp;gt;
		&amp;nbsp; Frontal
		&amp;lt;/pose&amp;gt;
		&amp;lt;truncated&amp;gt;
		&amp;nbsp; 0
		&amp;lt;/truncated&amp;gt;
		&amp;lt;occluded&amp;gt;
		&amp;nbsp; 0
		&amp;lt;/occluded&amp;gt;
		&amp;lt;bndbox&amp;gt;
			&amp;lt;xmin&amp;gt;
			&amp;nbsp; 333
			&amp;lt;/xmin&amp;gt;
			&amp;lt;ymin&amp;gt;
			&amp;nbsp; 72
			&amp;lt;/ymin&amp;gt;
			&amp;lt;xmax&amp;gt;
			&amp;nbsp; 425
			&amp;lt;/xmax&amp;gt;
			&amp;lt;ymax&amp;gt;
			&amp;nbsp; 158
			&amp;lt;/ymax&amp;gt;
		&amp;lt;/bndbox&amp;gt;
		&amp;lt;difficult&amp;gt;
		&amp;nbsp; 0
		&amp;lt;/difficult&amp;gt;
	&amp;lt;/object&amp;gt;
&amp;lt;/annotation&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 만약에 바로 xmin, ymin 과 같은 자식노드의 텍스트를 바로 접근하여 추출하고 싶다면 어떻게 할 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴 때는 아래와 같이 tag의 경로를 통해 바로 접근할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715839693223&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def find_text_by_tag(root, tag_name):
    # Find all elements with the specified tag
    elements = root.findall(f&quot;.//{tag_name}&quot;)
    # Extract and return the text of each element
    return [elem.text for elem in elements if elem is not None]
    
tag_names = ['xmin', 'ymin', 'xmax', 'ymax']

bbox = [int(find_text_by_tag(root, tag_name)[0]) for tag_name in tag_names]
bbox
# [333, 72, 425, 158]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 findall에 들어가는 경로 문자열은 어떤 규칙을 입력할 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 XPath가 사용된다. XML 문서 내의 특정 부분을 선택하거나 검색할 때 사용되는 언어이다. 경로 표현식(path expression)을 사용해서 XML 문서의 노드(node)를 선택하게 된다.&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;XPath 기본 문법과 형식&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;기본 구문&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/: 루트 노드를 선택합니다.&lt;/li&gt;
&lt;li&gt;//: 현재 노드의 자손 노드 중 모든 노드를 선택합니다.&lt;/li&gt;
&lt;li&gt;.: 현재 노드를 선택합니다.&lt;/li&gt;
&lt;li&gt;..: 현재 노드의 부모 노드를 선택합니다.&lt;/li&gt;
&lt;li&gt;@: 속성을 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;예제 XML&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1715839968454&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;library&amp;gt;
    &amp;lt;section&amp;gt;
        &amp;lt;shelf&amp;gt;
            &amp;lt;book&amp;gt;
                &amp;lt;title&amp;gt;Python Programming&amp;lt;/title&amp;gt;
                &amp;lt;author&amp;gt;John Doe&amp;lt;/author&amp;gt;
                &amp;lt;year&amp;gt;2020&amp;lt;/year&amp;gt;
                &amp;lt;info&amp;gt;
                    &amp;lt;publisher&amp;gt;XYZ Press&amp;lt;/publisher&amp;gt;
                    &amp;lt;isbn&amp;gt;1234567890&amp;lt;/isbn&amp;gt;
                &amp;lt;/info&amp;gt;
            &amp;lt;/book&amp;gt;
        &amp;lt;/shelf&amp;gt;
    &amp;lt;/section&amp;gt;
    &amp;lt;section&amp;gt;
        &amp;lt;shelf&amp;gt;
            &amp;lt;book&amp;gt;
                &amp;lt;title&amp;gt;Data Science Handbook&amp;lt;/title&amp;gt;
                &amp;lt;author&amp;gt;Jane Smith&amp;lt;/author&amp;gt;
                &amp;lt;year&amp;gt;2018&amp;lt;/year&amp;gt;
                &amp;lt;info&amp;gt;
                    &amp;lt;publisher&amp;gt;ABC Press&amp;lt;/publisher&amp;gt;
                    &amp;lt;isbn&amp;gt;0987654321&amp;lt;/isbn&amp;gt;
                &amp;lt;/info&amp;gt;
            &amp;lt;/book&amp;gt;
        &amp;lt;/shelf&amp;gt;
    &amp;lt;/section&amp;gt;
&amp;lt;/library&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;예제 XPath 표현식&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;루트 노드 선택&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/library: 루트 노드인 library를 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모든 section 노드 선택&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;//section: 문서 내의 모든 section 노드를 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;첫 번째 book 노드의 title 선택&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/library/section/shelf/book/title: 첫 번째 book 노드의 title 요소를 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모든 title 요소 선택&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;//title: 문서 내의 모든 title 요소를 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특정 속성 선택&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;//book[@year=&quot;2020&quot;]: year 속성이 2020인 모든 book 요소를 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;부모 노드 선택&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;//title/..: 모든 title 요소의 부모 노드를 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;속성 값 선택&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;//book/title/@lang: 모든 book 요소 내 title 요소의 lang 속성 값을 선택합니다 (속성 예제 필요).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/python</category>
      <author>방황하는 데이터불도저</author>
      <guid isPermaLink="true">https://kyull-it.tistory.com/215</guid>
      <comments>https://kyull-it.tistory.com/215#entry215comment</comments>
      <pubDate>Thu, 16 May 2024 20:28:55 +0900</pubDate>
    </item>
    <item>
      <title>[멀티모달] OpenAI의 GPT-4o (omni)는 GPT-4에서 얼마나 향상되었는가?</title>
      <link>https://kyull-it.tistory.com/214</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;GPT-4o&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #080808;&quot;&gt;GPT-4o (&amp;ldquo;o&amp;rdquo; for &amp;ldquo;omni&amp;rdquo;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Document : &lt;/span&gt;&lt;a href=&quot;https://openai.com/index/hello-gpt-4o/&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;Hello GPT-4o | OpenAI&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;OpenAI에서는 2024.05.13에 텍스트, 오디오, 이미지(영상)을 동시에 입력하였을 때, 출력도 텍스트, 오디오, 이미지를 생성해내는 AGI(Artificial General Intelligent)인 gpt-4o 모델을 발표했다. 모델의 성능은 GPT-4 Turbo 모델과 같은 성능에 non-english에 대한 정확도도 향상되었다. 이번 gpt-4o 모델은 특히, 이미지를 인식하는 비전영역과 음성을 인식하는 오디오영역에서 더 향상된 성능을 보인다. 그와 동시에 더 빠르고, 50% 낮아진 가격으로 API를 사용할 수 있게 되었다. 실제 ChatGPT에서 gpt-4o 모델로 프롬프트를 입력했을 때의 경우에도 답변속도는 gpt-4와 대비하여 체감상으로도 매우 빠르게 느껴진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Model Capabilities&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;최소 232ms, 평균 320ms 라는 1초도 안되는 시간안에 사람의 음성 입력에 대해 반응한다. 인간의 반응 속도와 거의 흡사하다. gpt-4o 이전의 모델에서 &lt;/span&gt;&lt;a href=&quot;https://openai.com/index/chatgpt-can-now-see-hear-and-speak/&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;Voice Mode&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 사용했을 때, Latency는 평균 2.8초 (GPT-3), 평균 5.4초 (GPT-4)가 걸렸다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존의 Voice Mode은 STT, GPT-4, TTS 3가지 모델로 구성되었다. 이는 텍스트&amp;larr;&amp;rarr;오디오 변환 작업이 들어가므로 observe tone, multiple speakers, or background noises들을 분석하지 못하며, 따라서 웃음소리, 노래, 감정 표현 등의 반응들을 할 수가 없었다. 하지만 gpt-4o는 텍스트, 이미지, 음성에 대한 입출력을 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;같은 신경망 모델 내에서 멀티모달로 처리&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하여 이가 가능해졌다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;gpt-4o 모델은 대화 속의 풍자, 개그를 이해하고 상황에 맞는 웃음소리를 낼 수 있다. 대화 중간에 리액션이나 말을 끊고 발화자가 상대방에게로 넘어가는 경우에도 버벅임없이 사람처럼 아주 자연스럽게 대화가 이어지는 것을 볼 수 있다. 특히나 카메라에 비치는 상황을 거의 실시간으로 묘사해주는 기능은 아주 인상적이다. 또한, Voice Mode를 켠 두 폰의 인공지능끼리 대화도 가능하다. 또는 두사람의 목소리를 내서 하모니로 노래를 불러달라는 요청도 가능하다. 실시간 통역기능에 대한 예시도 있다. ( &lt;/span&gt;&lt;a href=&quot;https://vimeo.com/945587808&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;OpenAI GPT-4o real-time translation on Vimeo&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt; )&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 다양한 예시들은 &lt;/span&gt;&lt;a href=&quot;https://openai.com/index/hello-gpt-4o/&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;공식 document&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에서 확인해볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Model Evaluation&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;1220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1B6K8/btsHoIqSSqC/amaGzfd7Vqa8t5cwwKoqxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1B6K8/btsHoIqSSqC/amaGzfd7Vqa8t5cwwKoqxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1B6K8/btsHoIqSSqC/amaGzfd7Vqa8t5cwwKoqxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1B6K8%2FbtsHoIqSSqC%2FamaGzfd7Vqa8t5cwwKoqxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;500&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;1220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;텍스트 평가 지표 6가지 중에서 MGSM스코어에서 약간 떨어지고, DROP(f1) 스코어에서도 일정수준 떨어지는 부분을 제외하고는 대체로 압도적인 성능을 보이고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cby356/btsHpPvNNAO/qeExAtTS8hqPwyNMTPQI31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cby356/btsHpPvNNAO/qeExAtTS8hqPwyNMTPQI31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cby356/btsHpPvNNAO/qeExAtTS8hqPwyNMTPQI31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcby356%2FbtsHpPvNNAO%2FqeExAtTS8hqPwyNMTPQI31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;439&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;음성인식모델(일반적인 STT모델)에 대해서 에러율을 측정해보았을 때, 이전의 Whisper-v3모델보다 GPT-4o 16-shot 모델이 압도적으로 낮은 에러율을 보이고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;1220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EoHOq/btsHplPrhns/9K9NKz0KlkhUZ82zJ5u8W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EoHOq/btsHplPrhns/9K9NKz0KlkhUZ82zJ5u8W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EoHOq/btsHplPrhns/9K9NKz0KlkhUZ82zJ5u8W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEoHOq%2FbtsHplPrhns%2F9K9NKz0KlkhUZ82zJ5u8W0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;477&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;1220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Audio Translation은 입력 음성을 다른 언어로 번역해주는 기능으로 BLEU score기준으로 GPT-4o 모델이 압도적인 성능을 내고있고, Google의 Gemini가 비슷하게 높은 성능을 가진것을 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;1368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN1JfJ/btsHottKtXs/OsmZAYycavKP9DVDhkLhNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN1JfJ/btsHottKtXs/OsmZAYycavKP9DVDhkLhNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN1JfJ/btsHottKtXs/OsmZAYycavKP9DVDhkLhNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN1JfJ%2FbtsHottKtXs%2FOsmZAYycavKP9DVDhkLhNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;529&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;1368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;모든 면에서 GPT-4보다 GPT-4o 모델이 월등한 정확도를 내고있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;M3Exam이 무엇인가?&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 문제 유형:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;텍스트 생성: 주어진 프롬프트에 대해 일관성 있고 창의적인 텍스트를 생성하는 능력을 평가합니다.&lt;/li&gt;
&lt;li&gt;독해 및 이해: 복잡한 텍스트를 이해하고, 그에 대한 질문에 정확하게 답변하는 능력을 측정합니다.&lt;/li&gt;
&lt;li&gt;지식 테스트: 특정 주제에 대한 모델의 지식 수준을 평가합니다. 예를 들어, 과학, 역사, 문화 등 다양한 분야의 지식을 포함합니다.&lt;/li&gt;
&lt;li&gt;논리 및 추론: 주어진 정보로부터 논리적 결론을 도출하거나 추론 문제를 해결하는 능력을 평가합니다.&lt;/li&gt;
&lt;li&gt;코딩 및 기술 문제: 프로그래밍 문제를 해결하고 코드의 정확성 및 효율성을 평가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 데이터 세트:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다양한 도메인에서 추출된 방대한 양의 데이터 세트를 사용하여 평가합니다. 여기에는 뉴스 기사, 학술 논문, 대화 데이터, 코드 스니펫 등이 포함됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;1172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cax5jB/btsHn3hKVzD/4WdcqIn7KfRMMFKqjObqI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cax5jB/btsHn3hKVzD/4WdcqIn7KfRMMFKqjObqI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cax5jB/btsHn3hKVzD/4WdcqIn7KfRMMFKqjObqI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcax5jB%2FbtsHn3hKVzD%2F4WdcqIn7KfRMMFKqjObqI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;468&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;1172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 테스트에서 가장 높은 성능을 보여주고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Language Tokenization&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;으로는 20개가 지원된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(구자라트어, 텔루구어, 타밀어, 마라티어, 힌디어, 우르두어, 아랍어, 페르시아어, 러시아어, 한국어, 베트남어, 일본어, 중국어, 터키어, 이탈리아어, 독일어, 스페인어, 포르투갈어, 프랑스어, 영어)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아직도 여러 부분에서 제한이 발견되고 있고, 특히 오디오 모델에서 잘못된 답변을 하는 경우가 있으나 gpt-4o 모델 공개 이후에 기술적인 인프라, 사용성을 위한 사후 학습, 다른 모달리티를 공개하기 위해 필요한 안정성 중심으로 연구를 이어 나가고, 더 향상된 모델을 개발할 것이라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;span style=&quot;color: #000000;&quot;&gt;한국어로 참고할만한 사이트 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://deepdaive.com/gpt-4o/&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;GPT-4o란 무엇인가? - OpenAI의 새로운 멀티모달 플래그십 모델 - DeepdAive&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>AI/Fundamental</category>
      <category>ChatGPT</category>
      <category>GPT</category>
      <category>gpt4</category>
      <category>gpt4o</category>
      <category>OpenAI</category>
      <author>방황하는 데이터불도저</author>
      <guid isPermaLink="true">https://kyull-it.tistory.com/214</guid>
      <comments>https://kyull-it.tistory.com/214#entry214comment</comments>
      <pubDate>Tue, 14 May 2024 19:00:59 +0900</pubDate>
    </item>
    <item>
      <title>프롬프트 엔지니어링이란? Prompt Engineering, in-context learning (Zero, One, Few-shot)</title>
      <link>https://kyull-it.tistory.com/213</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;prompt란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;prompt&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 컴퓨터가 사용자의 입력을 받을 준비가 되어있고,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;promptable&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 입력을 받을 수 있는 것 또는 상태&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;prompt engineering이란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프롬프트 엔지니어링은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대규모 언어 모델(LLM)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;으로부터 원하는 답변에 대해 높은 품질의 결과를 추출하기 위해서 프롬프트의 입력 텍스트를 적절히 조합하는 것을 말합니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;llm의 답변에 대한 지침을 부여하는 것으로 대표적인 llm을 제공하는 &lt;b&gt;OpenAI의 ChatGPT의 예시&lt;/b&gt;를 보겠습니다. 아래와 같이 프롬프트 엔지니어링을 위한 6가지 전략을 제시하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Write clear instructions&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: 명확한 지시서를 작성해라. (ex. 전문가 수준의 긴 답변)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Provide reference text&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(ex. fake information 최소화를 위해 document를 제공)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Split complex tasks into simpler subtasks&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(ex. 책 전체보다는 파트별로 요약을 요청)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Give the model time to think&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 사람도 복잡한 질문에는 대답하기까지 시간이 걸린다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Use external tools&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(ex. function calling)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Test changes systematically&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : gold-standard answers를 통해 모델을 평가하라.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://platform.openai.com/docs/guides/prompt-engineering/six-strategies-for-getting-better-results&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;Prompt engineering - OpenAI API&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;gt; 해당 링크에서 위의 내용에 대한 구체적인 예시를 확인할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;In-Context Learning이란?&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프롬프트 엔지니어링의 구체적인 방법으로는&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; in-context learning(ICL)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라는 것이 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사전학습된 기반 내에서 원하는 &lt;b&gt;문맥 상의(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;in-context&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;) 대답&lt;/b&gt;을 하도록 prompt의 일부로써 모델에게 특정 task에 대한 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;demonstrations&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;input-label pairs&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;)&lt;/b&gt;을 제시한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;제시된 demo를 이해(&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;learning&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)하여 특정 task에 적절한 맥락으로 답변한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모델을 weights 자체를 변경하는 &lt;b&gt;fine-tuning (파인튜닝)을 하지 않는다&lt;/b&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비슷한 학습방법으로는 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Meta Learning&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 있습니다. 이는 &lt;/span&gt;&lt;a href=&quot;https://arxiv.org/pdf/1803.02999&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;Alex et al.&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 참조하여 이해할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;적절한 in-context learning을 위해서 입력할 demonstrations(prompt)를 잘 구성해야합니다. 해당 방법이 잘 작동하는 이유는 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;llm에 사전학습된 label space(y)가 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;llm에 입력하는 질문 텍스트(x)가 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;demonstrations를 입력하여 input(x)와 그에 상응하는 답변(y)을 매핑시킨다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;demonstrations을 통해 입출력에 대한 format도 명확히 할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시 demonstrations로는 해당 블로그에 참조 문서로 걸어둔 것들을 참고해보시면 잘 이해가 될 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Prompting 종류들&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사실, ICL(= 질문(input)-정답인 답변(label)의 쌍을 prompt(demonstrations)로 입력) 하지 않더라도 &lt;b&gt;random labels(무작위 정답)&lt;/b&gt;를 통해 비슷한 정확도로 결과를 얻을 수 있다는 연구(&lt;/span&gt;&lt;a href=&quot;https://arxiv.org/abs/2202.12837&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;Min et al.&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)도 존재합니다. &lt;b&gt;하지만 적절한 지시문을 미리 정의한 후 task를 수행하는 것이 좋다는 것은 명백합니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 특수하지 않고, 일반적인 도메인(ex. 상식)에 대한 prompting을 원하는 경우에는 demonstrations를 아예 넣지 않을 수도 있습니다. 이러한 경우를 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Zero-shot Prompting&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(혹은 method)라고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 외에도 하나의 예시를 prompt로 넣어주는 경우인 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;One-Shot Prompting&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, 여러개의 예시를 prompt로 넣는 경우인&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; Few-Shot Prompting&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;prompt(demonstrations)를 &lt;b&gt;어떤 내용의 format으로 구성할지 / 몇 회 넣어줄지 / 어떤 구조로 넣어줄지 등&lt;/b&gt;에 대해 고급 prompt engineering 연구가 다양하게 이루어지고 있습니다. 예시로는 &lt;/span&gt;&lt;b&gt;&lt;a href=&quot;https://aws.amazon.com/ko/what-is/retrieval-augmented-generation/&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;Retrival Augmented Generation; RAG&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이나 &lt;b&gt;Chain of Thought; CoT&lt;/b&gt; (&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;복잡한 추론을 가능하도록 &lt;/span&gt;생각의 단계별로 prompt를 제시) 등이 있습니다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;추가적인 고급 프롬프트 엔지니어링은 아래의 사이트에서 참고해볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://www.promptingguide.ai/&quot;&gt;https://www.promptingguide.ai/&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715067975225&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Prompt Engineering Guide &amp;ndash; Nextra&quot; data-og-description=&quot;A Comprehensive Overview of Prompt Engineering&quot; data-og-host=&quot;www.promptingguide.ai&quot; data-og-source-url=&quot;https://www.promptingguide.ai/&quot; data-og-url=&quot;https://www.promptingguide.ai/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.promptingguide.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.promptingguide.ai/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Prompt Engineering Guide &amp;ndash; Nextra&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A Comprehensive Overview of Prompt Engineering&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.promptingguide.ai&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기타 참고문서&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://velog.io/@hundredeuk2/In-context-Leaning&quot;&gt;https://velog.io/@hundredeuk2/In-context-Leaning&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://velog.io/@dongyoungkim/GPT-fine-tuning-5.-in-context-learning&quot;&gt;https://velog.io/@dongyoungkim/GPT-fine-tuning-5.-in-context-learning&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://moonlang.tistory.com/29&quot;&gt;https://moonlang.tistory.com/29&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #1155cc;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://www.vellum.ai/blog/zero-shot-vs-few-shot-prompting-a-guide-with-examples&quot;&gt;https://www.vellum.ai/blog/zero-shot-vs-few-shot-prompting-a-guide-with-examples&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/Fundamental</category>
      <category>LLM</category>
      <category>prompt</category>
      <category>prompt engineering</category>
      <category>대규모언어모델</category>
      <category>프롬프트</category>
      <category>프롬프트 엔지니어링</category>
      <author>방황하는 데이터불도저</author>
      <guid isPermaLink="true">https://kyull-it.tistory.com/213</guid>
      <comments>https://kyull-it.tistory.com/213#entry213comment</comments>
      <pubDate>Tue, 7 May 2024 22:57:13 +0900</pubDate>
    </item>
    <item>
      <title>[NLP] 자연어처리 딥러닝 모델 변천과정 (RNN, LSTM, Seq2Seq, Attention, Transformer)</title>
      <link>https://kyull-it.tistory.com/212</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9vrwM/btsGFh1etBK/SyIiBwC44PE33yDtc2kyK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9vrwM/btsGFh1etBK/SyIiBwC44PE33yDtc2kyK1/img.png&quot; data-alt=&quot;신경망 기계 번역 NMT의 모델 변천 과정 (history)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9vrwM/btsGFh1etBK/SyIiBwC44PE33yDtc2kyK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9vrwM%2FbtsGFh1etBK%2FSyIiBwC44PE33yDtc2kyK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1887&quot; height=&quot;781&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;신경망 기계 번역 NMT의 모델 변천 과정 (history)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333;&quot;&gt;&lt;b&gt;1. RNN (1986)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;RNN은 시퀀스 데이터를 학습시키기 위해 제안된 신경망 모델로 RNN 기법이 처음으로 제안된 논문은 아래와 같다. &lt;span style=&quot;text-align: start;&quot;&gt;이 논문을 기틀로 RNN 연산을 거치는 신경망모델에 대한 수많은 연구가 수행되었다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;&lt;a href=&quot;https://www.nature.com/articles/323533a0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Learning representations by back-propagationing errors&lt;/a&gt; (&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.cs.utoronto.ca/~hinton/absps/naturebp.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pdf 보기&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333;&quot;&gt;&lt;b&gt;2. LSTM (1997)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;LSTM은 RNN의 은닉층에서 계산되는 연산을 변형시켜 장기적 기억을 더 잘하도록 고안된 신경망 모델이다. 처음으로 LSTM 매커니즘이 제안된 논문은 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;&lt;a href=&quot;https://deeplearning.cs.cmu.edu/S23/document/readings/LSTM.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Long Short-Term Memory&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;최종적으로 자리잡은 RNN과 LSTM에 대한 개념은 아래의 논문에서 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/1808.03314&quot;&gt;Fundamentals of Recurrent Neural Network (RNN) and Long Short-Term Memory (LSTM) Network&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;정리글 1) &lt;a href=&quot;https://kyull-it.tistory.com/139&quot;&gt;RNN(Recurrent Neural Network) 순환신경망 공부하기&lt;/a&gt; 2) &lt;a href=&quot;https://kyull-it.tistory.com/157&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LSTM(Long Short-Term Memory) 신경망 모델 공부하기&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333;&quot;&gt;&lt;b&gt;3. Seq2Seq (2014)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;시퀀스 데이터에 대한 입출력을 처리할 수 없는 DNN의 한계를 보완하기 위해 고안된 모델로 LSTM 연산을 여러 layer로 쌓은 Encoder-Decoder 구조이다. 이는 기계 번역에서 성능 향상의 효과로 인기를 얻게되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/1409.3215&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Sequence to Sequence Learning with Neural Networks&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;하지만&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;Seq2Seq 모델까지는 &lt;/span&gt;데이터마다 다른 길이의 입력값에 대해 고정된 길이의 문맥벡터를 출력하는 한계점이 있었다. 이러한 이유로 정보 손실과 비효율적인 연산이 이루어지는 Bottleneck문제가 발생했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333;&quot;&gt;&lt;b&gt;4. Attention (2015)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;Attention은 기존의 고정길이 문맥벡터를 사용하던 것으로 인한 Bottleneck문제를 해결하기 위해 고안되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;&lt;a href=&quot;https://arxiv.org/pdf/1409.0473.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Neural Machine Translation By Jointly Learning To Align and Translate&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;위의 논문에서는 Encoder로 bidirectional RNN을 사용하여 &lt;span style=&quot;text-align: start;&quot;&gt;순서와 문맥정보를 담고있는 문맥벡터(context vector)를 출력하고, Decoder에서만 Attention 기법을 제안하고, 적용하였다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Attention 기법을 간단하게 설명하면, 전체 입력 시퀀스에 대해 어떤 정보에 가장 주의를 기울일 것인지 판단하여, 다음 시퀀스를 예측하는데 활용하는 방식이다. 따라서, &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Attention기법을 사용한 Decoder 구조에서는 아래의 세가지를 활용하여 다음 시퀀스를 예측한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;전체 입력 시퀀스에 대한 hidden states(은닉값)에 가중치를 적용한 문맥벡터 ($ c_{i} $)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;이전 step때 decoder에서 출력한 문맥벡터 ($ s_{i-1} $)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;이전 step때 decoder에서 출력한 단어벡터 ($ y_{i-1} $)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333;&quot;&gt;&lt;b&gt;5. Transformer (2017)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;Transformer는 기존의 RNN,CNN과 같은 core machanism을 쓰지않고, 오직 Attention 방식만을 활용한 Encoder-Decoder 구조의 신경망 모델이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://proceedings.neurips.cc/paper_files/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Attention Is All You Need&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Attention 매커니즘에서는 전통적으로 수행하던, 시퀀스를 순차적으로 입력하는 방식을 사용하지 않기 때문에 데이터의 순서정보를 입력해주기 위해서 &lt;a href=&quot;https://kyull-it.tistory.com/192&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Positional Encoding&lt;/a&gt;이라는 기법을 추가적으로 수행해줘야 한다. 이 방식을 통해 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인코더에 전체 시퀀스를 하나의 임베딩 행렬로 입력하는 방식으로 병렬적인 계산이 가능하게하여&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; 연산 효율성을 높혔다. 결과적으로 기존의 RNN, CNN기반의 모델보다 Attention만 사용하여 학습했을 때의 성능이 훨씬 높아 지금까지 큰 인기를 얻고 있다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이후에 나온 유명한 BERT와 최근까지도 계속 발전되고 있는 GPT, LLM 모델도 모두 Transformer를 활용한 모델이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>AI/Fundamental</category>
      <category>NMT</category>
      <category>Transformer</category>
      <category>기계번역</category>
      <category>시퀀스모델</category>
      <category>신경망모델</category>
      <category>인공지능</category>
      <category>트랜스포머</category>
      <author>방황하는 데이터불도저</author>
      <guid isPermaLink="true">https://kyull-it.tistory.com/212</guid>
      <comments>https://kyull-it.tistory.com/212#entry212comment</comments>
      <pubDate>Tue, 16 Apr 2024 20:47:14 +0900</pubDate>
    </item>
    <item>
      <title>Anaconda없이 Python 가상환경 만들기</title>
      <link>https://kyull-it.tistory.com/211</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;리눅스에서 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://docs.python.org/3/tutorial/venv.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식 Document&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712553615728&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;12. Virtual Environments and Packages&quot; data-og-description=&quot;Introduction: Python applications will often use packages and modules that don&amp;rsquo;t come as part of the standard library. Applications will sometimes need a specific version of a library, because the ...&quot; data-og-host=&quot;docs.python.org&quot; data-og-source-url=&quot;https://docs.python.org/3/tutorial/venv.html&quot; data-og-url=&quot;https://docs.python.org/3/tutorial/venv.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rSkuX/hyVJZyeTZS/Oj1XvM1LZQoB9DGw9LkG21/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/venv.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.python.org/3/tutorial/venv.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rSkuX/hyVJZyeTZS/Oj1XvM1LZQoB9DGw9LkG21/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;12. Virtual Environments and Packages&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Introduction: Python applications will often use packages and modules that don&amp;rsquo;t come as part of the standard library. Applications will sometimes need a specific version of a library, because the ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.python.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;1. 가상환경을 지원하는 툴을 설치합니다. (이미 설치되어있다면 2번부터 진행해주세요.)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712553426267&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install python3.8-venv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;2. 원하는 위치에 가상환경 폴더를 생성합니다. 권한 문제 발생 시, sudo를 앞에 붙여 진행하세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712553449081&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 -m venv envname&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;3. 생성된 가상환경 폴더에 들어간 후, 아래의 커맨드를 입력하여 가상환경을 활성화시킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712553484081&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;4. 활성화된 가상환경에 원하는 패키지를 아래의 커맨드로 설치할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712553823454&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python -m pip install packagename
python -m pip install -r requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;5. 패키지 업그레이드 방법&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712553888927&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python -m pip install --upgrade packagename&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;6. 기타&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;패키지 삭제 : &lt;span style=&quot;text-align: left;&quot;&gt;python&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;-m&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;uninstall&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;설치 패키지 리스트 확인 : python -m pip list&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;가상환경 비활성화 : deactivate&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;일반적인 pip 커맨드에서 python -m 을 붙혀서 쓰면 쉽게 사용할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming/python</category>
      <category>Python</category>
      <category>venv</category>
      <category>가상환경</category>
      <category>파이썬</category>
      <author>방황하는 데이터불도저</author>
      <guid isPermaLink="true">https://kyull-it.tistory.com/211</guid>
      <comments>https://kyull-it.tistory.com/211#entry211comment</comments>
      <pubDate>Mon, 8 Apr 2024 19:17:36 +0900</pubDate>
    </item>
    <item>
      <title>MacOS Font Book : 폰트 경로 확인하는 방법</title>
      <link>https://kyull-it.tistory.com/210</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 맥북 서체관리자 (Font Book)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2582&quot; data-origin-height=&quot;1592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DJxCq/btsGeRikAhq/4gMquZBKCuyZilgDakqWX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DJxCq/btsGeRikAhq/4gMquZBKCuyZilgDakqWX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DJxCq/btsGeRikAhq/4gMquZBKCuyZilgDakqWX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDJxCq%2FbtsGeRikAhq%2F4gMquZBKCuyZilgDakqWX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2582&quot; height=&quot;1592&quot; data-origin-width=&quot;2582&quot; data-origin-height=&quot;1592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 원하는 폰트 선택 후 &amp;gt; 옵션 &amp;gt; Finder에서 보기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2008&quot; data-origin-height=&quot;1298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kI68b/btsGfKXjSnJ/Q3KlGupKO9Z8zzOrqDcBP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kI68b/btsGfKXjSnJ/Q3KlGupKO9Z8zzOrqDcBP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kI68b/btsGfKXjSnJ/Q3KlGupKO9Z8zzOrqDcBP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkI68b%2FbtsGfKXjSnJ%2FQ3KlGupKO9Z8zzOrqDcBP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2008&quot; height=&quot;1298&quot; data-origin-width=&quot;2008&quot; data-origin-height=&quot;1298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 폰트 경로 확인 : Option 버튼을 누르면 Copy부분이 Pathname Copy로 변합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;980&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhMjQg/btsGh48jg6G/X2j2gNX6ibstTCyx1QWmQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhMjQg/btsGh48jg6G/X2j2gNX6ibstTCyx1QWmQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhMjQg/btsGh48jg6G/X2j2gNX6ibstTCyx1QWmQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhMjQg%2FbtsGh48jg6G%2FX2j2gNX6ibstTCyx1QWmQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1844&quot; height=&quot;980&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;980&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/swift | mac</category>
      <author>방황하는 데이터불도저</author>
      <guid isPermaLink="true">https://kyull-it.tistory.com/210</guid>
      <comments>https://kyull-it.tistory.com/210#entry210comment</comments>
      <pubDate>Mon, 1 Apr 2024 22:46:23 +0900</pubDate>
    </item>
    <item>
      <title>Tensorflow 기초 : 모듈, 레이어, 모델 클래스 구조 알아보기</title>
      <link>https://kyull-it.tistory.com/202</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Tensorflow는 가장 흔하게 사용되는 딥러닝 프레임워크로 그 구조를 알아보고, 어떻게 활용할 수 있는지 &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://www.tensorflow.org/guide/intro_to_modules?hl=en&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식 document&lt;/a&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;를 보고 내용을 정리해보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔히 신경망모델에서의 레이어는 수학적인 구조로 이루어진 함수입니다. 딥러닝에서는 이 레이어에서 weights, bias와 같은 가중치(trainable variables)를 가지고있고, 이들이 적합한 값으로 학습되도록 하는 과정을 거칩니다. Tensorflow에서는 이러한 레이어를 함수로 재사용하고, 가중치를 저장했다가 로드할 수 있는 기능들을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 지원하는 Tensorflow의 클래스는 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;tf.Module&lt;/b&gt;&lt;/span&gt;입니다. 간단한 사용 예시를 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tf.Module을 상속받는 클래스는 아래의 두 함수로 정의할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;__init__ 함수&lt;/b&gt; : 연산의 input 값으로 들어갈 변수들을 선언해주는 부분&lt;/li&gt;
&lt;li&gt;&lt;b&gt;__call__함수&lt;/b&gt; : __init__함수에서 정의해준 변수(input)들을 가지고 연산을 정의해주는 부분&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1708056047566&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf

class SimpleModule(tf.Module):
  def __init__(self, name=None):
    super().__init__(name=name)
    self.a_variable = tf.Variable(5.0, name=&quot;train_me&quot;)
    self.non_trainable_variable = tf.Variable(5.0, trainable=False, name=&quot;do_not_train_me&quot;)
  def __call__(self, x):
    return self.a_variable * x + self.non_trainable_variable

simple_module = SimpleModule(name=&quot;simple&quot;)

simple_module(tf.constant(5.0))

# result
# 2023-10-18 01:21:08.181350: W tensorflow/core/common_runtime/gpu/gpu_device.cc:2211] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.
# Skipping registering GPU devices...
# &amp;lt;tf.Tensor: shape=(), dtype=float32, numpy=30.0&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 경우처럼 레이어에 들어가는 input size를 미리 정의하지 않고 싶다면, 아래와 같은 방식으로 구현이 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1708059241587&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Dense(tf.Module):
  def __init__(self, in_features, out_features, name=None):
    super().__init__(name=name)
    self.w = tf.Variable(
      tf.random.normal([in_features, out_features]), name='w')
    self.b = tf.Variable(tf.zeros([out_features]), name='b')
  def __call__(self, x):
    y = tf.matmul(x, self.w) + self.b
    return tf.nn.relu(y)
    
    
 class SequentialModule(tf.Module):
  def __init__(self, name=None):
    super().__init__(name=name)

    self.dense_1 = Dense(in_features=3, out_features=3)
    self.dense_2 = Dense(in_features=3, out_features=2)

  def __call__(self, x):
    x = self.dense_1(x)
    return self.dense_2(x)


# You have made a model!
my_model = SequentialModule(name=&quot;the_model&quot;)

# Call it, with random results
print(&quot;Model results:&quot;, my_model(tf.constant([[2.0, 2.0, 2.0]])))

# result
# Model results: tf.Tensor([[0.       3.415034]], shape=(1, 2), dtype=float32)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 사용되는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.tensorflow.org/guide/variable&quot;&gt;tf.Variable&lt;/a&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또한 연산 작업을 통해 값이 변경될 수 있는 Tensor형태로 텐서플로우 구조상 중요한 클래스 입니다. tf.Variable의 기능은 모델의 파라미터를 저장하고, 변수를 변경하는 다양한 연산 기능이 있습니다. 자세한 사항은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.tensorflow.org/api_docs/python/tf/Variable#attributes&quot;&gt;해당 페이지&lt;/a&gt;에서 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tf.Module 인스턴스는 자동으로 이러한 모든 tf.Variable를 모으기 때문에 이를 통해 모델 내의 여러 tf.Module들과 tf.Variable들을 관리할 수 있게 됩니다. 이에 따라 아래와 같은 기능들이 가능해집니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711511597757&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# All trainable variables
print(&quot;trainable variables:&quot;, simple_module.trainable_variables)
# Every variable
print(&quot;all variables:&quot;, simple_module.variables)

# result
# trainable variables: (&amp;lt;tf.Variable 'train_me:0' shape=() dtype=float32, numpy=5.0&amp;gt;,)
# all variables: (&amp;lt;tf.Variable 'train_me:0' shape=() dtype=float32, numpy=5.0&amp;gt;, &amp;lt;tf.Variable 'do_not_train_me:0' shape=() dtype=float32, numpy=5.0&amp;gt;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1711511621705&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;Submodules:&quot;, my_model.submodules)
# Submodules: (&amp;lt;__main__.Dense object at 0x7fc324244640&amp;gt;, &amp;lt;__main__.Dense object at 0x7fc21807c8e0&amp;gt;)

for var in my_model.variables:
  print(var, &quot;\n&quot;)
# result
# &amp;lt;tf.Variable 'b:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)&amp;gt; 
# 
# &amp;lt;tf.Variable 'w:0' shape=(3, 3) dtype=float32, numpy=
# array([[-0.22808331,  0.29274654,  0.6080226 ],
#       [-1.1041229 , -0.5975617 , -0.7721161 ],
#       [ 0.4206435 ,  0.31748644,  0.34665376]], dtype=float32)&amp;gt; 
# 
# &amp;lt;tf.Variable 'b:0' shape=(2,) dtype=float32, numpy=array([0., 0.], dtype=float32)&amp;gt; 
# 
# &amp;lt;tf.Variable 'w:0' shape=(3, 2) dtype=float32, numpy=
# array([[-1.2076675 ,  1.7211282 ],
#       [-0.22784151,  0.5912422 ],
#       [-0.9780839 , -1.3760505 ]], dtype=float32)&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, tf.Module을 통해서 모든 파라미터(=가중치=tf.Variable objects)를 저장하는 &lt;a href=&quot;https://www.tensorflow.org/guide/checkpoint&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;checkpoint&lt;/a&gt; 형태나 모델의 연산구조까지 저장하는 &lt;a href=&quot;https://www.tensorflow.org/guide/saved_model&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SavedModel&lt;/a&gt; 형태로 저장할 수 있는 기능을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;Tensorflow Serving이나 Tensorflow Lite에 정의된 것처럼 Python objects없이 모델을 돌리거나, Tensorflow Hub에서 미리 학습된 모델을 다운받기 위해서는 tf.Module은 필요한 기반 클래스입니다. (이때는 graph라는 개념과 @tf.function 데코레이터가 사용되는데, 자세한 사항은 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://www.tensorflow.org/guide/intro_to_graphs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Introduction to graphs and tf&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://www.tensorflow.org/guide/intro_to_graphs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;function&lt;/a&gt; &lt;/span&gt;&lt;span style=&quot;color: #9d9d9d; text-align: start;&quot;&gt;에서 따로 볼 수 있습니다. 해당 내용에 대해서는 다음 글에서 다루어 보겠습니다.)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tensorflow에서 &lt;b&gt;&lt;a href=&quot;https://www.tensorflow.org/guide/keras&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Keras&lt;/a&gt;&lt;/b&gt;는 tf.Module 클래스 상위에 high-level API로 구축된 모델 레이어들을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Keras API는 딥러닝에서 자주 사용되는 다양한 종류의 레이어들(dense, convolution, pooling, normalization,,,)뿐만 아니라 Optimizer, Metrics, Losses 등의 다양한 도구들을 지원하고 있습니다. 이 또한 저장 및 로드가 가능하고, 해당 레이어가 training step인지 inference step인지 구별이 가능해서 재사용도 용이합니다. &lt;a href=&quot;https://keras.io/api/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Keras API documentation&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;*&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.tensorflow.org/api_docs/python/tf/keras&quot;&gt;keras&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://github.com/google-deepmind/sonnet&quot;&gt;sonnet&lt;/a&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;은 다양한 목적의 신경망 모델을 제공하는 라이브러리로 해당 모듈을 가져와 학습, 추론 등의 과정을 편리하게 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;tf.keras.layers.Layer&lt;/b&gt;&lt;/span&gt;는 케라스에서 제공하는 레이어의 기본 클래스입니다. 이 클래스는 tf.Module로부터 상속받습니다. 부모 클래스를 변경하고, __call__을 call로 변경하면 모듈을 Keras 레이어로 변경할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1708060655134&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyDense(tf.keras.layers.Layer):

  def __init__(self, in_features, out_features, **kwargs):
    super().__init__(**kwargs)
    self.w = tf.Variable(
      tf.random.normal([in_features, out_features]), name='w')
    self.b = tf.Variable(tf.zeros([out_features]), name='b')
    
  def call(self, x):
    y = tf.matmul(x, self.w) + self.b
    return tf.nn.relu(y)

simple_layer = MyDense(name=&quot;simple&quot;, in_features=3, out_features=3)

simple_layer([[2.0, 2.0, 2.0]])&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;특별히, keras 레이어에서는 &lt;b&gt;build 함수&lt;/b&gt;를 제공합니다.&amp;nbsp;초기에 한번만 호출 되도록 하기 때문에 input size를 들어오는 값에 따라서 정의하고, 다음 실행부터는 다시 선언되지 않도록 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1708060688194&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class FlexibleDense(tf.keras.layers.Layer):
  # Note the added `**kwargs`, as Keras supports many arguments
  def __init__(self, out_features, **kwargs):
    super().__init__(**kwargs)
    self.out_features = out_features

  def build(self, input_shape):  # Create the state of the layer (weights)
    self.w = tf.Variable(
      tf.random.normal([input_shape[-1], self.out_features]), name='w')
    self.b = tf.Variable(tf.zeros([self.out_features]), name='b')

  def call(self, inputs):  # Defines the computation from inputs to outputs
    return tf.matmul(inputs, self.w) + self.b

# Create the instance of the layer
flexible_dense = FlexibleDense(out_features=3)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;빌드 전&lt;/p&gt;
&lt;pre id=&quot;code_1708060706066&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flexible_dense.variables
# []&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 후&lt;/p&gt;
&lt;pre id=&quot;code_1708060753108&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Call it, with predictably random results
print(&quot;Model results:&quot;, flexible_dense(tf.constant([[2.0, 2.0, 2.0], [3.0, 3.0, 3.0]])))

# Model results: tf.Tensor(
# [[-2.8120208  2.4438493  1.9408028]
#  [-4.2180314  3.6657739  2.9112043]], shape=(2, 3), dtype=float32)

flexible_dense.variables
# [&amp;lt;tf.Variable 'flexible_dense/w:0' shape=(3, 3) dtype=float32, numpy=
#  array([[-0.93394387,  0.07000035,  0.50755775],
#         [ 0.27968523,  0.8088689 ,  0.70035136],
#         [-0.7517518 ,  0.34305546, -0.23750767]], dtype=float32)&amp;gt;,
#  &amp;lt;tf.Variable 'flexible_dense/b:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)&amp;gt;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 호출 이후에 다시 호출하는 경우에는 build되지 않으므로 다른 shape의 입력이 들어가면 오류가 발생하게 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1708060871234&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try:
  print(&quot;Model results:&quot;, flexible_dense(tf.constant([[2.0, 2.0, 2.0, 2.0]])))
except tf.errors.InvalidArgumentError as e:
  print(&quot;Failed:&quot;, e)
  
# Failed: Exception encountered when calling layer 'flexible_dense' (type FlexibleDense).
# 
# { {function_node __wrapped__MatMul_device_/job:localhost/replica:0/task:0/device:GPU:0} } Matrix size-incompatible: In[0]: [1,4], In[1]: [3,3] [Op:MatMul]
# 
# Call arguments received by layer 'flexible_dense' (type FlexibleDense):
#   &amp;bull; inputs=tf.Tensor(shape=(1, 4), dtype=float32)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;여러 Keras 레이어들을 모델로 사용할 때 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;tf.keras.Model&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;은&lt;/span&gt; (여러 기기에서의) 학습, 평가, 로드, 저장 등의 과정을 편리하게 제공하는 클래스입니다. 이 클래스는 tf.keras.layers.Layer로부터 상속받습니다.&amp;nbsp;&lt;a href=&quot;https://www.tensorflow.org/api_docs/python/tf/keras/Model&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;API Documentation&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 정의했던 SequentialModule과 거의 비슷한 코드에서 부모클래스와 call 함수만 변경해주면 모델 클래스를 만들 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711514791858&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MySequentialModel(tf.keras.Model):
  def __init__(self, name=None, **kwargs):
    super().__init__(**kwargs)

    self.dense_1 = FlexibleDense(out_features=3)
    self.dense_2 = FlexibleDense(out_features=2)
  def call(self, x):
    x = self.dense_1(x)
    return self.dense_2(x)

# You have made a Keras model!
my_sequential_model = MySequentialModel(name=&quot;the_model&quot;)

# Call it on a tensor, with random results
print(&quot;Model results:&quot;, my_sequential_model(tf.constant([[2.0, 2.0, 2.0]])))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굉장히 Pythonic한 방식으로도 모델을 정의할 수 있습니다. 이 방법이 가장 흔하게 볼 수 있는 Tensorflow의 모델 선언 방식입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711514855335&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;inputs = tf.keras.Input(shape=[3,])

x = FlexibleDense(3)(inputs)
x = FlexibleDense(2)(x)

my_functional_model = tf.keras.Model(inputs=inputs, outputs=x)

my_functional_model.summary()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 텐서플로우에서 모델을 구성할 때 사용되는 기본적인 3가지 클래스 tf.Module, tf.keras.layers.Layer, tf.keras.Model 에 대해서 알아보았습니다. 더 자세하고, 구체적인 활용법들은 아래와 같은 사이트에서 참고할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tensorflow.org/guide/keras/making_new_layers_and_models_via_subclassing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Making&amp;nbsp;new&amp;nbsp;layers&amp;nbsp;and&amp;nbsp;models&amp;nbsp;via&amp;nbsp;subclassing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1711515123257&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Making new layers and models via subclassing &amp;nbsp;|&amp;nbsp; TensorFlow Core&quot; data-og-description=&quot;Complete guide to writing &amp;#96;Layer&amp;#96; and &amp;#96;Model&amp;#96; objects from scratch.&quot; data-og-host=&quot;www.tensorflow.org&quot; data-og-source-url=&quot;https://www.tensorflow.org/guide/keras/making_new_layers_and_models_via_subclassing&quot; data-og-url=&quot;https://www.tensorflow.org/guide/keras/making_new_layers_and_models_via_subclassing&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/OMt1s/hyVDEU7wfO/RJTTNUkwC05Xj76wIgdJnK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675&quot;&gt;&lt;a href=&quot;https://www.tensorflow.org/guide/keras/making_new_layers_and_models_via_subclassing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.tensorflow.org/guide/keras/making_new_layers_and_models_via_subclassing&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/OMt1s/hyVDEU7wfO/RJTTNUkwC05Xj76wIgdJnK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Making new layers and models via subclassing &amp;nbsp;|&amp;nbsp; TensorFlow Core&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Complete guide to writing `Layer` and `Model` objects from scratch.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.tensorflow.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tensorflow.org/guide/keras/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Keras:&amp;nbsp;The&amp;nbsp;high-level&amp;nbsp;API&amp;nbsp;for&amp;nbsp;TensorFlow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1711515203923&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Keras &amp;nbsp;|&amp;nbsp; TensorFlow Core&quot; data-og-description=&quot;Keras 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. tf.keras는 딥 러닝 모델을 빌드하고 학습시키기 위한 TensorFlow의 상위 수준 API입니다. 또한 신속한 프로토&quot; data-og-host=&quot;www.tensorflow.org&quot; data-og-source-url=&quot;https://www.tensorflow.org/guide/keras/&quot; data-og-url=&quot;https://www.tensorflow.org/guide/keras?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jTAXr/hyVDBD8sce/t1j511OTkFUOZ3cKpAm2n1/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675&quot;&gt;&lt;a href=&quot;https://www.tensorflow.org/guide/keras/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.tensorflow.org/guide/keras/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jTAXr/hyVDBD8sce/t1j511OTkFUOZ3cKpAm2n1/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Keras &amp;nbsp;|&amp;nbsp; TensorFlow Core&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Keras 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. tf.keras는 딥 러닝 모델을 빌드하고 학습시키기 위한 TensorFlow의 상위 수준 API입니다. 또한 신속한 프로토&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.tensorflow.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/Fundamental</category>
      <category>keras</category>
      <category>model</category>
      <category>TensorFlow</category>
      <category>딥러닝모델</category>
      <category>텐서플로우</category>
      <author>방황하는 데이터불도저</author>
      <guid isPermaLink="true">https://kyull-it.tistory.com/202</guid>
      <comments>https://kyull-it.tistory.com/202#entry202comment</comments>
      <pubDate>Wed, 27 Mar 2024 19:54:12 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 터미널에서 동일한 폴더 내의 파일명 일괄 변경하기</title>
      <link>https://kyull-it.tistory.com/209</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;** 다양한 파일명을 변경하는 경우들이 있겠지만 이번 글에서는 특정 단어를 추가하거나 특정 단어를 다른 단어로 변경하는 일괄 처리에 대해서 다루어보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 디렉토리에 있는 모든 파일을 다른 폴더로 옮기려고 할 때 mv 라는 명령어를 사용합니다. 파일을 옮길 때 mv 명령어를 이용하면 이동과 동시에 파일명도 변경해줄 수 있습니다. 일반적으로 아래와 같은 명령어로 수행할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711347568286&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mv &amp;lt;file_path&amp;gt; &amp;lt;new_file_path&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 여러개의 파일을 mv해주고, 파일명을 변경해주고 싶다면 for 구문을 사용해주면 됩니다. 아래의 예시로 어떻게 하는지 알아보겠습니다.&amp;nbsp;모든 파일에 path는 옮기지 않고, 파일명 변경만 해준 경우입니다. 모든 파일에 new_를 붙여서 옮기는 명령어 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711182713053&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for file in *
do mv &quot;$file&quot; &quot;new_$file&quot;
done&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKO2S6/btsF0mptnL8/7llzGu2HkCGHkRHU51Oohk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKO2S6/btsF0mptnL8/7llzGu2HkCGHkRHU51Oohk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKO2S6/btsF0mptnL8/7llzGu2HkCGHkRHU51Oohk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKO2S6%2FbtsF0mptnL8%2F7llzGu2HkCGHkRHU51Oohk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;95&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 new_라는 단어를 다시 다른 단어로 변경하기 위해서는 아래와 같이 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711346566787&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for file in new_*.jpg; do
  mv &quot;$file&quot; &quot;${file/new_/word_}&quot;
done&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;${file/new_/word_}&quot;에서 변수 치환을 통해 new_ 자리에 word_ 를 입력하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 동작은 rename이라는 툴을 통해서도 수행할 수 있습니다. rename은 파일명을 변경하는데에 더 고급 기능을 제공하는 명령어 툴로 아래와 같이 설치 후에 사용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711346872697&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install rename&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rename을 사용한 명령어는 아래와 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711346913528&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rename 's/new_/word_' new_*&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;훨씬 간단한 명령어로 같은 동작을 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/linux</category>
      <category>Linux</category>
      <category>Rename</category>
      <category>리눅스</category>
      <category>파일이름변경</category>
      <author>방황하는 데이터불도저</author>
      <guid isPermaLink="true">https://kyull-it.tistory.com/209</guid>
      <comments>https://kyull-it.tistory.com/209#entry209comment</comments>
      <pubDate>Sat, 23 Mar 2024 17:36:51 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 터미널(linux terminal)에서 텍스트 색상(text color) 바꾸는 법</title>
      <link>https://kyull-it.tistory.com/208</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu 20.04 에서 terminal을 작업할 때는 텍스트에 색상이 부여되어있어 가독성이 높습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjMZrS/btsFYNFnsnZ/2KUErGvJWS9mM5ySfDQMj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjMZrS/btsFYNFnsnZ/2KUErGvJWS9mM5ySfDQMj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjMZrS/btsFYNFnsnZ/2KUErGvJWS9mM5ySfDQMj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjMZrS%2FbtsFYNFnsnZ%2F2KUErGvJWS9mM5ySfDQMj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;739&quot; height=&quot;469&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 터미널에서 ssh로 서버에 원격접속하였을 때, 무색의 스타일로 접속되어 가독성이 매우 떨어집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6khum/btsFYqXYM6W/BYNQQKpJbsSssEZdK8e5S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6khum/btsFYqXYM6W/BYNQQKpJbsSssEZdK8e5S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6khum/btsFYqXYM6W/BYNQQKpJbsSssEZdK8e5S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6khum%2FbtsFYqXYM6W%2FBYNQQKpJbsSssEZdK8e5S0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;434&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 무색무취의 터미널의 스타일 변경을 시도해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, ssh 원격 접속된 터미널 내에서 보편적으로 /home/username/ 디렉토리에 .bashrc라는 파일이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( ls로는 .file은 보이지 않기 때문에 ls -a 라는 명령어를 통해서 확인할 수 있습니다. )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 사진의 초록색, 파란색 부분의 프롬프트인 username@hostname : ~working_directory $ 부분을 색상 변경 해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710985663559&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi .bashrc
i

PS1='\[\033[0;32m\]\u@\h:\[\033[0;34m\]\w\[\033[0m\]\$ '

esc &amp;gt; :wq &amp;gt; enter

source .bashrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;vi 에디터로 .bashrc 파일을 수정하러 들어갑니다.&lt;/li&gt;
&lt;li&gt;i를 눌러 insert mode로 진입합니다.&lt;/li&gt;
&lt;li&gt;첫번째 줄 혹은 원래 있던 PS1에 대한 설정을 확인하고, /u@/h: 앞에 초록색 컬러, /w에 대해 파란색 컬러, 그 뒤는 다시 흰색으로 초기화하는 내용으로 설정해줍니다.&lt;/li&gt;
&lt;li&gt;esc를 눌러 insert mode를 빠져나오고, 파일 저장을 위해 :wq를 누른 후, enter를 눌러 파일을 빠져나옵니다.&lt;/li&gt;
&lt;li&gt;source .bashrc 를 통해서 설정한 변수를 시스템에 적용해줍니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpXhfX/btsFX6yGeNi/V9S3SBagZyYOvpv56UDuHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpXhfX/btsFX6yGeNi/V9S3SBagZyYOvpv56UDuHk/img.png&quot; data-alt=&quot;변경된 텍스트 색상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpXhfX/btsFX6yGeNi/V9S3SBagZyYOvpv56UDuHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpXhfX%2FbtsFX6yGeNi%2FV9S3SBagZyYOvpv56UDuHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;307&quot; height=&quot;60&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;변경된 텍스트 색상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Color Code&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Black 0;30&lt;/li&gt;
&lt;li&gt;Blue 0;34&lt;/li&gt;
&lt;li&gt;Green 0;32&lt;/li&gt;
&lt;li&gt;Cyan 0;36&lt;/li&gt;
&lt;li&gt;Red 0;31&lt;/li&gt;
&lt;li&gt;Purple 0;35&lt;/li&gt;
&lt;li&gt;Brown 0;33&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 사이트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.quora.com/How-can-you-change-the-color-of-your-shell-prompt-on-Linux&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.quora.com/How-can-you-change-the-color-of-your-shell-prompt-on-Linux&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1710987021923&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;How can you change the color of your shell prompt on Linux?&quot; data-og-description=&quot;Answer (1 of 2): You can change the color of your shell prompt on Linux by modifying the PS1 environment variable. PS1 contains the prompt string, and you can include escape sequences in it to specify colors. Here's an example: 1. Open your terminal applic&quot; data-og-host=&quot;www.quora.com&quot; data-og-source-url=&quot;https://www.quora.com/How-can-you-change-the-color-of-your-shell-prompt-on-Linux&quot; data-og-url=&quot;https://www.quora.com/How-can-you-change-the-color-of-your-shell-prompt-on-Linux&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b9Cmfb/hyVDGw43Ab/y0lX5pw9rzX40ILyh078nK/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/dnmX9M/hyVAMscQub/VMGfNbyhjRh8KdjO4Cfkbk/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot;&gt;&lt;a href=&quot;https://www.quora.com/How-can-you-change-the-color-of-your-shell-prompt-on-Linux&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.quora.com/How-can-you-change-the-color-of-your-shell-prompt-on-Linux&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b9Cmfb/hyVDGw43Ab/y0lX5pw9rzX40ILyh078nK/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/dnmX9M/hyVAMscQub/VMGfNbyhjRh8KdjO4Cfkbk/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;How can you change the color of your shell prompt on Linux?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Answer (1 of 2): You can change the color of your shell prompt on Linux by modifying the PS1 environment variable. PS1 contains the prompt string, and you can include escape sequences in it to specify colors. Here's an example: 1. Open your terminal applic&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.quora.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;더 디테일한 정보&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1710987039995&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Bash Shell PS1: 10 Examples to Make Your Linux Prompt like Angelina Jolie&quot; data-og-description=&quot;Bash Shell PS1: 10 Examples to Make Your Linux Prompt like Angelina Jolie by Ramesh Natarajan on September 8, 2008 In the previous article, we discussed about Linux environment variables PS[1-4] and PROMPT_COMMAND. If used effectively, PS1 can provide valu&quot; data-og-host=&quot;www.thegeekstuff.com&quot; data-og-source-url=&quot;https://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/&quot; data-og-url=&quot;https://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IOoR0/hyVAD9RSMJ/NqdnYwk15OxKMXwiXURKtk/img.jpg?width=300&amp;amp;height=225&amp;amp;face=0_0_300_225&quot;&gt;&lt;a href=&quot;https://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IOoR0/hyVAD9RSMJ/NqdnYwk15OxKMXwiXURKtk/img.jpg?width=300&amp;amp;height=225&amp;amp;face=0_0_300_225');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bash Shell PS1: 10 Examples to Make Your Linux Prompt like Angelina Jolie&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Bash Shell PS1: 10 Examples to Make Your Linux Prompt like Angelina Jolie by Ramesh Natarajan on September 8, 2008 In the previous article, we discussed about Linux environment variables PS[1-4] and PROMPT_COMMAND. If used effectively, PS1 can provide valu&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.thegeekstuff.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** 사실 가장 쉽고 빠른 방법은 로컬의 우분투 linux terminal에 접속한 후, bashrc 파일에 있는 color에 대한 설정값들을 복사해서 ssh 접속한 서버의 bashrc파일로 붙여넣기하는 것입니다...ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 .bashrc 파일의 color관련 설정값들&lt;/p&gt;
&lt;pre id=&quot;code_1710990077937&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# set variable identifying the chroot you work in (used in the prompt below)
if [ -z &quot;${debian_chroot:-}&quot; ] &amp;amp;&amp;amp; [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we &quot;want&quot; color)
case &quot;$TERM&quot; in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n &quot;$force_color_prompt&quot; ]; then
    if [ -x /usr/bin/tput ] &amp;amp;&amp;amp; tput setaf 1 &amp;gt;&amp;amp;/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n &quot;$force_color_prompt&quot; ]; then
    if [ -x /usr/bin/tput ] &amp;amp;&amp;amp; tput setaf 1 &amp;gt;&amp;amp;/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors &amp;amp;&amp;amp; eval &quot;$(dircolors -b ~/.dircolors)&quot; || eval &quot;$(dircolors -b)&quot;
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/linux</category>
      <category>Linux</category>
      <category>Shell</category>
      <category>SSH</category>
      <category>Terminal</category>
      <category>리눅스</category>
      <author>방황하는 데이터불도저</author>
      <guid isPermaLink="true">https://kyull-it.tistory.com/208</guid>
      <comments>https://kyull-it.tistory.com/208#entry208comment</comments>
      <pubDate>Thu, 21 Mar 2024 19:02:22 +0900</pubDate>
    </item>
  </channel>
</rss>