blas
blas ๋?
๋ฒกํฐ์ ๋ง์ , ๋ด์ , ์ ํ ์กฐํฉ, ํ๋ ฌ ๊ณฑ์ ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ ํ ๋์ ์ฐ์ฐ์ ์ํํ๊ธฐ ์ํ ์ญํ ์ ํฉ๋๋ค.
Basic Linear Algebra Subprograms์ ์ฝ์์ ๋๋ค.
ํฌ๊ฒ 3๊ฐ์ level(
vector-vector
,matrix-vector
,matrix-matrix
)๋ก ๊ตฌ๋ถ๋์ด ์ง๋๋ค.
copy_cpu
ํจ์ ์ด๋ฆ: copy_cpu
์ ๋ ฅ:
N: ๋ณต์ฌํ ์์ ์
X: ๋ณต์ฌํ ๋ฐ์ดํฐ์ ํฌ์ธํฐ
INCX: X์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ
Y: ๋ณต์ฌ ๋์ ๋ฐ์ดํฐ์ ํฌ์ธํฐ
INCY: Y์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ
๋์:
X์ ์์๋ฅผ Y์ ๋ณต์ฌํฉ๋๋ค.
๊ฐ๊ฐ์ ์์๋ X์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ INCX์ Y์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ INCY๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์ฌ๋ฉ๋๋ค.
์ค๋ช :
์ ์ฝ๋๋ copy_cpu ํจ์์ ๋๋ค. ์ด ํจ์๋ X ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ๋ฅผ Y ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์์น์ ๋ณต์ฌํฉ๋๋ค. ์ด๋ INCX์ INCY๋ฅผ ์ด์ฉํ์ฌ X์ Y์ ์์ ๊ฐ๊ฒฉ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
์ด ํจ์๋ ์ฃผ๋ก ๋ฅ ๋ฌ๋์์ ์ฌ์ฉ๋๋ ๋ฐฐ์ด ์ฐ์ฐ์์ ๋ง์ด ํ์ฉ๋ฉ๋๋ค.
mean_cpu
ํจ์ ์ด๋ฆ: mean_cpu
์ ๋ ฅ:
x: ์ ๋ ฅ ๋ฐ์ดํฐ์ ํฌ์ธํฐ
batch: ๋ฐฐ์น ํฌ๊ธฐ
filters: ํํฐ ์
spatial: ๊ณต๊ฐ ํฌ๊ธฐ
mean: ํ๊ท ๊ฐ์ ์ ์ฅํ ํฌ์ธํฐ
๋์:
x์ ์์๋ค์ ์ด์ฉํ์ฌ ๊ฐ ํํฐ์ ํ๊ท ๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
mean ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์์น์ ๊ฐ ํํฐ์ ํ๊ท ๊ฐ์ ์ ์ฅํฉ๋๋ค.
์ค๋ช :
์ ์ฝ๋๋ mean_cpu ํจ์์ ๋๋ค. ์ด ํจ์๋ ์ ๋ ฅ ๋ฐ์ดํฐ x์ ์์๋ค์ ์ด์ฉํ์ฌ ๊ฐ ํํฐ์ ํ๊ท ๊ฐ์ ๊ณ์ฐํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ mean ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์์น์ ์ ์ฅํฉ๋๋ค.
ํ๊ท ๊ฐ์ ๋ฐฐ์น ํฌ๊ธฐ, ํํฐ ์, ๊ณต๊ฐ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ์ฌ ๊ณ์ฐ๋๋ฉฐ, ๋ฐฐ์น ํฌ๊ธฐ์ ๊ณต๊ฐ ํฌ๊ธฐ๋ฅผ ๊ณฑํ ๊ฐ์ ์ญ์๋ฅผ scale ๋ณ์์ ์ ์ฅํ์ฌ ํ๊ท ๊ฐ ๊ณ์ฐ์ ์ฌ์ฉํฉ๋๋ค.
์ด ํจ์๋ ์ฃผ๋ก ๋ฅ ๋ฌ๋์์ ์ฌ์ฉ๋๋ ๋ฐฐ์ด ์ฐ์ฐ์์ ๋ง์ด ํ์ฉ๋ฉ๋๋ค.
variance_cpu
ํจ์ ์ด๋ฆ: variance_cpu
์ ๋ ฅ:
x: ์ ๋ ฅ ๋ฐ์ดํฐ
mean: ์ ๋ ฅ ๋ฐ์ดํฐ์ ํ๊ท ๊ฐ
batch: ๋ฐฐ์น ํฌ๊ธฐ
filters: ํํฐ์ ๊ฐ์
spatial: ๊ณต๊ฐ ์ฐจ์(๋๋น์ ๋์ด)
๋์:
๋ชจ๋ ๋ฐฐ์น, ํํฐ ๋ฐ ๊ณต๊ฐ ์์์ ๋ํด, ์ ๋ ฅ ๋ฐ์ดํฐ x์ ํด๋น ํํฐ ์์์ ํ๊ท ๊ฐ ๊ฐ์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๊ณ , ๊ทธ ์ฐจ์ด์ ์ ๊ณฑ์ ๋์ ํ์ฌ ๋ถ์ฐ ๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
๊ณ์ฐ๋ ๋ถ์ฐ ๊ฐ์ ๋ฐฐ์น ํฌ๊ธฐ ๋ฐ ๊ณต๊ฐ ์ฐจ์์์ ๊ฐ์๋ ์์ ๋์ ๋ฐ๋ผ ์ค์ผ์ผ๋งํฉ๋๋ค.
์ค๋ช :
์ ์ฝ๋๋ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ถ์ฐ ๊ฐ์ ๊ณ์ฐํ๋ ํจ์์ธ variance_cpu์ ๋๋ค. ๋ถ์ฐ์ ๋ฐ์ดํฐ๊ฐ ์ผ๋ง๋ ๋ถ์ฐ๋์ด ์๋์ง๋ฅผ ๋ํ๋ด๋ ์งํ์ด๋ฉฐ, ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ถ์ฐ ๊ฐ์ ๋ฅ ๋ฌ๋์์ Batch Normalization ๋ฑ๊ณผ ๊ฐ์ ๊ธฐ์ ์์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
์ด ํจ์๋ ์ ๋ ฅ ๋ฐ์ดํฐ x์ ํด๋น ํํฐ์ ํ๊ท ๊ฐ์ ์ด์ฉํ์ฌ ๋ถ์ฐ ๊ฐ์ ๊ณ์ฐํ๊ณ , ์ค์ผ์ผ๋ง์ ํตํด ๋ฐํํฉ๋๋ค.
normalize_cpu
ํจ์ ์ด๋ฆ: normalize_cpu
์ ๋ ฅ:
x: ์ ๊ทํํ ๋ฐ์ดํฐ์ ํฌ์ธํฐ
mean: ํ๊ท ๊ฐ์ ํฌ์ธํฐ
variance: ๋ถ์ฐ ๊ฐ์ ํฌ์ธํฐ
batch: ๋ฐฐ์น ํฌ๊ธฐ
filters: ํํฐ ๊ฐ์
spatial: ๊ณต๊ฐ ํฌ๊ธฐ
๋์:
์ ๋ ฅ์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ x๋ฅผ ์ ๊ทํํ์ฌ ๊ฐ ์์์ ๋ํด ํ๊ท ๊ฐ์ ๋นผ๊ณ , ํ์ค ํธ์ฐจ ๊ฐ์ผ๋ก ๋๋์ด ์ ์ฅํฉ๋๋ค.
๋ฐ์ดํฐ x๋ ์ ๋ ฅ ์ธ๋ฑ์ค(b, f, i)์ ๋ฐ๋ผ์ ์ ๊ทํ๋์ด ์ ์ฅ๋ฉ๋๋ค.
์ค๋ช :
์ ์ฝ๋๋ ๋ฅ ๋ฌ๋์์ ๋ง์ด ์ฌ์ฉ๋๋ ์ ๊ทํ ํจ์์ธ normalize_cpu์ ๋๋ค. ์ด ํจ์๋ ์ ๋ ฅ๋ ๋ฐ์ดํฐ์ ํ๊ท ๊ณผ ๋ถ์ฐ์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทํํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ด ํจ์๋ ๊ฐ ์์๋ฅผ ํด๋น ํํฐ์ ํ๊ท ๊ฐ์ผ๋ก ๋บ ํ, ํด๋น ํํฐ์ ๋ถ์ฐ ๊ฐ์ผ๋ก ๋๋์ด ์ ๊ทํํฉ๋๋ค.
์ด ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ธ์ด ๋ ๋น ๋ฅด๊ณ ์์ ์ ์ผ๋ก ์๋ ดํ๊ฒ ๋๋ฏ๋ก, ๋ฅ ๋ฌ๋ ๋ชจ๋ธ์์ ๋ง์ด ํ์ฉ๋ฉ๋๋ค.
axpy_cpu
ํจ์ ์ด๋ฆ: axpy_cpu
์ ๋ ฅ:
N: X ๋ฐ Y์์ ๋ณต์ฌํด์ผ ํ ์์ ์
ALPHA: X์์ Y๋ก ๋ณต์ฌ๋ ๋ ๊ณฑํด์ง๋ ์ค์นผ๋ผ ๊ฐ
X: ๋ณต์ฌํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์๋ณธ ๋ฐฐ์ด
INCX: X์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ
Y: ๋ฐ์ดํฐ๊ฐ ๋ณต์ฌ๋ ๋์ ๋ฐฐ์ด
INCY: Y์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ
๋์:
X์ ์์๋ฅผ Y์ ๋ณต์ฌํ๊ณ ALPHA ๊ฐ์ผ๋ก ๊ณฑํ ๋ค์ Y์ ๋ํฉ๋๋ค.
๊ฐ๊ฐ์ ์์๋ X์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ INCX์ Y์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ INCY๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์ฌ๋ฉ๋๋ค.
์ค๋ช :
์ ์ฝ๋๋ axpy_cpu ํจ์์ ๋๋ค. ์ด ํจ์๋ X ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ๋ฅผ ALPHA ๊ฐ์ ๊ณฑํ ํ Y ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์์น์ ๋ํฉ๋๋ค. ์ด๋ INCX์ INCY๋ฅผ ์ด์ฉํ์ฌ X์ Y์ ์์ ๊ฐ๊ฒฉ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
์ด ํจ์๋ ์ฃผ๋ก ๋ฅ ๋ฌ๋์์ ์ฌ์ฉ๋๋ ๋ฐฐ์ด ์ฐ์ฐ์์ ๋ง์ด ํ์ฉ๋ฉ๋๋ค.
scal_cpu
ํจ์ ์ด๋ฆ: scal_cpu
์ ๋ ฅ:
N: ์ค์นผ๋ผ๋ฅผ ์ ์ฉํ ๋ฒกํฐ X์ ํฌ๊ธฐ
ALPHA: ์ค์นผ๋ผ ๊ฐ
X: ์ค์นผ๋ผ ๊ฐ์ ์ ์ฉํ ๋ฒกํฐ์ ํฌ์ธํฐ
INCX: X์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ
๋์:
๋ฒกํฐ X์ ๊ฐ ์์์ ์ค์นผ๋ผ ๊ฐ ALPHA๋ฅผ ๊ณฑํด ๊ฐฑ์ ํฉ๋๋ค. ์ด๋ INCX๋ฅผ ์ด์ฉํ์ฌ X์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
์ค๋ช :
์ ์ฝ๋๋ scal_cpu ํจ์์ ๋๋ค. ์ด ํจ์๋ ์ฃผ๋ก ๋ฅ ๋ฌ๋์์ ์ฌ์ฉ๋๋ ๋ฐฐ์ด ์ฐ์ฐ์์ ๋ง์ด ํ์ฉ๋ฉ๋๋ค.
๋ฒกํฐ X์ ๊ฐ ์์์ ์ค์นผ๋ผ ๊ฐ์ ๊ณฑํด ๊ฐฑ์ ํ๋ ๊ฒ์ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋๋ผ, ๋ฒกํฐ๋ฅผ ์ค์นผ๋ผ ๊ฐ์ผ๋ก ์ค์ผ์ผ๋งํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ์ด ํจ์๋ ์ฃผ๋ก ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ฉ๋ฉ๋๋ค.
fill_cpu
ํจ์ ์ด๋ฆ: fill_cpu
์ ๋ ฅ:
N: ์ฑ์์ง ์์ ์
ALPHA: ๋ฐฐ์ด์ ํ ๋นํ ๊ฐ
X: ์ฑ์์ง ๋ฐ์ดํฐ์ ํฌ์ธํฐ
INCX: X์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ
๋์:
X ๋ฐฐ์ด์ ALPHA ๊ฐ์ ์ฑ์๋๋ค.
๊ฐ ์์๋ X์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ INCX๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์์ง๋๋ค.
์ค๋ช :
์ ์ฝ๋๋ fill_cpu ํจ์์ ๋๋ค. ์ด ํจ์๋ X ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐฐ์ด์ ALPHA ๊ฐ์ผ๋ก ๋ชจ๋ ์์๋ฅผ ์ฑ์๋๋ค. ์ด๋ INCX๋ฅผ ์ด์ฉํ์ฌ X ๋ฐฐ์ด์ ์์ ๊ฐ๊ฒฉ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
์ด ํจ์๋ ์ฃผ๋ก ๋ฅ ๋ฌ๋์์ ์ด๊ธฐํ๋ ์ ์ฒ๋ฆฌ ๊ณผ์ ์์ ์ฌ์ฉ๋ฉ๋๋ค.
mul_cpu
ํจ์ ์ด๋ฆ: mul_cpu
์ ๋ ฅ:
N: ์์ ์
X: ๊ณฑํด์ง ๋ฐ์ดํฐ์ ํฌ์ธํฐ
INCX: X์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ
Y: ๊ณฑํ๋ ๋์ ๋ฐ์ดํฐ์ ํฌ์ธํฐ
INCY: Y์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ
๋์:
Y์ ๊ฐ ์์์ X์ ํด๋น ์์๋ฅผ ๊ณฑํฉ๋๋ค.
๊ฐ ์์๋ X์ Y์ ์ธ๋ฑ์ค ๊ฐ๊ฒฉ INCX์ INCY๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋ฉ๋๋ค.
์ค๋ช :
์ ์ฝ๋๋ mul_cpu ํจ์์ ๋๋ค. ์ด ํจ์๋ X ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ์ Y ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ์์๋ณ๋ก ๊ณฑํฉ๋๋ค. ์ด๋ INCX์ INCY๋ฅผ ์ด์ฉํ์ฌ X์ Y์ ์์ ๊ฐ๊ฒฉ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
์ด ํจ์๋ ์ฃผ๋ก ๋ฅ ๋ฌ๋์์ ์ฌ์ฉ๋๋ ๋ฐฐ์ด ์ฐ์ฐ์์ ๋ง์ด ํ์ฉ๋ฉ๋๋ค.
pow_cpu
ํจ์ ์ด๋ฆ: pow_cpu
์ ๋ ฅ:
N: ์ฒ๋ฆฌํ ๋ฐ์ดํฐ ๊ฐ์
ALPHA: ๊ฑฐ๋ญ์ ๊ณฑ ๊ณ์ฐ์ ์ฌ์ฉํ ์ง์
X: ์ ๋ ฅ ๋ฐ์ดํฐ ๋ฐฐ์ด ํฌ์ธํฐ
INCX: ์ ๋ ฅ ๋ฐ์ดํฐ ๋ฐฐ์ด์์ ์์ ์ฌ์ด์ ๊ฐ๊ฒฉ
Y: ์ถ๋ ฅ ๋ฐ์ดํฐ ๋ฐฐ์ด ํฌ์ธํฐ
INCY: ์ถ๋ ฅ ๋ฐ์ดํฐ ๋ฐฐ์ด์์ ์์ ์ฌ์ด์ ๊ฐ๊ฒฉ
๋์:
์ ๋ ฅ ๋ฐ์ดํฐ ๋ฐฐ์ด X์์ ์์๋ฅผ ALPHA ์ง์๋งํผ ๊ฑฐ๋ญ์ ๊ณฑํ์ฌ ์ถ๋ ฅ ๋ฐ์ดํฐ ๋ฐฐ์ด Y์ ์ ์ฅํจ
์ค๋ช :
pow_cpu ํจ์๋ ์ ๋ ฅ ๋ฐ์ดํฐ ๋ฐฐ์ด X์์ ์์๋ฅผ ALPHA ์ง์๋งํผ ๊ฑฐ๋ญ์ ๊ณฑํ์ฌ ์ถ๋ ฅ ๋ฐ์ดํฐ ๋ฐฐ์ด Y์ ์ ์ฅํ๋ ํจ์์ ๋๋ค.
์ด ํจ์๋ N ๊ฐ์ ์์๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, INCX์ INCY๋ฅผ ์ด์ฉํด X์ Y ๋ฐฐ์ด์ ํฌ์ธํฐ๋ฅผ ์ด๋ํ๋ฉด์ ์์์ ์ ๊ทผํฉ๋๋ค.
deinter_cpu
ํจ์ ์ด๋ฆ: deinter_cpu
์ ๋ ฅ:
NX: ์ธํฐ๋ฆฌ๋ธ๋ X ๋ฐ์ดํฐ์ ์
X: ์ธํฐ๋ฆฌ๋ธ๋ X ๋ฐ์ดํฐ (NX*B ๊ธธ์ด)
NY: ์ธํฐ๋ฆฌ๋ธ๋ Y ๋ฐ์ดํฐ์ ์
Y: ์ธํฐ๋ฆฌ๋ธ๋ Y ๋ฐ์ดํฐ (NY*B ๊ธธ์ด)
B: ๋ฐฐ์น ํฌ๊ธฐ
OUT: ์ธํฐ๋ฆฌ๋ธ๋ ์ถ๋ ฅ ๋ฐ์ดํฐ (NXNYB ๊ธธ์ด)
๋์:
์ธํฐ๋ฆฌ๋ธ๋ ์ถ๋ ฅ ๋ฐ์ดํฐ์์ X์ Y ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ์ฌ X์ Y์ ๋ํด์ค
OUT์ ์ธํฐ๋ฆฌ๋ธ๋ ํํ๋ก ์ ์ฅ๋ ์ถ๋ ฅ ๋ฐ์ดํฐ์ด๋ฉฐ, B๊ฐ์ ๋ฐฐ์น์ ๋ํ X์ Y ๋ฐ์ดํฐ๊ฐ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์ ์ฅ๋์ด ์๋ค.
์ค๋ช :
์ด ํจ์๋ ์ธํฐ๋ฆฌ๋ธ(interleave)๋ ๋ฐ์ดํฐ๋ฅผ ๋์ธํฐ๋ฆฌ๋ธ(deinterleave)ํ์ฌ X์ Y ๋ฐ์ดํฐ๋ก ๋ค์ ๋๋์ด ์ฃผ๋ ํจ์์ด๋ค.
์๋ฅผ ๋ค์ด, ์ธํฐ๋ฆฌ๋ธ๋ ๋ฐ์ดํฐ๋ [x1, y1, x2, y2, x3, y3, ...]์ ๊ฐ์ด X์ Y ๋ฐ์ดํฐ๊ฐ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์ ์ฅ๋์ด ์์ผ๋ฉฐ, ์ด๋ฅผ X=[x1, x2, x3, ...], Y=[y1, y2, y3, ...]๋ก ๋๋์ด ์ฃผ๋ ๊ฒ์ด๋ค.
์ด ํจ์๋ X์ Y๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์์ ๊ฐ๊ฐ NX์ NY์ ๊ธธ์ด๋ฅผ ๊ฐ์ง๋ ๋ฐ์ดํฐ๋ฅผ B๊ฐ ๋งํผ ๋ฐ์์จ๋ค. ์ด๋, OUT์ ์ธํฐ๋ฆฌ๋ธ๋ ํํ๋ก ์ ์ฅ๋ ์ถ๋ ฅ ๋ฐ์ดํฐ์ด๋ค.
ํจ์๋ B๊ฐ์ ๋ฐฐ์น์ ๋ํด for ๋ฃจํ๋ฅผ ์ํํ๋ฉฐ, ๊ฐ ๋ฐฐ์น์์ NX๊ฐ์ X ๋ฐ์ดํฐ์ NY๊ฐ์ Y ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ์ฌ, ์ธํฐ๋ฆฌ๋ธ๋ ํํ๋ก ์ ์ฅ๋ OUT์์ ์์๋๋ก ์ฝ์ด์์ X์ Y์ ๋ํด์ค๋ค.
inter_cpu
ํจ์ ์ด๋ฆ: inter_cpu
์ ๋ ฅ:
NX: int ํ์ ๋ณ์. ๋ฐฐ์ด X์ ์์ ๊ฐ์.
X: float ํ์ ๋ฐฐ์ด. NX๊ฐ์ ์์๋ฅผ ๊ฐ์ง ๋ฐฐ์ด.
NY: int ํ์ ๋ณ์. ๋ฐฐ์ด Y์ ์์ ๊ฐ์.
Y: float ํ์ ๋ฐฐ์ด. NY๊ฐ์ ์์๋ฅผ ๊ฐ์ง ๋ฐฐ์ด.
B: int ํ์ ๋ณ์. ๋ฐฐ์น ํฌ๊ธฐ.
OUT: float ํ์ ๋ฐฐ์ด. NX+NY๊ฐ์ ์์๋ฅผ ๊ฐ์ง ๋ฐฐ์ด.
๋์:
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง X์ Y ๋ฐฐ์ด์ ์์ด์ OUT ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
๋ฐฐ์น ์ฌ์ด์ฆ B๋งํผ X, Y ๋ฐฐ์ด์ ์์ด์ OUT ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
OUT ๋ฐฐ์ด์ ํฌ๊ธฐ๋ (NX+NY)*B์ด๋ค.
์ค๋ช :
์ด ํจ์๋ YOLOv3 ๋ฅ๋ฌ๋ ๋คํธ์ํฌ์์ ์ฌ์ฉ๋๋ ํจ์ ์ค ํ๋์ด๋ค.
์ด ํจ์๋ ๋ฐฐ์ด X์ ๋ฐฐ์ด Y์ ๊ฐ ์์๋ฅผ ๋ฒ๊ฐ์๊ฐ๋ฉฐ OUT ๋ฐฐ์ด์ ์ ์ฅํ๋ ์ญํ ์ ํ๋ค.
๋ฐฐ์ด X์ ๋ฐฐ์ด Y๋ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด ํจ์๋ ์ด๋ค์ ํ๋์ ๋ฐฐ์ด๋ก ์์ด์ ์ฌ์ฉํ๋ค.
๋ฐฐ์ด X์ Y๋ ์ ๋ ฅ ์ด๋ฏธ์ง๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ ์ด์ด์์ ์ฌ์ฉ๋๋ฉฐ, inter_cpu ํจ์๋ ์ด๋ค์ ๊ฒฐํฉํด์ฃผ๋ ์ญํ ์ ํ๋ค.
์ด ํจ์๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์์ด์ ํ์์ ์ธ ์ญํ ์ ์ํํ๋ฉฐ, ๋ฅ๋ฌ๋ ๋คํธ์ํฌ์ ์ ํ๋์ ์๋์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ค.
mult_add_into_cpu
ํจ์ ์ด๋ฆ: mult_add_into_cpu
์ ๋ ฅ:
N: ์ ์๊ฐ์ผ๋ก, X, Y, Z ๋ฐฐ์ด์ ๊ธธ์ด
X: float ํํ์ ๋ฐฐ์ด ํฌ์ธํฐ
Y: float ํํ์ ๋ฐฐ์ด ํฌ์ธํฐ
Z: float ํํ์ ๋ฐฐ์ด ํฌ์ธํฐ
๋์:
Z ๋ฐฐ์ด์ X[i]*Y[i] ๊ฐ์ ๋ํ๋ค. i๋ 0๋ถํฐ N-1๊น์ง ๋ฐ๋ณตํ๋ค.
์ค๋ช :
mult_add_into_cpu ํจ์๋ X, Y, Z ๋ฐฐ์ด์์ ๊ฐ์ ์ธ๋ฑ์ค ๊ฐ์ ๊ณฑํ ๋ค์, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Z ๋ฐฐ์ด์ ๊ฐ์ ์ธ๋ฑ์ค์ ๋ํ๋ ํจ์์ด๋ค.
์ด ํจ์๋ ๋ฒกํฐ ๋ด์ ๊ณผ ๋น์ทํ ์ญํ ์ ํ๋ฉฐ, ๋ ๋ฐฐ์ด์ ์์ ๊ณฑ์ ํฉ์ ๊ณ์ฐํ๋ ๊ฒ์ด๋ค.
์ด ํจ์๋ ๋ค์ํ ์ํ ์ฐ์ฐ์์ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ํ๋ ฌ ์ฐ์ฐ์์ ํ๋ ฌ์ ๊ฐ ํ๊ณผ ์ด์ ๊ณฑํ ๋ค ํฉํ ๊ฐ์ ๊ณ์ฐํ๋ ๋ฐ์๋ ์ฌ์ฉ๋ ์ ์๋ค.
smooth_l1_cpu
ํจ์ ์ด๋ฆ: smooth_l1_cpu
์ ๋ ฅ:
n: ๋ฐฐ์ด์ ๊ธธ์ด
pred: ์์ธก๊ฐ
truth: ์ค์ ๊ฐ
delta: gradient
error: ์๋ฌ
๋์:
์์ธก๊ฐ(pred)๊ณผ ์ค์ ๊ฐ(truth) ์ฌ์ด์ ์ฐจ์ด(diff)๋ฅผ ๊ตฌํ๊ณ , ์ฐจ์ด์ ์ ๋๊ฐ(abs_val)์ด 1๋ณด๋ค ์์ผ๋ฉด error์ delta๋ฅผ ๊ณ์ฐํ์ฌ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด error์ delta๋ฅผ ๋ค์ ๊ณ์ฐํ์ฌ ๋ฐํํ๋ค.
์ค๋ช :
์ด ํจ์๋ smooth L1 ์์ค ํจ์๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์ด ์์ค ํจ์๋ ํ๊ท(regression) ๋ฌธ์ ์์ ๋ง์ด ์ฌ์ฉ๋๋ฉฐ, ์ฃผ์ด์ง ์ ๋ ฅ ๊ฐ์ ๋ํด ์ค์ ๊ฐ๊ณผ ์์ธก ๊ฐ์ ๋น๊ตํ์ฌ ์ค์ฐจ๋ฅผ ๊ณ์ฐํ๋ค.
smooth L1 ์์ค ํจ์๋ L2 ์์ค ํจ์(MSE)์ L1 ์์ค ํจ์(MAE)๋ฅผ ๊ฒฐํฉํ ๊ฒ์ผ๋ก, ์ค์ฐจ๊ฐ ํฌ๋ฉด L1 ์์ค ํจ์์ฒ๋ผ ์ ๋๊ฐ์ ์ฌ์ฉํ๊ณ , ์์ผ๋ฉด L2 ์์ค ํจ์์ฒ๋ผ ์ ๊ณฑ์ ์ฌ์ฉํ๋ค.
์ด ํจ์๋ CPU์์ ๋์ํ๋ฉฐ, ๊ฐ๊ฐ์ ์ ๋ ฅ๊ฐ์ ๋ํด error์ delta๋ฅผ ๊ณ์ฐํ์ฌ ๋ฐํํ๋ค.
l1_cpu
ํจ์ ์ด๋ฆ: l1_cpu
์ ๋ ฅ:
n: ๋ฐ์ดํฐ ์ํ ์
pred: ์์ธก๊ฐ ๋ฐฐ์ด
truth: ์ค์ ๊ฐ ๋ฐฐ์ด
delta: ์ญ์ ํ ์ ๊ณ์ฐ๋๋ ๋ธํ๊ฐ์ด ์ ์ฅ๋ ๋ฐฐ์ด
error: ์์ค๊ฐ์ด ์ ์ฅ๋ ๋ฐฐ์ด
๋์:
์์ธก๊ฐ ๋ฐฐ์ด pred์ ์ค์ ๊ฐ ๋ฐฐ์ด truth ๊ฐ์ L1 ์์ค์ ๊ณ์ฐํ์ฌ error ๋ฐฐ์ด์ ์ ์ฅํ๊ณ ,
์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด๊ฐ ์์์ธ ๊ฒฝ์ฐ delta ๋ฐฐ์ด์ 1, ์์์ธ ๊ฒฝ์ฐ -1์ ์ ์ฅํจ์ผ๋ก์จ ์ญ์ ํ ์ ๊ณ์ฐ๋๋ ๋ธํ๊ฐ์ ๊ตฌํ๋ค.
์ค๋ช :
L1 ์์ค ํจ์๋ ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ ๊ฐ์ ์ฐจ์ด์ ์ ๋๊ฐ์ ์์ค๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค.
L1 ์์ค์ ์ด์์น(Outlier)์ ๋ํ ๋ฏผ๊ฐ๋๊ฐ ๋์ ์ด์์น๊ฐ ์ ์ ๋ฐ์ดํฐ์์๋ MSE ์์ค๋ณด๋ค ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
์ด ํจ์๋ CPU์์ ๋์ํ๋ฉฐ, ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ์ฌ ์์ค๊ฐ๊ณผ ๋ธํ๊ฐ์ ๊ตฌํ๋ค.
softmax_x_ent_cpu
ํจ์ ์ด๋ฆ: softmax_x_ent_cpu
์ ๋ ฅ:
n: ์์ธก๊ฐ(pred)๊ณผ ์ค์ ๊ฐ(truth)์ ๊ฐ์
pred: ์์ธก๊ฐ ํฌ์ธํฐ
truth: ์ค์ ๊ฐ ํฌ์ธํฐ
delta: ์ญ์ ํ ์ ์ค์ฐจ๊ฐ์ ์ ์ฅํ ํฌ์ธํฐ
error: ์์ค๊ฐ์ ์ ์ฅํ ํฌ์ธํฐ
๋์:
์ํํธ๋งฅ์ค(softmax) ํจ์์ ํฌ๋ก์ค ์ํธ๋กํผ(cross-entropy) ์์ค ํจ์๋ฅผ ๊ณ์ฐํ์ฌ ์ค์ฐจ๊ฐ๊ณผ ์์ค๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
์ค๋ช :
์ด ํจ์๋ ๋ฅ๋ฌ๋์์ ๋ถ๋ฅ(classification) ๋ฌธ์ ์์ ์ฌ์ฉํ๋ ์์ค ํจ์ ์ค ํ๋์ธ ํฌ๋ก์ค ์ํธ๋กํผ(cross-entropy) ์์ค ํจ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด ์์ค ํจ์๋ ์ํํธ๋งฅ์ค ํจ์์ ํจ๊ป ๋ถ๋ฅ ๋ฌธ์ ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
ํจ์์ ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์์ธก๊ฐ(pred)๊ณผ ์ค์ ๊ฐ(truth)์ด ์ฃผ์ด์ก์ ๋, ๋จผ์ ์ํํธ๋งฅ์ค ํจ์๋ฅผ ์ด์ฉํด ์์ธก๊ฐ์ ํ๋ฅ ๊ฐ์ผ๋ก ๋ณํํฉ๋๋ค. ๊ทธ ๋ค์, ํ๋ฅ ๊ฐ๊ณผ ์ค์ ๊ฐ์ ์ด์ฉํด ํฌ๋ก์ค ์ํธ๋กํผ ์์ค ํจ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์์ค ํจ์์ ๊ฐ์ด ์์์๋ก ๋ชจ๋ธ์ ์์ธก๊ฐ์ด ์ค์ ๊ฐ์ ๊ฐ๊น๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ด ํจ์๋ ์ญ์ ํ(backpropagation)๋ฅผ ์ํด ์ค์ฐจ๊ฐ(delta)๋ ํจ๊ป ๊ณ์ฐํฉ๋๋ค. ์ญ์ ํ๋ฅผ ํตํด ์ด ์ค์ฐจ๊ฐ์ด ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฐ์ดํธํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
logistic_x_ent_cpu
ํจ์ ์ด๋ฆ: logistic_x_ent_cpu
์ ๋ ฅ:
n: ์์ธก ๊ฐ(pred)๊ณผ ์ค์ ๊ฐ(truth)์ ๊ธธ์ด
pred: ์์ธก ๊ฐ ๋ฐฐ์ด ํฌ์ธํฐ
truth: ์ค์ ๊ฐ ๋ฐฐ์ด ํฌ์ธํฐ
delta: ๋ธํ ๊ฐ ๋ฐฐ์ด ํฌ์ธํฐ
error: ์ค์ฐจ ๊ฐ ๋ฐฐ์ด ํฌ์ธํฐ
๋์:
๋ก์ง์คํฑ ํ๊ท์์ ํฌ๋ก์ค ์ํธ๋กํผ ์์ค ํจ์์ ๊ฐ์ ๊ณ์ฐํ๊ณ , ๊ทธ ๊ฐ์ ์ด์ฉํด ๋ธํ ๊ฐ์ ๊ณ์ฐํ๋ ํจ์์ด๋ค.
์ค๋ช :
์ด ํจ์๋ n๊ฐ์ ์์๋ฅผ ๊ฐ๋ pred, truth ๋ฐฐ์ด์ ์์ ๊ฐ๋ค์ ์ด์ฉํ์ฌ ๋ก์ง์คํฑ ํ๊ท์์ ํฌ๋ก์ค ์ํธ๋กํผ ์์ค ํจ์์ ๊ฐ์ ๊ณ์ฐํ๊ณ , ๊ทธ ๊ฐ์ ์ด์ฉํด ๋ธํ ๊ฐ์ ๊ณ์ฐํ๋ค. ์ด ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ๋ค.
i๋ฒ์งธ ์์์ ๋ํด์, t๋ ์ค์ ๊ฐ(truth[i]), p๋ ์์ธก ๊ฐ(pred[i])์ด๋ค.
error[i]์๋ ํฌ๋ก์ค ์ํธ๋กํผ ์์ค ํจ์์ i๋ฒ์งธ ์์ ๊ฐ์ด ์ ์ฅ๋๋ค.
delta[i]์๋ ๋ธํ ๊ฐ(i๋ฒ์งธ ์์์ ๋ํ ์์ธก ๊ฐ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด)์ด ์ ์ฅ๋๋ค.
์ฃผ์ํ ์ ์ pred์ truth๋ ํ๋ฅ ๊ฐ์ผ๋ก ๊ฐ์ฃผ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ฆ, 0๊ณผ 1 ์ฌ์ด์ ๊ฐ์ด์ด์ผ ํ๋ค.
l2_cpu
ํจ์ ์ด๋ฆ: l2_cpu
์ ๋ ฅ:
n: ์์ธก ๊ฐ(pred)๊ณผ ์ค์ ๊ฐ(truth)์ ์์ ๊ฐ์
*pred: ์์ธก ๊ฐ ๋ฐฐ์ด
*truth: ์ค์ ๊ฐ ๋ฐฐ์ด
*delta: ์์ธก ๊ฐ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด
*error: ์์ธก ๊ฐ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด์ ์ ๊ณฑ
๋์:
์์ธก ๊ฐ(pred)๊ณผ ์ค์ ๊ฐ(truth)์ ์ด์ฉํ์ฌ ์์ธก ๊ฐ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด(diff)๋ฅผ ๊ณ์ฐํ๊ณ , ํด๋น ์ฐจ์ด(diff)๋ฅผ ์ด์ฉํ์ฌ ์์ธก ๊ฐ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด์ ์ ๊ณฑ(error)๊ณผ ์ฐจ์ด(delta)๋ฅผ ๊ณ์ฐํ๋ค.
์ค๋ช :
l2(์ ๊ณฑ๊ทผ ์ค์ฐจ) ์์ค ํจ์๋ฅผ ๊ณ์ฐํ๋ ํจ์๋ก, ๋ฅ๋ฌ๋์์ ์ฌ์ฉ๋๋ค.
l2 ์์ค ํจ์๋ ์์ธก ๊ฐ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ ๊ณฑํ ๊ฐ๋ค์ ํฉ์ ๊ตฌํ๋ ๋ฐฉ์์ผ๋ก ์์ค์ ๊ณ์ฐํ๋ค.
์ด๋ฅผ ์ด์ฉํ์ฌ ์์ธก ๊ฐ๊ณผ ์ค์ ๊ฐ ์ฌ์ด์ ์ค์ฐจ๋ฅผ ๊ณ์ฐํ๊ณ , ์ด๋ฅผ ์ญ์ ํ(backpropagation)๋ฅผ ํตํด ํ์ต์ ์งํํ๋ค.
dot_cpu
ํจ์ ์ด๋ฆ: dot_cpu
์ ๋ ฅ:
N(๋ฒกํฐ์ ๊ธธ์ด)
X(์ฒซ๋ฒ์งธ ๋ฒกํฐ)
INCX(์ฒซ๋ฒ์งธ ๋ฒกํฐ์ ์ฆ๋ถ)
Y(๋๋ฒ์งธ ๋ฒกํฐ)
INCY(๋๋ฒ์งธ ๋ฒกํฐ์ ์ฆ๋ถ)
๋์:
๋ ๋ฒกํฐ X์ Y์ ๋ด์ (dot product)์ ๊ณ์ฐํ๋ค. ์ฆ, X[0]*Y[0] + X[INCX]*Y[INCY] + ... + X[(N-1)*INCX]*Y[(N-1)*INCY]๋ฅผ ๊ณ์ฐํ๋ค.
์ค๋ช :
๋ ๋ฒกํฐ์ ๋ด์ ์ ์ ํ ๋์ํ์์ ์์ฃผ ์ฌ์ฉ๋๋ ์ฐ์ฐ ์ค ํ๋์ด๋ค.
์ด ํจ์๋ N๊ฐ์ ์์๋ฅผ ๊ฐ์ง๋ ๋ ๋ฒกํฐ X์ Y์ ๋ด์ ์ ๊ณ์ฐํ๋ค. X์ Y๋ ๊ฐ๊ฐ INCX, INCY๋งํผ ์ฆ๋ถ๋๋ค. ์ด ํจ์๋ ๋ด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
softmax
ํจ์ ์ด๋ฆ: softmax
์ ๋ ฅ:
input: ์ํํธ๋งฅ์ค ํจ์๋ฅผ ์ ์ฉํ ์ ๋ ฅ ๋ฐฐ์ด ํฌ์ธํฐ
n: ์ ๋ ฅ ๋ฐฐ์ด์ ํฌ๊ธฐ
temp: ์ํํธ๋งฅ์ค ํจ์์ ์จ๋ ๋งค๊ฐ๋ณ์
stride: ์ ๋ ฅ ๋ฐฐ์ด์์ ์์ ๊ฐ์ ๊ฐ๊ฒฉ
output: ์ํํธ๋งฅ์ค ํจ์์ ์ถ๋ ฅ ๋ฐฐ์ด ํฌ์ธํฐ
๋์:
์ ๋ ฅ ๋ฐฐ์ด์ ๊ฐ ์์์ ๋ํด ์ํํธ๋งฅ์ค ํจ์๋ฅผ ์ ์ฉํ์ฌ ์ถ๋ ฅ ๋ฐฐ์ด์ ๊ณ์ฐ
์ ๋ ฅ ๋ฐฐ์ด์์ ๊ฐ์ฅ ํฐ ๊ฐ(largest)์ ์ฐพ์
์ถ๋ ฅ ๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ๊ณ์ฐํ ๋, largest๋ก๋ถํฐ temp๋ก ๋๋ ๊ฐ์ ์ง์ ํจ์์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ์ฌ ์ง์ ํจ์ ๊ณ์ฐ
๋ชจ๋ ์์์ ์ง์ ํจ์ ๊ฐ์ ๋ํ๊ณ , ๊ฐ ์์์ ์ง์ ํจ์ ๊ฐ์ ์ดํฉ์ผ๋ก ๋๋ ์ ๊ทํ
์ต์ข ์ ์ผ๋ก ์ ๊ทํ๋ ๊ฐ์ ์ถ๋ ฅ ๋ฐฐ์ด์ ์ ์ฅ
์ค๋ช :
์ํํธ๋งฅ์ค ํจ์๋ ์ ๋ ฅ ๋ฐฐ์ด์ ํ๋ฅ ๋ถํฌ๋ก ๋ณํํ๋ ํจ์์ด๋ฉฐ, ๊ฐ ์ ๋ ฅ ์์๋ฅผ ์ ๊ทํ๋ ํ๋ฅ ๊ฐ์ผ๋ก ๋ณํํ๋ค. softmax ํจ์๋ ํฌ๊ฒ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
๋จผ์ ์ ๋ ฅ ๋ฐฐ์ด์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ์ largest์ ์ ์ฅํ๋ค.
๊ทธ ๋ค์, ์ ๋ ฅ ๋ฐฐ์ด์ ๊ฐ ์์์ ๋ํด ์ง์ ํจ์๋ฅผ ๊ณ์ฐํ์ฌ ์ถ๋ ฅ ๋ฐฐ์ด์ ๊ตฌํ๋ค. ๋ง์ง๋ง์ผ๋ก ์ถ๋ ฅ ๋ฐฐ์ด์ ๋ชจ๋ ๊ฐ์ ๋ํ๊ณ ์ดํฉ์ผ๋ก ๋๋ ์ ๊ทํํ๋ค.
์ด๋ฅผ ํตํด ์ถ๋ ฅ ๋ฐฐ์ด์ ๊ฐ์ ๋ชจ๋ 0๊ณผ 1 ์ฌ์ด์ ์์ผ๋ฉฐ, ์ดํฉ์ 1์ด ๋๋ค.
์ด๋ ๊ฒ ๊ตฌํด์ง ์ถ๋ ฅ ๋ฐฐ์ด์ ์ ๋ ฅ ๋ฐฐ์ด์ ํ๋ฅ ๋ถํฌ๋ฅผ ๋ํ๋ธ๋ค. ์ํํธ๋งฅ์ค ํจ์๋ ๋ฅ๋ฌ๋์์ ์ฃผ๋ก ์ถ๋ ฅ์ธต์์ ์ฌ์ฉ๋๋ฉฐ, ๋ค์ค ํด๋์ค ๋ถ๋ฅ ๋ฌธ์ ์์ ์ฌ์ฉ๋๋ค.
softmax_cpu
ํจ์ ์ด๋ฆ: softmax_cpu
์ ๋ ฅ:
input: ์ ๋ ฅ ๋ฐฐ์ด์ ํฌ์ธํฐ
n: softmax๋ฅผ ์ํํ ์์ ์
batch: ๋ฐฐ์น ํฌ๊ธฐ
batch_offset: ๋ฐฐ์น ๊ฐ๊ฒฉ
groups: ๊ทธ๋ฃน ์
group_offset: ๊ทธ๋ฃน ๊ฐ๊ฒฉ
stride: ์คํธ๋ผ์ด๋ ํฌ๊ธฐ
temp: softmax scaling ๋งค๊ฐ๋ณ์
output: ์ถ๋ ฅ ๋ฐฐ์ด์ ํฌ์ธํฐ
๋์:
๋ฐฐ์น์ ๊ทธ๋ฃน์ ๋ํด softmax ํจ์๋ฅผ ์ ์ฉํฉ๋๋ค.
๊ฐ๊ฐ์ ๋ฐฐ์น์ ๊ทธ๋ฃน์์, ์ ๋ ฅ ๋ฐฐ์ด์์ ํด๋น ๋ฐฐ์น์ ๊ทธ๋ฃน์ ์ ํํ๊ณ , softmax ํจ์๋ฅผ ์ํํ์ฌ ์ถ๋ ฅ ๋ฐฐ์ด์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค.
์ค๋ช :
softmax ํจ์๋ ์ฃผ์ด์ง ์ ๋ ฅ ๋ฐฐ์ด์ ๊ฐ๋ค์ ์ ๊ทํํ์ฌ ์ถ๋ ฅ ๋ฐฐ์ด์ ํฉ์ด 1์ด ๋๋๋ก ํฉ๋๋ค. ์ด ํจ์๋ ์ฃผ๋ก ๋ถ๋ฅ ๋ฌธ์ ์์ ์ถ๋ ฅ์ธต์์ ์ฌ์ฉ๋ฉ๋๋ค. softmax ํจ์๋ ๊ฐ ์์์ ์ง์๊ฐ์ ์ทจํ ํ ์ ์ฒด ์์์ ํฉ์ผ๋ก ๋๋์ด ๊ฐ์ ์ ๊ทํํฉ๋๋ค. softmax_cpu ํจ์๋ ์ด๋ฌํ softmax ํจ์๋ฅผ ๋ฐฐ์น์ ๊ทธ๋ฃน ๋จ์๋ก ์ํํฉ๋๋ค.
batch์ groups๋ ๋ฐฐ์ด์ ๋ถํ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. batch_offset์ ํ ๋ฐฐ์น์ ์์ ์์ stride๋ฅผ ๊ณฑํ ๊ฐ์ ๋๋ค. group_offset์ ํ ๊ทธ๋ฃน์ ์์ ์์ stride๋ฅผ ๊ณฑํ ๊ฐ์ ๋๋ค. ์ด๋ฌํ ๋ฐฐ์น ๋ฐ ๊ทธ๋ฃน์ ์ค์ ์ ์ ๋ ฅ ๋ฐฐ์ด์ ๋ค๋ฃฐ ๋ ์ ์ฉํฉ๋๋ค.
temp ๋งค๊ฐ๋ณ์๋ softmax ํจ์์ ์ค์ผ์ผ์ ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ถ๋ ฅ ๋ฐฐ์ด์์์ ๊ฐ์ ๋ชจ๋ ๊ฐ์ ๋ฒ์ ๋ด์ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ฐ์ด ์์ผ๋ฉด ์ถ๋ ฅ ๋ฐฐ์ด์ ์ฐจ์ด๊ฐ ์ปค์ง๋๋ค.
softmax_cpu ํจ์๋ ์ ๋ ฅ ๋ฐฐ์ด์ ๊ฐ ๋ฐฐ์น์ ๊ทธ๋ฃน์ ๋ํด softmax ํจ์๋ฅผ ์ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ ๋ฐฐ์ด์ ์ ์ฅํฉ๋๋ค. ์ถ๋ ฅ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ ์ ๋ ฅ ๋ฐฐ์ด๊ณผ ๋์ผํฉ๋๋ค.
upsample_cpu
ํจ์ ์ด๋ฆ: upsample_cpu
์ ๋ ฅ:
float *in: ์ ๋ ฅ ๋ฐ์ดํฐ ํฌ์ธํฐ
int w: ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋๋น
int h: ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋์ด
int c: ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ฑ๋ ์
int batch: ๋ฐฐ์น ํฌ๊ธฐ
int stride: ์ ์ํ๋ง ์คํธ๋ผ์ด๋
int forward: ์๋ฐฉํฅ ์ฌ๋ถ(1์ด๋ฉด ์๋ฐฉํฅ, 0์ด๋ฉด ์ญ๋ฐฉํฅ)
float scale: ์ค์ผ์ผ๋ง ๊ณ์
float *out: ์ถ๋ ฅ ๋ฐ์ดํฐ ํฌ์ธํฐ
๋์:
์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๋งํ์ฌ ์ถ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค.
์ ๋ ฅ ๋ฐ์ดํฐ์ ๊ฐ ํฝ์ ์ ์คํธ๋ผ์ด๋ ํฌ๊ธฐ๋งํผ ์ฐ์๋ ์ถ๋ ฅ ๋ฐ์ดํฐ์ ํฝ์ ๋ค์ ๋ณต์ฌ๋ฉ๋๋ค.
์ ์ํ๋ง ์คํธ๋ผ์ด๋๊ฐ 2์ธ ๊ฒฝ์ฐ, ์ ๋ ฅ ๋ฐ์ดํฐ์ (0,0) ์์น๋ ์ถ๋ ฅ ๋ฐ์ดํฐ์ (0,0), (0,1), (1,0), (1,1) ์์น์ ๋ณต์ฌ๋ฉ๋๋ค.
์ญ๋ฐฉํฅ ๊ณ์ฐ์ ์ํํ๋ ๊ฒฝ์ฐ, ์ถ๋ ฅ ๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ญ์ผ๋ก ์ ํํฉ๋๋ค.
์ค๋ช :
upsample_cpu ํจ์๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๋งํ์ฌ ์ถ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ํจ์์ ๋๋ค.
์ด๋ฏธ์ง ๋ถ์ ๋ถ์ผ์์ ์์ ํฌ๊ธฐ๋ฅผ ํ๋ํ๊ฑฐ๋ ํด์๋๋ฅผ ๋์ด๋ ๋ฑ์ ์ฉ๋๋ก ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
์ ๋ ฅ ๋ฐ์ดํฐ๋ 4์ฐจ์ ํ ์(batch, ์ฑ๋, ๋์ด, ๋๋น)๋ก ํํ๋๋ฉฐ, ์ถ๋ ฅ ๋ฐ์ดํฐ ์ญ์ ๊ฐ์ ํฌ๊ธฐ์ 4์ฐจ์ ํ ์๋ก ์์ฑ๋ฉ๋๋ค.
์คํธ๋ผ์ด๋ ํฌ๊ธฐ๋ ์ ์ํ๋ง ์คํธ๋ผ์ด๋ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ง์ ํ ์ ์์ผ๋ฉฐ, ์ค์ผ์ผ๋ง ๊ณ์(scale)๋ฅผ ํตํด ์ถ๋ ฅ ๋ฐ์ดํฐ์ ๊ฐ ๋ฒ์๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค.
reorg_cpu
ํจ์ ์ด๋ฆ: reorg_cpu
์ ๋ ฅ:
float *x: ์ ๋ ฅ ๋ฐฐ์ด ํฌ์ธํฐ
int w: ์ ๋ ฅ ๋ฐฐ์ด์ ๋๋น
int h: ์ ๋ ฅ ๋ฐฐ์ด์ ๋์ด
int c: ์ ๋ ฅ ๋ฐฐ์ด์ ์ฑ๋ ์
int batch: ์ ๋ ฅ ๋ฐฐ์ด์ ๋ฐฐ์น ํฌ๊ธฐ
int stride: reorg ์์ ์ stride ๊ฐ
int forward: reorg ์์ ์ ๋ฐฉํฅ. forward๋ 1, backward๋ 0
float *out: ์ถ๋ ฅ ๋ฐฐ์ด ํฌ์ธํฐ
๋์:
์ ๋ ฅ ๋ฐฐ์ด x๋ฅผ reorg ์์ ์ผ๋ก ์ถ๋ ฅ ๋ฐฐ์ด out์ผ๋ก ๋ณํํ๋ ํจ์.
reorg ์์ ์ ์ ๋ ฅ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ฑฐ๋ ๋๋ฆฌ๋ ์์ ์ ์ํํ๋ฉฐ, stride ๊ฐ์ ๋ฐ๋ผ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ค.
forward ๊ฐ์ด 1์ผ ๊ฒฝ์ฐ, ์ ๋ ฅ ๋ฐฐ์ด x๋ฅผ ์ถ๋ ฅ ๋ฐฐ์ด out์ผ๋ก ๋ณํํ๋ค.
forward ๊ฐ์ด 0์ผ ๊ฒฝ์ฐ, ์ถ๋ ฅ ๋ฐฐ์ด out์ ์ ๋ ฅ ๋ฐฐ์ด x๋ก ๋ณํํ๋ค.
์ ๋ ฅ ๋ฐฐ์ด x์ ๊ฐ ์์๋ ์ถ๋ ฅ ๋ฐฐ์ด์ ์๋ก์ด ์์น๋ก ์ด๋ํ๋ค.
reorg ์์ ์ ๋ค์๊ณผ ๊ฐ์ ๊ณต์์ผ๋ก ์ํ๋๋ค:
out_index = w2 + w * stride * (h2 + h * stride * (c2 + out_c * b))
in_index = i + w * (j + h * (k + c * b))
c2 = k % out_c
offset = k / out_c
w2 = i * stride + offset % stride
h2 = j * stride + offset / stride
์ค๋ช :
์ ๋ ฅ ๋ฐฐ์ด x๋ 4์ฐจ์ ๋ฐฐ์ด๋ก(batch, channel, height, width) ์ฃผ๋ก ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉ๋๋ค.
reorg ์์ ์ YOLO(Object Detection ์๊ณ ๋ฆฌ์ฆ)์์ ์ฌ์ฉ๋๋ ์์ ์ค ํ๋๋ก, feature map์ ๋ค๋ฅธ ํฌ๊ธฐ๋ก ๋ณํํ์ฌ ๋ค๋ฅธ ํฌ๊ธฐ์ feature map๊ณผ ๊ฒฐํฉํ๋ ์์ ์ ์ํํ๋ค.
์ด ํจ์๋ CPU ์์์ ์คํ๋๋ค.
flatten
ํจ์ ์ด๋ฆ: flatten
์ ๋ ฅ:
float *x: 1์ฐจ์ ๋ฐฐ์ด์ ํฌ์ธํฐ
int size: 1์ฐจ์ ๋ฐฐ์ด์ ํฌ๊ธฐ
int layers: 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ ์
int batch: 3์ฐจ์ ๋ฐฐ์ด์ ๋ฐฐ์น ํฌ๊ธฐ
int forward: 1 ๋๋ 0 ๊ฐ. 1์ด๋ฉด 3์ฐจ์ ๋ฐฐ์ด์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํผ์นจ. 0์ด๋ฉด 2์ฐจ์ ๋ฐฐ์ด์ 3์ฐจ์ ๋ฐฐ์ด๋ก ํผ์นจ.
๋์:
3์ฐจ์ ๋ฐฐ์ด์ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋๋ 2์ฐจ์ ๋ฐฐ์ด์ 3์ฐจ์ ๋ฐฐ์ด๋ก ๋ณํํ๋ ํจ์
3์ฐจ์ ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ 2์ฐจ์ ๋ฐฐ์ด์ ํํ๋ก ์ฌ๋ฐฐ์นํ์ฌ, ํฌ์ธํฐ swap์ ์ ์ฅ
forward๊ฐ 1์ด๋ฉด 3์ฐจ์ ๋ฐฐ์ด์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํผ์น๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก, swap์ ๊ฐ์ x๋ก ๋ณต์ฌ.
forward๊ฐ 0์ด๋ฉด 2์ฐจ์ ๋ฐฐ์ด์ 3์ฐจ์ ๋ฐฐ์ด๋ก ํผ์น๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก, swap์ ๊ฐ์ x๋ก ์ญ์ผ๋ก ๋ณต์ฌ.
swap ๋ฐฐ์ด์ ๋์ ์ผ๋ก ํ ๋นํ์ฌ ์ฌ์ฉํ๋ฏ๋ก, ๋ง์ง๋ง์๋ free ํจ์๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ .
์ค๋ช :
๋ค์ฐจ์ ๋ฐฐ์ด์์ ๋ฐ์ดํฐ์ ์์๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์
ํนํ, ๋ฅ ๋ฌ๋์์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ 2์ฐจ์ ๋ฐฐ์ด์ ํํ๋ก ํผ์น๋ flatten ๋ ์ด์ด์์ ์ฌ์ฉ๋จ.
3์ฐจ์ ๋ฐฐ์ด์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํผ์น ๋, ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ก ๋ฐฉํฅ์ผ๋ก 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ ์๋งํผ ์ฐ์ํ๊ฒ ๋ฐฐ์น๋จ.
2์ฐจ์ ๋ฐฐ์ด์ 3์ฐจ์ ๋ฐฐ์ด๋ก ๋ณํํ ๋, ๋ฐ์ดํฐ๊ฐ ์ธ๋ก ๋ฐฉํฅ์ผ๋ก 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ ์๋งํผ ์ฐ์ํ๊ฒ ๋ฐฐ์น๋จ.
weighted_sum_cpu
ํจ์ ์ด๋ฆ: weighted_sum_cpu
์ ๋ ฅ:
float *a: ์ฒซ ๋ฒ์งธ ์ ๋ ฅ ๋ฐฐ์ด
float *b: ๋ ๋ฒ์งธ ์ ๋ ฅ ๋ฐฐ์ด
float *s: ๊ฐ์ค์น ๋ฐฐ์ด
int n: ๋ฐฐ์ด์ ํฌ๊ธฐ
float *c: ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ์ถ๋ ฅ ๋ฐฐ์ด
๋์:
๋ฐฐ์ด a, b, s๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๊ฐ์ค ํ๊ท ๊ณ์ฐ์ ํตํด c ๋ฐฐ์ด์ ๊ณ์ฐํ๋ค.
๋ฐฐ์ด b๊ฐ NULL์ด ์๋ ๊ฒฝ์ฐ, (1-s[i])*b[i]๋ฅผ ๋ํด์ค๋ค.
์ค๋ช :
๋ ๊ฐ์ ๋ฐฐ์ด a, b์ ๊ฐ์ค์น ๋ฐฐ์ด s๋ฅผ ์ด์ฉํด ๊ฐ์ค ํ๊ท ๊ณ์ฐ์ ์ํํ๋ ํจ์์ด๋ค.
๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅ ๋ฐฐ์ด c์ ์ ์ฅ๋๋ค.
๋ง์ฝ b ๋ฐฐ์ด์ด NULL์ด๋ผ๋ฉด, ๋ ๋ฒ์งธ ํญ์ ๊ณ์ฐ๋์ง ์๋๋ค.
weighted_delta_cpu
ํจ์ ์ด๋ฆ: weighted_delta_cpu
์ ๋ ฅ:
a: floatํ ๋ฐฐ์ด ํฌ์ธํฐ
b: floatํ ๋ฐฐ์ด ํฌ์ธํฐ
s: floatํ ๋ฐฐ์ด ํฌ์ธํฐ
da: floatํ ๋ฐฐ์ด ํฌ์ธํฐ
db: floatํ ๋ฐฐ์ด ํฌ์ธํฐ
ds: floatํ ๋ฐฐ์ด ํฌ์ธํฐ
n: intํ ๋ณ์
dc: floatํ ๋ฐฐ์ด ํฌ์ธํฐ
๋์: ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๋ฐฐ์ด๊ณผ ๋ณ์๋ค์ ์ฌ์ฉํ์ฌ ๊ฐ์ค์น ๊ณ์ฐ์ ์ํํฉ๋๋ค.
์ค๋ช : ์ด ํจ์๋ ๋ด๋ด ๋คํธ์ํฌ์์ ๊ฐ์ค์น ๊ณ์ฐ์ ์ํํ๋ ํจ์์ ๋๋ค. ์ ๋ ฅ์ผ๋ก๋ ๋ ๊ฐ์ floatํ ๋ฐฐ์ด ํฌ์ธํฐ(a, b), ํ ๊ฐ์ floatํ ๋ฐฐ์ด ํฌ์ธํฐ(s), ์ธ ๊ฐ์ floatํ ๋ฐฐ์ด ํฌ์ธํฐ(da, db, ds), intํ ๋ณ์ n, ๊ทธ๋ฆฌ๊ณ ํ ๊ฐ์ floatํ ๋ฐฐ์ด ํฌ์ธํฐ dc๊ฐ ํ์ํฉ๋๋ค.
์ด ํจ์๋ ์ ๋ ฅ์ผ๋ก ๋ฐ์ dc ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๊ฐ์ค์น๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด๋, ๊ฐ์ค์น ๊ณ์ฐ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
da[i] += dc[i] * s[i]: da ๋ฐฐ์ด์ i๋ฒ์งธ ๊ฐ์ dc[i] * s[i] ๊ฐ์ ๋ํฉ๋๋ค.
db[i] += dc[i] * (1-s[i]): db ๋ฐฐ์ด์ i๋ฒ์งธ ๊ฐ์ dc[i] * (1-s[i]) ๊ฐ์ ๋ํฉ๋๋ค.
ds[i] += dc[i] * (a[i] - b[i]): ds ๋ฐฐ์ด์ i๋ฒ์งธ ๊ฐ์ dc[i] * (a[i] - b[i]) ๊ฐ์ ๋ํฉ๋๋ค.
์ด๋ฌํ ๊ฐ์ค์น ๊ณ์ฐ์ ์ํํ์ฌ ๊ฒฐ๊ณผ ๊ฐ์ da, db, ds ๋ฐฐ์ด์ ์ ์ฅํฉ๋๋ค.
shortcut_cpu
ํจ์ ์ด๋ฆ: shortcut_cpu
์ ๋ ฅ:
batch: ๋ฏธ๋๋ฐฐ์น ํฌ๊ธฐ
w1: ์ด์ ๋ ์ด์ด์ ๊ฐ๋ก ํฌ๊ธฐ
h1: ์ด์ ๋ ์ด์ด์ ์ธ๋ก ํฌ๊ธฐ
c1: ์ด์ ๋ ์ด์ด์ ์ฑ๋ ์
add: ์ด์ ๋ ์ด์ด์ ์ถ๋ ฅ๊ฐ
w2: ํ์ฌ ๋ ์ด์ด์ ๊ฐ๋ก ํฌ๊ธฐ
h2: ํ์ฌ ๋ ์ด์ด์ ์ธ๋ก ํฌ๊ธฐ
c2: ํ์ฌ ๋ ์ด์ด์ ์ฑ๋ ์
s1: ์ด์ ๋ ์ด์ด ์ถ๋ ฅ๊ฐ์ ์ค์ผ์ผ
s2: ํ์ฌ ๋ ์ด์ด ์ถ๋ ฅ๊ฐ์ ์ค์ผ์ผ
๋์: shortcut connection(์์ฌ ์ฐ๊ฒฐ)์ ์ํ ํจ์๋ก, ์ด์ ๋ ์ด์ด์ ์ถ๋ ฅ๊ฐ(add)๊ณผ ํ์ฌ ๋ ์ด์ด์ ์ถ๋ ฅ๊ฐ(out)์ ํฉํ์ฌ ์ต์ข ์ถ๋ ฅ๊ฐ์ ๊ณ์ฐํ๋ค.
์ค๋ช :
stride์ sample ๋ณ์๋ ์๋ก ๋ฐ๋ ๊ฐ๋ ์ด๋ฉฐ, ๊ฐ๋ก์ ์ธ๋ก ๋ฐฉํฅ์ ํฌ๊ธฐ ๋น์จ์ ๋ํ๋ธ๋ค. ์ด ๊ฐ๋ค์ ์ด์ฉํด ์ถ๋ ฅ๊ฐ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ค.
๋ ๋ ์ด์ด์ ํฌ๊ธฐ ์ค์์ ๋ ์์ ๊ฐ(minw, minh, minc)์ ์ด์ฉํด ์ถ๋ ฅ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํ๋ค.
๊ฐ ๋ฏธ๋๋ฐฐ์น(b), ์ฑ๋(k), ์ธ๋ก ๋ฐฉํฅ(j), ๊ฐ๋ก ๋ฐฉํฅ(i)์ ๋ํด ๋ฐ๋ณต๋ฌธ์ ์ํํ๋ฉฐ, out_index์ add_index๋ฅผ ๊ณ์ฐํ์ฌ ๋ ๊ฐ์ ๊ฐ์คํฉํ์ฌ ์ต์ข ์ถ๋ ฅ๊ฐ์ ๊ณ์ฐํ๋ค.
์ด์ ๋ ์ด์ด ์ถ๋ ฅ๊ฐ(add)๊ณผ ํ์ฌ ๋ ์ด์ด ์ถ๋ ฅ๊ฐ(out)์ ์๋ก ๋ค๋ฅธ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก, stride์ sample ๊ฐ์ ๋ฐ๋ผ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ์ฌ ํฉ์ฐํ๋ค.
์ถ๋ ฅ๊ฐ(out)์ ์ด์ ๋ ์ด์ด ์ถ๋ ฅ๊ฐ์ ์ค์ผ์ผ(s1)๊ณผ ํ์ฌ ๋ ์ด์ด ์ถ๋ ฅ๊ฐ์ ์ค์ผ์ผ(s2)์ ๊ณฑํ์ฌ ์ต์ข ์ถ๋ ฅ๊ฐ์ ๊ณ์ฐํ๋ค.
softmax_x_ent_cpu
ํจ์ ์ด๋ฆ: softmax_x_ent_cpu
์ ๋ ฅ:
n: ์์ธก๊ฐ(pred), ์ค์ ๊ฐ(truth), ๋ธํ๊ฐ(delta), ์ค์ฐจ๊ฐ(error)์ ๊ฐ์
pred: ์์ธก๊ฐ ๋ฐฐ์ด ํฌ์ธํฐ
truth: ์ค์ ๊ฐ ๋ฐฐ์ด ํฌ์ธํฐ
delta: ๋ธํ๊ฐ ๋ฐฐ์ด ํฌ์ธํฐ
error: ์ค์ฐจ๊ฐ ๋ฐฐ์ด ํฌ์ธํฐ
๋์: softmax์ cross-entropy loss๋ฅผ ๊ณ์ฐํ๋ ํจ์์ด๋ค.
์ค๋ช :
ํจ์๋ ์์ธก๊ฐ(pred), ์ค์ ๊ฐ(truth)์ ์ ๋ ฅ๋ฐ์์, ๋ธํ๊ฐ(delta)์ ์ค์ฐจ๊ฐ(error)์ ๊ณ์ฐํ๋ค.
softmax ํจ์๋ ๋ค์ค ํด๋์ค ๋ถ๋ฅ ๋ฌธ์ ์์ ๊ฐ ํด๋์ค์ ๋ํ ์์ธก ํ๋ฅ ์ ๊ตฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ์ฌ๊ธฐ์๋ softmax ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ด ์ด๋ฏธ ์ฃผ์ด์ง ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ค.
cross-entropy loss๋ ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๋ ์์ค ํจ์ ์ค ํ๋์ด๋ค. ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด๋ฅผ log ํจ์๋ฅผ ์ด์ฉํด ๊ณ์ฐํ๋ฉฐ, ์ค์ ๊ฐ์ด 0์ธ ๊ฒฝ์ฐ์๋ ์ค์ฐจ๋ฅผ 0์ผ๋ก ๊ณ์ฐํ๋ค.
๋ธํ๊ฐ์ ์ ๊ฒฝ๋ง ์ญ์ ํ(backpropagation)์์ ์ฌ์ฉ๋๋ค. ์ญ์ ํ์์๋ ์ถ๋ ฅ์ธต์์์ ์ค์ฐจ๊ฐ์ ์ ๋ ฅ์ธต์ผ๋ก ์ ํ์ํค๋ฉฐ, ๋ธํ๊ฐ์ ์ด ๊ณผ์ ์์ ์ฌ์ฉ๋๋ค.
ํจ์๋ CPU์์ ๋์ํ๋ค.
Last updated
Was this helpful?