ã·ã¹ãã ã€ã³ãã©ã¡ãŒã·ã§ã³
ã¿ãªãããããã«ã¡ã¯ïŒ ããã¯ç§ã®æåã®æçš¿ã§ãã®ã§ãäœããéããå Žåã¯ã容赊ãã ããã ãã®ãããéºäŒçã¢ã«ãŽãªãºã ã䜿çšããŠè€æ°ã®NNã¢ãŒããã¯ãã£ããã¬ãŒãã³ã°ããã³è©äŸ¡ããããšããŠããã®ã§ããã«ãã³ã¢CPUã§ãããã䞊ååããå¿ èŠããããŸãã ãããã£ãŠãjoblibã䜿çšããŠããã䞊ååããããšããŸããã ããããtf.kerasã³ãŒãã¯ãã¯ã«ã¹ã«ã§ããªããããè¡ãè©°ãŸããŸããã äœæéããããã°ããåŸãç§ã¯ã€ãã«tf.kerasã¢ãã«ã¯ãã¯ã«ã¹ã§ããªãã®ã«å¯Ÿããkerasã¢ãã«ã¯ãã¯ã«ã¹ã§ããããšã«æ°ã¥ããŸããã
çŸåšã®è¡åã説æãã
以äžã®ã³ãŒãã¯æ©èœããŸãããkerasãtf.kerasã«çœ®ãæãããšããšã©ãŒãçºçããŸãã
ã¿ã¹ã¯ããã¯ã«ã¹ã«ããŠã¯ãŒã«ãŒã«éä¿¡ã§ããŸããã§ããã
äºæ³ãããåäœã説æãã
ä»åŸã¯ãtf.kerasãkerasã«çœ®ãæããã¯ããªã®ã§ãtf.kerasããã¯ã«ã¹ã«ããå¿
èŠããããŸãã
åé¡ãåçŸããããã®ã³ãŒã
#The following is a simple code to illustrate the problem:
from joblib import Parallel, delayed
import keras
import tensorflow as tf
def test():
model = keras.models.Sequential()
return
Parallel(n_jobs=8)(delayed(test)(i) for i in range(10)) #this works as intended
def test_tf():
model = tf.keras.models.Sequential()
return
Parallel(n_jobs=8)(delayed(test_tf)(i) for i in range(10)) #this will spit out the error above
ä»ã®ã³ã¡ã³ã
ç°¡åãªä¿®æ£ã¯ãæ¢åã®ãã¹ãŠã®ã³ãŒããtf.kerasããkerasã«çœ®ãæããããšã ãšæããŸãããkerasã®ãµããŒãã¯å»æ¢ãããTensorflow 2.0ã«ãã£ãŠåžåããããããããã¯ä¿®æ£ããå¿
èŠããããšæããŸãã
@ Edwin-Koh1
ãã€ããªãŒããŒãžã§ã³ïŒ !pip install tf-nightly==2.1.0dev20191201
ïŒã§ãã§ãã¯ããŠããšã©ãŒãåŒãç¶ãçºçãããã©ããã確èªããŠãã ããã ææ°ã®å€éããŒãžã§ã³ã§ã¯ãããã©ãŒãã³ã¹ã倧å¹
ã«åäžããŠããŸãã ããããšãïŒ
æè¿ã®ã¢ã¯ãã£ããã£ããªããããèªåçã«éããŸãã æ°ããæ å ±ãå©çšå¯èœã«ãªã次第ãåé¡ãæŽæ°ããŠãã ãããåé¡ãåéããŸãã ããããšãïŒ
@ravikyram tensorflow == 2.1.0ã§ãã®åé¡ããŸã çºçããŠããŸãïŒ
import pickle
import tensorflow as tf
def main():
model_1 = tf.keras.Sequential((
tf.keras.layers.Dense(16, activation='relu'),
tf.keras.layers.Dense(1, activation='linear'),
))
_ = model_1(tf.random.uniform((15, 3)))
model_2 = pickle.loads(pickle.dumps(model_1))
for w1, w2 in zip(model_1.get_weights(), model_2.get_weights()):
tf.debugging.assert_equal(w1, w2)
if __name__ == '__main__':
main()
çµæã¯
Traceback (most recent call last):
File "/Users/hartikainen/conda/envs/softlearning-3/lib/python3.7/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/Users/hartikainen/conda/envs/softlearning-3/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/Users/hartikainen/github/rail-berkeley/softlearning-3/tests/test_pickle_keras_model.py", line 25, in <module>
main()
File "/Users/hartikainen/github/rail-berkeley/softlearning-3/tests/test_pickle_keras_model.py", line 18, in main
model_2 = pickle.loads(pickle.dumps(model_1))
TypeError: can't pickle weakref objects
$ pip freeze | grep "tf\|tensor"
tensorboard==2.1.0
tensorflow==2.1.0
tensorflow-estimator==2.1.0
tensorflow-probability==0.9.0
$ python --version
Python 3.7.5
TFããŒãžã§ã³2.1.0-rc2ã2.2.0-dev20200113ã§colabãè©ŠããŠã¿ãŸããããåé¡ãåçŸã§ããŸãããèŠç¹ã¯
@ ravikyram ãkerasæ©èœã¢ãã«ãéžæå¯èœã§ããå¿ èŠããããŸããïŒ ã·ãŒã±ã³ã·ã£ã«ã¢ãã«ãæ©èœã¢ãã«ã§ããå Žåãç§ã¯ãããã¹ãã ãšæããŸããïŒ ãããšããæ©èœã¢ãã«ã«ã¯ãé žæŽããå°é£ã«ããããã€ãã®ç¹æ§ããããŸããïŒ
$ python -m tests.test_pickle_keras_functional_model
2020-01-17 16:47:08.567598: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-01-17 16:47:08.581327: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fa0a55aa6c0 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-01-17 16:47:08.581362: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version
Traceback (most recent call last):
File "/Users/hartikainen/conda/envs/softlearning-3/lib/python3.7/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/Users/hartikainen/conda/envs/softlearning-3/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/Users/hartikainen/github/rail-berkeley/softlearning-3/tests/test_pickle_keras_functional_model.py", line 20, in <module>
main()
File "/Users/hartikainen/github/rail-berkeley/softlearning-3/tests/test_pickle_keras_functional_model.py", line 13, in main
model_2 = pickle.loads(pickle.dumps(model_1))
TypeError: can't pickle _thread.RLock objects
çããããã«ã¡ã¯ã
https://keras.io/ã®æšå¥šã«åŸã£ãŠãã¹ã¿ã³ãã¢ãã³ã®keras
ããtensorflow.keras
ã«åãæ¿ããããšããŠããŸãã
ç§ã¯ãåãäŸå€æã£ãŠãhttps://github.com/tensorflow/tensorflow/issues/34697#issuecommentãš-575705599 joblib
ïŒäœ¿çšããŠããŸãpickle
ãã³ãããã®äžã«ïŒã
ã·ã¹ãã ã€ã³ãã©ã¡ãŒã·ã§ã³ïŒ
åçŸããã¹ã¯ãªããïŒ
import joblib
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(1, input_dim=42, activation='sigmoid'))
model.compile(optimizer='Nadam', loss='binary_crossentropy', metrics=['accuracy'])
joblib.dump(model, 'model.pkl')
åºåïŒ
TypeError: can't pickle _thread.RLock objects
ããã¯ãKerasã¢ãã«ããã¯ã«ã¹åã§ããªãã£ããšãã«åãåé¡ã解決ããããšãç®çãšããhttp://zachmoshe.com/2017/04/03/pickling-keras-models.htmlããã®ä¿®æ£ã§ãã
import pickle
import tempfile
from tensorflow.keras.models import Sequential, load_model, save_model, Model
from tensorflow.keras.layers import Dense
# Hotfix function
def make_keras_picklable():
def __getstate__(self):
model_str = ""
with tempfile.NamedTemporaryFile(suffix='.hdf5', delete=True) as fd:
save_model(self, fd.name, overwrite=True)
model_str = fd.read()
d = {'model_str': model_str}
return d
def __setstate__(self, state):
with tempfile.NamedTemporaryFile(suffix='.hdf5', delete=True) as fd:
fd.write(state['model_str'])
fd.flush()
model = load_model(fd.name)
self.__dict__ = model.__dict__
cls = Model
cls.__getstate__ = __getstate__
cls.__setstate__ = __setstate__
# Run the function
make_keras_picklable()
# Create the model
model = Sequential()
model.add(Dense(1, input_dim=42, activation='sigmoid'))
model.compile(optimizer='Nadam', loss='binary_crossentropy', metrics=['accuracy'])
# Save
with open('model.pkl', 'wb') as f:
pickle.dump(model, f)
@epetrovskiã¢ãã«ããã¯ã«ã¹ãããšãã¯ãã€ã§ããã®ã³ãŒããåŒã³åºãå¿ èŠããããŸããããããšãã¢ããªã±ãŒã·ã§ã³ã®éå§æïŒã¢ãã«ãäœæããåïŒã«åŒã³åºãããšãã§ããŸããïŒ
@epetrovskiã¢ãã«ããã¯ã«ã¹ãããšãã¯ãã€ã§ããã®ã³ãŒããåŒã³åºãå¿ èŠããããŸããããããšãã¢ããªã±ãŒã·ã§ã³ã®éå§æïŒã¢ãã«ãäœæããåïŒã«åŒã³åºãããšãã§ããŸããïŒ
tensorflow.keras.models.Model
ã€ã³ããŒãããåŸãã¢ããªã®æåã«äžåºŠã ãåŒã³åºãããšãã§ããŸãã é¢æ°ãå®è¡ãããšã2ã€ã®æ°ããã¡ãœãã__getstate__()
ãš__setstate__()
ãtensorflow.keras.models.Model
ã¯ã©ã¹ã«è¿œå ããããããæŽæ°ãããtf.kerasã¢ãã«ã¯ã©ã¹ã®ã¡ã³ããŒãpickleåãããã³ã«æ©èœããã¯ãã§ã-ããªãã¡ã ããªãèªèº«ã®ã¢ãã«ã
ããã¯ããã¡ã€ã«ã«ä¿åããå¿ èŠã®ãªã@epetrovskiã®åçã®ä»£æ¿æ段ã§ãã
import pickle
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense
from tensorflow.python.keras.layers import deserialize, serialize
from tensorflow.python.keras.saving import saving_utils
def unpack(model, training_config, weights):
restored_model = deserialize(model)
if training_config is not None:
restored_model.compile(
**saving_utils.compile_args_from_training_config(
training_config
)
)
restored_model.set_weights(weights)
return restored_model
# Hotfix function
def make_keras_picklable():
def __reduce__(self):
model_metadata = saving_utils.model_metadata(self)
training_config = model_metadata.get("training_config", None)
model = serialize(self)
weights = self.get_weights()
return (unpack, (model, training_config, weights))
cls = Model
cls.__reduce__ = __reduce__
# Run the function
make_keras_picklable()
# Create the model
model = Sequential()
model.add(Dense(1, input_dim=42, activation='sigmoid'))
model.compile(optimizer='Nadam', loss='binary_crossentropy', metrics=['accuracy'])
# Save
with open('model.pkl', 'wb') as f:
pickle.dump(model, f)
ãœãŒã¹ïŒ https ïŒ
å€åãããã¢ãã«ã«è¿œå ã§ãããšæããŸããïŒ ãããããŸããããªãå Žåã¯ãããŸããïŒ
Sequentialã¯ã©ã¹ã§éžæã§ããªãå±æ§ã2ã€ããããã§ãã ãã®ä¿®æ£ã¯ç§ã«ã圹ç«ã¡ãŸããïŒ
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
class PickableSequential(Sequential):
def __getstate__(self):
state = super().__getstate__()
state.pop("_trackable_saver")
state.pop("_compiled_trainable_state")
return state
model = PickableSequential(Dense(10))
import pickle
pickle.dumps(model)
~
TFããŒãžã§ã³2.2ããã€ãããŒãžã§ã³ãšã®ã³ã©ãã§è©ŠããŠã¿ãŸããããåé¡ãåçŸããããšãã§ããŸãããããã§èŠç¹ãèŠã€ããŠ
TFããŒãžã§ã³2.2ããã€ãããŒãžã§ã³ãšã®ã³ã©ãã§è©ŠããŠã¿ãŸããããåé¡ãåçŸããããšãã§ããŸãããããã§èŠç¹ãèŠã€ããŠ
kerasã¢ãã«ã¯éžæå¯èœã§ãããtf.kerasã¯éžæå¯èœã§ã¯ãªããããããã«å¯Ÿãã代æ¿ãœãªã¥ãŒã·ã§ã³ã¯ä»¥äžã®ã³ãŒããåç
§ããããš
ç§ã¯ããªãã®ã³ã©ãããŒãããã¯ãèŠãŠãå¿
èŠãªå€æŽãå ããŸããã以äžãšåãã³ãŒããã³ããŒããã ãã§ããšã©ãŒã®è§£æ±ºã¯å®äºã§ãã
tensorflowãtfãšããŠã€ã³ããŒãããŸã
def mainïŒïŒïŒ
model_1 = tf.keras.SequentialïŒïŒ
tf.keras.layers.DenseïŒ16ãactivation = 'relu'ïŒã
tf.keras.layers.DenseïŒ1ãactivation = 'linear'ïŒã
ïŒïŒ
_ = model_1(tf.random.uniform((15, 3)))
model_1.save('model_2.h5')
model_2 = tf.keras.models.load_model('model_2.h5')
for w1, w2 in zip(model_1.get_weights(), model_2.get_weights()):
tf.debugging.assert_equal(w1, w2)
if __name__ == '__ main __'ïŒ
ã¡ã€ã³ïŒïŒ
@ Edwin-Koh1
@lahsrahtidnapããã®ææ¡ã«ãããšãç§ã¯colabã§è©ŠããŸããããåé¡ã¯çºçããŠããŸãããããã§èŠç¹ãèŠã€ããŠ
çããããã«ã¡ã¯ã
https://keras.io/ã®æšå¥šã«åŸã£ãŠãã¹ã¿ã³ãã¢ãã³ã®keras
ããtensorflow.keras
ã«åãæ¿ããããšããŠããŸãã
joblib
ïŒå éšã§pickle
ã䜿çšïŒã§ã·ã¹ãã ã€ã³ãã©ã¡ãŒã·ã§ã³ïŒ
- Debian 10ïŒãã¹ã¿ãŒïŒ
- Python 3.7.6
- joblib 0.14.1
- tensorflow 2.1.0
åçŸããã¹ã¯ãªããïŒ
import joblib from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense model = Sequential() model.add(Dense(1, input_dim=42, activation='sigmoid')) model.compile(optimizer='Nadam', loss='binary_crossentropy', metrics=['accuracy']) joblib.dump(model, 'model.pkl')
åºåïŒ
TypeError: can't pickle _thread.RLock objects
tensorflow.kerasã¯ããããµããŒãããŠããªããããpickleãŸãã¯joblibã䜿çšããŠãåé¡ã¯è§£æ±ºããŸããã
ãããã£ãŠãããã«å¯Ÿãã代æ¿ãœãªã¥ãŒã·ã§ã³ã¯æ¬¡ã®ãšããã§ãïŒ-
ããªãã®ã³ãŒããèæ
®ããŠïŒ-
ãã®è¡ã眮ãæããŸãïŒ-joblib.dumpïŒmodelã 'model.pkl'ïŒ
ãšïŒ-
ã¢ãã«ã®äœ¿çšãä¿åããã«ã¯ïŒ-
-----> model.saveïŒ 'new_model.h5'ïŒ
ãã®ã¢ãã«ãããŒãããå Žåã¯ã次ã䜿çšããŸãïŒ-
-----> new_model = tf.keras.models.load_modelïŒ 'new_model.h5'ïŒ
ããªãã®ã³ãŒããèæ ®ããŠïŒ-
ãã®è¡ã眮ãæããŸãïŒ-joblib.dumpïŒmodelã 'model.pkl'ïŒ
ãšïŒ-
ã¢ãã«ã®äœ¿çšãä¿åããã«ã¯ïŒ-
-----> model.saveïŒ 'new_model.h5'ïŒ
ãã®ã¢ãã«ãããŒãããå Žåã¯ã次ã䜿çšããŸãïŒ-
-----> new_model = tf.keras.models.load_modelïŒ 'new_model.h5'ïŒ
ããã¯å Žåã«ãã£ãŠã¯æ©èœããŸãããã¢ãã«ãå¥ã®é¢æ°ã®äžéšãšããŠpickleåãããŠããå Žåã¯åœ¹ã«ç«ã¡ãŸãããç§ã®å Žåãããã¯python multiprocessing
ã©ã€ãã©ãªã䜿çšããŠãããšãã«çºçããŸãã
@ Edwin-Koh1
ããã¯ãŸã åé¡ã§ããïŒ
確èªããŠãã ãããããããšãããããŸãã
Kerasã·ãŒã±ã³ã·ã£ã«ã¢ãã«ãbyteIOã³ã³ããã«ãã³ãããããšã¯å¯èœã§ããïŒ
bytes_container = BytesIO()
joblib.dump(Keras_model, bytes_container, protocol=4)
# Error
TypeError: can't pickle _thread.RLock objects
pickle.dump(Keras_model, bytes_container, protocol=4)
# Error
TypeError: can't pickle _thread.RLock objects
dill.dump(Keras_model, bytes_container, protocol=4)
# Error
TypeError: can't pickle tensorflow.python._tf_stack.StackSummary objects
ãŸãã¯äžæãã¡ã€ã«å
tempfile.TemporaryFile().write(Keras_model)
ãŸãã¯
save_model(Keras_model, bytes_container)
# Error
TypeError: expected str, bytes or os.PathLike object, not _io.BytesIO
ããã¯å®å šã«æ©èœããŸãããbase64ã䜿çšããå¿ èŠã¯ãªããããããŸãããç§ãè¡ã£ãããŒã¿ããŒã¹ã«ãã¹ãŠãä¿åãããã¹ãŠãã¡ã¢ãªå ã«ä¿åãããã£ã¹ã¯ã«è§Šããå¿ èŠã¯ãããŸããã
from io import BytesIO
import dill,base64,tempfile
#Saving Model as base64
model_json = Keras_model.to_json()
def Base64Converter(ObjectFile):
bytes_container = BytesIO()
dill.dump(ObjectFile, bytes_container)
bytes_container.seek(0)
bytes_file = bytes_container.read()
base64File = base64.b64encode(bytes_file)
return base64File
base64KModelJson = Base64Converter(model_json)
base64KModelJsonWeights = Base64Converter(Keras_model.get_weights())
#Loading Back
from joblib import load
from keras.models import model_from_json
def ObjectConverter(base64_File):
loaded_binary = base64.b64decode(base64_File)
loaded_object = tempfile.TemporaryFile()
loaded_object.write(loaded_binary)
loaded_object.seek(0)
ObjectFile = load(loaded_object)
loaded_object.close()
return ObjectFile
modeljson = ObjectConverter(base64KModelJson)
modelweights = ObjectConverter(base64KModelJsonWeights)
loaded_model = model_from_json(modeljson)
loaded_model.set_weights(modelweights)
@hanzigs
ããã¯çŽ æŽããã解決çã§ããããããšãã ãã®æ¹æ³ã§ã¯ãªããã£ãã€ã¶ãŒã®ç¶æ
ãä¿æãããªãããããã®ã¢ãã«ã®ãã¬ãŒãã³ã°ãç¶ç¶ããå Žåã«ã®ã¿æ³šæããŠãã ããã
@JohannesAck
ã¯ããæ°ããããŒã¿ã«åãããåã«ãªããã£ãã€ã¶ãŒã§ã³ã³ãã€ã«ããå¿
èŠããããŸãããæéã¯ããããŸãããã
ãã1ã€ã®æ¹æ³ã§ã¯ãmodel.saveãã¡ã¢ãªã«ä¿åããã®ã¯éåžžã«å°é£ã§ãã
ãã1ã€ã®æ¹æ³ã¯ãåæåãšã³ã³ãã€ã«ã䜿çšããŠget_configïŒïŒãšfrom_configïŒïŒãå®è¡ããæ°ããããŒã¿ã«å¯ŸããŠãã£ãããå®è¡ããå¿ èŠãããããšã§ãã
@ Edwin-Koh1
ãã®åé¡ã«é¢ããæŽæ°ããé¡ãããŸããããããšãïŒ
ãã®åé¡ã¯ãæè¿ã®ã¢ã¯ãã£ããã£ããªããããèªåçã«å€ããã®ãšããŠããŒã¯ãããŠããŸãã ãã以äžã®ã¢ã¯ãã£ããã£ãçºçããªãå Žåã¯éããããŸãã ããããšãããããŸããã
ããªãã®ã³ãŒããèæ ®ããŠïŒ-
ãã®è¡ã眮ãæããŸãïŒ-joblib.dumpïŒmodelã 'model.pkl'ïŒ
ãšïŒ-
ã¢ãã«ã®äœ¿çšãä¿åããã«ã¯ïŒ-
-----> model.saveïŒ 'new_model.h5'ïŒ
ãã®ã¢ãã«ãããŒãããå Žåã¯ã次ã䜿çšããŸãïŒ-
-----> new_model = tf.keras.models.load_modelïŒ 'new_model.h5'ïŒããã¯å Žåã«ãã£ãŠã¯æ©èœããŸãããã¢ãã«ãå¥ã®é¢æ°ã®äžéšãšããŠpickleåãããŠããå Žåã¯åœ¹ã«ç«ã¡ãŸãããç§ã®å Žåãããã¯python
multiprocessing
ã©ã€ãã©ãªã䜿çšããŠãããšãã«çºçããŸãã
@JohannesAck ãç§ã¯åæ§ã®åé¡ããããããããªããšæããŸãã GPUã§Kerasã¢ãã«ããã¬ãŒãã³ã°ããKerasAPIã䜿çšããŠTensorFlowSavedModel圢åŒã䜿çšããŠä¿åããæ°ããã»ãã·ã§ã³ã§ãªããŒããã multiprocessing
ã©ã€ãã©ãªãšstarmap
ã䜿çšããŠè€æ°ã®CPUã§äžŠè¡ããŠäºæž¬ãè©Šã¿ãŸãã TypeError: can't pickle _thread.RLock objects
ïŒãçºçããŸãã æ¯åäºæž¬é¢æ°å
ã«ã¢ãã«ãããŒãããåé¢æ°åŒã³åºãã®æåŸã«ã¢ãã«ãåé€ãããšãããã€ãã®äºæž¬ã®åŸã§ãã³ã°ããŸãã ããã§äœãèµ·ãã£ãŠããã®ãåãããŸããïŒ
å€ããªã£ããšããŠéããŸãã ããã«ã€ããŠããã«äœæ¥ãããå Žåã¯ãå床éããŠãã ããã
ç§ã®ç¥ãéããããã¯å€ãã¯ãããŸããã
2020幎8æ25æ¥ç«ææ¥ãåå5æ26åtensorflow-butler [bot] <
[email protected]>ã¯æžããïŒ
åé¡ã®è§£æ±ºã«æºè¶³ããŠããŸããïŒ
ã¯ã
https://docs.google.com/forms/d/e/1FAIpQLSfaP12TRhd9xSxjXZjcZFNXPGk4kc1-qMdv3gc6bEP90vY1ew/viewform?entry.85265664=Yes&entry.2137816233=https://github.com/tensorflow/tensorflow/issues/346
çªå·
https://docs.google.com/forms/d/e/1FAIpQLSfaP12TRhd9xSxjXZjcZFNXPGk4kc1-qMdv3gc6bEP90vY1ew/viewform?entry.85265664=No&entry.2137816233=https://github.com/tensorflow/tensorflow/issues/346â
ããªããã³ã¡ã³ãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/tensorflow/tensorflow/issues/34697#issuecomment-679941192 ã
ãŸãã¯è³Œèªã解é€ãã
https://github.com/notifications/unsubscribe-auth/AANMPP2EF3PRKBYRYHOHY3TSCOGTXANCNFSM4JSZ4QSA
ã
åé¡ã解決ãããåŸãããã¯WONTFIXã§ããïŒ
ç§ã®å Žåããã¯ã«ã¹åã¯ãã³ãŒããscikit-learnäºæã¢ãã«ãæäŸããã ãã®å€éšããŒã«ããå®è¡ãããããïŒç§ã®ã¯ã©ã¹ã¯get_clf
ã¡ãœãããæäŸããŸãïŒãåçŽã«model.save()
䜿çšããããšã¯ã§ããŸããã ç§ã®ã³ãŒãã¯ïŒã»ãŒïŒKerasäºæïŒtf.kerasã§ã¯ãªãïŒã§ãããKeras 2.3.1ïŒTF 1.15.0ïŒã®ãã¯ã«ã¹ã¯åé¡ãªãæ©èœããããããã®åé¡ãåé¿ã§ããŸããã
@mimxrt scikit-learnç°å¢å ã§SciKerasã確èªããŠhttpsïŒ //github.com/tensorflow/tensorflow/pull/39609ãç¹ã«https://github.com/tensorflow/tensorflow/pull/39609#issuecommentã確èªããŠãã ããã -683370566
ç·šéïŒåºå®ãªã³ã¯
çŸåšãç©æ¥µçã«åãçµãã§ããŸãããããŸã åé¡ãªã®ã§åéããŸãã
å€ããªã£ããšããŠéããŸãã ããã«ã€ããŠããã«äœæ¥ãããå Žåã¯ãå床éããŠãã ããã
ããã¯åã³å€±éããŸãã
ãã®åé¡ã¯ãæè¿ã®ã¢ã¯ãã£ããã£ããªããããèªåçã«å€ããã®ãšããŠããŒã¯ãããŠããŸãã ãã以äžã®ã¢ã¯ãã£ããã£ãçºçããªãå Žåã¯éããããŸãã ããããšãããããŸããã
æãåèã«ãªãã³ã¡ã³ã
ããã¯ããã¡ã€ã«ã«ä¿åããå¿ èŠã®ãªã@epetrovskiã®åçã®ä»£æ¿æ段ã§ãã
ãœãŒã¹ïŒ https ïŒ
å€åãããã¢ãã«ã«è¿œå ã§ãããšæããŸããïŒ ãããããŸããããªãå Žåã¯ãããŸããïŒ