μμ€ν μ 보
λͺ¨λλ€ μλ ! μ΄κ²μ λμ 첫 λ²μ§Έ κ²μλ¬Όμ΄λ―λ‘ λ΄κ° λκ°λ₯Ό λμΉ κ²½μ° λλ₯Ό μ©μνμμμ€. κ·Έλμ μ μ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ λ€μ€ 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
κ°μ Έμ¨ ν μ± μμμ ν λ²λ§ νΈμΆ ν μ μμ΅λλ€. ν¨μλ₯Ό μ€ννλ©΄ __getstate__()
λ° __setstate__()
λ κ°μ§ μλ‘μ΄ λ©μλκ° tensorflow.keras.models.Model
ν΄λμ€μ μΆκ°λλ―λ‘ μ
λ°μ΄νΈ λ tf.keras Model ν΄λμ€μ λ©€λ²λ₯Ό νΌν΄ ν λλ§λ€ μλν©λλ€. μ¦. μμ μ λͺ¨λΈ.
λ€μμ νμΌμ μ μ₯ν νμκ°μλ @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://docs.python.org/3/library/pickle.html#object.__reduce__
μ΄κ²μ΄ λͺ¨λΈμ μΆκ° λ μμμ κ² κ°μ΅λκΉ? μ΄κ²μ΄ μλνμ§ μλ κ²½μ°κ° μμ΅λκΉ?
Sequential ν΄λμ€μμ μ νν μμλ λ κ°μ§ μμ±μ΄μλ κ² κ°μ΅λλ€. μ΄ μμ μ¬νμ μ μκ²λ ν¨κ³Όμ μ΄μμ΅λλ€.
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, μΌκ° λ²μ μΌλ‘ colabμμ μλν΄ λ³΄μκ³ λ¬Έμ λ₯Ό μ¬ν ν μμμμ΅λλ€. μ¬κΈ° μμ μμ μ μ°ΎμΌ
TF λ²μ 2.2, μΌκ° λ²μ μΌλ‘ colabμμ μλν΄ λ³΄μκ³ λ¬Έμ λ₯Ό μ¬ν ν μμμμ΅λλ€. μ¬κΈ° μμ μμ μ μ°ΎμΌ
keras λͺ¨λΈμ μ νν μ μμ§λ§ tf.kerasλ μ νν μ μμΌλ―λ‘ μ΄μ λν λ체 μ루μ
μ μλ μ½λλ₯Ό μ°Έμ‘°νλ κ²μ
λλ€
colab λ
ΈνΈλΆμ 보μκ³ νμν λ³κ²½ μ¬νμ μλμ κ°μ μ½λλ₯Ό 볡μ¬νλ©΄ μ€λ₯ ν΄κ²°μ΄ μλ£λ©λλ€
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)
__name__ == '__main__'μΈ κ²½μ° :
λ³Έκ΄()
@ Edwin-Koh1
@lahsrahtidnap μ μ μμ λ°λΌ μ¬κΈ° μμ μμ μ μ°ΎμΌ
μλ νμΈμ μ¬λ¬λΆ,
https://keras.io/ μ κΆμ₯ μ¬νμ λ°λΌ λ 립 μ€ν νkeras
μμtensorflow.keras
λ‘ μ ννλ €κ³ ν©λλ€ .
joblib
(λ΄λΆμμpickle
μ¬μ© ) μ ν¨κ»μμ€ν μ 보:
- Debian 10 (λ²μ€ν°)
- νμ΄μ¬ 3.7.6
- joblib 0.14.1
- ν μ νλ‘μ° 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
pickle λλ joblibλ₯Ό μ¬μ©νλ©΄ tensorflow.kerasκ°μ΄λ₯Ό μ§μνμ§ μμΌλ―λ‘ λ¬Έμ κ° ν΄κ²°λμ§ μμ΅λλ€.
λ°λΌμ μ΄μ λν λ체 μ루μ
μ λ€μκ³Ό κ°μ΅λλ€.-
μ½λ κ³ λ € :-
λ€μ μ€μ λ°κΏλλ€.-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')
μ΄κ²μ μ΄λ€ κ²½μ°μλ μλνμ§λ§ λͺ¨λΈμ΄ λ€λ₯Έ ν¨μμ μΌλΆλ‘ νΌν΄λλ©΄ λμμ΄λμ§ μμ΅λλ€. μ κ²½μ°μλ python multiprocessing
λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν λ λ°μν©λλ€.
@ Edwin-Koh1
μ΄κ²μ΄ μ¬μ ν λ¬Έμ μ
λκΉ?
νμΈν΄μ£ΌμΈμ. κ°μ¬ν©λλ€!
Keras Sequential Modelμ 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)
ν
μ΄κ²μ μ’μ ν΄κ²°μ±
μ
λλ€. κ°μ¬ν©λλ€. μ΄ λ°©λ²μ μ΅ν° λ§μ΄μ μνλ₯Ό 보쑴νμ§ μμΌλ―λ‘μ΄ λͺ¨λΈμ κ³μ νμ΅νλ €λ κ²½μ°μλ§μ£Όμνμμμ€.
νν
μ, μλ‘μ΄ λ°μ΄ν°μ λ§μΆκΈ° μ μ μ΅μ ν νλ‘κ·Έλ¨μΌλ‘ μ»΄νμΌν΄μΌν©λλ€. μκ°μ΄ λ§μ΄ κ±Έλ¦¬μ§ μμμΌν©λλ€.
λ€λ₯Έ λ°©λ²μΌλ‘ model.saveλ λ©λͺ¨λ¦¬μ μ μ₯νκΈ°κ° λ§€μ° μ΄λ ΅μ΅λλ€.
λ λ€λ₯Έ λ°©λ²μ μ΄κΈ°νλ₯Ό ν΅ν΄ 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')μ΄κ²μ μ΄λ€ κ²½μ°μλ μλνμ§λ§ λͺ¨λΈμ΄ λ€λ₯Έ ν¨μμ μΌλΆλ‘ νΌν΄λλ©΄ λμμ΄λμ§ μμ΅λλ€. μ κ²½μ°μλ python
multiprocessing
λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν λ λ°μν©λλ€.
@JohannesAck , λΉμ·ν λ¬Έμ κ°μμ μ μμ΅λλ€. GPUμμ Keras λͺ¨λΈμ νλ ¨μν€κ³ , Keras APIλ₯Ό μ¬μ©νμ¬ TensorFlow SavedModel νμμ μ¬μ©νμ¬ μ μ₯νκ³ , μ μΈμ
μμ λ€μλ‘λνκ³ , 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/34697
μλ
https://docs.google.com/forms/d/e/1FAIpQLSfaP12TRhd9xSxjXZjcZFNXPGk4kc1-qMdv3gc6bEP90vY1ew/viewform?entry.85265664=No&entry.2137816233=https://github.com/tensorflow/tensorflow/issues/34697β
λκΈμ λ¬μ κΈ° λλ¬Έμ μμ ν κ²μ λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ³ GitHubμμ νμΈνμΈμ.
https://github.com/tensorflow/tensorflow/issues/34697#issuecomment-679941192 ,
λλ ꡬλ μ·¨μ
https://github.com/notifications/unsubscribe-auth/AANMPP2EF3PRKBYRYHOHY3TSCOGTXANCNFSM4JSZ4QSA
.
μ΄μκ° μ’ κ²° λ ν WONTFIXμ λκΉ?
λ΄ κ²½μ°μλ μ½λκ° scikit-learn νΈν λͺ¨λΈμ μ 곡νλ μΈλΆ λꡬμμ νΌν΄ λ§μ΄ μνλκΈ° λλ¬Έμ λ¨μν model.save()
λ₯Ό μ¬μ©ν μ μμ΅λλ€ (λ΄ ν΄λμ€λ get_clf
λ©μλλ₯Ό μ 곡ν¨). λ΄ μ½λκ° (κ±°μ) Keras νΈν (tf.keras μλ)μ΄κ³ Keras 2.3.1 (TF 1.15.0) νΌν΄μ΄ λ¬Έμ μμ΄ μλνλ―λ‘ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
λΉμ μ΄ scikit λ°°μΈ ENV λ΄ Keras λͺ¨λΈμ μ¬μ©νκ³ μνλ κ²½μ° @mimxrt, νμΈνμκΈ° λ°λλλ€ SciKerasμ (μ 체 κ³΅κ° : λλ μ μ). Keras κ°μ²΄λ₯Ό μ ν κ°λ₯νκ² λ§λλ λ°©λ²μ μ°Ύκ³ μλ€λ©΄ https://github.com/tensorflow/tensorflow/pull/39609 , νΉν https://github.com/tensorflow/tensorflow/pull/39609#issuecommentλ₯Ό νμΈ
νΈμ§ : κ³ μ λ§ν¬
μ§κΈμ μ κ·Ήμ μΌλ‘ μμ νκ³ μμ§ μμ§λ§ μ¬μ ν λ¬Έμ μ΄λ―λ‘ μ¬κ°ν©λλ€.
λΆμ€ μνλ‘ μ’ λ£λ©λλ€. μ΄ μμ μ κ³μνλ €λ©΄ λ€μμ¬μμμ€.
μ΄κ²μ λ€μ λ©μΆ κ²μ λλ€.
μ΄ λ¬Έμ λ μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ€λλ κ²μΌλ‘ νμλμμ΅λλ€. λ μ΄μ νλμ΄ λ°μνμ§ μμΌλ©΄ νμλ©λλ€. κ°μ¬ν©λλ€.
κ°μ₯ μ μ©ν λκΈ
λ€μμ νμΌμ μ μ₯ν νμκ°μλ @epetrovski μ λ΅λ³μ λν λμμ λλ€.
μΆμ² : https://docs.python.org/3/library/pickle.html#object.__reduce__
μ΄κ²μ΄ λͺ¨λΈμ μΆκ° λ μμμ κ² κ°μ΅λκΉ? μ΄κ²μ΄ μλνμ§ μλ κ²½μ°κ° μμ΅λκΉ?