Python 获得;TypeError:无法pickle'_thread.RLock';“对象”;使用pickle保存模型时

Python 获得;TypeError:无法pickle'_thread.RLock';“对象”;使用pickle保存模型时,python,keras,model,pickle,Python,Keras,Model,Pickle,我试图将我的keras模型保存到pickle文件中,但我遇到了这个错误。有什么办法?或者,保存和加载模型的更好方法是什么?我正在预测480x640灰度图像 我的代码如下: def trainModel(data): batch_size = 3 img_height = 480 img_width = 640 trainDataset = tf.keras.preprocessing.image_dataset_from_directory( data, val

我试图将我的keras模型保存到pickle文件中,但我遇到了这个错误。有什么办法?或者,保存和加载模型的更好方法是什么?我正在预测480x640灰度图像

我的代码如下:

def trainModel(data):
  batch_size = 3
  img_height = 480
  img_width = 640

  trainDataset = tf.keras.preprocessing.image_dataset_from_directory(
    data,
    validation_split=0.25,
    subset="training",
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size,
    #class_names={"nao_doentes", "doentes"}
  )

  valDataset = tf.keras.preprocessing.image_dataset_from_directory(
    data,
    validation_split=0.25,
    subset="validation",
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size,
    #class_names={"nao_doentes", "doentes"}
  )

  AUTOTUNE = tf.data.experimental.AUTOTUNE

  trainDataset = trainDataset.cache().prefetch(buffer_size=AUTOTUNE)
  valDataset = valDataset.cache().prefetch(buffer_size=AUTOTUNE)

  num_classes = 2

  model = tf.keras.Sequential([
    layers.experimental.preprocessing.Rescaling(1./255),
    layers.Conv2D(32, 3, activation='relu'),
    layers.MaxPooling2D(),
    layers.Conv2D(32, 3, activation='relu'),
    layers.MaxPooling2D(),
    layers.Conv2D(32, 3, activation='relu'),
    layers.MaxPooling2D(),
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dense(num_classes)
  ])

  model.compile(
    optimizer='adam',
    loss=tf.keras.losses.BinaryCrossentropy(),
    metrics=['accuracy']
  )

  model.fit(
    trainDataset,
    validation_data=valDataset,
    epochs=10
  )
  return model

model = trainModel(training_data)
with open('model.sav', 'wb') as f:
  pickle.dump(model, f)

with open('model.sav', 'rb') as f:
  model = pickle.load(f)

testing = np.ndarray(shape=(1, 1, 480, 640), dtype=np.float32)
image = load_img(os.path.join(test_data, "doentes/doente_6.jpg"), target_size=(480,640))
x = img_to_array(image)
x = np.expand_dims(x, axis=0)
testing = np.vstack([x])
print(model.predict(testing))

另外,当处理图像分类情况时,您是否愿意提供一些好的实践和解释来源?我是这个地区的新手,因此在搜索和链接不同来源的信息时,我会有点挣扎。

一般来说,pickle在保存pytorch、tensorflow和keras的ml模型权重时会遇到问题。要保存您的keras模型,请查看

具体而言,请尝试在keras中使用函数save and load_module:

model.save('path/to/location'))
重建模型=keras.models.load模型(“路径/目的地/位置”)

通常,pickle在保存pytorch、tensorflow和keras的ml模型重量时存在问题。要保存您的keras模型,请查看

具体而言,请尝试在keras中使用函数save and load_module:

model.save('path/to/location'))
重建模型=keras.models.load模型(“路径/目的地/位置”)