Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 面向';can';t pickle _thread.rlock对象';使用pickle保存keras模型时出错_Python_Keras_Pickle - Fatal编程技术网

Python 面向';can';t pickle _thread.rlock对象';使用pickle保存keras模型时出错

Python 面向';can';t pickle _thread.rlock对象';使用pickle保存keras模型时出错,python,keras,pickle,Python,Keras,Pickle,我正在尝试使用keras构建分类器,下面是我的代码: import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, confusion_matrix from sklearn.p

我正在尝试使用keras构建分类器,下面是我的代码:

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.preprocessing import MinMaxScaler

from collections import Counter
from imblearn.over_sampling import SMOTE

from keras.models import Sequential
from keras.layers import Dense

import pickle
import joblib

import warnings
warnings.filterwarnings('ignore')

df = pd.read_csv('bankloan.csv')
df = df.dropna()
df.isna().any()
df = df.drop('Loan_ID', axis=1)
df['LoanAmount'] = (df['LoanAmount']*1000).astype(int)

pre_y = df['Loan_Status']
pre_X = df.drop('Loan_Status', axis=1)
dm_X = pd.get_dummies(pre_X)
dm_y = pre_y.map(dict(Y=1, N=0))

smote = SMOTE()
X1, y = smote.fit_sample(dm_X, dm_y)
sc = MinMaxScaler()
X = sc.fit_transform(X1)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, shuffle=True)

classifier = Sequential()
classifier.add(Dense(200, activation='relu', input_dim=X_test.shape[1]))
classifier.add(Dense(400, activation='relu'))
classifier.add(Dense(4, activation='relu'))
classifier.add(Dense(1, activation='sigmoid'))
classifier.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
classifier.fit(X_train, y_train, batch_size=20, epochs=100, verbose=0)

filename = 'loan_model.pkl'
joblib.dump(classifier, filename)

这就是我试图做的,模型非常好,但在最后一步,当我试图保存模型时,它显示以下错误:


TypeError:无法pickle _thread.RLock对象

在pickle模型之前运行以下代码:

import types
import tempfile
import keras.models

def make_keras_picklable():
    def __getstate__(self):
        model_str = ""
        with tempfile.NamedTemporaryFile(suffix='.hdf5', delete=True) as fd:
            keras.models.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 = keras.models.load_model(fd.name)
        self._dict_ = model._dict_


    cls = keras.models.Model
    cls.__getstate__ = __getstate__
    cls.__setstate__ = __setstate__

make_keras_picklable()

看一看,这似乎是一个图书馆的问题,没有什么可以帮助的是没有帮助的。事实上,因为这个问题并没有在keras方面得到解决(tbh,我怀疑它永远不会得到解决,考虑到keras正在被完全集成到TF中,我不认为TF.keras是可以挑选的)