๋ฌธ์ ์ํ :
์ฐธ๊ณ :
inputs
ํ ์์ ์์๊ฐ 2๋ณด๋ค ํฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๊ธฐ ํ๋ ฌ์w
๊ณฑํ๊ธฐ ์ ์ ํํํ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ค์์ ์
๋ ฅ์ด ํํํ์ง ์์ ๊ฒ์ฒ๋ผ shape=(2, 2, 2, 400)
๋ชจ์์ ํ
์๋ฅผ ๋ฐํํฉ๋๋ค.
tf.layers.dense(tf.placeholder(tf.float32, (2,2,2,2)), 400)
์ฃ์กํฉ๋๋ค. ์ ์์ ์ ์ ๊ฑฐํ๋ ค๋ ๊ฒ์ด ์๋๋๋ค. ๋ด๋ถ ์กฐ์ฌ๋ฅผํ๋ฉด์ ์ฑ ์์ด ์๋ค๊ณ ์๊ฐํ๋ ์ฌ๋์ ์ถ๊ฐํ๋ ค๊ณ ํ์ต๋๋ค.
๊ทธ๋์ ์กฐ์ฌ ํ, ์ ๊ฐ ๋ค์๋ ๊ฒ์ ๊ทธ๊ฒ์ด ํ ์ ๋ท์ฒ๋ผ ๋์ํ๊ณ ๊ทธ๋์ ๋์๊ณผ ํ์ฌ ๋ฌธ์๊ฐ ๋ชจ๋ ์ ํํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๊ฐ ์ด์ผ๊ธฐ ํ ์์ง๋์ด๋ ์ฐ๋ฆฌ๊ฐ ๋ ์ ํํ ์ธ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ ๊ฒ ๋ ๊ฒ์ด๋ผ๊ณ ๋งํ์ต๋๋ค. ํ์ฌ ์ธ์ด๊ฐ ๋ฌธ๋งฅ ์ ๋ช ํํ๊ณ ๋ชจํธํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ๋์์ด๋ฉ๋๋ค. (tensordot : https://docs.scipy.org/doc/numpy/reference/generated/numpy.tensordot.html ์ฐธ์กฐ)
ํ ๋ฆฌํ์คํธ๋ฅผ ์ง์ ๋ง๋ค์ด์ ๋ฆฌ์๋๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ํ์ํฉ๋๋ค.ํ์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ ์๋ฌด๊ฒ๋ํ์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ง๊ธ์์ด ๋ฒ๊ทธ๋ฅผ ๋ซ๊ฒ ์ต๋๋ค.
์, ํ ์ ๋ท ์ฐ๊ฒฐ์ด ๋ ๋ช ํ ํด์ก์ต๋๋ค.
tf.dense
์
๋ ฅ ํ
์์ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ค์น ํ
์์ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ก ์ถ์ํ์ฌ ๋์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. "flatten"์ด๋ผ๋ ๋จ์ด๊ฐ ํผ๋ ์ค๋ฌ์ ์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฌด์จ ๋ป์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
tf.dense๋ฅผ ๋๋ฑํ np.tensordot๋ก ๋ฒ์ญํ๊ธฐ ์ํด ๋ง๋ ์ฅ๋๊ฐ ์์
tf.reset_default_graph()
x0 = np.ones((3, 3, 3))
w0 = np.arange(6).reshape((3, 2))
x = tf.constant(x0)
y = tf.layers.dense(x, 2)
var_dict = {v.op.name: v for v in tf.global_variables()}
assert(var_dict["dense/kernel"].get_shape() == (3, 2))
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
sess.run(tf.assign(var_dict["dense/kernel"], w0))
sess.run(tf.assign(var_dict["dense/bias"], np.zeros((2,))))
expected_y0 = np.tensordot(x0,w0,axes=[(2,),(0,)])
y0 = sess.run(y)
np.testing.assert_allclose(y0, expected_y0)
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์, ํ ์ ๋ท ์ฐ๊ฒฐ์ด ๋ ๋ช ํ ํด์ก์ต๋๋ค.
tf.dense
์ ๋ ฅ ํ ์์ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ค์น ํ ์์ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ก ์ถ์ํ์ฌ ๋์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. "flatten"์ด๋ผ๋ ๋จ์ด๊ฐ ํผ๋ ์ค๋ฌ์ ์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฌด์จ ๋ป์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.tf.dense๋ฅผ ๋๋ฑํ np.tensordot๋ก ๋ฒ์ญํ๊ธฐ ์ํด ๋ง๋ ์ฅ๋๊ฐ ์์