Tensorflow: tf.layers.dense ๋ณ‘ํ•ฉ ๋™์ž‘์— ๋Œ€ํ•œ ๋ถˆ๋ช…ํ™• ํ•œ ๋ฌธ์„œ

์— ๋งŒ๋“  2017๋…„ 03์›” 07์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: tensorflow/tensorflow

๋ฌธ์„œ ์ƒํƒœ :

์ฐธ๊ณ  : inputs ํ…์„œ์˜ ์ˆœ์œ„๊ฐ€ 2๋ณด๋‹ค ํฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ดˆ๊ธฐ ํ–‰๋ ฌ์— w ๊ณฑํ•˜๊ธฐ ์ „์— ํ‰ํƒ„ํ™”๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ์€ ์ž…๋ ฅ์ด ํ‰ํ‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ shape=(2, 2, 2, 400) ๋ชจ์–‘์˜ ํ…์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
tf.layers.dense(tf.placeholder(tf.float32, (2,2,2,2)), 400)

docs-bug

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•„, ํ…์„œ ๋‹ท ์—ฐ๊ฒฐ์ด ๋” ๋ช…ํ™• ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

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)

๋ชจ๋“  3 ๋Œ“๊ธ€

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ž์‹ ์„ ์ œ๊ฑฐํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์กฐ์‚ฌ๋ฅผํ•˜๋ฉด์„œ ์ฑ…์ž„์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์กฐ์‚ฌ ํ›„, ์ œ๊ฐ€ ๋“ค์—ˆ๋˜ ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ํ…์„œ ๋‹ท์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ณ  ๊ทธ๋ž˜์„œ ๋™์ž‘๊ณผ ํ˜„์žฌ ๋ฌธ์„œ๊ฐ€ ๋ชจ๋‘ ์ •ํ™•ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ๊ฐ€ ์ด์•ผ๊ธฐ ํ•œ ์—”์ง€๋‹ˆ์–ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋” ์ •ํ™•ํ•œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์–ธ์–ด๊ฐ€ ๋ฌธ๋งฅ ์ƒ ๋ช…ํ™•ํ•˜๊ณ  ๋ชจํ˜ธํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. (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)
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰