- Published on
๐STUDY ์น ๋ธ๋ผ์ฐ์ ์ ๋จธ์ ๋ฌ๋ Tensorflow.js | ์น์์์ ๋จธ์ ๋ฌ๋
3๋
์ ๋์ปค ์ด๋ฏธ์ง๋ก aws์ ๋ชจ๋ธ์ ์ฌ๋ฆฌ๊ณ ์น ์ฌ์ดํธ๋ฅผ ์ด์์ ํ์๋๋ฐ, ๋น์ ๋ด ๊ถ๊ธ์ฆ์ผ๋ก๋ ๊ทธ๋ฅ ๋ก์ปฌ์์ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ๋ ์๋ ์ถ์ด์ ์ฐพ์ ์ฑ
์ด์๋ค.
์๊ฐ์ด ๋ง์ด ์ง๋์ ์ด์ง ์ค๋น๋ฅผ ํ๋ฉด์ ๊ทธ๊ฐ ์ฌ๋์ ์ฑ
๋ค์ ๋งค์ผ ํ๋์ฉ ๊ณต๋ถํ๋ ์๊ฐ์ผ๋ก ํฌ์คํ
์ ์์ํ๋ค..!
๋ฐ๋ผ์ ์ด ํฌ์คํ ์ ๋ด๊ฐ ์ฝ๊ณ ์ค์ตํ๋ฉด์ ์๊ฐ๋ค์ ์ ๋ฆฌํ ํฌ์คํธ๋ผ๊ณ ๋ณด๋ฉด ๋๊ฒ ๋ค.
์น์์์ ๋จธ์ ๋ฌ๋
์น์์ ๋ชจ๋ธ์ ๋์ฐ๋ ์ด์ ๋ ๊ฒฐ๊ตญ์ ์ฌ์ฉ์๋ค(end user)์๊ฒ ๋ ๋ง์ด ๋ชจ๋ธ์ ํ์ฉํ๊ณ ๊ทธ์ ๋ํ ์ด์ต ์ฐฝ์ถ์ด๋ค. ์ด๋ฅผ porting์ด๋ผ๊ณ ํ๋๋ฐ, ํ์ด์ฌ์ผ๋ก ๋ง๋ค์๋ ๋ชจ๋ธ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋๋ถ๋ถ ์ด์ฉํ๋ ์น์ฌ์ดํธ์์ ํธํ์ ์ฝ์ง ์์ ์ผ๋ก ์ฌ๊ฒจ์ ธ ์๋ค.
- ํ์ด์ฌ์ผ๋ก ๊ตฌํํ ๋ชจ๋ธ์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด์๋
tfjs-converter
์ ์ด์ฉํ์ฌ ๋ณํํ๋ค.
Tensorflow.js๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ํ๋ ์์ํฌ๋ก, ์น์์ ๋จธ์ ๋ฌ๋์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
ํน์ง์ผ๋ก๋ ์ฐ์ฐ ๊ทธ๋ํ๋ฅผ ์ฆ์ ์คํ(eager execution)์ผ๋ก ๊ตฌํํ์ฌ, WebGL์ ํตํด GPU๋ฅผ ํ์ฉํ ์ ์๋๋ก ํ๋ค.
๋ฐ๋ผ์ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ฐ์ฐ์ ์ํํ๋ ๊ฒ์ด ๋ ์ ํฉํ๋ค๊ณ ํ๋ค.
GPU๋ฅผ ์ด์ฉํ์ฌ ์ฐ์ฐํ์ง๋ง, ํด๋น ๋ฉ๋ชจ๋ฆฌ์์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ ์ํด์ผ ํ๋ค. explicitํ๊ฒ ๊ด๋ฆฌ๋ฅผ ํด์ผํ๊ณ , ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ์ ์๋ค. (๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์ ํด๊ฒฐ)
const a = tf.tensor([1, 2, 3, 4], [2, 2]);
const b = tf.tensor([1, 2, 3, 4], [2, 2]);
const c = a.add(b);
a.dispose(); // a ๋ฉ๋ชจ๋ฆฌ ํด์
b.dispose(); // b ๋ฉ๋ชจ๋ฆฌ ํด์
c.dispose(); // c ๋ฉ๋ชจ๋ฆฌ ํด์
๋ชจ๋ ๋ณ์๋ฅผ ์ค๊ฐ ๋จ๊ณ์์ ํด์ ํ๋ ๋ฐฉ๋ฒ์ ๋นํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์, tf.tidy
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ค.
const a = tf.tensor([1, 2, 3, 4], [2, 2]);
const b = tf.tensor([1, 2, 3, 4], [2, 2]);
const c = tf.tidy(() => {
const a = tf.tensor([1, 2, 3, 4], [2, 2]);
const b = tf.tensor([1, 2, 3, 4], [2, 2]);
return a.add(b);
});
์ํฉ์ ๋ฐ๋ผ tf.tidy
ํน์ .dispose
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ฉด ๋๋ค. ๋ํ, tf.tidy
๋ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ์๋์ผ๋ก ์ํํ๊ธฐ ๋๋ฌธ์, ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
๋ชจ๋ธ api๋ ๋ ๊ฐ์ง๋ก ๋๋๋ค.
- Layers API: for ๋ชจ๋ธ ๊ตฌ์กฐ, Keras์ ์ ์ฌํ API๋ก, ๋ชจ๋ธ์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
- Sequential API: ๋ ์ด์ด๋ฅผ ์์๊ฐ๋ ๋ฐฉ์์ผ๋ก ๋ชจ๋ธ์ ๋ง๋ค ์ ์๋ค.
- Functional API: ๋ ์ด์ด๋ฅผ ํจ์ํ์ผ๋ก ์ฐ๊ฒฐํ์ฌ ๋ชจ๋ธ์ ๋ง๋ค ์ ์๋ค.
- Core API: for ์ฐ์ฐ, ์ ์์ค API๋ก, ํ ์ ์ฐ์ฐ์ ์ง์ ์ํํ ์ ์๋ค.
Layers API๋ฅผ ์ด์ฉํ์ฌ ์ปค์คํ ๋ ์ด์ด๋ฅผ ๋ง๋ค ์ ์๋ค. ํ์ง๋ง serialization์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์, ๋ชจ๋ธ์ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ค๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์, ์ปค์คํ ๋ ์ด์ด๋ฅผ ๋ง๋ค ๋๋ Core API๋ฅผ ์ด์ฉํ์ฌ ์ง์ ๊ตฌํํด์ผ ํ๋ค.
Terminology
- Tensor: ๋ฐ์ดํฐ์ ๋ค์ฐจ์ ๋ฐฐ์ด์ ์๋ฏธํ๋ค. (numpy์์๋ ndarray๋ก ํํ)
- Machine Learning vs Deep Learning: ์ด ๋์ ์ฐจ์ด๋ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ตํ๋ ๋ฐฉ๋ฒ์ ์๋ค. ๋จธ์ ๋ฌ๋์ feature๋ฅผ ์ง์ ์ ์ํ๊ณ , ๋ฅ๋ฌ๋์ feature๋ฅผ ์ค์ค๋ก ํ์ตํ๋ค.
- Backpropagation: ๋ฅ๋ฌ๋์์ ๊ฐ์ค์น๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ์ค์ฐจ๋ฅผ ์ญ์ ํํ์ฌ ๊ฐ์ค์น๋ฅผ ์กฐ์ ํ๋ค.
- ์ง๋ํ์ต์ผ๋ก ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ ์ค์ฐจ์จ ๊ณ์ฐ
- ์์ธก ๊ฒฐ๊ณผ๊ฐ ๊ธฐ์ฌํ๋ ์ ๋์ ๋ฐ๋ผ ๊ฐ ์ฐ์ฐ ๋ ธ๋์ ์ค์ฐจ์จ ์ ํ
- ์ค์ฐจ์จ ๊ธฐ๋ฐ์ผ๋ก ํ๋ผ๋ฏธํฐ ๊ฐฑ์
- rank: ํ ์์ ์ฐจ์ ์
- shape: ํ ์์ ๊ฐ ์ฐจ์ ํฌ๊ธฐ
- dtype: ํ ์์ ๋ฐ์ดํฐ ํ์
- Authors
- Name
- Amelia Young
- GitHub
- @ameliacode