Path: blob/master/site/ja/guide/migrate/tf1_vs_tf2.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
TensorFlow 1.x ãš TensorFlow 2 ã®æ¯èŒ - åäœãš API
å éšã§ã¯ãTensorFlow 2 㯠TF1.x ãšã¯æ ¹æ¬çã«ç°ãªãããã°ã©ãã³ã°ãã©ãã€ã ã«åŸã£ãŠããŸãã
ãã®ã¬ã€ãã§ã¯ãåäœãš API ã«é¢ãã TF1.x ãš TF2 ã®åºæ¬çãªéããšãããããã¹ãŠãç§»è¡éçšã«ã©ã®ããã«é¢é£ãããã«ã€ããŠèª¬æããŸãã
äž»ãªå€æŽç¹ã®å šäœçãªæŠèŠ
åºæ¬çã«ãTF1.x ãš TF2 ã¯ãå®è¡ïŒTF2 ã§ã¯ eagerïŒã倿°ãå¶åŸ¡ãããŒããã³ãœã«åœ¢ç¶ãããã³ãã³ãœã«ç䟡æ¯èŒã«é¢ããŠãç°ãªãäžé£ã®ã©ã³ã¿ã€ã åäœã䜿çšããŸããTF2 ãšäºææ§ãæãããã«ã¯ãã³ãŒãã TF2 åäœã®å®å
šãªã»ãããšäºææ§ãããå¿
èŠããããŸããç§»è¡äžã«ããããã®åäœã®ã»ãšãã©ã tf.compat.v1.enable_*
ãŸã㯠tf.compat.v1.disable_*
API ãä»ããŠåå¥ã«æå¹ãŸãã¯ç¡å¹ã«ããããšãã§ããŸãã1 ã€ã®äŸå€ã¯ãã³ã¬ã¯ã·ã§ã³ã®åé€ã§ããããã¯ãEager execution ã®æå¹å/ç¡å¹åã®å¯äœçšã§ãã
TensorFlow 2 ã®æŠèŠã¯æ¬¡ã®ãšããã§ãã
åé·ãª API ãåé€ããŸãã
API ã®äžè²«æ§ãé«ããŸããäŸãã°ãçµ±å RNN ãçµ±åãªããã£ãã€ã¶ãªã©ã§ãã
ã»ãã·ã§ã³ããã颿°ãåªå ããã°ã©ããšã³ã³ãã€ã«ã®èªåå¶åŸ¡äŸåé¢ä¿ãæäŸãã
tf.function
ãšãšã ã« Eager execution ãããã©ã«ãã§æå¹ã«ãªã£ãŠãã Python ã©ã³ã¿ã€ã ãšã®çµ±åãæ¹åããŸããã°ããŒãã«ã°ã©ãã³ã¬ã¯ã·ã§ã³ãéæšå¥šã«ããŸãã
ReferenceVariables
ãããResourceVariables
ã䜿çšããŠã倿°ã®åæå®è¡ã®ã»ãã³ãã£ã¯ã¹ã倿ŽããŸãã颿°ããŒã¹ã®åŸ®åå¯èœãªå¶åŸ¡ãããŒïŒå¶åŸ¡ãã㌠v2ïŒããµããŒãããŸãã
tf.compat.v1.Dimension
ãªããžã§ã¯ãã®ä»£ããã«int
ãä¿æããããã« TensorShape API ãç°¡çŽ åããŸãããã³ãœã«ã®ç䟡æ§ã®ä»çµã¿ãæŽæ°ããŸããTF1.x ã§ã¯ããã³ãœã«ãšå€æ°ã®
==
æŒç®åããªããžã§ã¯ãåç §ã®ç䟡æ§ããã§ãã¯ããŸããTF2 ã§ã¯ãå€ã®ç䟡æ§ããã§ãã¯ããŸããããã«ããã³ãœã«/倿°ã¯ããã·ã¥å¯èœã§ã¯ãªããªããŸããããããããã³ãœã«/倿°ãã»ããã§ããŸãã¯dict
ããŒãšããŠäœ¿çšããå¿ èŠãããå Žåã¯ãvar.ref()
çµç±ã§ããããžã®ããã·ã¥å¯èœãªãªããžã§ã¯ãåç §ãååŸã§ããŸãã
以äžã®ã»ã¯ã·ã§ã³ã§ã¯ãTF1.x ãš TF2 ã®çžéç¹ã«ã€ããŠããã«èª¬æããŸããTF2 ã®èšèšããã»ã¹ã®è©³çްã«ã€ããŠã¯ãRFC ãšèšèšããã¥ã¡ã³ããã芧ãã ããã
API ã®ã¯ãªãŒã³ã¢ãã
TF2 ã§ã¯ã倿°ã® API ãåãé€ããããç§»è¡ãããŠããŸããäž»ãªå€æŽç¹ã«ã¯ãçŸåšã§ã¯ãªãŒãã³ãœãŒã¹ãšãªã£ã absl-py ã®å°å
¥ã«ãã tf.app
ãtf.flags
ãããã³ tf.logging
ã®åé€ãtf.contrib
ã«ãã£ããããžã§ã¯ãã®ç§»æ€ã䜿çšé »åºŠã®äœã颿°ã tf.math
ãªã©ã®ãµãããã±ãŒãžã«ç§»åããããšã«ããã¡ã€ã³ã® tf.*
åå空éã®ã¯ãªãŒã³ã¢ãããªã©ããããŸããäžéšã® API 㯠TF2 ããŒãžã§ã³ã® tf.summary
ãtf.keras.metrics
ãããã³ tf.keras.optimizers
ã«çœ®ãæããããŸããã
tf.compat.v1
: ã¬ã¬ã·ãŒããã³äºææ§ API ãšã³ããã€ã³ã
tf.compat
ããã³ tf.compat.v1
åå空éã®ã·ã³ãã«ã¯ãTF2 API ãšã¯èŠãªãããŸããããããã®åå空éã¯ãäºææ§ã·ã³ãã«ã®çµã¿åãããšãTF 1.x ã®ã¬ã¬ã·ãŒ API ãšã³ããã€ã³ããå
¬éããŸãããããã¯ãTF1.x ãã TF2 ãžã®ç§»è¡ãæ¯æŽããããšãç®çãšããŠããŸãããã ãããããã® compat.v1
API ã¯ããããæ
£çšç㪠TF2 API ã§ã¯ãªããããæ°ãã TF2 ã³ãŒããèšè¿°ããããã«äœ¿çšããªãã§ãã ããã
åã
ã® tf.compat.v1
ã·ã³ãã«ã¯ãTF2 åäœãæå¹ã«ãªã£ãŠããŠãåäœãç¶ããããïŒtf.compat.v1.losses.mean_squared_error
ãªã©ïŒãTF2 ãšäºææ§ãããå ŽåããããŸãããä»ã®ãã®ã¯ TF2 ãšäºææ§ããããŸããïŒtf.compat.v1.metrics.accuracy
ïŒãå€ãã® compat.v1
ã·ã³ãã«ïŒãã¹ãŠã§ã¯ãããŸããïŒã®ããã¥ã¡ã³ãã«ã¯ãTF2 åäœãšã®äºææ§ã®çšåºŠãšããããã TF2 API ã«ç§»è¡ããæ¹æ³ã説æããå°çšã®ç§»è¡æ
å ±ãå«ãŸããŠããŸãã
TF2 ã¢ããã°ã¬ãŒãã¹ã¯ãªããã¯ãå€ãã® compat.v1
API ã·ã³ãã«ãããããããšã€ãªã¢ã¹ã§ããããåãåŒæ°ãæã£ãŠããŠãé åºãç°ãªãå Žåã«åçã® TF2 API ã«ãããã§ããŸããã¢ããã°ã¬ãŒãã¹ã¯ãªããã䜿çšããŠãTF1.x API ã®ååãèªåçã«å€æŽããããšãã§ããŸãã
False friendïŒç©ºäŒŒèšèïŒAPI
TF2 tf
åå空éïŒcompat.v1
ã®äžã§ã¯ãªãïŒã«ã¯ãå
éšã§ TF2 ã®åäœãå®éã«ç¡èŠãããTF2 ã®åäœã®å®å
šãªã»ãããšå®å
šã«äºææ§ããªãããŸãã¯ãã®äž¡æ¹ã®äžé£ã®ãfalse-friendãã·ã³ãã«ããããŸãããã®ããããããã® API ã¯ãæœåšçã«ãµã€ã¬ã³ããªæ¹æ³ã§ãTF2 ã³ãŒãã§èª€åäœããå¯èœæ§ããããŸãã
tf.estimator.*
: Estimator ã¯å éšã§ã°ã©ããšã»ãã·ã§ã³ãäœæããŠäœ¿çšããŸãããã®ãããããã㯠TF2 äºæãšèŠãªãããã¹ãã§ã¯ãããŸãããã³ãŒãã Estimator ãå®è¡ããŠããå ŽåãTF2 ã®åäœã¯äœ¿çšãããŸãããkeras.Model.model_to_estimator(...)
: ããã¯å éšã§ Estimator ãäœæããŸãããäžèšã«ããããã«ãTF2 äºæã§ã¯ãããŸãããtf.Graph().as_default()
: ãã㯠TF1.x ã°ã©ãã®åäœãããæšæºã® TF2 äºæã®tf.function
ã®åäœã«ã¯åŸããŸããããã®ãããªã°ã©ãã«å ¥ãã³ãŒãã¯ãéåžžãã»ãã·ã§ã³ãä»ããŠã°ã©ããå®è¡ããTF2 äºæãšèŠãªãã¹ãã§ã¯ãããŸãããtf.feature_column.*
ç¹åŸŽéå API ã¯äžè¬ã« TF1 ã¹ã¿ã€ã«ã®tf.compat.v1.get_variable
倿°ã®äœæã«äŸåããäœæããã倿°ã¯ã°ããŒãã«ã³ã¬ã¯ã·ã§ã³çµç±ã§ã¢ã¯ã»ã¹ããããšæ³å®ããŸããTF2 ã¯ã³ã¬ã¯ã·ã§ã³ããµããŒãããŠããªããããTF2 ã®åäœãæå¹ã«ã㊠API ãå®è¡ãããšãAPI ãæ£ããæ©èœããªãå ŽåããããŸãã
ãã®ä»ã® API ã®å€æŽ
TF2 ã¯ã
tf.colocate_with
ã®äœ¿çšãäžèŠã«ããããã€ã¹é 眮ã¢ã«ãŽãªãºã ã®å€§å¹ ãªæ¹åãç¹åŸŽãšããŠããŸããåé€ã«ããããã©ãŒãã³ã¹ãäœäžããå Žåã¯ããã°ãå ±åããŠãã ãããtf.v1.ConfigProto
ã®ãã¹ãŠã®äœ¿çšãtf.config
ããã®åçã®é¢æ°ã«çœ®æããŸãã
Eager execution
TF1.x ã§ã¯ãtf.*
API åŒã³åºããäœæããŠæœè±¡æ§æããªãŒïŒã°ã©ãïŒãæåã§ã€ãªãåãããåºåãã³ãœã«ãšå
¥åãã³ãœã«ã®ã»ããã session.run
åŒã³åºãã«æž¡ããæœè±¡æ§æããªãŒãæåã§ã³ã³ãã€ã«ããå¿
èŠããããŸãããTF2 ã¯ãããïŒPython ãéåžžè¡ãããã«ïŒeagerly ã«å®è¡ã ãã°ã©ããšã»ãã·ã§ã³ã¯å®è£
ã®è©³çްã®ãããªæèŠã«ãªã£ãŠããŸãã
Eager execution ã®å¯ç£ç©ãšããŠæ³šç®ããŠããããã®ã¯ãtf.control_dependencies
ãäžèŠã«ãªã£ããšããç¹ã§ããããã¯ãã³ãŒãã®ãã¹ãŠã®è¡ãé ã«å®è¡ãããããã«ãªã£ãããã§ãïŒtf.function
å
ã§ã¯ã坿¬¡ç圱é¿ã®ããã³ãŒãã¯èšè¿°ãããé ã«å®è¡ãããŸãïŒã
global ã®æé€
TF1.X ã§ã¯ãã°ããŒãã«åå空éãšã³ã¬ã¯ã·ã§ã³ã«æé»çã«å€§ããäŸåããŠããŸãããtf.Variable
ãåŒã³åºããšãããã©ã«ãã®ã°ã©ãã«ããã³ã¬ã¯ã·ã§ã³ã«é
眮ãããããããã€ã³ããã Python 倿°ã远跡ã§ããªããªã£ãŠãã°ã©ãã«æ®ã£ãŠããŸããããã® tf.Variable
ã¯åŸ©å
ã§ããŸããããã®äœæã«äœ¿çšãããååãããã£ãŠããå Žåã®ã¿ã§ããã倿°ã®äœæã管çããŠããªããŠãŒã¶ãŒã«ãšã£ãŠã¯å°é£ãªããšã§ããããã®çµæã倿°ãããäžåºŠèŠã€ãåºãããã®ããŸããŸãªä»çµã¿ãçãŸããã ãã§ãªãã倿°ã¹ã³ãŒããã°ããŒãã«ã³ã¬ã¯ã·ã§ã³ãtf.get_global_step
ã®ãããªãã«ããŒã¡ãœãããtf.global_variables_initializer
ããã¹ãŠã®ãã¬ãŒãã³ã°å¯èœãªå€æ°ã®åŸé
ãæé»çã«èšç®ãããªããã£ãã€ã¶ãªã©ããŠãŒã¶ãŒäœæå€æ°ãæ€çŽ¢ãããã¬ãŒã ã¯ãŒã¯ãæ¥å¢ããŸãããTF2 ã¯ãããããã¹ãŠã®ä»çµã¿ïŒVariables 2.0 RFCïŒãæé€ããèªåã®å€æ°ã¯èªåã§è¿œè·¡ãããšããããã©ã«ãã®ä»çµã¿ãæ¡æããŸããtf.Variable
ã远跡ã§ããªããªããšãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«ãã£ãŠåéãããŸãã
倿°ã远跡ããå¿
èŠããããããäœåãªäœæ¥ãçºçããŸãããã¢ããªã³ã°ã·ã ãªã©ã®ããŒã«ãšãtf.Module
ããã³ tf.keras.layers.Layer
ã®æé»çãªãªããžã§ã¯ãæå倿°ã³ã¬ã¯ã·ã§ã³ãªã©ã®åäœã«ãããè² æ
ã¯æå°éã«æããããŸãã
ã»ãã·ã§ã³ã§ã¯ãªã颿°
session.run
åŒã³åºãã¯ãã»ãŒé¢æ°åŒã³åºããšå€ãããŸãããå
¥åãšåŒã³åºããã颿°ãæå®ãããšãäžé£ã®åºåãè¿ãããŸããTF2 ã§ã¯ãtf.function
ã䜿ã£ãŠãTensorFlow ãåäžã®ã°ã©ããšããŠå®è¡ã§ããããã« Python 颿°ã« JIT ã³ã³ãã€ã«ã®ããŒã¯ãã€ããŸãïŒFunctions 2.0 RFCïŒããã®ä»çµã¿ã«ãããTF2 㯠Graph ã¢ãŒãã®ãã¹ãŠã®ã¡ãªãããåŸãããšãã§ããŸãã
ããã©ãŒãã³ã¹: 颿°ãæé©åã§ããŸãïŒããŒãæç©ããã«ãŒãã«èåãªã©ïŒ
ç§»æ€æ§: 颿°ããšã¯ã¹ããŒã/åã€ã³ããŒãïŒSavedModel 2.0 RFCïŒã§ãããããã¢ãžã¥ãŒã«å TensorFlow 颿°ãåå©çšãå ±æããããšãã§ããŸãã
Python ãš TensorFlow ã³ãŒããèªç±ã«æ··åšããããããããPython ã®è¡šçŸåãæŽ»çšã§ããŸãããã ããç§»æ€å¯èœãª TensorFlow ã¯ãã¢ãã€ã«ãC++ãJavaScript ãªã©ãPython ã€ã³ã¿ãŒããªã¿ãŒã䜿çšããªãã³ã³ããã¹ãã§å®è¡ãããŸããtf.function
ã远å ããéã«ã³ãŒãã®æžãçŽããé¿ããã«ã¯ãAutoGraph ã䜿çšããŠãPython ã³ã³ã¹ãã©ã¯ãã®ãµãã»ããã TensorFlow ã®åçã®ãã®ã«å€æããŸãã
for
/while
->tf.while_loop
(break
ãšcontinue
ã¯ãµããŒããããŠããŸã)if
->tf.cond
for _ in dataset
->dataset.reduce
AutoGraph ã§ã¯å¶åŸ¡ãããŒãä»»æã«ãã¹ãã§ãããããã·ãŒã±ã³ã¹ã¢ãã«ã匷ååŠç¿ãã«ã¹ã¿ã ãã¬ãŒãã³ã°ã«ãŒããªã©ãå€ãã®è€é㪠ML ããã°ã©ã ãå¹ççãã€ç°¡æœã«å®è£ ããããšãã§ããŸãã
TF 2.x ã®åäœå€æŽãžã®é©å¿
TF2 ãžã®ç§»è¡ã¯ãTF2 ã®åäœã®å®å
šãªã»ããã«ç§»è¡ããŠåããŠå®äºããŸããtf.compat.v1.enable_v2_behaviors
ããã³ tf.compat.v1.disable_v2_behaviors
ãä»ããŠãåäœã®å®å
šãªã»ãããæå¹ãŸãã¯ç¡å¹ã«ããããšãã§ããŸãã以äžã®ã»ã¯ã·ã§ã³ã§ã¯ãããããã®äž»èŠãªåäœã®å€æŽã«ã€ããŠè©³ãã説æããŸãã
tf.function
ã®äœ¿çš
ç§»è¡äžã®ããã°ã©ã ãžã®æå€§ã®å€æŽã¯ãåºæ¬çãªããã°ã©ãã³ã° ã¢ãã«ã®ãã©ãã€ã ã°ã©ããšã»ãã·ã§ã³ãã Eager execution ãš tf.function
ãžã®ã·ããããçããå¯èœæ§ããããŸããEager execution ããã³ tf.function
ãšäºææ§ã®ãªã API ããããããšäºææ§ã®ãã API ãžã®ç§»è¡ã®è©³çްã«ã€ããŠã¯ãTF2 ç§»è¡ã¬ã€ããåç
§ããŠãã ããã
泚æ: ç§»è¡äžã«ãtf.compat.v1.enable_eager_execution
ãš tf.compat.v1.disable_eager_execution
ã䜿çšã㊠eager execusion ãçŽæ¥æå¹ãŸãã¯ç¡å¹ã«ããããšãéžæã§ããŸãããããã¯ããã°ã©ã ã®æå¹æéäžã«äžåºŠã ãè¡ãããšãã§ããŸãã
以äžã¯ãtf.Graph
ããã³ tf.compat.v1.Session
ãã tf.function
ã«ãã Eager execution ã«åãæ¿ããå Žåã«åé¡ãåŒãèµ·ããå¯èœæ§ããããããããã® API ã«é¢é£ä»ããããŠããªãäžè¬çãªããã°ã©ã ãã¿ãŒã³ã®äžéšã§ãã
ãã¿ãŒã³ 1: 1 åã®ã¿å®è¡ããããšãç®çãšãã Python ãªããžã§ã¯ãã®æäœãšå€æ°ã®äœæããè€æ°åå®è¡ãããã
ã°ã©ããšã»ãã·ã§ã³ã«äŸåãã TF1.x ããã°ã©ã ã§ã¯ãéåžžãããã°ã©ã å
ã®ãã¹ãŠã® Python ããžãã¯ã 1 åã ãå®è¡ãããããšãæåŸ
ãããŸãããã ããEager execution ããã³ tf.function
ã䜿çšãããšãPython ããžãã¯ã¯å°ãªããšã 1 åå®è¡ãããŸãããå Žåã«ãã£ãŠã¯ãã以äžã®åæ°ïŒeagerly ã«è€æ°åããŸãã¯ç°ãªã tf.function
ãã¬ãŒã¹å
šäœã§è€æ°åïŒãå®è¡ãããå¯èœæ§ããããŸããæã«ã¯ãtf.function
ãåãå
¥åã 2 åãã¬ãŒã¹ããäºæããªãåäœãåŒãèµ·ããããšãããããŸãïŒäŸ 1 ãš 2 ãã芧ãã ããïŒã詳现ã«ã€ããŠã¯ãtf.function
ã¬ã€ããåç
§ããŠãã ããã
泚æ: éåžžããã®ãã¿ãŒã³ã«ãããtf.function
ãªãã§ eagerly ã«å®è¡ãããšãã³ãŒããèŠåãªãã«èª€åäœããŸãããåé¡ã®ããã³ãŒãã tf.function
å
ã«ã©ããããããšãããšãäžè¬ã« InaccessibleTensorError
ãŸã㯠ValueError
ãçºçããŸãããã®åé¡ãçºèŠããŠãããã°ããã«ã¯ãæ©ã段éã§ã³ãŒãã tf.function
ã§ã©ããããpdb ãŸãã¯å¯Ÿè©±åãããã°ã䜿çšã㊠InaccessibleTensorError
ã®ãœãŒã¹ãç¹å®ããããšããå§ãããŸãã
äŸ 1: 倿°ã®äœæ
颿°ãåŒã³åºããããšãã«å€æ°ãäœæãã以äžã®äŸãèããŠã¿ãŸãããã
ãã ãã倿°ã®äœæãå«ãäžèšã®é¢æ°ãåçŽã« tf.function
ã§ã©ããããããšã¯èš±å¯ãããŠããŸãããtf.function
ã¯ãæåã®åŒã³åºãã§ã®ã·ã³ã°ã«ãã³å€æ°ã®äœæã®ã¿ããµããŒãããŸããããã匷å¶ããã«ã¯ãtf.function ãæåã®åŒã³åºãã§å€æ°ã®äœæãæ€åºãããšãå床ãã¬ãŒã¹ã詊è¡ãã2 çªç®ã®ãã¬ãŒã¹ã§å€æ°ã®äœæãããå Žåã¯ãšã©ãŒãçºçãããŸãã
åé¿çãšããŠã倿°ãæåã®åŒã³åºãã§äœæããåŸã«ãã£ãã·ã¥ããŠåå©çšããŸãã
äŸ 2: tf.function
ã®åãã¬ãŒã¹ã«ããç¯å²å€ã®ãã³ãœã«
äŸ 1 ã§ç€ºããããã«ãæåã®åŒã³åºãã§å€æ°ã®äœæãæ€åºãããšãtf.function
ã¯åãã¬ãŒã¹ããŸãã2 ã€ã®ãã¬ãŒã¹ã§ 2 ã€ã®ã°ã©ããäœæããããããããã¯ããã«æ··ä¹±ãæãå¯èœæ§ããããŸããåãã¬ãŒã¹ããã® 2 çªç®ã®ã°ã©ããæåã®ãã¬ãŒã¹äžã«çæãããã°ã©ããããã³ãœã«ã«ã¢ã¯ã»ã¹ããããšãããšãTensorflow ã§ã¯ãã³ãœã«ãç¯å²å€ã§ãããšãããšã©ãŒãçºçããŸããã·ããªãªã瀺ãããã«ã以äžã®ã³ãŒãã¯æåã® tf.function
åŒã³åºãã§ããŒã¿ã»ãããäœæããŸããããã¯æåŸ
ã©ããã«å®è¡ãããŸãã
ãã ããæåã® tf.function
åŒã³åºãã§å€æ°ãäœæããããšãããšãã³ãŒãã¯ããŒã¿ã»ãããç¯å²å€ã§ããããšãéç¥ãããšã©ãŒãçºçãããŸããããã¯ãããŒã¿ã»ãããæåã®ã°ã©ãã«ããã2 çªç®ã®ã°ã©ããããã«ã¢ã¯ã»ã¹ããããšããŠããããã§ãã
æãç°¡åãªè§£æ±ºçã¯ã倿°ã®äœæãšããŒã¿ã»ããã®äœæãäž¡æ¹ãšã tf.function
åŒã³åºãã®å€ã«ããããšã確èªããããšã§ããäŸãã°ã次ã®ãšããã§ãã
ãã ããtf.function
ã§å€æ°ãäœæããããšãé¿ããããªãå ŽåããããŸãïŒäžéšã® TF keras ãªããã£ãã€ã¶ã®ã¹ããã倿°ãªã©ïŒãããã§ããããŒã¿ã»ããã®äœæã tf.function
åŒã³åºãã®å€ã«ç§»åããã ãã§ããããã«äŸåã§ããçç±ã¯ãtf.function
ãæé»çãªå
¥åãšããŠããŒã¿ã»ãããåãåããäž¡æ¹ã®ã°ã©ããé©åã«ã¢ã¯ã»ã¹ã§ããããã§ãã
äŸ 3: dict ã®äœ¿çšã«ããäºæããªã Tensorflow ãªããžã§ã¯ãã®åäœæ
tf.function
ã¯ããªã¹ããžã®è¿œå ããã£ã¯ã·ã§ããªãžã®ãã§ãã¯/远å ãªã©ãPython ã®å¯äœçšã«å¯ŸãããµããŒããéåžžã«è²§åŒ±ã§ãã詳现ã¯ãtf.function ã«ããããã©ãŒãã³ã¹ã®åäžãã«ãããŸãã以äžã®äŸã§ã¯ãã³ãŒãã¯ãã£ã¯ã·ã§ããªã䜿çšããŠããŒã¿ã»ãããšã€ãã¬ãŒã¿ããã£ãã·ã¥ããŠããŸããåãããŒã®å Žåãã¢ãã«ãžã®ååŒã³åºãã¯ãããŒã¿ã»ããã®åãã€ãã¬ãŒã¿ãè¿ããŸãã
ãã ããäžèšã®ãã¿ãŒã³ã¯ tf.function
ã§ã¯æåŸ
ã©ããã«æ©èœããŸããããã¬ãŒã¹äžãtf.function
ã¯ãã£ã¯ã·ã§ããªãžã®è¿œå ã«ãã Python ã®å¯äœçšãç¡èŠããŸãã代ããã«ãæ°ããããŒã¿ã»ãããšã€ãã¬ãŒã¿ã®äœæã®ã¿ãèšæ¶ããŸãããã®çµæãã¢ãã«ãžã®ååŒã³åºãã¯åžžã«æ°ããã€ãã¬ãŒã¿ãè¿ããŸãããã®åé¡ã¯ãæ°å€çµæãŸãã¯ããã©ãŒãã³ã¹ãååã«éèŠã§ãªãéããæ°ã¥ãã«ãããã®ã§ãããããã£ãŠãtf.function
ãåçŽã« Python ã³ãŒãã«ã©ããããåã«ãã³ãŒãã«ã€ããŠæ
éã«æ€èšããããšããå§ãããŸãã
tf.init_scope
ã䜿çšããŠãæåŸ
ãããåäœãå®çŸããããã«ãããŒã¿ã»ãããšã€ãã¬ãŒã¿ã®äœæãã°ã©ãã®å€ã«æã¡äžããããšãã§ããŸãã
äžè¬çãªçµéšåã¯ãããžãã¯ã§ Python ã®å¯äœçšã«äŸåããããšãé¿ãããããããã¬ãŒã¹ã®ãããã°ã«ã®ã¿äœ¿çšããããšã§ãã
äŸ 4: ã°ããŒãã« Python ãªã¹ãã®æäœ
次㮠TF1.x ã³ãŒãã¯ãçŸåšã®ãã¬ãŒãã³ã°ã¹ãããã«ãã£ãŠçæãããæå€±ã®ãªã¹ãã®ã¿ãç¶æããããã«äœ¿çšããæå€±ã®ã°ããŒãã«ãªã¹ãã䜿çšããŸãããªã¹ãã«æå€±ã远å ãã Python ããžãã¯ã¯ãã»ãã·ã§ã³ãå®è¡ããããã¬ãŒãã³ã°ã¹ãããã®æ°ã«é¢ä¿ãªãã1 åã ãåŒã³åºãããããšã«æ³šæããŠãã ããã
ãã ãããã® Python ããžãã¯ã Eager execution ã§åçŽã« TF2 ã«ãããã³ã°ãããŠããå Žåãæå€±ã®ã°ããŒãã«ãªã¹ãã«ã¯åãã¬ãŒãã³ã°ã¹ãããã§æ°ããå€ã远å ãããŸããããã¯ã以åã¯ãªã¹ãã«çŸåšã®ãã¬ãŒãã³ã°ã¹ãããããã®æå€±ã®ã¿ãå«ãŸãããšæ³å®ããŠãããã¬ãŒãã³ã°ã¹ãããã³ãŒããããããŸã§ã«å®è¡ããããã¹ãŠã®ãã¬ãŒãã³ã°ã¹ãããããã®æå€±ã®ãªã¹ããå®éã«ç¢ºèªããããã«ãªã£ãããšãæå³ããŸããããã¯æå³ããªãåäœã®å€æŽã§ãããåã¹ãããã®éå§æã«ãªã¹ããã¯ãªã¢ãããããã¬ãŒãã³ã°ã¹ãããã«å¯ŸããŠããŒã«ã«ã«ããå¿ èŠããããŸãã
ãã¿ãŒã³ 2: TF1.x ã®ãã¹ãŠã®ã¹ãããã§åèšç®ãããããšãæå³ããã·ã³ããªãã¯ãã³ãœã«ããeager ã«åãæ¿ããéã«èª€ã£ãŠåæå€ã§ãã£ãã·ã¥ãããã
ãã®ãã¿ãŒã³ã¯éåžžãã³ãŒãã tf.functions ã®å€éšã§ eagerly ã«å®è¡ãããšãèŠåãªãã«èª€åäœãåŒãèµ·ãããŸãããåæå€ã®ãã£ãã·ã¥ã tf.function
ã®å
éšã§çºçããå Žå㯠InaccessibleTensorError
ãçºçãããŸãããã ããäžèšã®ãã¿ãŒã³ 1 ãåé¿ããããã«ããšã©ãŒãçºçãããå¯èœæ§ã®ãã tf.function
ã®å€éšã§ãã®åæå€ã®ãã£ãã·ã¥ãçºçããããã«ãã³ãŒãã誀ã£ãŠæ§é åããããšãããããããšã«æ³šæããŠãã ããããã®ãããããã°ã©ã ããã®ãã¿ãŒã³ã®åœ±é¿ãåããããããšãããã£ãŠããå Žåã¯ãç¹ã«æ³šæããŠãã ããã
ãã®ãã¿ãŒã³ã®äžè¬çãªè§£æ±ºçã¯ãã³ãŒããåæ§ç¯ããããå¿ èŠã«å¿ã㊠Python callable ã䜿çšããŠãå€ã誀ã£ãŠãã£ãã·ã¥ãããã®ã§ã¯ãªããæ¯ååèšç®ãããããã«ããããšã§ãã
äŸ 1: ã°ããŒãã«ã¹ãããã«äŸåãããåŠç¿çããã€ããŒãã©ã¡ãŒã¿ãªã©ã®ã¹ã±ãžã¥ãŒã«
次ã®ã³ãŒãã¹ããããã§ã¯ãã»ãã·ã§ã³ãå®è¡ããããã³ã«ææ°ã® global_step
å€ãèªã¿åãããæ°ããåŠç¿çãèšç®ãããããšãæåŸ
ãããŸãã
ãã ããeager ã«åãæ¿ããããšããå Žåã¯ãæå³ããã¹ã±ãžã¥ãŒã«ã«åŸãã®ã§ã¯ãªããåŠç¿çã 1 åã ãèšç®ãããŠããåå©çšãããããšã«æ³šæããŠãã ããã
ãã®ç¹å®ã®äŸã¯äžè¬çãªãã¿ãŒã³ã§ããããªããã£ãã€ã¶ã¯åãã¬ãŒãã³ã°ã¹ãããã§ã¯ãªã 1 åã ãåæåããå¿
èŠããããããTF2 ãªããã£ãã€ã¶ã¯åŠç¿çããã®ä»ã®ãã€ããŒãã©ã¡ãŒã¿ã®åŒæ°ãšã㊠tf.keras.optimizers.schedules.LearningRateSchedule
ã¹ã±ãžã¥ãŒã«ãŸã㯠Python callable ããµããŒãããŸãã
äŸ 2: ãªããžã§ã¯ã屿§ãšããŠå²ãåœãŠããããã€ã³ã¿ãŒãä»ããŠåå©çšãããã·ã³ããªãã¯ä¹±æ°ã®åæåããeager ãžã®åãæ¿ãæã«èª€ã£ãŠãã£ãã·ã¥ããã
次㮠NoiseAdder
ã¢ãžã¥ãŒã«ãèããŠã¿ãŸãããã
TF1.x ã§æ¬¡ã®ããã«äœ¿çšãããšãã»ãã·ã§ã³ãå®è¡ããããã³ã«æ°ããã©ã³ãã ãã€ãºãã³ãœã«ãèšç®ãããŸãã
ãã ããTF2 ã§ã¯ãæåã« noise_adder
ãåæåãããšãnoise_distribution
ã 1 åã ãèšç®ããããã¹ãŠã®ãã¬ãŒãã³ã°ã¹ãããã§åçµãããŸãã
ãããä¿®æ£ããã«ã¯ãæ¯ååããã³ãœã«ãªããžã§ã¯ããåç
§ãã代ããã«ãæ°ããã©ã³ãã ãã³ãœã«ãå¿
èŠã«ãªããã³ã« NoiseAdder
ãåŒã³åºãããã« tf.random.normal
ããªãã¡ã¯ã¿ãªã³ã°ããŸãã
ãã¿ãŒã³ 3: TF1.x ã³ãŒãã¯ãã³ãœã«ã«çŽæ¥äŸåããååã§æ€çŽ¢ãã
TF1.x ã³ãŒããã¹ãã§ã¯ãã°ã©ãã«ååšãããã³ãœã«ãŸãã¯æŒç®ã®ãã§ãã¯ã«äŸåããã®ãäžè¬çã§ãããŸãã«ãã¢ããªã³ã°ã³ãŒãããããã®ååã«ããæ€çŽ¢ã«äŸåããããšããããŸãã
tf.function
ã®å€ã§ eagerly ã«å®è¡ããå Žåããã³ãœã«åã¯ãŸã£ããçæãããªããããtf.Tensor.name
ã®ãã¹ãŠã®äœ¿çšã¯ tf.function
å
ã§çºçããå¿
èŠããããŸããå®éã«çæãããååã¯ãåã tf.function
å
ã§ãã£ãŠã TF1.x ãš TF2 ã®éã§ç°ãªãå¯èœæ§ãéåžžã«é«ããAPI ä¿èšŒã¯ TF ããŒãžã§ã³éã§çæãããååã®å®å®æ§ãä¿èšŒããªãããšã«æ³šæããŠãã ããã
泚æ: 倿°å㯠tf.function
ã®å€éšã§ãçæãããŸãããã¢ãã«ãããã³ã°ã¬ã€ãã®é¢é£ã»ã¯ã·ã§ã³ã«åŸãå Žåãé€ãããã®ååã TF1.x ãš TF2 ã®éã§äžèŽããããšã¯ä¿èšŒãããŸããã
ãã¿ãŒã³ 4: TF1.x ã»ãã·ã§ã³ããçæãããã°ã©ãã®äžéšã®ã¿ãéžæçã«å®è¡ãã
TF1.x ã§ã¯ãã°ã©ããæ§ç¯ããã°ã©ãå ã®ãã¹ãŠã®æŒç®ãå®è¡ããå¿ èŠã®ãªãå ¥åãšåºåã®ã»ãããéžæããããšã«ãããã»ãã·ã§ã³ã§ãã®ãµãã»ããã®ã¿ãéžæçã«å®è¡ããããšãéžæã§ããŸãã
äŸãã°ã1 ã€ã®ã°ã©ãå
ã«ãžã§ãã¬ãŒã¿ãšãã£ã¹ã¯ãªãããŒã¿ã®äž¡æ¹ãæã¡ãåå¥ã® tf.compat.v1.Session.run
åŒã³åºãã䜿çšããŠããã£ã¹ã¯ãªãããŒã¿ã®ã¿ã®ãã¬ãŒãã³ã°ãšãžã§ãã¬ãŒã¿ã®ã¿ã®ãã¬ãŒãã³ã°ã亀äºã«è¡ãããšãã§ããŸãã
TF2 ã§ã¯ãtf.function
ã®èªåå¶åŸ¡ã®äŸåé¢ä¿ãš Eager execution ã«ãããtf.function
ãã¬ãŒã¹ã®éžæçãªæåãã¯ãããŸãããäŸãã°ããã£ã¹ã¯ãªãããŒã¿ãŸãã¯ãžã§ãã¬ãŒã¿ã®åºåã®ã¿ã tf.function
ããåºåãããå Žåã§ãããã¹ãŠã®å€æ°ã®æŽæ°ãå«ãå®å
šãªã°ã©ããå®è¡ãããŸãã
ãããã£ãŠãããã°ã©ã ã®ããŸããŸãªéšåãå«ãè€æ°ã® tf.function
ã䜿çšããããå®éã«å®è¡ããããã®ã ããå®è¡ããããã«åå²ãã tf.function
ãžã®æ¡ä»¶ä»ãåŒæ°ã䜿çšããå¿
èŠããããŸãã
ã³ã¬ã¯ã·ã§ã³ã®åé€
Eager execution ãæå¹ã«ãªã£ãŠããå Žåãã°ã©ãã³ã¬ã¯ã·ã§ã³é¢é£ã® compat.v1
APIïŒtf.compat.v1.trainable_variables
ãªã©ã®å
éšã§ã³ã¬ã¯ã·ã§ã³ãèªã¿æžããã API ãå«ãïŒã¯äœ¿çšã§ããªããªããŸããValueError
ãçºçããããã®ãããã°ãèŠåãªãã«ç©ºã®ãªã¹ããè¿ããã®ããããŸãã
TF1.x ã§ã®ã³ã¬ã¯ã·ã§ã³ã®æãæšæºçãªäœ¿çšæ³ã¯ãåæååãã°ããŒãã«ã¹ããããéã¿ãæ£ååæå€±ãã¢ãã«åºåæå€±ãããã³ BatchNormalization
ã¬ã€ã€ãŒãªã©ããå®è¡ããå¿
èŠããã倿°ã®æŽæ°ãç¶æããããšã§ãã
ãããã®æšæºçãªäœ¿çšæ³ãããããåŠçããã«ã¯ã次ã®ããã«ããŸãã
åæåå - ç¡èŠããŸããEager execution ãæå¹ã«ãªã£ãŠããå Žåã倿°ã®æååæåã¯å¿ èŠãããŸããã
ã°ããŒãã«ã¹ããã - ç§»è¡æé ã«ã€ããŠã¯ã
tf.compat.v1.train.get_or_create_global_step
ã®ããã¥ã¡ã³ããã芧ãã ãããéã¿ - ã¢ãã«ãããã³ã°ã¬ã€ãã®ã¬ã€ãã³ã¹ã«åŸã£ãŠãã¢ãã«ã
tf.Module
/tf.keras.layers.Layer
/tf.keras.Model
ã«ãããããtf.module.trainable_variables
ãªã©ã®ããããã®éã¿è¿œè·¡ã®ä»çµã¿ã䜿çšããŸããæ£ååæå€± - ã¢ãã«ãããã³ã°ã¬ã€ãã®ã¬ã€ãã³ã¹ã«åŸã£ãŠã¢ãã«ã
tf.Module
/tf.keras.layers.Layer
/tf.keras.Model
ã«ãããã³ã°ããtf.keras.losses
ã䜿çšããŸãããŸãã¯ãæ£ååæå€±ãæåã§è¿œè·¡ããããšãã§ããŸããã¢ãã«åºåæå€± -
tf.keras.Model
æå€±ç®¡çã®ä»çµã¿ã䜿çšããããã³ã¬ã¯ã·ã§ã³ã䜿çšããã«æå€±ãåå¥ã«è¿œè·¡ããŸããéã¿ã®æŽæ° - ãã®ã³ã¬ã¯ã·ã§ã³ãç¡èŠããŸããEager execution ãš
tf.function
ïŒautograph ãš auto-control-dependencies ã䜿çšïŒã¯ããã¹ãŠã®å€æ°ã®æŽæ°ãèªåçã«å®è¡ãããããšãæå³ããŸãããã®ãããæåŸã«ãã¹ãŠã®éã¿ã®æŽæ°ãæç€ºçã«å®è¡ããå¿ èŠã¯ãããŸããããã³ã³ãããŒã«ã®äŸåé¢ä¿ã®äœ¿ç𿹿³ã«ãã£ãŠã¯ãTF1.x ã³ãŒããšã¯ç°ãªãã¿ã€ãã³ã°ã§éã¿ã®æŽæ°ãè¡ãããå¯èœæ§ãããããšã«æ³šæããŠãã ãããæŠèŠ - ç§»è¡æŠèŠ API ã¬ã€ããåç §ããŠãã ããã
ããè€éãªã³ã¬ã¯ã·ã§ã³ã®äœ¿çšïŒã«ã¹ã¿ã ã³ã¬ã¯ã·ã§ã³ã®äœ¿çšãªã©ïŒã§ã¯ãã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŠãç¬èªã®ã°ããŒãã«ã¹ãã¢ãç¶æããããã°ããŒãã«ã¹ãã¢ã«ãŸã£ããäŸåããªãããã«ããå¿ èŠãããå ŽåããããŸãã
ReferenceVariables
ã®ä»£ããã« ResourceVariables
ResourceVariables
ã«ã¯ãReferenceVariables
ããã匷åãªèªã¿æžãäžè²«æ§ä¿èšŒããããŸããããã«ããã倿°ã䜿çšãããšãã«ä»¥åã®æžã蟌ã¿ã®çµæã芳å¯ãããã©ããã«ã€ããŠãããäºæž¬å¯èœã§æšè«ããããã»ãã³ãã£ã¯ã¹ãåŸãããŸãããã®å€æŽã«ãããæ¢åã®ã³ãŒãã§ãšã©ãŒãçºçãããã èŠåãªãã«äžæãããããå¯èœæ§ã¯ã»ãšãã©ãããŸããã
ãã ãããããã®åŒ·åãªäžè²«æ§ã®ä¿èšŒã«ãããç¹å®ã®ããã°ã©ã ã®ã¡ã¢ãªäœ¿çšéãå¢å ããå¯èœæ§ã¯äœãã§ããããããŸãããããåœãŠã¯ãŸãå Žåã¯ãåé¡ãæåºããŠãã ãããããã«ã倿°ã®èªã¿åãã«å¯Ÿå¿ããã°ã©ãå ã®æŒç®ååã«å¯Ÿããæ£ç¢ºãªæå忝èŒã«äŸåããåäœãã¹ããããå Žåã¯ããªãœãŒã¹å€æ°ãæå¹ã«ãããšããããã®æŒç®ååããããã«å€æŽãããå¯èœæ§ãããããšã«æ³šæããŠãã ããã
ã³ãŒãã«å¯Ÿãããã®åäœå€æŽã®åœ±é¿ãåé¢ããããã«ãEager execution ãç¡å¹ã«ãªã£ãŠããå Žåãtf.compat.v1.disable_resource_variables()
ããã³ tf.compat.v1.enable_resource_variables()
ã䜿çšããŠããã®åäœå€æŽãã°ããŒãã«ã«ç¡å¹ãŸãã¯æå¹ã«ããããšãã§ããŸããEager execution ãæå¹ã«ãªã£ãŠããå ŽåãResourceVariables
ã¯åžžã«äœ¿çšãããŸãã
å¶åŸ¡ãã㌠v2
TF1.x ã§ã¯ãtf.cond
ã tf.while_loop
ãªã©ã®å¶åŸ¡ãããŒæŒç®ã¯ãSwitch
ãMerge
ãªã©ã®ã€ã³ã©ã€ã³ã®äœã¬ãã«æŒç®ã§ããTF2 ã¯ããã¹ãŠã®ãã©ã³ãã«å¯ŸããŠåå¥ã® tf.function
ãã¬ãŒã¹ã§å®è£
ããã髿¬¡åŸ®åããµããŒããããæ¹åããã颿°å¶åŸ¡ãããŒæŒç®ãæäŸããŸãã
ã³ãŒãã«å¯Ÿãããã®åäœå€æŽã®åœ±é¿ãåé¢ããããã«ãeager execution ãç¡å¹ã«ãªã£ãŠããå Žåãtf.compat.v1.disable_control_flow_v2()
ããã³ tf.compat.v1.enable_control_flow_v2()
ã䜿çšããŠããã®åäœå€æŽãã°ããŒãã«ã«ç¡å¹ãŸãã¯æå¹ã«ããããšãã§ããŸãããã ããeager execution ãç¡å¹ã«ãªã£ãŠããå Žåã«ã®ã¿ãå¶åŸ¡ãã㌠v2 ãç¡å¹ã«ã§ããŸããEager execution ãæå¹ã«ãããšãå¶åŸ¡ãã㌠v2 ãåžžã«äœ¿çšãããŸãã
ãã®åäœã®å€æŽã«ãããå¶åŸ¡ãããŒã䜿çšããçæããã TF ããã°ã©ã ã®æ§é ãåçã«å€åããå¯èœæ§ããããŸããããã¯ã1 ã€ã®ãã©ããã°ã©ãã§ã¯ãªããè€æ°ã®ãã¹ãããã颿°ãã¬ãŒã¹ãå«ãŸããããã§ãããã®ãããçæããããã¬ãŒã¹ã®æ£ç¢ºãªã»ãã³ãã£ã¯ã¹ã«å€§ããäŸåããã³ãŒãã¯ãäœããã®å€æŽãå¿ èŠã«ãªãå ŽåããããŸããããã«ã¯æ¬¡ãå«ãŸããŸãã
æŒç®ååãšãã³ãœã«åã«äŸåããã³ãŒã
ãã®ãã©ã³ãã®å€åŽãã TensorFlow å¶åŸ¡ãããŒã®ãã©ã³ãå ã§äœæããããã³ãœã«ãåç §ããã³ãŒããããã¯
InaccessibleTensorError
ãçæããå¯èœæ§ããããŸã
ãã®åäœã®å€æŽã¯ãããã©ãŒãã³ã¹ããã¥ãŒãã©ã«ããè¯å®çã«ããããšãç®çãšããŠããŸãããå¶åŸ¡ãã㌠v2 ã®ããã©ãŒãã³ã¹ã TF1.x å¶åŸ¡ãããŒãããæªããšããåé¡ãçºçããå Žåã¯ãåçŸæé ã§åé¡ãå ±åããŠãã ããã
TensorShape API ã®åäœã®å€æŽ
TensorShape
ã¯ã©ã¹ã¯ãtf.compat.v1.Dimension
ãªããžã§ã¯ãã®ä»£ããã« int
ãä¿æããããã«åçŽåãããŸããããããã£ãŠãint
ãååŸããããã« .value
ãåŒã³åºãå¿
èŠã¯ãããŸããã
åã ã® tf.compat.v1.Dimension ãªããžã§ã¯ãã¯äŸç¶ãšã㊠tf.TensorShape.dims ããã¢ã¯ã»ã¹å¯èœã§ãã
ã³ãŒãã«å¯Ÿãããã®åäœå€æŽã®åœ±é¿ãåé¢ããã«ã¯ãtf.compat.v1.disable_v2_tensorshape()
ããã³ tf.compat.v1.enable_v2_tensorshape()
ã䜿çšããŠããã®åäœå€æŽãã°ããŒãã«ã«ç¡å¹ãŸãã¯æå¹ã«ããããšãã§ããŸãã
以äžã¯ãTF1.x ãš TF2 ã®éãã瀺ããŠããŸãã
TF1.x ã«ä»¥äžããããšããŸãã
TF2 ã§ã¯ãã®ããã«ãªããŸãã
TF1.x ã«ä»¥äžããããšããŸãã
TF2 ã§ã¯ãã®ããã«ãªããŸãã
TF1.x ã«ä»¥äžããããšããŸãïŒãŸãã¯ãã®ä»ã®æ¬¡å ã¡ãœããã䜿çšããŠãããšããŸãïŒã
TF2 ã§ã¯ãã®ããã«ãªããŸãã
tf.TensorShape ã®ããŒã«åã®å€ã¯ãéæ°ãããã£ãŠããå Žå㯠Trueã§ãããã§ãªãå Žå㯠False ã§ãã
TensorShape ã®å€æŽã«ããæœåšçãªãšã©ãŒ
TensorShape ã®åäœã®å€æŽã«ãã£ãŠãã³ãŒããèŠåãªãã«å£ããããšã¯ã»ãšãã©ãããŸããããã ãã圢ç¶é¢é£ã®ã³ãŒãã AttributeError
ãçºçããå§ãããããããŸãããint
ããã³ None
㯠tf.compat.v1.Dimension
ãšåã屿§ãæã£ãŠããŸããã以äžã«ããããã® AttributeError
ã®äŸãããã€ã瀺ããŸãã
å€ã«ãããã³ãœã«ã®ç䟡æ§
倿°ãšãã³ãœã«ã®ãã€ã㪠==
ããã³ !=
æŒç®åã¯ãTF1.x ã§ã®ããã«ãªããžã§ã¯ãåç
§ã§æ¯èŒããã®ã§ã¯ãªããTF2 ã§ã¯å€ã§æ¯èŒããããã«å€æŽãããŸãããããã«ããã³ãœã«ãšå€æ°ã¯ãå€ã§ããã·ã¥ããããšãã§ããªãå¯èœæ§ããããããã»ãããŸã㯠dict ããŒã§çŽæ¥ããã·ã¥å¯èœãŸãã¯äœ¿çšå¯èœã§ã¯ãªããªããŸããã代ããã«ããã³ãœã«ãŸãã¯å€æ°ãžã®ããã·ã¥å¯èœãªåç
§ãååŸããããã«äœ¿çšã§ãã .ref()
ã¡ãœãããå
¬éããŸãã
ãã®åäœå€æŽã®åœ±é¿ãåé¢ããããã«ãtf.compat.v1.disable_tensor_equality()
ããã³ tf.compat.v1.enable_tensor_equality()
ã䜿çšããŠããã®åäœå€æŽãã°ããŒãã«ã«ç¡å¹ãŸãã¯æå¹ã«ããããšãã§ããŸãã
äŸãã°ãTF1.x ã§ã¯ã==
æŒç®åã䜿çšãããšãåãå€ãæã€ 2 ã€ã®å€æ°ã¯ false ãè¿ããŸãã
ãã³ãœã«ç䟡æ§ãã§ãã¯ãæå¹ã«ãªã£ãŠãã TF2 ã§ã¯ãx == y
㯠True
ãè¿ããŸãã
ãããã£ãŠãTF2 ã§ã¯ããªããžã§ã¯ãåç
§ã§æ¯èŒããå¿
èŠãããå Žåã¯ãå¿
ã is
ãš is not
ã䜿çšããŠãã ããã
ãã³ãœã«ãšå€æ°ã®ããã·ã¥
TF1.x ã®åäœã«ãããset
ããŒã dict
ããŒãªã©ãããã·ã¥ãå¿
èŠãšããããŒã¿æ§é ã«å€æ°ãšãã³ãœã«ãçŽæ¥è¿œå ã§ããŸããã
ãã ãããã³ãœã«ã®ç䟡æ§ãæå¹ã«ãªã£ãŠãã TF2 ã§ã¯ã==
ããã³ !=
æŒç®åã®ã»ãã³ãã£ã¯ã¹ãå€ã®ç䟡æ§ãã§ãã¯ã«å€æŽãããããããã³ãœã«ãšå€æ°ã¯ããã·ã¥äžå¯ã«ãªããŸãã
ãããã£ãŠãTF2 ã§ã¯ããã³ãœã«ãŸãã¯å€æ°ãªããžã§ã¯ããããŒãŸã㯠set
ã®ã³ã³ããã¹ããšããŠäœ¿çšããå¿
èŠãããå Žåãtensor.ref()
ã䜿çšããŠãããŒãšããŠäœ¿çšã§ããããã·ã¥å¯èœãªåç
§ãååŸã§ããŸãã
å¿
èŠã«å¿ããŠãreference.deref()
ã䜿çšããŠåç
§ãããã³ãœã«ãŸãã¯å€æ°ãååŸããããšãã§ããŸãã
ãªãœãŒã¹ãšãã®ä»ã®æç®
TF1.x ãã TF2 ãžã®ç§»è¡ã®è©³çްã«ã€ããŠã¯ãTF2 ãžã®ç§»è¡ã»ã¯ã·ã§ã³ãã芧ãã ããã
ã¢ãã«ãããã³ã°ã¬ã€ããèªãã§ãTF1.x ã¢ãã«ããããã³ã°ã㊠TF2 ã§çŽæ¥åäœãããæ¹æ³ãåŠç¿ããŠãã ããã