<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>웹 개발 메모장</title>
    <link>https://dororongju.tistory.com/</link>
    <description>개발 관련 메모를 하기위한 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Sat, 12 Sep 2026 20:11:59 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>도로롱주</managingEditor>
    <image>
      <title>웹 개발 메모장</title>
      <url>https://tistory1.daumcdn.net/tistory/2776118/attach/e9a85f300e4849e4972e6ba1bb388caa</url>
      <link>https://dororongju.tistory.com</link>
    </image>
    <item>
      <title>[자바스크립트] 채팅 구현 코드 (프론트)</title>
      <link>https://dororongju.tistory.com/151</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Javascript.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/okjI6/btqzQ9og0jH/mVIw9KzC9sjt1aIK3eqVp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/okjI6/btqzQ9og0jH/mVIw9KzC9sjt1aIK3eqVp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/okjI6/btqzQ9og0jH/mVIw9KzC9sjt1aIK3eqVp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FokjI6%2FbtqzQ9og0jH%2FmVIw9KzC9sjt1aIK3eqVp1%2Fimg.png&quot; data-filename=&quot;Javascript.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;채팅 구현 코드(프론트)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;웹소켓 통신 부분을 제외한 프론트단의 코드입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;chatting.PNG&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yNBf0/btqzQsIzHWu/h5Y5gYHOnfFGvDuENXD7ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yNBf0/btqzQsIzHWu/h5Y5gYHOnfFGvDuENXD7ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yNBf0/btqzQsIzHWu/h5Y5gYHOnfFGvDuENXD7ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyNBf0%2FbtqzQsIzHWu%2Fh5Y5gYHOnfFGvDuENXD7ek%2Fimg.png&quot; data-filename=&quot;chatting.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;CSS&lt;/b&gt;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #fafafa; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #e5e5e5;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #666; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;margin&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;padding&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;.chat_wrap&amp;nbsp;.header&amp;nbsp;&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;font-size&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;14px&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;padding&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;15px&amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;background&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;#F18C7E&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;color&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;white&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;text-align&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;center&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;.chat_wrap&amp;nbsp;.chat&amp;nbsp;&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;padding-bottom&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;80px&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;.chat_wrap&amp;nbsp;.chat&amp;nbsp;ul&amp;nbsp;&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;width&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;100%&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;list-style&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;none&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;.chat_wrap&amp;nbsp;.chat&amp;nbsp;ul&amp;nbsp;li&amp;nbsp;&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;width&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;100%&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;.chat_wrap&amp;nbsp;.chat&amp;nbsp;ul&amp;nbsp;li.left&amp;nbsp;&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;text-align&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;left&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;.chat_wrap&amp;nbsp;.chat&amp;nbsp;ul&amp;nbsp;li.right&amp;nbsp;&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;text-align&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;right&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;.chat_wrap&amp;nbsp;.chat&amp;nbsp;ul&amp;nbsp;li&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4da51b;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;nbsp;div&amp;nbsp;&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;font-size&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;13px&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;.chat_wrap&amp;nbsp;.chat&amp;nbsp;ul&amp;nbsp;li&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4da51b;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;nbsp;div.sender&amp;nbsp;&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;margin&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;10px&amp;nbsp;20px&amp;nbsp;0&amp;nbsp;20px&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;font-weight&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;bold&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;.chat_wrap&amp;nbsp;.chat&amp;nbsp;ul&amp;nbsp;li&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4da51b;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;nbsp;div.message&amp;nbsp;&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;display&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;inline-block&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;word-break&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;break-all&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;margin&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;5px&amp;nbsp;20px&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;max-width&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;75%&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;border&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;1px&amp;nbsp;solid&amp;nbsp;#888&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;padding&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;10px&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;border-radius&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;5px&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;background-color&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;#FCFCFC&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;color&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;#555&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;; &lt;span style=&quot;color: #0099cc;&quot;&gt;text-align&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;left&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;.chat_wrap&amp;nbsp;.input-div&amp;nbsp;&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;position&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;fixed&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;bottom&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;width&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;100%&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;background-color&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;#FFF&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;text-align&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;center&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;border-top&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;1px&amp;nbsp;solid&amp;nbsp;#F18C7E&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;.chat_wrap&amp;nbsp;.input-div&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4da51b;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;nbsp;textarea&amp;nbsp;&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;width&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;100%&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;height&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;80px&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;border&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;none&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;padding&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;10px&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;span style=&quot;color: #ff3399;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;.format&amp;nbsp;&lt;/span&gt;{&lt;span style=&quot;color: #0099cc;&quot;&gt;&amp;nbsp;display&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;none&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #e5e5e5text-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #e5e5e5; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;HTML&lt;/b&gt;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #fafafa; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #e5e5e5;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #666; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;19&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;20&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;21&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;22&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;23&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;24&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;25&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;26&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;27&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;28&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;chat_wrap&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;header&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CHAT&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;chat&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;&amp;lt;!--&amp;nbsp;동적&amp;nbsp;생성&amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;input-div&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;textarea&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;placeholder&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;Press&amp;nbsp;Enter&amp;nbsp;for&amp;nbsp;send&amp;nbsp;message.&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;textarea&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;&amp;lt;!--&amp;nbsp;format&amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;chat&amp;nbsp;format&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;sender&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #df5000;&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066de2;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #010101;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #e5e5e5text-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #e5e5e5; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;JAVASCRIPT&lt;/b&gt;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #fafafa; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #e5e5e5;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #666; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;19&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;20&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;21&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;22&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;23&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;24&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;25&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;26&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;27&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;28&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;29&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;30&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;31&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;32&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;33&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;34&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;35&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;36&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;37&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;38&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;39&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;40&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;41&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;42&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;43&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;44&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;45&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;46&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;47&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;48&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;49&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;50&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;51&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;52&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;53&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;54&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;55&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;56&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;57&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;58&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;59&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;60&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;61&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;62&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;63&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;64&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;65&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;66&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;67&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;68&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;69&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;70&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;71&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;72&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;73&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #010101; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;const&amp;nbsp;Chat&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #a71d5d;&quot;&gt;function&lt;/span&gt;(){&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;myName&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;blue&quot;&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;init&amp;nbsp;함수&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;function&lt;/span&gt;&amp;nbsp;init()&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;enter&amp;nbsp;키&amp;nbsp;이벤트&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style=&quot;color: #066de2;&quot;&gt;document&lt;/span&gt;).on(&lt;span style=&quot;color: #63a35c;&quot;&gt;'keydown'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;'div.input-div&amp;nbsp;textarea'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;function&lt;/span&gt;(e){&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;if&lt;/span&gt;(e.keyCode&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;!&lt;/span&gt;e.shiftKey)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.preventDefault();&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;message&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;$(this).val();&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;메시지&amp;nbsp;전송&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sendMessage(message);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;입력창&amp;nbsp;clear&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clearTextarea();&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;메세지&amp;nbsp;태그&amp;nbsp;생성&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;function&lt;/span&gt;&amp;nbsp;createMessageTag(LR_className,&amp;nbsp;senderName,&amp;nbsp;message)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;형식&amp;nbsp;가져오기&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;chatLi&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;$(&lt;span style=&quot;color: #63a35c;&quot;&gt;'div.chat.format&amp;nbsp;ul&amp;nbsp;li'&lt;/span&gt;).clone();&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;값&amp;nbsp;채우기&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;chatLi.addClass(LR_className);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;chatLi.find(&lt;span style=&quot;color: #63a35c;&quot;&gt;'.sender&amp;nbsp;span'&lt;/span&gt;).text(senderName);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;chatLi.find(&lt;span style=&quot;color: #63a35c;&quot;&gt;'.message&amp;nbsp;span'&lt;/span&gt;).text(message);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;return&lt;/span&gt;&amp;nbsp;chatLi;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;메세지&amp;nbsp;태그&amp;nbsp;append&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;function&lt;/span&gt;&amp;nbsp;appendMessageTag(LR_className,&amp;nbsp;senderName,&amp;nbsp;message)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;chatLi&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;createMessageTag(LR_className,&amp;nbsp;senderName,&amp;nbsp;message);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style=&quot;color: #63a35c;&quot;&gt;'div.chat:not(.format)&amp;nbsp;ul'&lt;/span&gt;).append(chatLi);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;스크롤바&amp;nbsp;아래&amp;nbsp;고정&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style=&quot;color: #63a35c;&quot;&gt;'div.chat'&lt;/span&gt;).scrollTop($(&lt;span style=&quot;color: #63a35c;&quot;&gt;'div.chat'&lt;/span&gt;).prop(&lt;span style=&quot;color: #63a35c;&quot;&gt;'scrollHeight'&lt;/span&gt;));&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;메세지&amp;nbsp;전송&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;function&lt;/span&gt;&amp;nbsp;sendMessage(message)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;서버에&amp;nbsp;전송하는&amp;nbsp;코드로&amp;nbsp;후에&amp;nbsp;대체&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;data&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;senderName&quot;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;blue&quot;&lt;/span&gt;,&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;message&quot;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;message&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;통신하는&amp;nbsp;기능이&amp;nbsp;없으므로&amp;nbsp;여기서&amp;nbsp;receive&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resive(data);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;메세지&amp;nbsp;입력박스&amp;nbsp;내용&amp;nbsp;지우기&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;function&lt;/span&gt;&amp;nbsp;clearTextarea()&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style=&quot;color: #63a35c;&quot;&gt;'div.input-div&amp;nbsp;textarea'&lt;/span&gt;).val(&lt;span style=&quot;color: #63a35c;&quot;&gt;''&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;메세지&amp;nbsp;수신&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;function&lt;/span&gt;&amp;nbsp;resive(data)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;LR&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(data.senderName&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #a71d5d;&quot;&gt;=&lt;/span&gt;&amp;nbsp;myName)?&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;left&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;right&quot;&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;appendMessageTag(&lt;span style=&quot;color: #63a35c;&quot;&gt;&quot;right&quot;&lt;/span&gt;,&amp;nbsp;data.senderName,&amp;nbsp;data.message);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a71d5d;&quot;&gt;return&lt;/span&gt;&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #63a35c;&quot;&gt;'init'&lt;/span&gt;:&amp;nbsp;init&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;})();&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;$(&lt;span style=&quot;color: #a71d5d;&quot;&gt;function&lt;/span&gt;(){&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Chat.init();&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;});&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #e5e5e5text-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #e5e5e5; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>옛날../자바스크립트</category>
      <author>도로롱주</author>
      <guid isPermaLink="true">https://dororongju.tistory.com/151</guid>
      <comments>https://dororongju.tistory.com/151#entry151comment</comments>
      <pubDate>Mon, 18 Nov 2019 18:01:42 +0900</pubDate>
    </item>
    <item>
      <title>2. CGAN(Conditional Generative Adversarial Network)</title>
      <link>https://dororongju.tistory.com/150</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display:none;&quot; 
 data-ad-unit    = &quot;DAN-t81v31lxxz6s&quot; 
 data-ad-width   = &quot;728&quot; 
 data-ad-height  = &quot;90&quot;&gt;&lt;/ins&gt; 
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot; async&gt;&lt;/script&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&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&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Abstract&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Introduction&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Conditional Adversarial nets&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Experiments&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;References&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Abstract&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;생성모델을 학습시키는 &lt;b&gt;GAN&lt;/b&gt;을 기반으로 &lt;b&gt;GAN의 조건부(Conditional) 버전&lt;/b&gt;으로&amp;nbsp;기존 모델에 간단히 y를 추가하여 만든 적대적 신경망을 소개합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CGAN이 class label(0~9)에 맞는 MNIST 이미지를 생성할 수 있음을 보여줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 이 모델이 multi-modal 모델에 어떻게 사용될 지, 또 이미지 태깅에 어떻게 응용 가능할 지를 설명합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CMYPe/btqxj0G4Nh4/rzWRFS0zw54Lh1MyhZ47AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CMYPe/btqxj0G4Nh4/rzWRFS0zw54Lh1MyhZ47AK/img.png&quot; data-alt=&quot;CGAN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CMYPe/btqxj0G4Nh4/rzWRFS0zw54Lh1MyhZ47AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCMYPe%2Fbtqxj0G4Nh4%2FrzWRFS0zw54Lh1MyhZ47AK%2Fimg.png&quot; width=&quot;265&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;CGAN&lt;/figcaption&gt;
&lt;/figure&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;color: #000000;&quot;&gt;GAN 모델과 비교하여 c가 추가되었고 나머지는 같습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;C는 class label 등에 기반할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;original GAN에서는 불가능 했었던, 생성 데이터에 대한 제어가 가능해 집니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Conditional Adversarial nets&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&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;color: #000000;&quot;&gt;Original Gan&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sBnfU/btqxgyZP4Zg/oVcBshN9TsMLRXeo6RxvD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sBnfU/btqxgyZP4Zg/oVcBshN9TsMLRXeo6RxvD0/img.png&quot; data-alt=&quot;original gan 목적함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sBnfU/btqxgyZP4Zg/oVcBshN9TsMLRXeo6RxvD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsBnfU%2FbtqxgyZP4Zg%2FoVcBshN9TsMLRXeo6RxvD0%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;/&gt;&lt;/span&gt;&lt;figcaption&gt;original gan 목적함수&lt;/figcaption&gt;
&lt;/figure&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;color: #000000;&quot;&gt;CGAN&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caaSop/btqxf4dvvrH/rpvFGiWOchyQFuMKVFgCbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caaSop/btqxf4dvvrH/rpvFGiWOchyQFuMKVFgCbk/img.png&quot; data-alt=&quot;CGAN 목적함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caaSop/btqxf4dvvrH/rpvFGiWOchyQFuMKVFgCbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaaSop%2Fbtqxf4dvvrH%2FrpvFGiWOchyQFuMKVFgCbk%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;/&gt;&lt;/span&gt;&lt;figcaption&gt;CGAN 목적함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위는 GAN과 CGAN의 목적함수입니다. GAN에서 input 데이터가 x 였다면, CGAN에서는 input 데이터가 x|y 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;조건부 데이터를 입력으로 받는다는 이야기 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeIkI/btqxjB8GPnx/MFiQ97cUFMTuaWgmH5INjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeIkI/btqxjB8GPnx/MFiQ97cUFMTuaWgmH5INjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeIkI/btqxjB8GPnx/MFiQ97cUFMTuaWgmH5INjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeIkI%2FbtqxjB8GPnx%2FMFiQ97cUFMTuaWgmH5INjK%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;original GAN에서 input 데이터에 추가정보 y라는 조건이 붙는다면(y를 같이 input한다면) 조건부 생성 모델을 만들 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;y는 어떤 보조정보라도 될 수 있는데, class label이나 다른 modality의 데이터 등이 될 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Experiment&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bExjKW/btqxgYjHjKp/WtAgm4QlAarQVLH6e5IbDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bExjKW/btqxgYjHjKp/WtAgm4QlAarQVLH6e5IbDk/img.png&quot; data-alt=&quot;CGAN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bExjKW/btqxgYjHjKp/WtAgm4QlAarQVLH6e5IbDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbExjKW%2FbtqxgYjHjKp%2FWtAgm4QlAarQVLH6e5IbDk%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;/&gt;&lt;/span&gt;&lt;figcaption&gt;CGAN&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실험 결과로 위 이미지와 같이 condition을 통해&amp;nbsp;0~9 중 원하는 이미지를 생성할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;소스코드: &lt;a href=&quot;https://github.com/djkim1991/cgan&quot;&gt;https://github.com/djkim1991/cgan&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display:none;&quot; 
 data-ad-unit    = &quot;DAN-1iyhozrisrk8k&quot; 
 data-ad-width   = &quot;300&quot; 
 data-ad-height  = &quot;250&quot;&gt;&lt;/ins&gt; 
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot; async&gt;&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>옛날../GAN(Generative Adversarial Networks)</category>
      <category>ai</category>
      <category>CGAN</category>
      <category>Gan</category>
      <author>도로롱주</author>
      <guid isPermaLink="true">https://dororongju.tistory.com/150</guid>
      <comments>https://dororongju.tistory.com/150#entry150comment</comments>
      <pubDate>Wed, 7 Aug 2019 09:11:37 +0900</pubDate>
    </item>
    <item>
      <title>1. GAN: Generative Adversarial Networks</title>
      <link>https://dororongju.tistory.com/149</link>
      <description>&lt;p&gt;&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-t81v31lxxz6s&quot; data-ad-width=&quot;728&quot; data-ad-height=&quot;90&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;gan.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGKIrp/btqxgAch0ny/WnkqmexOuy0scKzT3Fg2gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGKIrp/btqxgAch0ny/WnkqmexOuy0scKzT3Fg2gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGKIrp/btqxgAch0ny/WnkqmexOuy0scKzT3Fg2gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGKIrp%2FbtqxgAch0ny%2FWnkqmexOuy0scKzT3Fg2gK%2Fimg.png&quot; data-filename=&quot;gan.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&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&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Abstract&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Introduction&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Adversarial Nets&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Theoritical Results&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Experiments&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Advantages and disadvantages&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Conclusions and future work&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;References&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Abstract&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 논문에서는 적대적으로 동작하는 두 생성 모델을 동시에 학습시키는 새 framework를 제안합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;G(생성자)는 원본 data distribution을 흉내 내고, D(판별자)는 data가 원본 data인지, G(생성자)가 생성한 data인지 판별합니다.&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;G(생성자)의 목적은 D(판별자)를 속이는 것이 목적이고, D(판별자)는 data를 정확하게 판별하는 것이 목적입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서, D(판별자)의 정확도는 종국에 50%가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Generative-Adversarial-Network-GAN.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btNKvK/btqw8CzL96Y/yC02LvwRjYUbiUfBzb3lU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btNKvK/btqw8CzL96Y/yC02LvwRjYUbiUfBzb3lU1/img.png&quot; data-alt=&quot;GAN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btNKvK/btqw8CzL96Y/yC02LvwRjYUbiUfBzb3lU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtNKvK%2Fbtqw8CzL96Y%2FyC02LvwRjYUbiUfBzb3lU1%2Fimg.png&quot; data-filename=&quot;Generative-Adversarial-Network-GAN.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;/&gt;&lt;/span&gt;&lt;figcaption&gt;GAN&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;적대적인 두 네트워크를 학습시킵니다. D는 data가 X에서 온 것인지, G에서 온 것인지 잘 판별하는 것이 목표이고,&amp;nbsp; G는 D를 속일 정도로 data를 잘 생성하는 것이 목표입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다층 퍼셉트론을 사용하면, 다른 복잡한 네트워크 필요 없이 forward/backpropagation 만으로도 학습이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Adversarial Nets&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyYjoM/btqw5hD8enf/3K8gozJHRxKxgvf6H6Lrk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyYjoM/btqw5hD8enf/3K8gozJHRxKxgvf6H6Lrk0/img.png&quot; data-alt=&quot;GAN 목적 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyYjoM/btqw5hD8enf/3K8gozJHRxKxgvf6H6Lrk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyYjoM%2Fbtqw5hD8enf%2F3K8gozJHRxKxgvf6H6Lrk0%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;/&gt;&lt;/span&gt;&lt;figcaption&gt;GAN 목적 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;G는 V를 최소화 하려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;D는 V를 최소화 하려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;E: 기댓값&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;X~Pdata(x): 원본 데이터 분포에서 왔을 때,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;X~Pz(z): 생성 데이터 분포에서 왔을 때&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;학습시킬 때, inner loop에서 G를 최적화하는 것은 매우 많은 계산을 필요로 하고, 유한한 데이터셋에서는 overfitting을 초래하기 때문에, k step만큼 D를 최적화 시키고 G는 1 step만 최적화 하도록 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;학습 초반에는 G가 형편없기 때문에 D는 판별을 아주 잘하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;G가 log(1-D(G(z))를 최소화하도록 하는 것 보다는, log(D(G(x))를 최대화하도록 하는 것이 더 학습이 잘됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이유는 G가 너무 형편없는 경우, log(1-D(G(z))의 gradient 값이 너무 작아 학습이 느리기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Generative-Adversarial-Network-GAN2.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daD5Lv/btqw5hD8pV5/cSbCnSnpIrH8KiDm6bDLu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daD5Lv/btqw5hD8pV5/cSbCnSnpIrH8KiDm6bDLu0/img.png&quot; data-alt=&quot;GAN 학습과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daD5Lv/btqw5hD8pV5/cSbCnSnpIrH8KiDm6bDLu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaD5Lv%2Fbtqw5hD8pV5%2FcSbCnSnpIrH8KiDm6bDLu0%2Fimg.png&quot; data-filename=&quot;Generative-Adversarial-Network-GAN2.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;/&gt;&lt;/span&gt;&lt;figcaption&gt;GAN 학습과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검은 점선: 원본 데이터의 분포&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;초록 실선: G가 생성한 분포&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파란 점선: D가 판별한 결과&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;화살표: x = G(z) mapping&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(a) 초기상태, G, D 모두 학습전&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(b) D 학습 후, 판별을 잘하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(c) G 학습 후, G가 생성한 분포가 원본 분포와 비슷해지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(d) 충분한 학습 후, G가 생성한 분포가 원본의 분포와 거의 동일하며, D의 판별 값이 0.5에 수렴한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Theoretical Results&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Generative-Adversarial-Network-GAN3.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k5jAg/btqw7wAgHXZ/3jwj2rO1YpYEjiAQVk1Bs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k5jAg/btqw7wAgHXZ/3jwj2rO1YpYEjiAQVk1Bs0/img.png&quot; data-alt=&quot;Theoretical Results&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k5jAg/btqw7wAgHXZ/3jwj2rO1YpYEjiAQVk1Bs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk5jAg%2Fbtqw7wAgHXZ%2F3jwj2rO1YpYEjiAQVk1Bs0%2Fimg.png&quot; data-filename=&quot;Generative-Adversarial-Network-GAN3.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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Theoretical Results&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Experiments&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MNIST, TFD, CIFAR-10에 대해 학습을 진행한 결과가 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Generative-Adversarial-Network-GAN4.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX4Use/btqw7vOUD32/fZnkAR2Z37b8aKLgzFk0VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX4Use/btqw7vOUD32/fZnkAR2Z37b8aKLgzFk0VK/img.png&quot; data-alt=&quot;GAN 학습 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX4Use/btqw7vOUD32/fZnkAR2Z37b8aKLgzFk0VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX4Use%2Fbtqw7vOUD32%2FfZnkAR2Z37b8aKLgzFk0VK%2Fimg.png&quot; data-filename=&quot;Generative-Adversarial-Network-GAN4.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;/&gt;&lt;/span&gt;&lt;figcaption&gt;GAN 학습 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;소스코드:&lt;/b&gt;&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://github.com/djkim1991/gan&quot;&gt;https://github.com/djkim1991/gan&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Adventages and disadvantages&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;장점&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- backpropagation 만으로 학습이 가능합니다.(마르코프 체인이 필요 없다.)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- 다양한 함수들이 모델들을 모델에 접목하여 활용도가 뛰어나고 발전 가능성이 높습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단점&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- 판별자 &lt;b&gt;D&lt;/b&gt;와 생성자 &lt;b&gt;G&lt;/b&gt;가 균형을 잘 맞추어 성능이 향상되어야 하는데, 정답이 없고 쉽지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- 모델이 실제 데이터 분포를 따라가지 못하고 그저 뭉뚱그리기만 하면서, 다양성을 잃을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;예를 들면, MNIST로 학습하는 경우 단순히 목적함수의 loss만 줄이는 방향으로 설정되어, 0~9 총 10가지 숫자를 골고루 생성하는 것이 아니라 특정 숫자만 만들려고 하는 경우입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Conclusions and future work&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사실 2014년 처음 발표된 original GAN은 학습이 불안정하고 고해상도 이미지는 생성하지 못하는 한계를 갖고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 문제를 보완하기 위해 GAN 이후로 수많은 발전된 GAN이 연구되어 발표되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-1iyhozrisrk8k&quot; data-ad-width=&quot;300&quot; data-ad-height=&quot;250&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot;&gt;&lt;/script&gt;</description>
      <category>옛날../GAN(Generative Adversarial Networks)</category>
      <category>ai</category>
      <category>Gan</category>
      <author>도로롱주</author>
      <guid isPermaLink="true">https://dororongju.tistory.com/149</guid>
      <comments>https://dororongju.tistory.com/149#entry149comment</comments>
      <pubDate>Fri, 2 Aug 2019 20:43:45 +0900</pubDate>
    </item>
    <item>
      <title>Generative Adversarial Networks 발전 스토리</title>
      <link>https://dororongju.tistory.com/148</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-t81v31lxxz6s&quot; data-ad-width=&quot;728&quot; data-ad-height=&quot;90&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;gan.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uqzM8/btqw7vVEh9g/sA6MngswXkQCH9sz9ILFck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uqzM8/btqw7vVEh9g/sA6MngswXkQCH9sz9ILFck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uqzM8/btqw7vVEh9g/sA6MngswXkQCH9sz9ILFck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuqzM8%2Fbtqw7vVEh9g%2FsA6MngswXkQCH9sz9ILFck%2Fimg.png&quot; data-filename=&quot;gan.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Ian Goodfellow가 2014년 Generative Adversarial Networks(GAN)을 꿈꾸었을 때, 그 분야가 이렇게까지 빠른 발전이 있을거라고는 생각하지 못했을 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 사진들을 봅시다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;biggan.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc2VT2/btqw8awIQCK/zSa9A7LhYYU5MdzRxTXX00/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc2VT2/btqw8awIQCK/zSa9A7LhYYU5MdzRxTXX00/img.jpg&quot; data-alt=&quot;https://regmedia.co.uk/2018/10/01/biggan.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc2VT2/btqw8awIQCK/zSa9A7LhYYU5MdzRxTXX00/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc2VT2%2Fbtqw8awIQCK%2FzSa9A7LhYYU5MdzRxTXX00%2Fimg.jpg&quot; data-filename=&quot;biggan.jpg&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://regmedia.co.uk/2018/10/01/biggan.jpg&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이 이미지들은 &lt;b&gt;100% 가짜 이미지&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p&gt;가짜 이미지라는 것이, 포토샵같이 사람이 인위적으로 작업한 이미지를 말하는 것이 아닙니다.&lt;/p&gt;
&lt;p&gt;오직 엄청난 양의 덧셈, 곱셈등 &lt;b&gt;GPU 연산만을 통해 만들어낸 가짜 이미지&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 이미지들을 만들어낸 알고리즘이 &lt;b&gt;GAN&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2014년 발표된 기본 GAN의 모든 개선 알고리즘을 살펴보는 것은 현실적으로 매우 힘듭니다.&lt;/p&gt;
&lt;p&gt;대신 지난 몇 년 동안 GAN 연구에서 멋진 결과를 나타낸 몇몇 연구들을 선택해서 살펴봅시다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(&quot;Convolution&quot;이나 &quot;&lt;span&gt;Wasserstein distance&quot;등의 개념들은 자세히 설명하기보다는 참고할 수 있는 코드를 링크하겠습니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래는 GAN landscape를 표현한 그림입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;GanMap.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MQvBP/btqw8CfsNqZ/kkTjvn5m7RtIwxRiomYkBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MQvBP/btqw8CfsNqZ/kkTjvn5m7RtIwxRiomYkBk/img.png&quot; data-alt=&quot;GAN landscape&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MQvBP/btqw8CfsNqZ/kkTjvn5m7RtIwxRiomYkBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMQvBP%2Fbtqw8CfsNqZ%2FkkTjvn5m7RtIwxRiomYkBk%2Fimg.png&quot; data-filename=&quot;GanMap.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;/&gt;&lt;/span&gt;&lt;figcaption&gt;GAN landscape&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;u&gt;&lt;a href=&quot;https://dororongju.tistory.com/149?category=799198&quot;&gt;1. GAN: Generative Adversarial Networks&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;u&gt;&lt;a href=&quot;https://dororongju.tistory.com/150&quot;&gt;2. CGAN: Conditional Generative Adversarial Network&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;u&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. DCGAN: Deep Convolutional Generative Adversarial Network&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;u&gt;&lt;span&gt;4. CycleGAN&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;u&gt;&lt;span&gt;5. CoGAN: Coupled Generative Adversarial Networks&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;u&gt;&lt;span&gt;6. ProGAN: Progressive Generative Adversarial Networks&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;u&gt;&lt;span&gt;7. WGAN: Wassertein Generative Adversarial Networks&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;u&gt;&lt;span&gt;8. SAGAN: Self-Attention Generative Adversarial Networks&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;u&gt;&lt;span&gt;9. BigGAN: Big Generative Adversarial Networks&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;u&gt;&lt;span&gt;10. StyleGAN: Style-based Generative Adversarial Networks&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;원문: &lt;a href=&quot;https://blog.floydhub.com/gans-story-so-far/&quot;&gt;https://blog.floydhub.com/gans-story-so-far/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-1iyhozrisrk8k&quot; data-ad-width=&quot;300&quot; data-ad-height=&quot;250&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot;&gt;&lt;/script&gt;</description>
      <category>옛날../GAN(Generative Adversarial Networks)</category>
      <category>ai</category>
      <category>Gan</category>
      <author>도로롱주</author>
      <guid isPermaLink="true">https://dororongju.tistory.com/148</guid>
      <comments>https://dororongju.tistory.com/148#entry148comment</comments>
      <pubDate>Sun, 28 Jul 2019 19:07:13 +0900</pubDate>
    </item>
    <item>
      <title>7. nn.Sequential을 사용한 신경망 구현</title>
      <link>https://dororongju.tistory.com/147</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;다운로드.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwiLrP/btqwYSv86t3/KfCRy7jVKC0kAuCPNjEGr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwiLrP/btqwYSv86t3/KfCRy7jVKC0kAuCPNjEGr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwiLrP/btqwYSv86t3/KfCRy7jVKC0kAuCPNjEGr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwiLrP%2FbtqwYSv86t3%2FKfCRy7jVKC0kAuCPNjEGr0%2Fimg.png&quot; data-filename=&quot;다운로드.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-t81v31lxxz6s&quot; data-ad-width=&quot;728&quot; data-ad-height=&quot;90&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h2&gt;nn.Sequantial을 사용한 신경망 구현(앞서 정의한 신경망 모델(#6 )의 연장)&lt;/h2&gt;
&lt;h3&gt;nn.Sequantial을 사용하지 &lt;b&gt;않은&lt;/b&gt; 신경망&lt;/h3&gt;
&lt;p&gt;아래 신경망에서는 &lt;code&gt;__init__()&lt;/code&gt; 에서 사용할 네트워크 모델들을 정의 해주고,&lt;br /&gt;&lt;code&gt;forward()&lt;/code&gt; 함수에서 그 모델들을 사용하여 순전파 로직을 구현했습니다.&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;class MyNeuralNetwork(nn.Module):
    def __init__(self):
        super(MyNeuralNetwork, self).__init__()

        self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=5)
        self.conv2 = nn.Conv2d(in_channels=64, out_channels=30, kernel_size=5)
        self.fc1 = nn.Linear(in_features=30*5*5, out_features=128, bias=True)
        self.fc2 = nn.Linear(in_features=128, out_features=10, bias=True)

    def forward(self, x):
        x = F.relu(self.conv1(x), inplace=True)
        x = F.max_pool2d(x, (2, 2))

        x = F.relu(self.conv2(x), inplace=True)
        x = F.max_pool2d(x, (2, 2))

        x = x.view(x.shape[0], -1)
        x = F.relu(self.fc1(x), inplace=True)
        x = F.relu(self.fc2(x), inplace=True)

        return x&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;nn.Sequantial을 사용한 신경망&lt;/h3&gt;
&lt;p&gt;nn.Sequantial을 사용하면 &lt;code&gt;__init__()&lt;/code&gt; 에서 사용할 네트워크 모델들을 정의 해줄 뿐만 아니라,&lt;br /&gt;&lt;code&gt;forward()&lt;/code&gt; 함수에서 구현될 순전파를 Layer 형태로 보다 가독성이 뛰어나게 코드를 작성할 수 있습니다. Layer가 복잡해질수록 nn.Sequential은 그 효가가 뛰어납니다.&lt;/p&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;class MyNeuralNetwork(nn.Module):
    def __init__(self):
        super(MyNeuralNetwork, self).__init__()

        self.layer1 = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=64, kernel_size=5),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2)
        )

        self.layer2 = nn.Sequential(
            nn.Conv2d(in_channels=64, out_channels=30, kernel_size=5),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2)
        )

        self.layer3 = nn.Sequential(
            nn.Linear(in_features=30*5*5, out_features=128, bias=True),
            nn.ReLU(inplace=True)
        )

        self.layer4 = nn.Sequential(
            nn.Linear(in_features=128, out_features=10, bias=True),
            nn.ReLU(inplace=True)
        )

    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = x.view(x.shape[0], -1)
        x = self.layer3(x)
        x = self.layer4(x)

        return x&lt;/code&gt;&lt;/pre&gt;

&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display:none;&quot; 
 data-ad-unit    = &quot;DAN-1iyhozrisrk8k&quot; 
 data-ad-width   = &quot;300&quot; 
 data-ad-height  = &quot;250&quot;&gt;&lt;/ins&gt; 
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot; async&gt;&lt;/script&gt;</description>
      <category>옛날../pytorch</category>
      <category>ai</category>
      <category>pytorch</category>
      <author>도로롱주</author>
      <guid isPermaLink="true">https://dororongju.tistory.com/147</guid>
      <comments>https://dororongju.tistory.com/147#entry147comment</comments>
      <pubDate>Mon, 22 Jul 2019 22:47:50 +0900</pubDate>
    </item>
    <item>
      <title>6. 신경망 학습과 평가</title>
      <link>https://dororongju.tistory.com/146</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;다운로드.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eavajg/btqwVTpGi4t/8Ev0tKOHD12qZ7K648sByK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eavajg/btqwVTpGi4t/8Ev0tKOHD12qZ7K648sByK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eavajg/btqwVTpGi4t/8Ev0tKOHD12qZ7K648sByK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feavajg%2FbtqwVTpGi4t%2F8Ev0tKOHD12qZ7K648sByK%2Fimg.png&quot; data-filename=&quot;다운로드.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-t81v31lxxz6s&quot; data-ad-width=&quot;728&quot; data-ad-height=&quot;90&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;신경망 학습과 평가(앞서 정의한 신경망 모델(#5 )의 연장)&lt;/h2&gt;
&lt;h3&gt;신경망 모델 개선 ①&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;학습에 사용할 데이터는 CIFAR10 입니다.&lt;/li&gt;
&lt;li&gt;이 신경망 모델은 이미지를 입력받았을 때, 이미지가 어떤 이미지인지 분류하는 모델입니다.&lt;/li&gt;
&lt;li&gt;분류되는 class는 '비행기', '자동차', '개구리' 등 10개 입니다.&lt;br /&gt;따라서 forward 함수의 output은 10개의 classes를 분류할 수 있도록 out_features가 10이 되어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;신경망 모델 개선 ②&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2개의 convolutional Layer를 사용&lt;/li&gt;
&lt;li&gt;2개의 Linear Layout을 사용&lt;/li&gt;
&lt;li&gt;convolutional Layout을 통과한 데이터들을 max_pool2d 함수로 2*2 필터를 사용해 풀링&lt;/li&gt;
&lt;li&gt;활성화 함수로는 relu함수를 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;개선된 신경망 모델 코드&lt;/h3&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import Dataset, DataLoader

import torchvision
import torchvision.transforms as transforms


class MyNeuralNetwork(nn.Module):
    def __init__(self):
        super(MyNeuralNetwork, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=5)
        self.conv2 = nn.Conv2d(in_channels=64, out_channels=30, kernel_size=5)
        self.fc1 = nn.Linear(in_features=30*5*5, out_features=128, bias=True)
        self.fc2 = nn.Linear(in_features=128, out_features=10, bias=True)

    def forward(self, x):
        x = F.relu(self.conv1(x), inplace=True)
        x = F.max_pool2d(x, (2, 2))

        x = F.relu(self.conv2(x), inplace=True)
        x = F.max_pool2d(x, (2, 2))

        x = x.view(x.shape[0], -1)
        x = F.relu(self.fc1(x), inplace=True)
        x = F.relu(self.fc2(x), inplace=True)

        return x

    @staticmethod
    def load_data():
        # classes of &quot;CIFAR10&quot;
        classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

        transform = transforms.Compose([
            transforms.ToTensor(),
            transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
        ])

        train_set = torchvision.datasets.CIFAR10(
            root='./data',
            train=True,
            download=False,
            transform=transform
        )

        test_set = torchvision.datasets.CIFAR10(
            root='./data',
            train=False,
            download=False,
            transform=transform
        )
        train_loader = DataLoader(train_set, batch_size=8, shuffle=True, num_workers=0)
        test_loader = DataLoader(test_set, batch_size=8, shuffle=False, num_workers=0)

        return train_loader, test_loader&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;신경망 모델 학습&lt;/h3&gt;
&lt;p&gt;신경망 모델을 학습시키기 위해서는 optimizer와 loss function이 필요합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;loss function은 forward 함수가 return 한 결과(예측 값)와 실제 값이 얼마나 다른 지를 return 해주는 함수입니다.&lt;/li&gt;
&lt;li&gt;optimizer는 역전파를 통해 각 노드들의 미분값을 구하고 그것을 활용해 하이퍼 파라미터들을 조정함으로써 신경망 모델을 좀더 나은 방향으로 변화시키는 역할을 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;optimizer는 &lt;code&gt;torch.optim.SGD&lt;/code&gt;를 사용했고,&lt;br /&gt;loss함수는 &lt;code&gt;torch.nn.CrossEntropyLoss&lt;/code&gt;를 사용했습니다.&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;optimizer = torch.optim.SGD(params=network.parameters(), lr=0.001, momentum=0.9)
loss_function = nn.CrossEntropyLoss()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;epoch 크기를 3으로 하여 학습을 시키는 코드는 아래와 같습니다.&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;network = MyNeuralNetwork()
train_loader, test_loader = network.load_data()

optimizer = torch.optim.SGD(params=network.parameters(), lr=0.001, momentum=0.9)
loss_function = nn.CrossEntropyLoss()

epoch_size = 3
for epoch in range(epoch_size):
    for i, data in enumerate(train_loader):
        inputs, labels = data
        inputs, labels = Variable(inputs), Variable(labels)

        if torch.cuda.is_available():
            inputs = inputs.cuda()
            labels = labels.cuda()
            network.cuda()

        optimizer.zero_grad()
        out = network.forward(inputs)
        loss = loss_function(out, labels)
        loss.backward()
        optimizer.step()

        if(i % 100 == 0):
            print('{0}: loss is {1}'.format(i, loss))

print(&quot;train over&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;신경망 모델 평가&lt;/h3&gt;
&lt;p&gt;test 데이터를 이용해 신경망 모델이 예측한 값과 실제 label이 얼마나 같은 지 모두 확인하여 그 정확도를 출력하는 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;total = 0
correct = 0
for _, data in enumerate(test_loader):
    images, labels = data

    if torch.cuda.is_available():
        images = images.cuda()
        labels = labels.cuda()

    out = network.forward(Variable(images))
    _, predicted = torch.max(out.data, 1)

    total += labels.size(0)
    correct += (predicted == labels).sum()

print('Accuracy is {0}%'.format(100*correct/total))&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;참고: 김군이(&lt;a href=&quot;https://www.youtube.com/watch?v=hAdjMBR-ttg&quot;&gt;https://www.youtube.com/watch?v=hAdjMBR-ttg&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;pytorchStudy_img01.PNG&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHSev8/btqwW0uyeiG/g5Sggnc9AInbj8Au2DmgK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHSev8/btqwW0uyeiG/g5Sggnc9AInbj8Au2DmgK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHSev8/btqwW0uyeiG/g5Sggnc9AInbj8Au2DmgK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHSev8%2FbtqwW0uyeiG%2Fg5Sggnc9AInbj8Au2DmgK0%2Fimg.png&quot; data-filename=&quot;pytorchStudy_img01.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-1iyhozrisrk8k&quot; data-ad-width=&quot;300&quot; data-ad-height=&quot;250&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;</description>
      <category>옛날../pytorch</category>
      <category>ai</category>
      <category>pytorch</category>
      <author>도로롱주</author>
      <guid isPermaLink="true">https://dororongju.tistory.com/146</guid>
      <comments>https://dororongju.tistory.com/146#entry146comment</comments>
      <pubDate>Mon, 22 Jul 2019 00:07:43 +0900</pubDate>
    </item>
    <item>
      <title>5. 신경망 정의와 순방향 전파</title>
      <link>https://dororongju.tistory.com/145</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;다운로드.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkVgww/btqwWAizSs9/seZqPAkk96Q7KjRUPuk0M1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkVgww/btqwWAizSs9/seZqPAkk96Q7KjRUPuk0M1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkVgww/btqwWAizSs9/seZqPAkk96Q7KjRUPuk0M1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkVgww%2FbtqwWAizSs9%2FseZqPAkk96Q7KjRUPuk0M1%2Fimg.png&quot; data-filename=&quot;다운로드.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display:none;&quot; 
 data-ad-unit    = &quot;DAN-t81v31lxxz6s&quot; 
 data-ad-width   = &quot;728&quot; 
 data-ad-height  = &quot;90&quot;&gt;&lt;/ins&gt; 
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot; async&gt;&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;신경망 정의와 순방향 전파(Neural Network and Forward propagation)&lt;/h2&gt;
&lt;h3&gt;Neural Network 정의&lt;/h3&gt;
&lt;p&gt;신경망은 아래 그림과 같이&lt;br /&gt;input layer, hidden layer, output layer 를 갖습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;nn.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zHzHI/btqwVS5mYQy/TImmk46cxI39k8bt0DGUT0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zHzHI/btqwVS5mYQy/TImmk46cxI39k8bt0DGUT0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zHzHI/btqwVS5mYQy/TImmk46cxI39k8bt0DGUT0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzHzHI%2FbtqwVS5mYQy%2FTImmk46cxI39k8bt0DGUT0%2Fimg.jpg&quot; data-filename=&quot;nn.jpg&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;신경망 모델을 pytorch를 사용해 class로 구현하기&lt;/h3&gt;
&lt;p&gt;pytorch의 nn.module을 상속받아 low level의 코딩을 줄일 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import torch
import torch.nn as nn


class MyNeuralNetwork(nn.Module):
    def __init__(self):
        pass # 모델 코딩

    def forward(self, x):
        pass # 순전파 코딩&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;CIFAR10 데이터셋&lt;/h3&gt;
&lt;p&gt;CIFAR10 데이터셋을 학습하는 신경망 모델을 만들려고 합니다.&lt;br /&gt;CIFAR10 데이터셋은 32 * 32 크기의 RGB 데이터입니다.&lt;br /&gt;이 데이터셋을 torchvision을 통해 다음과 같이 데이터를 로드하려고 합니다.&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;train_set = torchvision.datasets.CIFAR10(
    root='./data',
    train=True,
    download=False,
    transform=transform
)

test_set = torchvision.datasets.CIFAR10(
    root='./data',
    train=False,
    download=False,
    transform=transform
)
train_loader = DataLoader(train_set, batch_size=8, shuffle=True, num_workers=0)
test_loader = DataLoader(test_set, batch_size=8, shuffle=False, num_workers=0)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이렇게 로드한 데이터의 형태를 살펴보면&lt;/p&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;# print shapes of loaded data
for n, (img, labels) in enumerate(test_loader):
    print(n, img.shape, labels.shape)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;torch.Size([8, 3, 32, 32]) torch.Size([8])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;batch_size 8 로 가져온 이미지가 채널이 3이고, 크기가 32 * 32 인 이미지라는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h3&gt;모델과 순전파 코딩&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nn.Conv2d를 사용한 모델입니다.&lt;/li&gt;
&lt;li&gt;nn.Conv2d에 대한 내용은 앞에 있으니 넘어가겠습니다.(&lt;a href=&quot;https://github.com/djkim1991/pytorchStudy/issues/3&quot;&gt;https://github.com/djkim1991/pytorchStudy/issues/3&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;forward 함수는 입력 데이터가 어떤 결과를 return 하는 지 작성하면 됩니다.&lt;/li&gt;
&lt;li&gt;여기서는 입력 데이터 x가 Conv2d 함수를 두번 통과한 결과를 return 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;import torch
import torch.nn as nn


class MyNeuralNetwork(nn.Module):
    def __init__(self):
        super(MyNeuralNetwork, self).__init__()
        self.net_1 = nn.Conv2d(3, 5, 5)
        self.net_2 = nn.Conv2d(5, 10, 5)

    def forward(self, x):
        x = self.net_1(x)
        x = self.net_2(x)

        return x&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;참고: 김군이(&lt;a href=&quot;https://www.youtube.com/watch?v=KXiDzNai9tI&quot;&gt;https://www.youtube.com/watch?v=KXiDzNai9tI&lt;/a&gt;)&lt;/p&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display:none;&quot; 
 data-ad-unit    = &quot;DAN-1iyhozrisrk8k&quot; 
 data-ad-width   = &quot;300&quot; 
 data-ad-height  = &quot;250&quot;&gt;&lt;/ins&gt; 
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot; async&gt;&lt;/script&gt;</description>
      <category>옛날../pytorch</category>
      <author>도로롱주</author>
      <guid isPermaLink="true">https://dororongju.tistory.com/145</guid>
      <comments>https://dororongju.tistory.com/145#entry145comment</comments>
      <pubDate>Mon, 22 Jul 2019 00:03:42 +0900</pubDate>
    </item>
    <item>
      <title>4. Pytorch torchvision에서 데이터셋 가져오기</title>
      <link>https://dororongju.tistory.com/144</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;다운로드.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwJJXE/btqwWgERPz6/02bw2N0AX4OFDxYJfP8380/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwJJXE/btqwWgERPz6/02bw2N0AX4OFDxYJfP8380/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwJJXE/btqwWgERPz6/02bw2N0AX4OFDxYJfP8380/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwJJXE%2FbtqwWgERPz6%2F02bw2N0AX4OFDxYJfP8380%2Fimg.png&quot; data-filename=&quot;다운로드.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display:none;&quot; 
 data-ad-unit    = &quot;DAN-t81v31lxxz6s&quot; 
 data-ad-width   = &quot;728&quot; 
 data-ad-height  = &quot;90&quot;&gt;&lt;/ins&gt; 
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot; async&gt;&lt;/script&gt;
&lt;h2&gt;&lt;code&gt;&lt;/code&gt;&lt;/h2&gt;
&lt;h2&gt;&lt;code&gt;torchvision&lt;/code&gt;에서 데이터셋 가져오기&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;torchvision&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;( pip install torchvision 으로 설치 )&lt;br /&gt;널리 사용되는 &lt;b&gt;데이터 셋&lt;/b&gt;, &lt;b&gt;아키텍쳐 모델&lt;/b&gt; computer vision에서의 일반적인 &lt;b&gt;이미지 변환&lt;/b&gt;으로 구성되어 있습니다.&lt;/p&gt;
&lt;h4&gt;torchvision.datasets&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;MNIST&lt;/li&gt;
&lt;li&gt;Fashion-MNIST&lt;/li&gt;
&lt;li&gt;KMNIST&lt;/li&gt;
&lt;li&gt;EMNIST&lt;/li&gt;
&lt;li&gt;FakeData&lt;/li&gt;
&lt;li&gt;COCO&lt;/li&gt;
&lt;li&gt;LSUN&lt;/li&gt;
&lt;li&gt;ImageFolder&lt;/li&gt;
&lt;li&gt;DatasetFolder&lt;/li&gt;
&lt;li&gt;Imagenet-12&lt;/li&gt;
&lt;li&gt;CIFAR&lt;/li&gt;
&lt;li&gt;STL10&lt;/li&gt;
&lt;li&gt;SVHN&lt;/li&gt;
&lt;li&gt;PhotoTour&lt;/li&gt;
&lt;li&gt;SBU&lt;/li&gt;
&lt;li&gt;Flickr&lt;/li&gt;
&lt;li&gt;VOC&lt;/li&gt;
&lt;li&gt;Cityscapes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;torchvision.models&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Alexnet&lt;/li&gt;
&lt;li&gt;VGG&lt;/li&gt;
&lt;li&gt;ResNet&lt;/li&gt;
&lt;li&gt;SqueezeNet&lt;/li&gt;
&lt;li&gt;DenseNet&lt;/li&gt;
&lt;li&gt;Inception v3&lt;/li&gt;
&lt;li&gt;GoogLeNet&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;torchvision.transforms&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Transforms on PIL Image&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Transforms on torch.*Tensor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Conversion Transforms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generic Transforms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Functional Transforms&lt;/p&gt;
&lt;h4&gt;torchvision.utils&lt;/h4&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;code&gt;torchvision.transforms&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;다양한 이미지 변환 기능들을 제공해 줍니다.&lt;/p&gt;
&lt;h4&gt;EX)&lt;/h4&gt;
&lt;h4&gt;&lt;code&gt;torchvision.transform.ToTensor&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;PIL 이미지 또는 numpy.ndarray를 pytorch의 텐서로 변형시켜 줍니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;transforms.ToTensor()&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;torchvision.transforms.Normalize(mean, std, inplace=False)&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;평균과 표준편차를 사용하여 이미지를 정규화 시켜 줍니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;torchvision.transform.Compose&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;여러 transform 들을 Compose로 구성할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;torchvision.datasets.CIFAR10&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;CIFAR10 데이터셋을 가져옵니다.&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;train_set = torchvision.datasets.CIFAR10(
    root='./data',        # 데이터 저장 위치
    train=True,           # True: train set, False: test set
    download=False,       # 다운로드 여부, (이미 다운받았으면 False로 지정)
    transform=transform   # 데이터 선처리 작업
)

test_set = torchvision.datasets.CIFAR10(
    root='./data',
    train=False,
    download=False,
    transform=transform
)&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;torch.utils.data.DataLoader&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;torchvision.dataset의 데이터들을 불러옵니다.&lt;br /&gt;batch_size, shuffle, num_workers 등 10여개의 parameter를 전달 받습니다.&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;train_loader = DataLoader(train_set, batch_size=8, shuffle=True, num_workers=0)
test_loader = DataLoader(test_set, batch_size=8, shuffle=False, num_workers=0)&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;참고: 김군이(&lt;a href=&quot;https://www.youtube.com/watch?v=KXiDzNai9tI&quot;&gt;https://www.youtube.com/watch?v=KXiDzNai9tI&lt;/a&gt;)&lt;/p&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display:none;&quot; 
 data-ad-unit    = &quot;DAN-1iyhozrisrk8k&quot; 
 data-ad-width   = &quot;300&quot; 
 data-ad-height  = &quot;250&quot;&gt;&lt;/ins&gt; 
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot; async&gt;&lt;/script&gt;</description>
      <category>옛날../pytorch</category>
      <category>ai</category>
      <category>pytorch</category>
      <author>도로롱주</author>
      <guid isPermaLink="true">https://dororongju.tistory.com/144</guid>
      <comments>https://dororongju.tistory.com/144#entry144comment</comments>
      <pubDate>Sun, 21 Jul 2019 23:59:34 +0900</pubDate>
    </item>
    <item>
      <title>3. Pytorch nn과 nn.functional</title>
      <link>https://dororongju.tistory.com/143</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;다운로드.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A9QJP/btqwWYKfInC/H3ijejypP0c0WuDqCKv50k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A9QJP/btqwWYKfInC/H3ijejypP0c0WuDqCKv50k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A9QJP/btqwWYKfInC/H3ijejypP0c0WuDqCKv50k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA9QJP%2FbtqwWYKfInC%2FH3ijejypP0c0WuDqCKv50k%2Fimg.png&quot; data-filename=&quot;다운로드.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display:none;&quot; 
 data-ad-unit    = &quot;DAN-t81v31lxxz6s&quot; 
 data-ad-width   = &quot;728&quot; 
 data-ad-height  = &quot;90&quot;&gt;&lt;/ins&gt; 
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot; async&gt;&lt;/script&gt;
&lt;h3&gt;필요 패키지&lt;/h3&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;import torch.nn as nn
import torch.nn.functional as F&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;문서&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nn&lt;br /&gt;&lt;a href=&quot;https://pytorch.org/docs/1.0.1/nn.html&quot;&gt;https://pytorch.org/docs/1.0.1/nn.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;nn.functional&lt;br /&gt;&lt;a href=&quot;https://pytorch.org/docs/1.0.1/nn.html#torch-nn-functional&quot;&gt;https://pytorch.org/docs/1.0.1/nn.html#torch-nn-functional&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;nn 과 nn.functional&lt;/h3&gt;
&lt;p&gt;제공하는 기능들은 비슷한데 사용하는 방법에 차이가 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;nn 이 제공하는 기능들&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parameters&lt;/li&gt;
&lt;li&gt;Containers&lt;/li&gt;
&lt;li&gt;Conv&lt;/li&gt;
&lt;li&gt;Pooling&lt;/li&gt;
&lt;li&gt;Padding&lt;/li&gt;
&lt;li&gt;Non-linear Activation&lt;/li&gt;
&lt;li&gt;Normalization&lt;/li&gt;
&lt;li&gt;Recurrent&lt;/li&gt;
&lt;li&gt;Linear&lt;/li&gt;
&lt;li&gt;Dropout&lt;/li&gt;
&lt;li&gt;Sparse&lt;/li&gt;
&lt;li&gt;Distance&lt;/li&gt;
&lt;li&gt;Loss&lt;/li&gt;
&lt;li&gt;Vision&lt;/li&gt;
&lt;li&gt;Data Parallel&lt;/li&gt;
&lt;li&gt;Utilities&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;nn.functional 이 제공하는 기능들&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Conv&lt;/li&gt;
&lt;li&gt;Pooling&lt;/li&gt;
&lt;li&gt;Non-linear Activation&lt;/li&gt;
&lt;li&gt;Normalization&lt;/li&gt;
&lt;li&gt;Linear function(=fully connected layer)&lt;/li&gt;
&lt;li&gt;Dropout&lt;/li&gt;
&lt;li&gt;Loss&lt;/li&gt;
&lt;li&gt;Vision&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;conv2d의 사용&lt;/h3&gt;
&lt;p&gt;nn 과 nn.functional의 차이를 conv2d를 이용해서 알아봅시다.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;nn.conv2d
nn.functionnal.conv2d&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;torch.nn.Conv2d VS torch.nn.functional.Conv2d&lt;/h3&gt;
&lt;p&gt;입력 이미지에 2d Convolution을 적용시키는 메소드 입니다.&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;nn.Conv2d&lt;/code&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;weight를 직접 선언해주지 않음&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;in_channels&lt;/code&gt; : input image 채널의 수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;out_channels&lt;/code&gt; : convolution 결과 채널의 수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kernel_size&lt;/code&gt; : convolution 커널의 크기(필터 크기)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;torch.nn.functional.conv2d&lt;/code&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;weight를 직접 선언 ( 외부에서 만든 filter를 사용 )&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input&lt;/code&gt; : input Tensor ( minibatch&amp;times;in_channels&amp;times;iH&amp;times;iW )&lt;/li&gt;
&lt;li&gt;&lt;code&gt;weight&lt;/code&gt; : 필터의 shape ( out_channels &amp;times; groups in_channels &amp;times; kH &amp;times; kW )&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;예제&lt;/h3&gt;
&lt;p&gt;아래 그림과 같은 convolution 연산을 pytorch로 진행해 보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;33-con.gif&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PEQKq/btqwVFrxSnT/M5HB75FbHC21xzIxMOs7yK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PEQKq/btqwVFrxSnT/M5HB75FbHC21xzIxMOs7yK/img.gif&quot; data-alt=&quot;convolution 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PEQKq/btqwVFrxSnT/M5HB75FbHC21xzIxMOs7yK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/PEQKq/btqwVFrxSnT/M5HB75FbHC21xzIxMOs7yK/img.gif&quot; data-filename=&quot;33-con.gif&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;convolution 연산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;1. &lt;code&gt;torch.nn.functional.conv2d&lt;/code&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;이미지와 같은 input, filter 텐서를 생성하고 conv2d 메소드로 연산한 코드와 결과입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable
import numpy as np

input = torch.Tensor(np.array([[[  
[1,1,1,0,0],  
[0,1,1,1,0],  
[0,0,1,1,1],  
[0,0,1,1,0],  
[0,1,1,0,0]  
]]]))

filter = torch.Tensor(np.array([[[  
[1,0,1],  
[0,1,0],  
[1,0,1]  
]]]))

input = Variable(input, requires\_grad=True)  
filter = Variable(filter)

out = F.conv2d(input, filter)  
print(out)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;tensor([[[[4., 3., 4.],  
[2., 4., 3.],  
[2., 3., 4.]]]], grad_fn=) [Finished in 0.5s]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. &lt;code&gt;torch.nn.conv2d&lt;/code&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;nn.conv2d&lt;/code&gt;는 weight를 제공해 주기 때문에 filter를 넘기지 않았습니다.&lt;br /&gt;결과 출력 뿐만 아니라 사용된 weight도 같이 출력하겠습니다.&lt;br /&gt;(호출할 때마다 결과가 달라집니다.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;
import torch  
import torch.nn as nn  
import torch.nn.functional as F  
from torch.autograd import Variable  
import numpy as np

input = torch.Tensor(np.array([[[  
[1,1,1,0,0],  
[0,1,1,1,0],  
[0,0,1,1,1],  
[0,0,1,1,0],  
[0,1,1,0,0]  
]]]))

input = Variable(input, requires_grad=True)

func = nn.Conv2d(1,1,3)  
print(func.weight)

out = func(input)  
print(out)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;inform7&quot;&gt;&lt;code&gt;Parameter containing:  
tensor([[[[-0.0219, 0.0051, 0.0586],  
[ 0.1440, 0.3288, -0.2014],  
[ 0.0100, 0.1854, -0.1580]]]], requires\_grad=True)  
tensor([[[[ 0.0342, 0.3050, 0.5113],  
[-0.2727, 0.2196, 0.4731],  
[-0.0924, 0.4095, 0.5477]]]], grad_fn=) [Finished in 0.5s]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;참고: 김군이(&lt;a href=&quot;https://www.youtube.com/watch?v=VKhFeh92eps&quot;&gt;https://www.youtube.com/watch?v=VKhFeh92eps&lt;/a&gt;)&lt;/p&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display:none;&quot; 
 data-ad-unit    = &quot;DAN-1iyhozrisrk8k&quot; 
 data-ad-width   = &quot;300&quot; 
 data-ad-height  = &quot;250&quot;&gt;&lt;/ins&gt; 
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot; async&gt;&lt;/script&gt;</description>
      <category>옛날../pytorch</category>
      <author>도로롱주</author>
      <guid isPermaLink="true">https://dororongju.tistory.com/143</guid>
      <comments>https://dororongju.tistory.com/143#entry143comment</comments>
      <pubDate>Sun, 21 Jul 2019 22:51:30 +0900</pubDate>
    </item>
    <item>
      <title>2. Pytorch autograd와 Variable</title>
      <link>https://dororongju.tistory.com/142</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;다운로드.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clcc0H/btqwVETHl5Z/kkjwul5yaqn1ni9ua6ajWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clcc0H/btqwVETHl5Z/kkjwul5yaqn1ni9ua6ajWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clcc0H/btqwVETHl5Z/kkjwul5yaqn1ni9ua6ajWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fclcc0H%2FbtqwVETHl5Z%2Fkkjwul5yaqn1ni9ua6ajWK%2Fimg.png&quot; data-filename=&quot;다운로드.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display:none;&quot; 
 data-ad-unit    = &quot;DAN-t81v31lxxz6s&quot; 
 data-ad-width   = &quot;728&quot; 
 data-ad-height  = &quot;90&quot;&gt;&lt;/ins&gt; 
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot; async&gt;&lt;/script&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;autograd&lt;/h3&gt;
&lt;p&gt;Auto Gradient&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;autograd를 사용하면 backprop을 위한 미분 값을 자동으로 계산해 줍니다.&lt;/li&gt;
&lt;li&gt;자동 계산을 위해서 사용하는 변수는 &lt;code&gt;torch.autograd&lt;/code&gt;에 있는 Variable 입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;역전파(backpropagation)&lt;/h3&gt;
&lt;p&gt;복잡한 함수에 대해 텐서들 마다 각각 편미분을 진행하려면 연산량이 엄청나기 때문에, 합성 함수 미분의 성질을 이용하여 훨씬 적은 연산만으로 각 텐서들에 대한 미분을 구하는 방법입니다.&lt;br /&gt;여기서 역전파에 대한 자세한 내용을 다루지는 않겠습니다.&lt;/p&gt;
&lt;h3&gt;Variable의 모습&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;torch.aurograd.Variable()&lt;/code&gt;을 통해 Variable을 생성합니다.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;import torch
import numpy as np
a = torch.Tensor(np.array([[1]]))
a = torch.autograd.Variable(a, requires_grad=True)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Variable은 아래와 같은 속성들을 갖고 있습니다.&lt;br /&gt;&lt;code&gt;.backward()&lt;/code&gt; 가 호출되면 미분이 시작되고 그 정보가 담기게 됩니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;data&lt;/b&gt;&lt;br /&gt;Tensor 형태의 데이터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;grad&lt;/b&gt;&lt;br /&gt;Data가 거쳐온 layer에 대한 미분 값&lt;/li&gt;
&lt;li&gt;&lt;b&gt;grad_fn&lt;/b&gt;&lt;br /&gt;미분 값을 계산한 함수에 대한 정보&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;예시&lt;/h3&gt;
&lt;p&gt;식 d를 a에 대해 미분한 결과를 보여주는 예제입니다.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;import torch
import numpy as np

a = torch.Tensor(np.array([[1]]))
a = torch.autograd.Variable(a, requires_grad=True)

b = a + 2
c = b**2
d = c*3

d.backward()

print(&quot;=&quot;*50)
print(&quot;d.data:&quot;, d.data)
print(&quot;d.grad:&quot;, d.grad)
print(&quot;d.grad_fn:&quot;, d.grad_fn)

print(&quot;=&quot;*50)
print(&quot;c.data:&quot;, c.data)
print(&quot;c.grad:&quot;, c.grad)
print(&quot;c.grad_fn:&quot;, c.grad_fn)

print(&quot;=&quot;*50)
print(&quot;b.data:&quot;, b.data)
print(&quot;b.grad:&quot;, b.grad)
print(&quot;b.grad_fn:&quot;, b.grad_fn)

print(&quot;=&quot;*50)
print(&quot;a.data:&quot;, a.data)
print(&quot;a.grad:&quot;, a.grad)
print(&quot;a.grad_fn:&quot;, a.grad_fn)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드의 실행 결과입니다.&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;==================================================
d.data: tensor([[27.]])
d.grad: None
d.grad_fn: &amp;lt;MulBackward0 object at 0x0000025A0F43ABE0&amp;gt;
==================================================
c.data: tensor([[9.]])
c.grad: None
c.grad_fn: &amp;lt;PowBackward0 object at 0x0000025A0F43AC18&amp;gt;
==================================================
b.data: tensor([[3.]])
b.grad: None
b.grad_fn: &amp;lt;AddBackward0 object at 0x0000025A0F43AF60&amp;gt;
==================================================
a.data: tensor([[1.]])
a.grad: tensor([[18.]])
a.grad_fn: None
[Finished in 0.5s]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;참고: 김군이(&lt;a href=&quot;https://www.youtube.com/watch?v=VKhFeh92eps&quot;&gt;https://www.youtube.com/watch?v=VKhFeh92eps&lt;/a&gt;)&lt;/p&gt;
&lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display:none;&quot; 
 data-ad-unit    = &quot;DAN-1iyhozrisrk8k&quot; 
 data-ad-width   = &quot;300&quot; 
 data-ad-height  = &quot;250&quot;&gt;&lt;/ins&gt; 
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/adfit/static/ad.min.js&quot; async&gt;&lt;/script&gt;</description>
      <category>옛날../pytorch</category>
      <category>ai</category>
      <category>pytorch</category>
      <author>도로롱주</author>
      <guid isPermaLink="true">https://dororongju.tistory.com/142</guid>
      <comments>https://dororongju.tistory.com/142#entry142comment</comments>
      <pubDate>Sun, 21 Jul 2019 22:45:18 +0900</pubDate>
    </item>
  </channel>
</rss>