Java์ฉ swig ์ธํฐํ์ด์ค์ ๋ ธ๋ ฅ์ ์ถ์ ํ๋ ๋ฌธ์ ์ ๋๋ค. ๊ตฌํ ์์ - ์งํ ์ํฉ์ ๋ฐ๋ผ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์๊ฒฌ/ํ์ด ์๋ ์ฌ๋์ด ์์ผ๋ฉด ์ธ์ ๋ ์ง ํ ๋ก ์ ์ฐธ์ฌํ์ญ์์ค!
๋ฉ์ง!
https://github.com/tensorflow/tensorflow/issues/3 ์์ ์ด ๋๊ธ์ ์ฌ๊ธฐ๋ก
์๋นํ ์ข์ ์๋ ด์ ๊ฐ์ง ํ ์คํธ ์ค์ํธ๊ฐ ์์ง๋ง ํ์ฌ๋ ๋ช ๊ฐ์ง C++ ํ ์คํธ๊ฐ ํฌํจ๋ ๋๋ถ๋ถ Python์ ๋๋ค. ๋ํ ํ์ฌ Python ์ ์ฉ์ธ ๊ทธ๋ํ๋ฅผ ์์ฑํ๊ธฐ ์ํ ๋ง์ ๊ธฐ๋ฅ, ํนํ ์๋ ๋ฏธ๋ถ ๊ธฐ๋ฅ์ด ์์ง๋ง Java์์ ๊ทธ๋ํ๋ฅผ ํ๊ฐํ๋ ๊ฒฝ์ฐ์๋ ์ค์ํ์ง ์์ต๋๋ค. ์์ผ๋ก ์ด ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ C++๋ก ์ด๋ํ ๊ณํ์ด ์์ผ๋ฉฐ, ์ด ์์ ์์ Java SWIG ๋ฐ์ธ๋ฉ์ ๊ทธ๋ํ ์์ฑ์ ๋ ์ ์ฉํ ๊ฒ์ ๋๋ค.
๋๊ตฐ๊ฐ๊ฐ Java SWIG ์ฑ๋ฆฐ์ง๋ฅผ ๋งก๋๋ค๋ฉด ๊ฒํ ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋ฑ์ ์ ์คํธ๋ฆผ์ ๊ธฐ๊บผ์ด ์๋ฝํ ๊ฒ์ด๋ฉฐ, ์ด ์์ ์์ ์ฐ๋ฆฌ์ ์ง์์ ์ธ ํ ์คํธ์ ์ผ๋ถ๊ฐ ๋ ๊ฒ์ ๋๋ค. ๊ธฐ๋ถ๊ธ ์๋ฝ์ ๋ํ ์ธ๋ถ ์ฌํญ์ ํ์ฌ ์ ๋์ ์ด์ง๋ง ์์ ํ๋ ๊ฒ์ ๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ
๋ํ TensorFlow for Java๋ฅผ ์ ์ฉํ๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๋ค. @ravwojdyla ํน์ Swig Interface for Java ์์
์ ์์ํ์
จ์ต๋๊น? ๋น์ ์ด ์๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ์ ๋
ธ๋ ฅ์ ๋์ฐธํ๊ณ ๊ทธ๊ฒ์ ๋ํด ํ๋ ฅํ ์ ์์ต๋๋ค.
์๋
ํ์ญ๋๊น,
์ ๋ ๋ฉ์ธ C++ API์ SWIG ๋ฉ ์์
์ ํ๊ณ ์์ต๋๋ค. ๋ด ํฌํฌ์์ ์ง๊ธ๊น์ง์ ์งํ ์ํฉ์ ๋ณผ ์ ์์ง๋ง ์์ง ๋๋์ง ์์ ์ํฉ์
๋๋ค. ํ์ฌ #include "tensorflow/core/lib/core/error_codes.pb.h"
์(๋ฅผ) ํด๊ฒฐํ ์ ์๊ณ ํ๋ก์ ํธ ํ์ผ ๋ด์์ ์ํ๋ ํ์ผ์ ์ฐพ์ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด๋ค ์ข
๋ฅ์ ์
๋ ฅ๋ ํฌ๊ฒ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
Caffe ๋ฐ OpenCV์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉํ ์ ์๋ javacpp ์ฌ์ ์ค์ ์ด ์์ต๋๋ค. https://github.com/bytedeco/javacpp-presets/issues/111 ๋
@girving ์ด๊ธฐ ์ปค๋ฐ https://github.com/bytedeco/javacpp-presets/commit/374e1d5ea3cb4db36144aeec2cac33d32e1a7489
/cc @saudet
@pslam - ๋๋ ์ด๊ฒ์ ๋ํด ์ฝ๊ฐ์ ์์ ์ ํ ์ ์์์ต๋๋ค - ํ์คํ ๋์์ด ๋ ์ ์์ต๋๋ค!
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ ๋ JavaCPP์ ๋ํ ๊ฝค ๊ธฐ๋ฅ์ ์ธ ๋ฐ์ธ๋ฉ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค: https://github.com/bytedeco/javacpp-presets/tree/master/tensorflow. SWIG๋ก ์ํํ ์ ์์ง๋ง JavaCPP๋ก ์ํํ ์ ์๋ ๊ฒ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค. ๋๋ ํ์คํ ํผ๋๋ฐฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. (cc @bhack ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!)
@saudet ์์ฃผ ๋ฉ์ง๊ฒ ์์ฑํ์ต๋๋ค! SWIG ๋ฉ์ ๊ฑฐ์ ์๋ฃํ์ง๋ง ๊ตฌํ๋ ์ ๋๋ก ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด SWIG ๋ฉ์ด ํ ์ ์๋ ์ผ ์ค ๊ทํ๊ฐ ํ ์ ์๋ ์ผ์ ์์ต๋๋ค. JavaCPP๋ ๋งค์ฐ ๋ฉ์ง ๊ฒ ๊ฐ์ต๋๋ค. ํฅํ ํ๋ก์ ํธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ด์ผ ํฉ๋๋ค.
@kylevedder๋ , error_codes.pb.h
์ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์
จ์ต๋๊น?
[ํธ์ง๋จ]
๋ชจ๋ .pb.h ํ์ผ์ .proto์์ ์ปดํ์ผ๋ฉ๋๋ค.
@tngan ๋ค, ์ ๋ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ํ ์ด ํ๋ก์ ํธ์ .proto
ํ์ผ์ ์ฌ์ฉํ๋ ค๋ฉด ProtoBuff3๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ ๋ Ubuntu 14.04๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ ํจํค์ง ๊ด๋ฆฌ์์์ ProtoBuff3๋ฅผ ์ฌ์ฉํ ์ ์์๊ธฐ ๋๋ฌธ์ 3.0.0 ๋ฒ ํ ๋ฆด๋ฆฌ์ค ์์ ๊ฐ์ ธ์จ ์์ค์์ ์ปดํ์ผํ์ต๋๋ค.
๋ด๊ฐ ํด๊ฒฐํ๋ ค๊ณ ํ๋ ํ์ฌ ์ฅ์ ๋ฌผ์ ProtoBuff๊ฐ ์ ์ฒด ํ์ผ ํธ๋ฆฌ์์ ์ฌ๊ทํ๋๋ก ํ๊ณ .proto
ํ์ผ์ .h
๋ฐ .cc
ํ์ผ๋ก ์ปดํ์ผํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ๊ฐ ํด๋๋ฅผ ์กฐ๊ธ์ฉ ์ํํ๋ฉด ์์ง ์ปดํ์ผ๋์ง ์์ .proto
ํ์ผ์ ๋ํ ๋ง์กฑ์ค๋ฝ์ง ๋ชปํ ์ข
์์ฑ์ผ๋ก ์ธํด ์คํจ๊ฐ ๋ฐ์ํฉ๋๋ค.
@kylevedder SWIG ๋ํผ๊ฐ ๋ณ๋์ ์ ์ฅ์์ ์์ต๋๊น, ์๋๋ฉด tensorflow ์ ์ฅ์์์ ์์
ํ๊ณ ์์ต๋๊น? protoc
๋ ๋ค๋ฅธ ์ปดํ์ผ๋ฌ์ ์ ์ฌํ๊ฒ ์๋ํฉ๋๋ค. tensorflow ์ ์ฅ์์์ ์์
ํ๊ฑฐ๋ Bazel์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ protobuf ๋น๋ ๋์๊ณผ ์ด๋ค ๊ฐ์ ์ข
์์ฑ์ ์ค์ ํด์ผ ํฉ๋๋ค.
๋ณ๋์ ์ ์ฅ์์์ ์์ ํ๊ณ ๋ค๋ฅธ ๋น๋ ์์คํ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํด๋น ๋น๋ ์์คํ ์ ๋ํด protobuf ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ํ์๋ฉด ๋น๋ ์ค์ ์ ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค.
@davidzchen ์ ์์ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ ๋ชจ๋ ๋์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ด๊ฐ ์ง๊ธ๊น์ง ๊ฐ์ง๊ณ ์๋ ๊ฒ:
์ ๋ ์ด๋ฏธ Bazel์ ์ค์ ํ๊ณ .whl
ํ์ผ๋ก ์ปดํ์ผํ๋๋ก ํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด ํ์ผ์ pip
๋๊ฒผ๊ณ First TensorFlow ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์์์ ํ์ธํ์ต๋๋ค.
๋ถ๊ธฐ๋ ์ ์ฅ์์ SWIG ๋ํผ ํ์ผ์ ์์ฑํ์ต๋๋ค. core/javaWrapper
์๋์ ํด๋์ ์์ต๋๋ค. [[๋งํฌ](https://github.com/kylevedder/tensorflow/tree/master/tensorflow/core/javaWrapper)]
๋ด๊ฐ ํ๋ ค๊ณ ํ๋ ๊ฒ:
๊ถ๊ทน์ ์ผ๋ก ๋ด ๋ชฉํ๋ Java์์ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ๋ถ๋ฅผ ์ ์๋ .so
ํ์ผ์ ์์ฑํ๋ ๊ฒ์
๋๋ค. ํ์ฌ g++๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ์์คํ
์ .so
ํ์ผ๋ก ์ปดํ์ผํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฌ๋ .proto
ํ์ผ์ ์ด ์ปดํ์ผ ์ ์ ๋จผ์ .h
๋ฐ .cc
๋ก ํ์ฅ๋์ด์ผ ํ๋ฉฐ ์ด๊ฒ์ด protoc
ํ๋ ค๊ณ ํ๋ ๊ฒ์
๋๋ค.
์ง๊ธ๊น์ง protoc
๋ฅผ ์ฌ์ฉํ๋ ค๋ ๋ชจ๋ ์๋๋ ๋๋ ํ ๋ฆฌ๋ณ๋ก ์ด๋ฃจ์ด์ก์ผ๋ฏ๋ก ๊ฒฐ๊ณผ์ ์ผ๋ก๋ ์๋์์ง๋ง ๋ฉ ์คํฌ๋ฆฝํธ์ ๋ํ ๋์ ์๋๋ฅผ ์ฌ๊ธฐ ์์ ๋ณผ ์ ์์ต๋๋ค protoc
์คํฌ๋ฆฝํธ์์.
๋ง์ง๋ง์ผ๋ก, ๊ฐ์ ์์ญ์ ๋ํ ํผ๋๋ฐฑ์ ํฌ๊ฒ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌ ํด์!
@kylevedder ์ ๋ ์ด๋ฏธ JavaCPP ์ฌ์ ์ค์ ์ ์ผ๋ถ๋ก .so
๋น๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค: https://github.com/bytedeco/javacpp-presets/tree/master/tensorflow. Bazel ๋๋ถ์ ์ ๋ง ๊ฐ๋จํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ํจ์น๋ฅผ ์ ์ฉํ๋ฉด ๋ฉ๋๋ค.
diff -ruN tensorflow/tensorflow/cc/BUILD tensorflow-patch/tensorflow/cc/BUILD
--- tensorflow/tensorflow/cc/BUILD 2015-11-22 00:00:02.441829192 +0900
+++ tensorflow-patch/tensorflow/cc/BUILD 2015-11-14 11:15:12.689330351 +0900
@@ -75,6 +75,17 @@
],
)
+cc_binary(
+ name = "libtensorflow.so",
+ copts = tf_copts(),
+ linkshared = 1,
+ deps = [
+ ":cc_ops",
+ "//tensorflow/core:kernels",
+ "//tensorflow/core:tensorflow",
+ ],
+)
+
filegroup(
name = "all_files",
srcs = glob(
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด Bazel์ ์คํํฉ๋๋ค.
bazel build -c opt //tensorflow/cc:libtensorflow.so
AFAIK, ์ด๊ฒ์ C++ API์ ๋ํ ๊ด์ฌ์ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ ์ง์ด์ผํฌ ๊ฒ์ ๋๋ค.
@saudet cc_library
๋์ cc_binary
๊ท์น์ ์ฌ์ฉํ์ฌ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋ํ๋ ์ด์ ๊ฐ ์์ต๋๊น? ์ด๋ฆ์ด tensorflow
cc_library
๊ท์น๋ง ์์ผ๋ฉด ๋น๋ ๋์์ด libtensorflow.so
๋ผ๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋ํฉ๋๋ค.
@kylevedder ๋ชฉํ๊ฐ .so
ํ์ผ์ ์์ฑํ๋ ๊ฒ์ด๋ผ๋ฉด @saudet์ด ์ ์ํ ๊ฒ๊ณผ ์ ์ฌํ ๊ฒ์ด ์๋ํ ๊ฒ์
๋๋ค.
Java ์ฝ๋์์ TensorFlow ํ๋กํ ์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ java_*
Bazel ๋น๋ ๋์์์ .proto
์์ Java ํด๋์ค๋ฅผ ์์ฑํ๋ proto_library
๋์์ ์ข
์์ฑ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. .proto
ํ์ผ.
๊ธฐ๋ณธ proto_library
๊ท์น์ ๊ณต๊ฐํ๊ธฐ ์ ์ ์์ง ํด์ผ ํ ์ผ์ด ์ฝ๊ฐ ์์ง๋ง(bazelbuild/bazel#52 ์ฐธ์กฐ) TensorFlow๋ cc_proto_library
๋ฐ py_proto_library
๊ท์น์ protobuf ์์ Bazel์ ํฌํจ๋ Java genproto
๊ท์น ์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. proto_library
๋ํ ํ์๋ผ์ธ์ด ๋ฌด์์ธ์ง, Protobuf์์ ์ ๊ณตํ๋ ๊ท์น์ genproto
๋ก ํตํฉํ๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์๋์ง ์ฌ๋ถ๋ฅผ ํ๊ณผ ํจ๊ป ํ์ธํ๊ฒ ์ต๋๋ค.
๋ช ๊ฐ์ง ๋ค๋ฅธ ํผ๋๋ฐฑ:
java_wrapper
๋ณด๋ค๋ javaWrapper
//tensorflow/java/wrapper
๋ณด๋ค๋ //tensorflow/core/java_wrapper
์ผ๊น์?.swig
ํ์ผ์ ๊ฐ์ ธ์ ์์ค๋ฅผ ์์ฑํ๋ ๋ช ๊ฐ์ง ๋น๋ ๊ท์น์ด ์์ต๋๋ค. ์ด๊ฒ์ ์์ฑ๋ ํ์ผ์ ์ฒดํฌ์ธํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ ์ด์์ ์
๋๋ค. Bazel์ด ์ด์ ๊ฐ์ ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋ช ๊ฐ์ง SWIG ๋น๋ ๊ท์น์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ด๋ ค์ด์ง ํ์ธํ ์ ์์ต๋๋ค.@davidzchen ํน๋ณํ ์ด์ ๋ ์์ต๋๋ค. ์ ๋ Bazel์ ์ฒ์ ์ฌ์ฉํ๊ณ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ์์ ์ธ๊ธํ ๋๋ก linkshared=1
ํ๊ณ ์์ต๋๋ค. ๊ทธ๋์ ํ์ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค! ์
๋ฐ์ดํธํ๊ฒ ์ต๋๋ค.
@saudet ๊ฐ์ฌํฉ๋๋ค! Bazel์ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ๋ ์ค์ด์์ต๋๋ค. :) ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ธ์ ๋ ์ง ์๋ ค์ฃผ๊ฑฐ๋ ๋ฒ๊ทธ๋ฅผ ์ด์ด์ฃผ์ธ์.
@saudet Bazel ์ฌ์ฉ์ ๋ํ ์ ๋ณด ๊ฐ์ฌํฉ๋๋ค. ๋๋ ์ฒ์์ด๊ณ ๊ทธ๋ฐ ์์ผ๋ก .so
๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ซ์ง ๋ชปํ์ต๋๋ค.
@davidzchen cc_library
์ฌ์ฉ์ ๋ํ ๋ถ๋ก์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. Bazil ๋ํผ ๋น๋๋ฅผ ๊ตฌํํ ๋ @saudet ์ ์์ ๋ฅผ
๋ํ .so
ํ์ผ ์์ฑ์ ๋ํ ์ด์ ์๊ฒฌ์์ ๋ช
ํํ์ง ์์์ต๋๋ค. ๋ด ๋ชฉํ๋ ์์ฑํ๋ ๋์ .so
์๋ณธ ์์ค์์ ํ์ผ์ ๋ํ ํฌํจ ํ $ # $ 4 $ # $๋ฅผ
๊ฟ๊บฝ ๊ฟ๊บฝ๊ฐ ์์ฑํ๋ ํ์ผ์ ๋ด๋ถ์ .so
JNI๋ฅผ์ ์ด์งํ๊ธฐ ์ํด ์ ํ. ํ์ฌ SWIG์์ ์์ฑํ .cxx
ํ์ผ์ ์ปดํ์ผํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ฐธ์กฐํ๋ ค๊ณ JNI.h
์์๋ ํค๋ $JAVA_HOME/include/
ํ์ง๋ง ์ธ๋ถ ๊ฒฝ๋ก๋ฅผ ํฌํจ ์ดํด Bazel์ ์ป์ ์ ์์ต๋๋ค.
@davidzchen ํ , ์๋, cc_library
๊ฐ ์๋ํ์ง ์์ต๋๋ค. Bazel์ด -shared
์ต์
์ ์ปดํ์ผ๋ฌ์ ์ ๋ฌํ๋๋ก ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. http://bazel.io/docs/be/c-cpp.html.
@saudet ๋ณธ์ธ์ด -shared
๋ฅผ ์ ๋ฌํ ํ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. cc_library
๋ ๊ธฐ๋ณธ์ ์ผ๋ก .so
๋ฅผ ๋น๋ํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ ๋น์ ์ ์ํด ์๋ํฉ๋๊น?
@kylevedder JNI ํค๋๋ ์์
๊ณต๊ฐ ์ธ๋ถ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฐ ์์ผ๋ก ์ถ๊ฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Bazel์ ๋ก์ปฌ JDK๋ฅผ ๋ก์ปฌ ์ ์ฅ์ ๋ก ํฌํจํ๊ณ ๋ก์ปฌ JDK์ ์์กดํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ ๋ด์ฅ ๋์( jdk.WORKSPACE
๋ฐ ํด๋น jdk.BUILD
)์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ Bazel ์์
๊ณต๊ฐ์ ํฌํจ๋์ด ์์ต๋๋ค.
Bazel ์์ฒด๋ JNI๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๋ก์ปฌ JDK์ ์ธํฐํ์ด์คํฉ๋๋ค( src/main/native/BUILD
). ์ด ๋น๋ ํ์ผ์์์ด ๋ ๊ฐ์ง genrule
s๋ฅผ JNI ํค๋์ ๋ณต์ฌ cc_library
๋ ํค๋์ ๋ฐ๋ผ ์ฌ์ฉ JNI, ๊ทธ ๊ฑด๋ฌผ๋์ด์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๋์๊ณผ includes = ["."]
๊ทธ๋์ C ++ ์ฝ๋์ JNI ํค๋๋ฅผ ํฌํจ ํ ์ ์๋ค๋ #include <jni.h>
. ์ด๊ฒ์ ํ์ฌ ์ธ๋ถ ์ ์ฅ์ ๋ฉ์ปค๋์ฆ์ ๋ํ ์ฌ๋ฌ ๊ฐ์ ์์
์ ํ๊ณ ์๊ณ @local-jdk
์ด๋ฆ์ด ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ํ๋์ง ์์์ง๋ง ๊ทธ ๋์ JNI๋ฅผ ์ฌ์ฉํ๋ TensorFlow ๋ฐ ๊ธฐํ Bazel ํ๋ก์ ํธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. .
์ฌ๊ธฐ์ ์ถ๊ฐ ๋น๋ ํ์ผ์ ๋ํ ํจ์น์
๋๋ค genrule
๋น์ ์ด ํ์๋กํ๋ JNI ํค๋์ ์ผ๋ถ ๋ณ๊ฒฝ ๋ณต์ฌ์ ๋์์ cc_library
์ฆ, ์ฌ๋ฐ๋ฅธ ์ข
์์ฑ์ ์ค์ ํ๋ ๋ชฉํ๋ :
genrule
์์ srcs
์ํด ํ์ฌ ํจํค์ง์ ๋ณต์ฌ๋ jni.h
๋ฐ jni_md.h
๋ฅผ ์ถ๊ฐํฉ๋๋ค.tensorflow/core/public
์๋์ ํค๋๋ฅผ ํฌํจํ ์ ์๋๋ก //tensorflow/core
์ ์ข
์์ฑ์ ์ถ๊ฐํฉ๋๋ค. ๋ณ๋์ ๋๋ ํฐ๋ฆฌ์ ์๋ ํค๋ ๋๋ ์์ค ํ์ผ์ Bazel์ ๊ด์ ์์ ๋ณผ ๋ ๋ณ๋์ ํจํค์ง์ ์์ผ๋ฉฐ ์ด๋ฌํ ํ์ผ์ด ํฌํจ๋ ๋น๋ ๋์์ ์ข
์์ฑ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.diff --git a/tensorflow/core/java/wrapper/BUILD b/tensorflow/core/java/wrapper/BUILD
index 72b4076..04a3394 100644
--- a/tensorflow/core/java/wrapper/BUILD
+++ b/tensorflow/core/java/wrapper/BUILD
@@ -7,10 +7,30 @@ exports_files(["LICENSE"])
load("/tensorflow/tensorflow", "tf_copts")
load("/tensorflow/tensorflow", "tf_gen_op_wrappers_cc")
+genrule(
+ name = "copy_link_jni_md_header",
+ srcs = ["//external:jni_md_header-linux"],
+ outs = ["jni_md.h"],
+ cmd = "cp -f $< $@",
+)
+
+genrule(
+ name = "copy_link_jni_header",
+ srcs = ["//external:jni_header"],
+ outs = ["jni.h"],
+ cmd = "cp -f $< $@",
+)
+
cc_library(
name = "java_wrapper",
- srcs = glob(["*.cc","*.cxx","*.h"]),
- copts = ["-I$$JAVA_HOME/include/", "-I$$JAVA_HOME/include/linux/"],
+ srcs = glob(["*.cc", "*.cxx", "*.h"]) + [
+ ":jni.h",
+ ":jni_md.h",
+ ],
+ includes = ["."],
+ deps = [
+ "//tensorflow/core",
+ ],
visibility = ["//visibility:public"],
)
์ผ๋ฐ์ ์ผ๋ก Bazel์ ์ปดํ์ผ ์์ ์ ์์ค ํธ๋ฆฌ์ ๋ฃจํธ์์ ์คํ๋๋ฉฐ ๋ค์๊ณผ ๊ฐ์ด SWIG ํ์ผ์ ํฌํจ์ ๋ณ๊ฒฝํ ๋ค์ C++ ํ์ผ์ ๋ค์ ์์ฑํ์ฌ ์ฌ๋ฐ๋ฅธ ํฌํจ์ ๊ฐ๋๋ก ํด์ผ ํฉ๋๋ค. ์:
diff --git a/tensorflow/core/java/wrapper/tensor_c_api.i b/tensorflow/core/java/wrapper/tensor_c_api.i
index d08b571..9ab1fa1 100644
--- a/tensorflow/core/java/wrapper/tensor_c_api.i
+++ b/tensorflow/core/java/wrapper/tensor_c_api.i
@@ -1,8 +1,8 @@
%module tensor_c_api_module
%{
-#include "../../public/tensor_c_api.h"
+#include "tensorflow/core/public/tensor_c_api.h"
%}
-%include "../../public/tensor_c_api.h"
+%include "tensorflow/core/public/tensor_c_api.h"
%include "stddef.h"
์ด๊ฒ์ด ์๋ํ๋ฉด copy_link_jni_md_header
genrule
๋ Linux ์ ์ฉ ํค๋๋ง ๋ณต์ฌํ๋ฏ๋ก Linux์ฉ JNI ๋น๋๊ฐ ์ค์ ๋ฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ํ๋ซํผ๋ณ JNI ํค๋๋ฅผ ๋ณต์ฌํ๋๋ก ํ๋ ค๋ฉด ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
cpu
config_setting
๋ฅผ ์ค์ ํฉ๋๋ค. ํ์ฌ tensorflow์๋ config_setting
์ --cpu=darwin
์ ๋ํ tensorflow/python/BUILD
์์ต๋๋ค. //tensorflow/core
์ ๊ฐ์ ๋ ์ ์ ํ ํจํค์ง๋ก ์ด๋ํด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Bazel๊ณผ ๋์ผํ config_setting
์ธํธ๋ฅผ ์ํ ๊ฒ์
๋๋ค( src/BUILD
).copy_link_jni_md_header
๊ฐ select()
์ฌ์ฉํ์ฌ ์ค์ ํ ๊ตฌ์ฑ ์ค์ ์ ๋ฐ๋ผ ์ฌ๋ฐ๋ฅธ JNI ํค๋๋ฅผ ๋ณต์ฌํ๋๋ก ํ์ญ์์ค . genrule
๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.genrule(
name = "copy_link_jni_md_header",
srcs = select({
"//tensorflow/core:darwin": ["//external:jni_md_header-darwin"],
"//tensorflow/core:darwin_x86_64": ["//external:jni_md_header-darwin"],
"//tensorflow/core:freebsd": ["//external:jni_md_header-freebsd"],
"//conditions:default": ["//external:jni_md_header-linux"],
}),
outs = ["jni_md.h"],
cmd = "cp -f $< $@",
)
๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๊ธฐ๊บผ์ด ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ด๊ฒ์ด ๋น์ ์ ์ํด ์๋ํ๋์ง ์๋ ค์ฃผ์ญ์์ค.
@davidzchen cc_library๋ .a ํ์ผ์ ๋ง์ด ์์ฑํ์ง๋ง .so ํ์ผ์ ์์ฑํ์ง ์์ต๋๋ค. TensorFlow์ ๋ํด ์ด์ ์ ๊ถ์ฅ๋ ๋๋ก 0.1.0์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค... 0.1.1์์ ์์ ๋์์ ์ ์์ต๋๊น? ๋ค์ ์๋ํด์ผ ํฉ๋๋ค.
@davidzchen ๋์์ ์ฃผ์
์ ๋๋จํ ๊ฐ์ฌํฉ๋๋ค. ๊ทํ์ ์ง์์ ๋ฐ๋ผ Java ๋ํผ BUILD
ํ์ผ ๊ณผ SWIG .i
ํ์ผ ์ ์ ์ํ ๋๋ก ์
๋ฐ์ดํธํ์ต๋๋ค. ๋ํ ๋ฉ ์คํฌ๋ฆฝํธ๋ฅผ core/java/wrapper
์์ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ๊ณ ๊ทธ์ ๋ฐ๋ผ ๋งํฌ๋ฅผ ์
๋ฐ์ดํธํ์ต๋๋ค.
์ง๊ธ์ jni_md.h
ํ์ผ์ ๋ํ ์ผ๋ฐํ genrule
๋ฅผ ๊ฑด๋๋ฐ๊ณ libtensorflow.so
๋น๋์ ์ง์คํ์ต๋๋ค. ๋ถํํ๋ libtensorflow.so
๊ฐ ์์ฑ๋์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. "libtensorflow"์ ๋ณ์ข
์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ๋ชจ๋ ํ์ผ ์์คํ
์ ๊ฒ์ํ๊ณ ๊ด๋ จ ํญ๋ชฉ์ด ๋ํ๋์ง ์์์ต๋๋ค. ์ด๋ฆ์ด ๋ค๋ฅผ ์๋ ์๊ณ ๋จ์ํ ์ฌ์ฉ์ ์ค๋ฅ์ผ ์๋ ์์ต๋๋ค. ๋ํ, @saudet ์ด .so
์์ฑ์ ๋ํ cc_library
๊ท์น์ผ๋ก ๊ฒช๊ณ ์๋ ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๋ค์ ํ ๋ฒ ๋ชจ๋ ๋์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ ๋ง ๊ฐ์ฌํฉ๋๋ค.
์ฃ์กํฉ๋๋ค. ์ ๊ฐ ์๋ชป ์๊ณ ์์์ต๋๋ค. ๊ตฌ์ถํ๊ธฐ ์ํด .so
@saudet ์ฌ์ฉ ์์๋ค ๋ฌด์ ์ด์ ์ข
์์ฑ ํฌํจํ๋ cc_binary
๊ฐ์ง linkshared = 1
๋ฐ name = "libtensorflow.so"
์ ํํ๋ค. cc_binary.linkshared
๋ฌธ์์์ :
๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค. ์ด ์์ฑ์ ํ์ฑํํ๋ ค๋ฉด ๊ท์น์ linkshared=1์ ํฌํจํ์ญ์์ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ์ต์ ์ ๊บผ์ ธ ์์ต๋๋ค. ํ์ฑํํ๋ฉด foo์ ํฉ๋ฆฌ์ ์ธ ๊ฐ์ ๋ํด ๋ฐ์ด๋๋ฆฌ ์ด๋ฆ์ libfoo.so(๋๋ ๋์ ํ๋ซํผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ช ๋ช ๊ท์น)๋ก ์ง์ ํด์ผ ํฉ๋๋ค.
๊ฐ์ ์ฃผ๋ ์ฐจ์ด์ .so
'์ ์ํด ๋ง๋ค์ด์ง s๋ cc_library
ํ๊ฒ๊ณผ .so
๋น๋ cc_binary
์๊ธฐ ๋ฐฉ๋ฒ์ ์๊ธฐ ์ด์ฉ์ ๊ทธ cc_library
์ํฐํฉํธ์๋ srcs
์ ์ฝ๋๋ง ํฌํจ๋ฉ๋๋ค. ๊ตฌ์ถํ๋ ์ด์ ์
๋๋ค cc_library
์๋์ค ๋ชฉํ srcs
๋ง deps
๊ฐ์, //tensorflow/core
๋ชจ๋ ์ํฐํฉํธ๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ๋ฐ๋ฉด์ cc_binary
๋์์ ๋ชจ๋ ์ ์ด์ ์ข
์์ฑ์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
ํผ๋์ ๋๋ ค ์ฃ์กํฉ๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ ๋ฌธ์๋ฅผ ๊ฐ์ ํ๊ณ .so
๋น๋์ ๋ํ ์์ ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
Tensorflow์ ๋ชจ๋ ์ข
์์ฑ์ ๋น๋ํ๋ ค๋ฉด ์ด๋ฌํ ๋จ๊ณ๋ฅผ ๋ฐ๋ผ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ TensorFlow๋ฅผ node.js๋ก ์ด์ํ๋ ์์
์ ํ๊ณ ์์ผ๋ฉฐ ์ ์ฒด ์ ์ฅ์์์ ํ์ ์์ค๋ง ์ปดํ์ผํ๊ณ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ตฌํํ์ต๋๋ค.
https://github.com/node-tensorflow/node-tensorflow/blob/1.0.0/tools/install.sh#L233 -L282
@davidzchen .so
์์ฑ์ ๊ดํ ์ ๋ณด๋ฅผ ์ ๊ณตํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๊ทธ์ ๋ฐ๋ผ ๋ด ์ค์ ์ ์
๋ฐ์ดํธํ๊ณ ๋ ์์ฑ ํ tensorflow/core/java/wrapper/example
_extremely_ ๊ธฐ๋ณธ ํ
์คํฐ ์ฆ๋ช
ํ๊ธฐ ์ํด ๊ทธ์๊ฒ JNI ํจ์ ํธ์ถ .so
์์
. ์ฐธ๊ณ createWrapper.sh
์คํํ๊ธฐ ์ ์ ์คํํด์ผํฉ๋๋ค compileAndRun.sh
.
๋๋ SWIG ๋ํผ๋ฅผ ๊ฐ์ ํ๊ณ ๋ ๋์ ์๋ฅผ ๋ง๋ค๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค. ์ง๊ธ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ๋ฐ์ธ๋ฉ ์์ ์ ๋ํ ์ต์ํ์ ์ฆ๊ฑฐ์ผ ๋ฟ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋์์ ์ฃผ์ @davidzchen ๊ณผ @saudet ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ๊ทธ๋ค ์์ด๋ ์ด๊ฒ์ ํ ์ ์์์ ๊ฒ์ ๋๋ค.
๋ฉ์ง! ์์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค, @kylevedder!
๊ด์ฌ์ด ์์ผ์๋ฉด 1) Skylark SWIG ๊ท์น์ ์์ฑํ๊ณ 2) Bazel์ Java ๊ท์น ์ ์ฌ์ฉํ์ฌ Java ์ฝ๋๋ฅผ ๋น๋ํ์ฌ createWrapper.sh
๋ฐ compileAndRun.sh
์คํฌ๋ฆฝํธ๋ฅผ Bazel ๋น๋์ ํตํฉํ ์ ์์ต๋๋ค.
@davidzchen ์ ๋ง ์ข๊ฒ ๊ตฐ์! SWIG ๋ํผ์ ๊ธฐ๋ณธ ์์ ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
JavaCPP์ ๋ํ ์ฌ์ ์ค์ ์ ์๋ฃํ๊ณ example_trainer.cc
์ํ์ ์ด์ํ์ต๋๋ค.
https://github.com/bytedeco/javacpp-presets/tree/master/tensorflow
SWIG๋ฅผ ์ฌ์ฉํ๋ ๋๋ฑํ ๋ํผ์ ์ด๊ฒ์ ๋น๊ตํ ์ ์๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค!
API ๋งํฌ๊ฐ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค: http://bytedeco.org/javacpp-presets/tensorflow/apidocs/
@verdiyanto ์ฃ์กํฉ๋๋ค. ์์ง CI๊ฐ ์์ง๋ง API ๋ฌธ์๋ฅผ ์ ๋ก๋ํ๋ ๊ฒ์ ์ถฉ๋ถํ ์ฝ๊ธฐ ๋๋ฌธ์ ์ต์ํ ๊ทธ๋ ๊ฒ ํ์ต๋๋ค. ์ฆ๊ธฐ๋ค!
@saudet JavaCPP ์ฌ์ ์ค์ ์ ๋ํ ์ข์ ์์ ์ ๋๋ค!
๋ด ์์ ์ ๋ํ ์ ๋ฐ์ดํธ: SWIG ๋ํผ์ ๋ํด ๋ ๋ง์ ์์ ์ ์ํํ์ผ๋ฉฐ ์ฌ๊ธฐ์์ ์ํํ ์์ ์ ๋ณผ ์
์ ๋ SWIG๋ฅผ ์ฌ์ฉํ๋ ์ฒซ ๋ฒ์งธ ์ฃผ์ ํ๋ก์ ํธ์ด๊ธฐ ๋๋ฌธ์ SWIG๋ฅผ ์ฒ์ ์ ํ์ต๋๋ค. ๋ฐ๋ผ์ SWIG์ ์๋ ๋ฐฉ์๊ณผ C/C++๋ฅผ SWIG Java ๋ํผ๋ก ๋ํํ๋ ๋ฐฉ๋ฒ์ ์คํํ๋ SWIG ๊ธฐ๋ณธ ์ฌํญ ๊ณผ SWIG ๋ฐ Java ์ ๋ํ SWIG ์ค๋ช ์๋ฅผ ์ฝ์์ต๋๋ค.
๋ฌธ์์์๋ SWIG๊ฐ C/C++์ ํฌ์ธํฐ๋ฅผ ๋ถํฌ๋ช
ํ Java ๊ฐ์ฒด๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํฉ๋๋ค. ์ด๊ฒ์ด SWIG์ ์ํด ์์ฑ๋ SWIGTYPE_p_void
์ ๊ฐ์ ํด๋์ค๋ฅผ ์ป๋ ์ด์ ์
๋๋ค. ๋ฌธ์ ๋ POJO๋ฅผ ์ด๋ฌํ SWIG ํด๋์ค๋ก ๋ณํํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด tensor_c_api.h
์์ C ๋ฉ์๋ TF_CreateTensor()
๋ ์
๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ void*
์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ size
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ฐ์ดํธ ๋จ์์ ์
๋ ฅ ๋ฐ์ดํฐ. ์ด๊ฒ์ C/C++์์๋ ์๋ฒฝํ๊ฒ ํฉ๋ฆฌ์ ์ธ ๋์์ธ ํจํด์ด์ง๋ง Java์์๋ ์์ ํ ๋ฌด์๋ฏธํฉ๋๋ค. SWIG ์์ฑ Java ๋ฉ์๋ TF_CreateTensor()
๋ size
์ ํจ๊ป SWIGTYPE_p_void
๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ก ์ฌ์ฉํ์ง๋ง String
๊ณผ ๊ฐ์ POJO๋ฅผ ๋ณํํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค SWIGTYPE_p_void
์ฝ๋๋ฅผ ๋ง์ด ํ๊ธฐ์์ด.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ๋ด๊ฐ ํ์ฌ ๊ฑฐ์ง๋ง์ ํ๋ ๊ต์ฐจ๋ก์
๋๋ค. TF_DataType
์ ์๋ ๋ชจ๋ ์ ํ์ ์ทจํ๊ณ void*
๋ก ๋ณํํ๋ ์๋ง์ C/C++ ๋ณํ ๋ฐฉ๋ฒ์ ์์ฑํ๊ฑฐ๋ ๊ฐ์ ์ผ์ ํ๋ SWIG ํ์
๋งต. SWIG ๋ฌธ์๋ ๋ ์๋ฃจ์
๋ชจ๋ ๊ฒ๋ณด๊ธฐ์ ์ํธ ๊ตํ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ ์๋ฃจ์
์ ์ ํธํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ๋ฌธ์ ๋ C/C++ ๋ณํ ํจ์ ๋๋ SWIG ์ ํ ๋งต์ ๋๊น?
@kylevedder ์ฒ์์ JavaCPP๋ฅผ ๋ง๋ ์ด์ ๋ฅผ ์ดํดํ๊ธฐ ์์ํ ๊ฒ ๊ฐ์ต๋๋ค. :)
@saudet ์ JavaCPP ์ฌ์ ์ค์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค! tensorflow์ ๋ํ Clojure ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ผ๋ถ ์๊ฒฌ:
a) ๋จ์ํ / ์์ ๊ณ์ธต์ ๊ธฐํ๊ฐ ์์ต๋๋ค.
๋ง์ JavaCPP API๋ ๋ธ๋ฆฟ์ง ์์ด JVM์์ ์ง์ ๋ฌ์ฑํ ์ ์๋ protobuf ๊ธฐ๋ฅ์ ๋ณต์ ํฉ๋๋ค. ์ด๊ฒ์ ๊นจ๋ซ๋ ๋ฐ ์ฝ๊ฐ์ ์๊ฐ์ด ๊ฑธ๋ ธ์ง๋ง JavaCPP ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ์ฌ protobuf ๊ฐ์ฒด๋ฅผ ๊ตฌ์ถํ๊ณ interop์ ์ฌ์ฉํ์ฌ ์ด ํ๋ซํผ ๋ ๋ฆฝ์ ์ธ ํํ์ ์์ฑํ ๋ค์ ์ด๋ฅผ Session์ ์ฑ์ฐ๋ ๊ฒ์ ๋๋ค.
๋๋ Jvm ๊ธฐ๋ฐ protobufs๋ฅผ ์ฌ์ฉํ์ฌ JavaCPP ์์ฑ์ ๊ธฐ๋ฅ์ ์ฐํํ์ฌ ๊ทธ๋ํ๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ์ผ๋ก ๋์ ๋งบ์์ต๋๋ค. ์ด๊ฒ์ ๋ช ๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค. ํ๋ก๊ทธ๋๋ฐํ๊ธฐ์ ๋ ๊ฐ๋จํ API์ ์ฌ๋์ด ์ฝ์ ์ ์๋ protobuf๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฉ์ง .toString ํ์์ ๋๋ค.
ํนํ Clojure์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ด์ ์์ tensorflow ๊ทธ๋ํ๋ฅผ ์ค๋ช ํ ๋ค์ protobuf๋ก ์ง์ ๋ณํํ๋ ๊ฒ์ด ๋ด ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ฐ ๋ ธ๋์ ๋ํ ์์ฑ์ ํจ์๋ฅผ ์ฐพ์ ํธ์ถํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ฝ์ต๋๋ค.
b) ๋น๋ ๋ฐ ํจํค์ง ๊ฐ์
์ ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ๋น๋ํ๊ฑฐ๋ ์ด๋ฌํ ํ๋ก์ ํธ์ ์ฌ์ฉ๋๋ ๋น๋ ๋๊ตฌ์ ๋ํ ์ ๋ฌธ๊ฐ๊ฐ ์๋๋๋ค. maven-ized ์ํฐํฉํธ๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค. ํนํ ์์ฑ๋ Java protobuf ํด๋์ค๋ ํฌํจ๋ ๊ฒฝ์ฐ. ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์์๋ด๋ ๋ฐ ๋นํฉ์ค๋ฌ์ด ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค.
c) ๋ชฉํ๋ก ํ๋ ๊ทธ๋ํ ํ ์คํธ ์ผ์ด์ค์ ์๊ฐ ์ ์ ๊ฒ์ด ์ ์ฉํ ๊ฒ์ ๋๋ค.
์ง๊ธ ์ ๋ฐฉ๋ฒ๋ก ์ ๋ค์ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค. JavaCPP ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ํ๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ๋ด JVM protobuf์ ๋ง์ฌ๋งํ๊ณ , ์ฌ๋์ด ์ฝ์ ์ ์๋ ํ์์ ๋ณด๊ณ , ๋์ผํ ํ์์ ๋ง๋ค๊ธฐ ์ํด ์์ฒด ์์ฑ์๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์์๋ ๋๋ค.
TensorFlow์ ํต์ฌ ๊ธฐ๋ฅ์ ์คํํ๋ ๋งค์ฐ ๊ฐ๋จํ ๊ทธ๋ํ์ ์์ ์ปฌ๋ ์ ์ ๊ฐ๋ ๊ฒ์ด ์ ์ฉํ ๊ฒ์ด๋ฏ๋ก ๋์ ๊ฐ์ ์ฌ๋๋ค์ ๋ค์ํ ์ธ์ด์ ๋ํ ์ํธ ์ด์ฉ์ฑ์ ๋์์ผ๋ก ํ๋ ํฉ๋ฆฌ์ ์ธ ํ ์คํธ ์ผ์ด์ค ์ธํธ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
์ด์จ๋ ๋ชจ๋์ ๋ ธ๋ ฅ์ ๊ฐ์ฌํ๊ณ ์ข์ ์ผ์ ๊ณ์ํ์ญ์์ค!
@kovasb ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค! ๋ถ๋ช ํ Java, Scala, Clojure ๋ฑ์ ๋ํ ์ธํฐํ์ด์ค๋ฅผ ๋ณด๋ค ์์ฐ์ค๋ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด ํด์ผ ํ ์ผ์ด ๋ง์ด ์์ต๋๋ค.
C++ API์ Java protobuf API๋ฅผ ํตํฉํ๊ธฐ ์ํ ๋์ฐ๋ฏธ ํด๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ ์์ฑ๋ Java protobuf ํด๋์ค ์์ฒด๋ฅผ ํฌํจํ์ฌ ๋ค์ ํจํค์ง์ ๋ชจ๋ ๊ฒ์ ์์ ๋กญ๊ฒ ๋ฃ๊ณ PR์ ๋ณด๋ด์ญ์์ค.
https://github.com/bytedeco/javacpp-presets/tree/master/tensorflow/src/main/java/org/bytedeco/javacpp/helper
์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ์ด๋ฉฐ Bazel์ด ์ง์ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ Maven ์ํฐํฉํธ์ ์๋์ผ๋ก ํจํค์ง๋ฉ๋๋ค. ์ด์จ๋ , ์ด๊ฒ์ ๋ํด ์กฐ์ฌํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
@kovasb ํด๋ก์ ์ธํฐํ์ด์ค๋ ์ ๋ง ํฅ๋ฏธ๋กญ๊ฒ ๋ค๋ฆฝ๋๋ค. ์์ง ๊ณต์ ํ ์ฝ๋๊ฐ ์์ต๋๊น?
๊ฐ์ฌ ํด์!
๋ฐ๋ผ์ ์ด ์ค๋ ๋์ ์ฌ๋๋ค์ https://github.com/tensorflow/tensorflow/issues/3์์ ๋ฌธ์ ๊ฐ ์ ๊ธฐ๋์์์ ์๊ณ ์์ต๋๋ค. Python API์์ TF๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ ์๋ ๋ฏธ๋ถ์ ํ์ฌ ์๋ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ C++๋ก ํฌํ ๋๋ ๊ธฐ๋ฅ์ ๋ณด๋ฅ ์ค์ธ ์ผ์คํ ํผ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ฐ์ดํฐ ํ๋ฆ์ ์ ์ดํดํ์ง ๋ชปํ์ง๋ง C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ํ์ด์ฌ ๋์ฐ๋ฏธ๋ฅผ ์์ํ ์ ์์ต๋๊น?
๋ด๊ฐ๋ณด๊ณ ์๋ ๋ ๋ค๋ฅธ ์๋ฃจ์ ์ Jpy ๋๋ ๋ค๋ฅธ ๋ธ๋ฆฌ์ง ์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค (์ถ์ฒํ๋ ์ฌ๋์ด ์์ต๋๊น?) JyNi๋ ๊ฝค ํฅ๋ฏธ๋กญ์ง ๋ง ํฉ๊ธ ์๊ฐ๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์ต๋๋ค (๋ ๋ง์ ์ถ์ง๋ ฅ / ์ปค๋ฎค๋ํฐ๋ฅผ ๋ณด๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค)
JyNi๊ฐ ์ ๋ฆฌ๋๋ฉด + jython์ JVM์ ์ ๋ง ๋ฉ์ง ์คํ ๋ฆฌ์ python ์ํ๊ณ ์ํธ ์ด์ฉ์ฑ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค. ๊ฟ์ ๊ฟ ์ ์์ต๋๋ค.
Java ์ธํฐํ์ด์ค์ ๊ฒฝ์ฐ +1!
javaCPP๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ฉด SWIG๊ฐ ์ฌ์ ํ ํ์ํ๊ฐ์? SWIG ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ํ๋ ฅํด์ผ ํฉ๋๊น?
@maxiwu JavaCPP๊ฐ SWIG๋ณด๋ค ๋ ๋์ ์์ ์ ์ํํ๋ค๊ณ ์๊ฐํ๊ณ ์ถ์ง๋ง ์ค์ ๋ก ์ด๋ฅผ ์ฆ๋ช ํ๊ธฐ ์ํด ๋น๊ตํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. :)
@kovasb ์ ๋ Clojure ์ธํฐํ์ด์ค๋ฅผ ๋๊ณ ๊ธฐ์ฌํ๋ ๋ฐ ๋งค์ฐ ๊ด์ฌ์ด ์์ต๋๋ค.
@sorenmacbeth gmail์ ์๋ ๋ด ์ด๋ฆ ์ ์ผ๋ก ์ด๋ฉ์ผ์ ๋ณด๋ด์ฃผ์ธ์.
์ฌ๊ธฐ์ ์์ฃผ ์์ ํ Javacpp ์ฌ์ ์ค์ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. "ํ"์ ์ ํฉํ ์๋ฃจ์ ์ ๋๊น?
@saudet JavaCPP ๋ํผ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๋ ค๊ณ ํ์ง๋ง tensorflow ์์ค์ ๋น ๋ฅธ ๋ณ๊ฒฝ ์๋ ๋๋ฌธ์ 0.6.0 ๋ฆด๋ฆฌ์ค๋ ์ค๋๋ ์ ๋ง์คํฐ ๋ธ๋์น์ ํธํ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ ์คํธํ ์ ํํ tensorflow ์ปค๋ฐ/๋ฒ์ ์ ๋ํ ํฌ์ธํฐ๋ก ์ ๋ฐ์ดํธํ ์ ์์ต๋๊น?
@nikitakit ๋ฐฉ๊ธ ๋ง์คํฐ ๋ธ๋์น๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค. https://github.com/bytedeco/javacpp-presets/commit/43bdcdf03beaaddb4bd5badf5d4f79669e9e78dd
ํ์ง๋ง Caffe์ ๋ฌ๋ฆฌ TensorFlow๋ ์ค์ ๋ก ๋งค๋ฌ ์ ๋ ๋ฆด๋ฆฌ์ค๋ฅผ ํ๋ ๊ฒ ๊ฐ์ผ๋ฏ๋ก ๋ค์ ๋ฆด๋ฆฌ์ค(0.7.0?)๋ถํฐ ๊ทธ ์์ ์์ ๋ฐ์ธ๋ฉ ์์ ํ๋ฅผ ์์ํ ๊ฒ์ ๋๋ค.
@martinwicke ์ด๋ป๊ฒ ์๊ฐํ์ธ์?
์์ ์ ์ธ Java ๋ฐ์ธ๋ฉ์ด ์์ผ๋ฉด Scala API๋ก ์์ ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
/ ์ฐธ์กฐ @databricks
@kovasb ์ฒ์์ผ๋ก ๋์น ๊ฒ ๊ฐ์์. Python์ ํตํด TensorFlow๋ฅผ ์ฌ์ฉํ์ฌ ์ป์ ์ ์๋ ๋ชจ๋ ๋ฉ์ง ์๋ ๋ฏธ๋ถ ๋ง๋ฒ์ด C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ Python ๋ด์์ ๊ตฌํ๋๋ค๋ ๋ง์์ด์ ๊ฐ์? ๋ฐ๋ผ์ ์ค์ ๋ก Java API๋ ์ด ๋ชจ๋ ๊ฒ์ ๋ค์ ๊ตฌํํด์ผ ํฉ๋๊น, ์๋๋ฉด ๋ ๋ค๋ฅธ ์ซ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋์ด์ผ ํฉ๋๊น? ๋๋ TensorFlow์ ๋ด๋ถ๋ ํ์ด์ฌ ๊ธ๋ฃจ์ ๋ด๋ถ์ ์ต์ํ์ง ์์ ์ด๋์์ ๋ฌด๊ฑฐ์ด ๋ฌผ๊ฑด์ ๋ค์ด ์ฌ๋ฆฌ๋ ์ผ์ด ์ ํํ ๋ฌด์์ธ์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค.
@drdozer @girving ์ ์๊ฒฌ์ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ค์ ์์ค๋ฅผ ์ฝ๊ฐ ์ฐพ์ ๋ณด๋ ์ ์ดํด์ ๋๋ค. Java๋ก ์ฌ๊ตฌํํ๋ ๊ฒ์ ์์์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. # 3์ ๋๊ธ์ ๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ์ ๋ง๋ก ๊ด์ฌ์ด ์๋ค๋ฉด Java API๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ๊ฐ์ง ๊ต์ก ์์ ๋ฅผ ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค(์ง๊ธ๊น์ง๋ ์ ๋ฐฉํฅ ๊ฒฝ๋ก๋ฅผ ๋ณด๊ฑฐ๋ ์๋ฃํ์ต๋๋ค).
์์ด์ฌ์ผ๋ก ํ์ด์ฌ ์ฝ๋๋ฅผ ์ด๋๊น์ง ์คํํ ์ ์์์ง ๊ถ๊ธํฉ๋๋ค...
Python API ๊ณ์ธต์๋ C++ ๊ณ์ธต API๊ฐ ๋
ธ์ถํ์ง ์๋ ๋ง์ ๋
ผ๋ฆฌ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ JavaCpp ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ฅด๋ ค๊ณ ํ์ง๋ง ๊ฒฐ๊ตญ์๋ ๋ง์ ์ค๋ณต ์ฝ๋๊ฐ ์์ ๊ฒ์ด๊ณ Python ๊ตฌํ์์ ๋ฌด์ธ๊ฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ด๋ ค์ธ ๊ฒ์
๋๋ค.
์๋ง๋ ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ @saudet ์ด ์ด์ ์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ Jython์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค ...
https://github.com/tensorflow/tensorflow/issues/476 ์์ @josh11b์ ํ ๋น๋์์ต๋๋ค. ๊ทธ๊ฐ ์ด ์์ ์ ํ๊ณ ์๋ค๋ฉด Jython์ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
์์ด์ฌ์ ์ฌ์ฉํ๋ฉด C++ ์ฝ๋๊ฐ ๊ณ์ ์๋ํฉ๋๊น? Java์์๋ ์๋ฒ์ ์ด๊ฒ์ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ง Java ๊ฒฝ๋ก๋ฅผ ์ง์ ์๋ํ๊ฑฐ๋ ์์ผ์ ํตํด Python ํ๋ก์ธ์ค๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๊ฒ ์ฌ์ด์์ ๋งํ์ต๋๋ค.
Java API์ ์๋ ๋ฏธ๋ถ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ๋ง์ด ํฌํจ๋์ด ์์ง๋ ์์ง๋ง ์ด๊ฒ์ด ์ ์์ ์ ์ฅ์ ๊ฐ ๋์ง ์๋๋ค๋ ์ ์ ์ธ๊ธํ๊ณ ์ถ์ต๋๋ค. ์ ๋ ํ์ด์ฌ์์ ๋ชจ๋ธ์ ์์ฑํ๊ณ .proto ํ์ผ๋ก ์ง๋ ฌํํ ๋ค์ ํ๋ จ์ ์ํด Java ๋ํผ๋ฅผ ํตํด ์ฌ๋ ๋ฐ ํฐ ์ฑ๊ณต์ ๊ฑฐ๋์์ต๋๋ค. Saver ๊ธฐ๋ฅ์ C++ ๋ฐ Java API๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ ์๊ฐ์๋ ๋์ผํ๊ฒ ์ํํ ์ ์์ต๋๋ค.
+1
@saudet
javacpp์ tensorflow์ฉ ์ฌ์ ์ค์ ์ ๋ง๋ค์ด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. Java์์ Python ๊ทธ๋ํ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ค์ ๋ง๋ค ์ ์์์ง๋ง ์ ์ฅ๋ ๋ชจ๋ธ ํ์ผ์์ ๋ณต์ํ๋ ค๊ณ ํ๋ฉด ๋ฉ์ถฅ๋๋ค. ์ด ์ค์ ์๋ํ์ง ์์ต๋๋ค:
ํ
์ fn = new Tensor(tensorflow.DT_STRING, new TensorShape(1));
CharBuffer ๋ฒํผ = fn.createBuffer();
buffer.put("๋ชจ๋ธ ํ์ผ.tf");
์ธ์
.์คํ(...);
๊ทธ๋ฌ๋ CharBuffer๋ NULL๋ก ํ๋ช ๋์์ต๋๋ค. DT_STRING์ DT_FLOAT๋ก ๋ณ๊ฒฝํ๋ฉด FloatBuffer๊ฐ ๋ฐ์ํ์ง๋ง DT_STRING์ด ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@nikitakit ๋น์ ์ ์ด๊ฒ์ด ์๋ํ๋ค๊ณ ๋งํ์ต๋๋ค. ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์์ต๋๊น?
@lakshmanok
ํธ์ง: ์ฃ์กํฉ๋๋ค. ์ฌ๊ธฐ์์ ๋งํ ๋ด์ฉ์ ์๋ชป ์ฝ์์ต๋๋ค. Java์์ ์ธ๋ถ ๋ณดํธ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก ๋ด ์ฝ๋์์ tensorflow ๊ทธ๋ํ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://gist.github.com/nikitakit/d3ec270aee9d930267cec3efa844d5aa
Scala์ ์์ง๋ง Java/๋ค๋ฅธ JVM ์ธ์ด๋ก ํฌํ ํ๋ ๊ฒ์ ๊ฐ๋จํด์ผ ํฉ๋๋ค.
์ค์ ๋ก ๊ทธ๋ํ์์ ๋ ธ๋๋ฅผ ์คํํ๊ธฐ ์ํ ๋ด ์ฝ๋๋ ๋ถํํ๋ ๋ด๊ฐ ์ฌ์ฉํ๋ Scala ํ๋ ์์ํฌ์ ํฌ๊ฒ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก ์ด ๋ถ๋ถ์ ๋ํด์๋ tensorflow API ๋ฌธ์์ ์์กดํด์ผ ํฉ๋๋ค.
๋๊ตฌ๋ ์ง jvm์ python tensorflow ํ๊ฒฝ์ ํฌํจํ๋ ๋ฐ ์ฑ๊ณตํ์ต๋๊น? ์์ด์ฌ + JyNI๋ก ๋งํฉ๋๊น? ์๋๋ฉด ์ด ๋ชจ๋ ๊ฒ์ด ์์ ์ ์ผ๋ก ์๋ํ๊ธฐ์๋ ๋๋ฌด ์คํ์ ์ ๋๊น?
์ ๋ ํ์ฌ ๊ทธ๋ํ ์ ์์ ๋ํ ์ง์์ ์ถ๊ฐํ๊ธฐ ์ํด C API๋ฅผ ํ์ฅํ๋ ์์ ์ ํ๊ณ ์์ต๋๋ค. ์ธ์ ์์ฑ๋ ์ง๋ ๋ชจ๋ฅด์ง๋ง 1.0 ์ด์ ์ ์ฐ๋ฆฌ์ ๋ชฉํ ์ค ํ๋์ ๋๋ค.
Java์์ ํ ์ ํ๋ฆ์ ์ฌ์ฉํ๋ ์ค์ ๋๋ค. ๋๋ jython์ ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์์ฉํ๋๋ก ํ ์ ํ๋ฆ cpython ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ ํ์ฌ ๋ฌธ์ ์ ์ ๊ทผํ๊ณ ์์ต๋๋ค. cpython์ ๊ณ์ํด์ ์๋ฒฝํ๊ฒ ์๋ํด์ผ ํ๋ฉฐ ๋ด ์ฝ๋๋ ์ธํฐํ๋ฆฌํฐ๊ฐ Jython์ธ์ง ๊ฐ์งํ๊ณ ์๋ํ๋๋ก ๊ฐ์ ธ์ค๊ธฐ/๋ชจ๋์ ์์ ํฉ๋๋ค. ๊ทธ ์๋์์ libtensorflow_cc.so์ ๋ํ javacpp ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํฉ๋๋ค. ์ด๊ฒ์ด Google ํ์ด ๊ณต์ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๊ณต๊ฐํ ์ ์๋ ๊ฒ์ ๋๊น? @vrv
๊ทธ๊ฒ์ ์ข์ ๊ฐ๋ ์ฆ๋ช ์ฒ๋ผ ๋ณด์ด์ง๋ง ๊ณต์ ๋ฐ์ธ๋ฉ์ ์๋ง๋ Python์ ํตํ๋ ๊ฒ๋ณด๋ค ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ธ๋ฉํ๊ธฐ๋ฅผ ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์๋์, c-python ๋ํผ๋ฅผ ํธ์ถํ๋ ๋์ javaccp ๋ํผ๋ฅผ ํธ์ถํฉ๋๋ค. ๋ฐ๋ผ์ cpython ํ ์ ํ๋ฆ๊ณผ ๋์ผํ์ง๋ง Jython์ ์ฌ์ฉํ์ฌ JVM์์ ํ๊ฐ๋ฉ๋๋ค. ๋ค๋ฅธ ์ธ์ด๋ก ์ ์ฒด python ๋ ผ๋ฆฌ๋ฅผ ๋ค์ ๊ตฌํํ๋ ๊ฒ์ ๋๋ฌด ๋ง์ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ ๋ค๋ฅธ API๋ก ๋๋ฉ๋๋ค. javacpp ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ์์ด ์ถ๋ก ์ ์คํํ ์ ์์ง๋ง ํ์ฌ๋ก์๋ ๋ชจ๋ธ์ด cpython ์คํฌ๋ฆฝํธ์์ ๋น๋/ํธ๋ ์ด๋๋์ด์ผ ํฉ๋๋ค.
Kotlin์ผ๋ก tensorflow๋ฅผ ์๋์ํค๋ ๋ฐฉ๋ฒ์ ๋ณธ ์ฌ๋์ด ์์ต๋๊น? ๋ ์์ฐ์ค๋ฌ์ ๋ณด์ด๊ณ ํ๋ฃจ๊ฐ ๋๋ ๋ ์ฌ์ ํ 100 % ์๋ฐ์ ๋๋ค. ๋๋ Kotlin ์ธ์ด๊ฐ ํ์ด์ฌ๊ณผ ์์ ์๋ฐ ์ฌ์ด์ ์์ฃผ ์ข์ ์ค๊ฐ ์ง์ ์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
์ ๋ฐ์ดํธ: @saudet ๋๋ถ์ javacpp๋ก ์์ ์ ์ฑ๊ณต์ ์ผ๋ก ์ํํ ์ ์์๊ณ Java ํ๋ก๊ทธ๋จ์์ TensorFlow ๋ชจ๋ธ์ ์ฝ๊ฑฐ๋ ์คํํ ์ ์์์ต๋๋ค.
@lakshmanok ๋ฐ @saudet ๊ฐ์ฌํฉ๋๋ค. javacpp
ํ๋ก์ ํธ๋ ๋๋ถ๋ถ์ TensorFlow API๋ฅผ ๊ตฌํํ๋ ๊ฒ ๊ฐ์ต๋๋ค. Java์์ tensorflow/serving ์ ์คํํ๋ ค๊ณ ํฉ๋๋ค.
API๋ ๊ฐ๋จํ๊ณ protobuf
์ ์๋ฉ๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ์๋ฒ๋ฅผ ๊ตฌํํ๊ณ Java์์ ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌํํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. Java์์ TensorProto
๋ฅผ ๊ตฌ์ฑํ๊ณ gRPC
ํธ์ถ์ ํธ์ถํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. TensorFlow๋ Java๊ฐ ์๋ Python ๋ฐ C++์ฉ์ผ๋ก ๋ค์ค ์ฐจ์ ๋ฐฐ์ด์ ๋ณํํ๋ ๋์ฐ๋ฏธ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
javacpp
ํ๊ฑฐ๋ ์ด๋ฅผ ์ํด ์ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๊น?
๋น์ ์ด ์ฐพ๊ณ ์๋ ๊ฒ์ ์๋ง๋ ์ด๋ฏธ https://github.com/bytedeco/javacpp-presets/blob/master/tensorflow/src/main/java/org/bytedeco/javacpp/helper/tensorflow.java์ ์์ง๋ง ์๋ ค์ฃผ์ญ์์ค. ๊ฑฐ๊ธฐ์ ๋ญ๊ฐ ๋น ์ง๋ค๋ฉด. ๊ฐ์ฌ ํด์!
์ด๊ฒ์ ์ฌ์ ํ โโ์์ ์ค์ ๋๊น? ์ด ํฌํ ํ๋ก์ ํธ์ ๋ํ ๊ณต์ github ์ ์ฅ์๊ฐ ์์ต๋๊น? ๋๋ ๋ ๊ฐ์ ์์์ repos๋ฅผ ๋ณด์์ง๋ง ๋งํ ์ ์์ต๋๋ค.
๋ค, ํ์ง๋ง ์๋ง๋ 10์/11์์ ์์ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ C++ API๋ก SWIGingํ๋ ๋์ C API๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋์ saudet๊ฐ ์ธ๊ธํ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ป๊ฒ C API๋ฅผ ์ฌ์ฉํ๊ฒ ๋์
จ๋์? ์ฐ๋ฆฌ๋ ์์
์ค์
๋๋ค
swig๋ฅผ ์ฌ์ฉํ๋ ๋ฃจ๋น ์ธํฐํ์ด์ค:
http://github.com/somaticio/tensorflow.rb
2016๋
9์ 13์ผ ํ์์ผ ์คํ 6์ 22๋ถ, Jonathan Hseu [email protected]
์ผ๋ค:
๋ค, ํ์ง๋ง ์๋ง๋ 10์/11์์ ์์ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ C API๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค
C++ API๋ก ์ ํํ๋ ๋์ . ๊ทธ๋์ ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
saudet๊ฐ ์ธ๊ธํ ๋ฐ์ธ๋ฉ.โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/tensorflow/tensorflow/issues/5#issuecomment -246844192,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAA5v3g86Z6D1rz-aTGdMyMWnQZhrZUYks5qpyIJgaJpZM4Getd8
.
์์ผ๋ก ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ธ์ด ๋ฐ์ธ๋ฉ์ด C API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๋ฌธ์๊ฐ ์ค๋น ์ค์ ๋๋ค.
์ฌ๊ธฐ์์ ์ฌ์ฉ ์๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/go
ํ์ง๋ง ๊ธด๊ธํ ์ํฉ์ ์๋๋ฉฐ ์ง๊ธ์ SWIG๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@jhseu ์ด๋ C API๊ฐ ํ์ฌ Python ๋ฐ์ธ๋ฉ์ด ์ก์ธ์คํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ํฌํจํ๋๋ก ํ์ฅ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น?
์์ฐ, ํฐ ๋ณํ์
๋๋ค. ์ด๊ฒ์ด ๋ ์ผ์ฐ ๊ฒฐ์ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด์จ๋ ๋ฌธ์๋ฅผ ๋ณด๋ ค๋ฉด
๋ ๋นจ๋ฆฌ?
2016๋
9์ 14์ผ ์์์ผ ์คํ 5์ 56๋ถ, Samuel Audet [email protected]
์ผ๋ค:
@jhseu https://github.com/jhseu C API๊ฐ
Python ๋ฐ์ธ๋ฉ์ด ํ์ฌ ์ก์ธ์คํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ํฌํจํ๋๋ก ํ์ฅ๋์์ต๋๊น?โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/tensorflow/tensorflow/issues/5#issuecomment -247167887,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAA5vwfBJoZC2s33_7E9Xy6-NYNUjHjnks5qqG2FgaJpZM4Getd8
.
@saudet ๋จ๊ธฐ์ ์ผ๋ก๋ ์ผ๋ถ ๊ธฐ๋ฅ(์: ๊ทธ๋๋์ธํธ, ์ตํฐ๋ง์ด์ )์ ์ ์ธํ๊ณ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์
๋๋ค.
@jtoy ๋ง์ด๊ทธ๋ ์ด์
์ด ๊ธํ์ง ์์ต๋๋ค. SWIG๋ ๋น๋ถ๊ฐ ๊ณ์ ์๋ํฉ๋๋ค.
๋ฌธ์๋ ๊ทธ๊ฒ์ ์ํํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ช
๋ช
๊ท์น์ ์ค๋ช
ํฉ๋๋ค. ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ์ด๋ค ์์ด C API๋ก ๋ง์ด๊ทธ๋ ์ด์
์ ์์ํ ์ ์์ต๋๋ค.
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/c/c_api.h
@saudet ๊ฐ์ฌ TensorProto
๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ํด stackoverflow ์์ ์ด๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ค์์ gRPC Java ํด๋ผ์ด์ธํธ๋ฅผ ์ ๊ณตํ๋ TensorFlow์ ์์ ์ฝ๋ ์
๋๋ค.
@tobegit3hub ์ข์ต๋๋ค . C++ API๋ก ์ด ์์ ์ ์ํํ ์ ์๋ค๋ฉด JavaCPP ์ฌ์ ์ค์ ์ ๋์ฐ๋ฏธ ํจํค์ง์ ์ถ๊ฐํ๊ณ ํ ์์ฒญ์ ๋ณด๋ด์ฃผ์ธ์! ์ด ์ฌ๋์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๊ด์ฌ์ด ์์ ๊ฒ์ ๋๋ค: https://github.com/bytedeco/javacpp-presets/issues/240
@girving javacpp ๊ฐ ์ด๋ฏธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๊น?
tensorflow java api์ ๊ธฐ์ฌํ๊ณ ์ถ์ต๋๋ค. ํ์ด์ฌ์ฒ๋ผ ๊ตฌํํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ, ๋๊ตฐ๊ฐ ์ด๋ฏธ C API๋ฅผ ์ฌ์ฉํ์ฌ Java/Scala ์ธ์ด ๋ฐ์ธ๋ฉ ์์
์ ์์ํ์ต๋๊น?
( SWIG ์์ ๊ตฌ์ถํ๋ ๋์ )
JNR์ ํตํด C API๋ง ์ฌ์ฉํ๋ tensorflow์ ๋ํ ์๋ํ๋ Java/Scala ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค. ๋ถํํ๋, ๋๋ ์์ง ๊ทธ๊ฒ์ ๊ณต๊ฐํ ๊ถํ์ด ์์ต๋๋ค. ์ถ์๋๋ฉด ์ฌ๊ธฐ์ ๊ฒ์ํ๊ฒ ์ต๋๋ค. ์์ง ์งํ ์ค์ธ ์์ ์ด์ง๋ง ๋งค์ฐ ๊ธฐ๋ฅ์ ์ ๋๋ค.
@jdolson ๋ ธ์ถํ๋ API๊ฐ TensorFlow์ ํ๋กํ ์ฝ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ํ์ฉํฉ๋๊น? ๋ด๊ฐ @saudet์์ javacpp ์ฌ์ ์ค์ ์ ์ฌ์ฉ ํ์ด ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ค ํ๋๋ ๋น์ ์ ํ๋กํ ์ฝ ๋ฒํผ ์ปดํ์ผ๋ฌ ๋์ ์ํด ์์ฑ๋๋ org.tensorflow.framework.TensorProto ๋น์ ์๊ฒ ์๋ฐ ํด๋ผ์ด์ธํธ ์ฝ๋์์์ด ๊ฑฐ๋๋ฅผ ํ ์ ์ค๋ธ์ ํธ๋ฅผ ์กฐ์ํ๋ ๊ฒฝ์ฐ ์๋ฐ๋ฅผ ์ถ๋ ฅํ๋๋ก ์ค์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ TensorFlow API ๋ํผ์์๋ C๋ฅผ ์์ฑํ๋๋ก ๊ตฌ์ฑ๋ ๋ ํ๋กํ ์ฝ ๋ฒํผ ์ปดํ์ผ๋ฌ์ ์ํด ์์ฑ๋ c ์ฝ๋๋ฅผ ๊ฐ๋ฆฌํฌ ๋ javacpp์ ์ํด ์์ฑ๋๋ org.bytedeco.javacpp.tensorflow.TensorProto.TensorProto๋ฅผ ๋ค๋ฃจ๊ณ ์์ต๋๋ค. ๋ํ๋ TensorFlow API๋ฅผ ํธ์ถํ ๋ ์๋ฐ ์ฝ๋์ ํ ์๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@Intropy ์, protoc
๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ tensorflow *.proto
์์ค๋ฅผ Java ์์ค ์ฝ๋๋ก ์ปดํ์ผํ๊ณ API์์ ํด๋น ํด๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@jhseu C API ์ธํฐํ์ด์ค๊ฐ ์์ง 11์ ์์ ์ถ์๋ ์์ ์ธ๊ฐ์? ๊ทธ๋ ์ง ์๋ค๋ฉด ํ์ฌ ์ํ๋ ์ด๋ป์ต๋๊น?
@eaplatanios : C API๋ ๋๋ถ๋ถ ์์ ์ ์ด๋ฉฐ(๊ณต์์ ์ผ๋ก 1.0๊น์ง ๋ ์์ ์) ์์ ํ์ง๋ ์์ง๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค(๊ทธ๋ํ์ ๋ํ ์๋ ๊ธฐ์ธ๊ธฐ ๊ณ์ฐ ๊ธฐ๋ฅ์ด ์ฌ์ ํ ๋๋ฝ๋จ). C API๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ด ๋ฐ์ธ๋ฉ์ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ ๋ฌธ์๋ https://www.tensorflow.org/how_tos/language_bindings/index.html์ ์์ต๋๋ค.
Go API ๋ ์์ ๋ฌธ์๋ฅผ ๋ฐ๋ฅด๋ ์ฒซ ๋ฒ์งธ ์๋ก C API๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ์ต๋๋ค.
์ฐ๋ฆฌ๋ JNI๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์์ Java ๋ฐ์ธ๋ฉ๋ ๊ตฌ์ถํ๊ธฐ๋ฅผ ํฌ๋งํ๊ณ ์กฐ๊ธ ํ์ํ๊ธฐ ์์ํ์ต๋๋ค. @saudet ์ JavaCPP ์๋์ ๋ํ ํ๋ฅญํ ์์ ์ ์ฌ์ฉํ์ฌ ์ฌ๋๋ค์ด ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ ์๊ฒฌ/๋ฐฐ์์ ๋ํด ์๊ณ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
JavaCPP ๋ฐ์ธ๋ฉ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋ช ๊ฐ์ง ์ ์์ด ์์ต๋๋ค.
์ฒซ์งธ, ํ๋กํ ์ฝ ๋ฒํผ๊ฐ ์๋ฐ๋ก ์ง์ ์ปดํ์ผ๋๊ธฐ ๋๋ฌธ์ ์๋ฐ ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋ค. ๋ฐ๋์งํ๊ฒ๋ API์ ์ฐธ์ฌํ๋ ํ๋กํ ์ฝ ๋ฒํผ๋ maven ๋ชจ๋๋ก ๋ณ๋๋ก ์ฌ์ฉํ ์ ์์ด์ผ ํ๊ณ proto ์ ์์ ํจ๊ป ์ ๊ณต๋์ด์ผ ํ๋ฏ๋ก Java ์คํ์ ์ฌ๋๋ค์ด ์ ์๋ฅผ ๋ฐ์ด๋๋ฆฌ๋ก ์ฝ๊ฒ ์ป์ ์ ์์ ๋ฟ๋ง ์๋๋ผ ์ฝ๊ฒ ์ป์ ์ ์์ต๋๋ค. ๋ค๋ฅธ proto ์ ์์ ํฌํจํ๊ธฐ ์ํด proto ์ ์๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๋์งธ, TensorFlow๊ฐ ํ์๋ก ํ๋ libc์ ์ต์ ๋ฒ์ ์ ์ฐพ๊ณ ์ด์ ๋ฐ๋ผ ๋น๋ํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์ ์งธ, ์๋ ์์ฑ๋ API๋ณด๋ค ์ ์คํ๊ฒ ์ค๊ณ๋ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ์ฝ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ช ๋ฐฑํ๊ณ JavaCPP์ ํ ๋ฐฉ์ฒ๋ผ ๋ค๋ฆฐ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์๋ฏธํ์ง ์์ต๋๋ค. ์๋์ผ๋ก ์์ฑ๋ ์ธํฐํ์ด์ค๊ฐ ์๋ค๋ ๊ฒ์ด ์ ๋ง ๊ธฐ์ฉ๋๋ค. ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด์ํ ๋งํฌ๊ฐ ํ์ํ๊ณ ์ฌ๋ง๊ท๊ฐ ๋ง์ผ๋ฉฐ ํ๋ ค๋ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ํ์ ํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒ์ด ๊ฝค ์ด๋ ต์ต๋๋ค. ์ด ์ ์์ด "์ ๋ง๋ค์ด์ผ ํ๋ค"๋ ๊ฒ๋ณด๋ค ๋ ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ง๋ง ์์ ์ C++ API์ python API๊ฐ ์ผ๋ง๋ ๋ค๋ฅธ์ง ์ดํด๋ณด๋ ๊ฒ์ ๋๋ค. ๋ ๋ค ์๋์ผ๋ก ๋ณํ๋ ์ฝ๋๊ฐ ์ผ์นํ์ง ์๋ ๋ฐฉ์์ผ๋ก ํ๊ฒฝ์ ๋ง๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํฉ๋๋ค.
Go, Ruby, R๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด์์ ์ฌ์ฉํ ์ ์๋๋ก Swig์ C ๋ฐฑ์๋๋ฅผ ์ง์ํ๊ณ Swig๋ฅผ ํตํด TF C API๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ ์ข์์ ๊ฒ์ ๋๋ค. https://github.com/swig/swig/issues/800 ์์ ์ ๋ฐ์ธ๋ฉ์ ์์ฑํ๋ C API.
C FFI๊ฐ ์๋ ๋ชจ๋ ์ธ์ด์ ๋ํ ์ง์์ ์ถ๊ฐํ๊ธฐ ์ํ ๊ธฐ์กด C API๊ฐ ์์ต๋๋ค.
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/c/c_api.h
(๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด TensorFlow์ฉ Go, Java, Rust ๋ฑ ๋ฐ์ธ๋ฉ์ ๋น๋ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฒ์ ๋๋ค)
JNA๋ฅผ ์ฌ์ฉํ์ฌ C API์ ์ก์ธ์คํ ์ ์์ต๋๊น?
@jhseu ๋ด ๋ง์, C API๋ฅผ ์๋์ผ๋ก ๊ตฌํํ๊ธฐ ์ ์ ์ด์ ์ C++ API์์ ์์ฑ๋์์ ์ ์๋ค๋ ๋ป์ ๋๋ค.
@Quantum64 , ๋ค์ ์ JNA๋ฅผ ์ฌ์ฉํ๋ tensorflow์ Scala ๋ฐ์ธ๋ฉ์ ๋๋ค.
์ด ๋ฌธ์ ๊ฐ ์์ง ์ด๋ ค ์์ผ๋ฏ๋ก ์ด๋ป๊ฒ
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/java
๊ตฌํ ์ค์ด๋ฉฐ ์ปค๋ฐ์ ๋ํ PR์ ๋ฌด์์
๋๊น?
@hsaputra : ๋น์ ์ด ์ฐพ๊ณ ์๋ ๊ฒ์ ๋ํด ์์ธํ tensorflow/java
์ ์ฝ๋์ ๊ธฐ์ฌํ๋ ์ปค๋ฐ์ด ์ฌ๋ฌ ๊ฐ ์์ผ๋ฉฐ, ๋๋ถ๋ถ์ด ์ด ๋ฌธ์ ์์ ์ฐธ์กฐ๋ฉ๋๋ค(์: 2b1cd28, d73a266 ๋ฐ ๊ทธ ์ฌ์ด์ ๋ง์ ๋ค๋ฅธ ์ปค๋ฐ).
์๋ ํ์ธ์ @asimshankar , ๋ต๋ณ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ด ํฐ์ผ์ด ๋ซํ์ง ์์๊ธฐ ๋๋ฌธ์ tensorflow/java
์ด Java API๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ทจํ๋ ๊ฒฝ๋ก๊ฐ ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค.
JavaCPP ์ฌ์ฉ ๋ SWIG ์ฌ์ฉ ๋ Jython์ ํตํ ํธ์ถ ์ฌ์ฉ์ ๋ํ ํ ๋ก ์ด ์์์ต๋๋ค.
tensorflow/java
๊ฐ ์ง์ JNI๋ก ๊ตฌํ๋์ด ๋์ C API๋ฅผ ํธ์ถํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๊น?
์ณ์.
์ด๋ด,
์ด์ Swig ๋ฐ์ธ๋ฉ์ด ์๋ํ์ต๋๋ค. API ๋ณ๊ฒฝ ์์ฒญ์ด ์์ต๋๋ค. ํ์ฌ Tensors๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ฆฌํ๋ ์ ์ด ํ์ํ๋ฉฐ ๋ฐฐ์ด ํ์์ n์ฐจ์ ๋ค์ดํฐ๋ธ Java ๋ฐฐ์ด์ ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ์ด์ํฉ๋๋ค. ์ด ์ธํฐํ์ด์ค๋ฅผ ์ ์งํ๋ฉด์ 1์ฐจ์ ๋ฐฐ์ด์ ํ์๋ก ํ๋ ํ ์๋ฅผ ๋ง๋ค๊ณ ๋ค๋ฅธ long ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๋ชจ์์ ์ง์ ํ๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ถ๊ฐํ ์ ์์ต๋๊น? ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ์ ์์ต๋๋ค.
double[] matrix = {1.414, 2.718, 3.1415, 3.4, 56.7, 89.0};
long[] shape = {2, 3};
// add a method for each primitive type
org.tensorflow.Tensor tensor = org.tensorflow.Tensor.createDouble(matrix, shape);
์ด๊ฒ์ ๋ํ ํธํ์ฑ์ ๋์์ด ๋๋ int8, int16, uint8, uint16, uint32 ํ ์๋ฅผ ์์ฑํ ๊ฐ๋ฅ์ฑ์ผ๋ก ์ด์ด์ง๋๋ค.
์ด๊ฑธ ๋ฌธ์ ๋ก ํด์ผ ํ๋? ์๋๋ฉด ์ฌ๊ธฐ ๊ด์ฐฎ๋์?
๋ํ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ด ๋๋ ๊ฒ์ ๊ธฐ์๊ฒ ์๊ฐํฉ๋๋ค.
@hollinwilkins : PR #6577์ด ์ ์ํ ๊ณต์ฅ ๋ฐฉ์์ ์ฝ๊ฐ๋ง ์์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Tensor tensor = Tensor.create(shape, DoubleBuffer.wrap(matrix));
@asimshankar ๋ฉ์ง๋ค์ ! ๋น ๋ฅธ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค. ๋ณํฉ์๋ ๊ฑฐ์ ๊ทผ์ ํ ๊ฒ ๊ฐ์ต๋๋ค :+1:
์๋ก์ด Java API๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋๋ฐ ์๊ฐ๋ณด๋ค ์ฌ์ฉํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ๋ช ๊ฐ์ง ์ฌํญ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๋ํ ์ด๊ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋์ณค์ ์๋ ์์ง๋ง ์คํ์ ์ถ๋ ฅ์์ โโ์ง์๋๋ ๋ชจ๋ ํ ์ ์ ํ์ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ด ์ถ๋ ฅ ํ ์๊ฐ dtype INT16์ธ ๊ฒฝ์ฐ ๊ฐ์ ์ถ์ถํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. Tensor.shortValue ๋ฑ์ด ์๊ณ Tensor.intValue๊ฐ ์ ํํ ์ผ์นํด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. tensor_jni.cc์์ DEFINE_GET_SCALAR_METHOD๋ฅผ ์ฝ๋ ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
@Intropy : ๊ทํ์ ์๊ฒฌ์ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ ํ์คํ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ง๊ธ์ ๋ช ๊ฐ์ง ๊ฐ๋จํ ์๊ฐ์ ์ฌ๋ฌ๋ถ๊ณผ ๊ณต์ ํ ์ ์์ต๋๋ค.
RE: protobufs: ์ด ์์ ์์ ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ํต์ฌ API๋ฅผ protobufs์ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์งํ๋ ค๊ณ ํฉ๋๋ค( nanproto ์ ๊ฐ์ ๊ฒ์ด ๋ ์ ์ ํ ์ ์๋ ๋ฆฌ์์ค ์ ํ ์์คํ ์์์ ์ฌ์ฉ ํฌํจ). ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ์ฃผ์ ํ๋ ์ด์ ๊ฐ ์์ต๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๊ณ ์ ์์ ๊ฐ์ฌํ๊ฒ ์๊ฐํ๋ ๊ฒ์ ๋๋ค. ํ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ ๋ชจ๋ protobuf ๊ด๋ จ ๊ธฐ๋ฅ์ ๋ณ๋์ ํจํค์ง์ ํฌํจํ์ฌ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ๋ ๊ฒ์ ๋๋ค.
๋ค์ ์์ ์ผ๋ก ๋์๊ฐ์:
์ ์ฐธ์กฐ. ํ์ง๋ง byte[]
๊ฐ ๋ ์๋ฏธ๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๋ ์ ์ ๋ฒ ํ
ํฉ๋๋ค(์: ํ์ผ ๋๋ ๋คํธ์ํฌ ์ฑ๋์์ ๊ทธ๋ํ ์ฝ๊ธฐ)
์์ ์ ์์์ด
์ ์ฐธ์กฐ.
Session.runner.run
๋ ์ผํค๋ ์ํ๊ฐ ์๋ ์ด์ผ ํฉ๋๋ค. ์ค๋ฅ๊ฐ ์์ผ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค( session_jni.cc:166
). ์ด๊ฒ์ด ์ผ์ด๋์ง ์์ผ๋ฉด ๋ฒ๊ทธ๋ฅผ ์ ๊ณ ํ์ญ์์ค.
๋ง์ต๋๋ค. ์์ง ๋ชจ๋ ์ ํ์ด ์ง์๋๋ ๊ฒ์ ์๋์ง๋ง ์ถ๊ฐํ ์ ์์ ๋งํผ ์ฌ์์ผ ํฉ๋๋ค. ๋๋ฝ๋ ์ ํ์ ๋ํ ๊ธด๊ธํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๊ฑฐ๋ PR์ ๋ณด๋ด์ฃผ์ญ์์ค. ๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค :)
@asimshankar ์๊ฐ
์ฒซ ๋ฒ์งธ ์์ ์ ๊ดํด์๋ ์ค์ ๋ก ํฐ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ๋น์ ์ด ๋งํ๋ฏ์ด byte[]๊ฐ ๊ฐ์ฅ ์๋ฏธ๊ฐ ์๋ ๋๊ฐ ์์ต๋๋ค. ๋ด ์์ ์ ์ฌ์ฉ ์ฌ๋ก์๋ byte[]๋ก ๋ณํํ๊ธฐ ์ฌ์ด InputStream์ด ์์ต๋๋ค. ํ๋กํ ์ฝ ๋ฒํผ API๋ ๋ณํ์ ๊ฐ๋จํ๊ฒ ๋ง๋ญ๋๋ค. ์ด์จ๋ (TF_GraphImportGraphDef์์) ์ญ์ง๋ ฌํํด์ผ ํ๊ธฐ ๋๋ฌธ์ API์ ๋ํ byte[] ์ฌ๋ง๊ท๋ฅผ ๊ณ ๋ คํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ผ๋ถ ์ ํ ์์ ์ฑ์ ์๊ฒ ๋ฉ๋๋ค. ๊ณ ๋ คํด์ผ ํ proto3์ json ์ง๋ ฌํ๋ ์์ต๋๋ค.
์ผํค๋ ์ํ์์๋ ๋ง์ต๋๋ค. ํ์ธ๋์ง ์์ ์์ธ๋ฅผ ๋์ณค์ต๋๋ค.
2์ 3์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ํ์คํ ๋ฐฉ๋ฒ์ TensorProto์ ์ผ๋ถ toTensorProto()์์ ๋ณํํ๋ ํฉํ ๋ฆฌ๋ฅผ org.tensorflow.Tensor์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ๋ฆฌ์์ค๊ฐ ์ ํ๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ํ๋กํ ์ฝ ๋ฒํผ์ ๋ฌธ์ ์ธ ๊ฒฝ์ฐ ํด๋น ์ํฉ์ ์๋ ์ฌ๋๋ค์ ๋จ์ํ ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ด Tensor๊ฐ ๋ฐ์ดํฐ๋ฅผ protobuff์ ์ง์ ์ ์ฅํ๋๋ก ํจ์ผ๋ก์จ ํผํ ์ ์๋ ๋ณํ ๋น์ฉ์ ์ง๋ถํ๊ฒ ๋๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ ์ ์ jni๋ก ์์ ํ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๋ฐฉ์์ ๋ฐ๋ฅด๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ง๋ง ๋ณธ์ง์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ์ง์ ๋ void*์ฒ๋ผ ์ฒ๋ฆฌ๋๋ TensorBuffer๊ฐ ์๋ TF_Tensor์ ๋ํ ํฌ์ธํฐ์ฒ๋ผ nativeHandle์ ์ฒ๋ฆฌํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ถํดํ๊ณ Java ์ธํฐํ์ด์ค์ ๊ฐ ๊ธฐ๋ฅ์ ๋ํด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ ์ถํ ์ ์์ต๋๊น? ์ถ์ /๋ถ์์ด ๋ ์ฌ์์ง๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ ์ ์์ต๋๋ค.
@drpngx : ๋ด ์๋๋ Go์์ ํ๋ ๊ฒ์ฒ๋ผ ์ด ์์ ์ ์ข ๋ฃํ๊ณ ๊ธฐ๋ฅ/๋ฒ๊ทธ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ถํ๊ธฐ ์ ์ (๋ฒํผ์์ ํ ์ ์ฝ๊ธฐ) ๋ช ๊ฐ์ง ์ถ๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ป๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ๊ณง ๋ฐ๋๋๋ค.
์ข์ ์๋ฆฌ, ๊ฐ์ฌํฉ๋๋ค!
์ข์, ๊ตฌ์ถํ ๊ธฐ๋ฐ์ด ์ถฉ๋ถํ ๊ฒ ๊ฐ์ต๋๋ค(์: LabelImage ์์ ๋ฅผ ๊ตฌ์ถํ๊ธฐ์ ์ถฉ๋ถํ๊ณ ์ฌ๋๋ค์ด ๋ ๊ตฌ์ฒด์ ์ธ ๋ฒ๊ทธ/๊ธฐ๋ฅ ์์ฒญ์ ์ ์ถํ๊ณ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ง๋ฌด๋ฆฌํ๊ฒ ์ต๋๋ค. Java API์๋ ์ฌ์ ํ ํด์ผ ํ ์ผ์ด ๋ง์ง๋ง ๋ณ๋์ ๋ฌธ์ ์์ ๋ ผ์/์ถ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ฐ์ฌ ํด์!
@asimshankar ์ฐ๋ฆฌ๋ ๋ฅ ๋ฌ๋ ํ๋ ์์ํฌ(mxnet/tf)๋ฅผ ์ ํํ๋ ๊ณผ์ ์ ์์ผ๋ฉฐ etl/api๋ spark/akka ํ๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค... ps๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ ๋ณ๋ ฌ ๊ต์ก์ ์คํํ๊ธฐ ์ํด Java API์ distribution_runtime ์ง์์ ์ถ๊ฐํ ๊ณํ์ด ์์ต๋๊น? ๋ ธ๋ ? ps ๋ ธ๋๋ ๋ง์ ์ฌ์ฉ ์ฌ๋ก์์ ์ค์ํฉ๋๋ค... C API ์์ฒด์ distribution_runtime์ด ์๋ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ javacpp ์ฌ์ ์ค์ ์ ์ฒซ ๋ฒ์งธ ์ปท์ ์ํด ๋ด๋ณด๋ด๋ ๊ฒ์ด ๋ ์ฌ์ธ ์ ์์ต๋๋ค...
@debasish83 : ๋ถ์ฐ ๋ฐํ์ ์์ฒด๋ฅผ ํฌํจํ๋ ๊ฒ์ ์ฌ์ํ์ง๋ง Python API์๋ Estimator
ํด๋์ค์ ๊ฐ์ ๋ง์ ์ผ(์ฒดํฌํฌ์ธํธ, ์์ฝ ์ ์ฅ ๋ฑ)์ ์ฒ๋ฆฌํ๋ ๋์ ์์ค์ ๊ตฌ์กฐ๊ฐ ๋ง์ด ์์ต๋๋ค. TensorBoard๋ฅผ ํตํด ์๊ฐํ๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์์) Python์์ ๊ต์ก ์์
์ ์คํํ๋ ๋ฐ ๋ ์ ํฉํ ์ ์์ต๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ Java API์ ๊ธฐ์กด ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถํ ์ ์์ง๋ง ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
์๋ง๋ ์ฐ๋ฆฌ๋ ์ค๋ ๋์์ ๋๊ธฐํํด์ผํฉ๋๊น?
@asimshankar ๋ ธ๋ ๋ชฉ๋ก, ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ํ์๊ณผ ๊ฐ์ graphDef(๋์คํฌ์ ์๋ ๊ทธ๋ํ์ .pb ํ์ผ์์ ๋น๋๋จ)์์ ์ ๋ณด๋ฅผ ๊ฒ์ํ๋ tensorflow Java ๋ฐ์ธ๋ฉ์ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ์๋๋ฉด ๋ค์ด์ค๋ ๊ธฐ๋ฅ์ ๋๊น? ๊ฐ์ฌ ํด์!
@asimshankar TF Java๋ก ๊ต์ก์ ์ํํ๋ ๋ฐ ๋ฌด์์ด ๋ถ์กฑํ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ซ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌธ์ ์
๋๊น(numpy ๋๋ฝ)? TensorBoard dataviz์๋ ๊ด์ฌ์ด ์์ง๋ง ๊ธฐ๋ณธ Java ์ซ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ต์ก๋ง ํ๋ ๊ฒฝ์ฐ ๊ต์ก์ฉ์ผ๋ก๋ง Python์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น( Estimator
ํด๋์ค์ ๋ํด ์ ์ํ ๋๋ก)?
๊ฐ์ฌ ํด์.
Java์์ ํ์ต ๋ชจ๋ธ์ ์ํ๋ ๋ฌด์์ ๋๊น? ์ ๋ ImageJ(์ธ๊ธฐ ์๋ ๋ฌด๋ฃ ์ด๋ฏธ์ง ๋ถ์ ์ ํ๊ตฐ) ํ๋ฌ๊ทธ์ธ์ ์์ฑํ์ฌ https://arxiv.org/pdf/1505.04597.pdf (์ต๊ทผ ์ธํฌ ์ถ์ ๋ฐ ์๋ฌผ ์ํ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ํ ์ด๋ฏธ์ง ๋ถํ ์์ ๋๋ฆฌ ์ฌ์ฉ๋จ)์ ๊ฐ์ ์ ๊ทผ ๋ฐฉ์์ ์ ์ฉํ๋ ๊ฒ์ ์๊ฐํ๊ณ ์์ต๋๋ค. ์ฌ์ ํ๋ จ๋ ๋ค์ํ ๋ชจ๋ธ์ ์ ๊ณตํ๊ณ ์ฌ์ฉ์๊ฐ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง๊ฒ ์ด๋ฅผ ๊ฐ์ ํ ์ ์๊ฒ ํ๋ ๊ฒ์ด ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ์ด ๋ชฉ์ ์ ์ํด DL4J๋ฅผ ์กฐ์ฌํด ์์ต๋๋ค. TF Java ๋ฐ์ธ๋ฉ์ ๋ง์ถ ์ ์๋ ๊ตฌ์ฒด์ ์ธ ๊ณํ์ด ์์ต๋๊น?
@bergwerf : ํน๋ณํ ํธ๋ฆฌํ์ง ์๋๋ผ๋ Java๋ก ํ๋ จํ๋ ๊ฒ์ ํ์คํ ๊ฐ๋ฅํฉ๋๋ค.
https://github.com/tensorflow/models/tree/master/samples/languages/java/training ์์ ์ํ์ ์ฐพ์ ์ ์์ต๋๋ค.
(๋ํ, ๋๋ ๋น์ ์ด ์๊ณ ์๋ค๊ณ ํ์ ํ์ง๋ง https://imagej.net/TensorFlow๋ ์ฐธ์กฐํ์ญ์์ค)
์ค, ๊ต์ฅํ๋ค! ๋ด ์ ๋ณด๋ ์ค๋๋ ๊ฒ์ด์ด์ผํฉ๋๋ค ;-). ๋๋ ๋ด๊ฐ ์ฝ์๋ค๊ณ ์๊ฐํ๋ค
์ด๋๊ฐ์์ Java API๋ ์ฌ์ ํ๋ จ๋
๋ชจ๋ธ. ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
2018๋ 3์ 28์ผ ์์์ผ 22:01 Asim Shankar [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@bergwerf https://github.com/bergwerf : Java ๊ต์ก์ ํ์คํ
ํนํ ํธ๋ฆฌํ์ง ์๋ค๋ฉด ๊ฐ๋ฅํฉ๋๋ค.
์์ ์ํ์ ์ฐพ์ ์ ์์ต๋๋ค.
https://github.com/tensorflow/models/tree/master/samples/languages/java/trainingโ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/tensorflow/tensorflow/issues/5#issuecomment-377015867 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AEQJ1UD9-xACQAII5996ees_UFJ_NzL-ks5ti-wSgaJpZM4Getd8
.
@asimshankar ๊ต์ฅํฉ๋๋ค ๐ ๐ฏ ๐ฅ , ๋ด ์ ์ฅ์์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค https://github.com/loretoparisi/tensorflow-java
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ๋ฐ์ดํธ: @saudet ๋๋ถ์ javacpp๋ก ์์ ์ ์ฑ๊ณต์ ์ผ๋ก ์ํํ ์ ์์๊ณ Java ํ๋ก๊ทธ๋จ์์ TensorFlow ๋ชจ๋ธ์ ์ฝ๊ฑฐ๋ ์คํํ ์ ์์์ต๋๋ค.
https://medium.com/google-cloud/how-to-invoke-a-trained-tensorflow-model-from-java-programs-27ed5f4f502d#.tx8nyds5v