module.save()错误'TypeError:此__dict__描述符不支持'_DictWrapper'对象'

问题描述 投票:0回答:2

我正在关注 Youtube 上的机器学习图像分类教程。我尝试使用张量流保存深度学习模块时不断收到标题所示的错误。

我在 Windows 11 上使用 PyCharm。

这是我的代码...

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras as ker

(training_images, training_labels), (testing_images, testing_labels) = ker.datasets.cifar10.load_data()
testing_images, testing_images = training_images / 255, testing_images / 255

class_names = ['Plane', 'Car', 'Bird', 'Cat', 'Deer', 'Dog', 'Frog', 'Horse', 'Ship', 'Truck']

for i in range(16):
    plt.subplot(4, 4, i+1)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(training_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[training_labels[i][0]])

plt.show()

training_images = training_images[:20000]
training_labels = training_labels[:20000]
testing_images = testing_images[:4000]
testing_labels = testing_labels[:4000]

#Model
model = ker.models.Sequential()
model.add(ker.layers.Conv2D(32, (3,3), activation='relu', input_shape=(32,32,3)))
model.add(ker.layers.MaxPooling2D((2,2)))
model.add(ker.layers.Conv2D(64, (3,3), activation='relu'))
model.add(ker.layers.MaxPooling2D((2,2)))
model.add(ker.layers.Conv2D(64, (3,3), activation='relu'))
model.add(ker.layers.Flatten())
model.add(ker.layers.Dense(64, activation='relu'))
model.add(ker.layers.Dense(10, activation='softmax'))

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

model.fit(training_images, training_labels, epochs=1, validation_data=(testing_images, testing_labels))

loss, accuracy = model.evaluate(testing_images, testing_labels)
print(f"Loss: {loss}")
print(f"Accuracy: {accuracy}")

model.save('img_classifier.model')

#model = ker.models.load_model()

输出...

C:\img_classifier\venv\Scripts\python.exe 
C:\img_classifier\main.py 
625/625 [==============================] - 15s 23ms/step - loss: 2.1824 - accuracy: 0.2874 - val_loss: 2.3014 - val_accuracy: 0.1047
125/125 [==============================] - 1s 8ms/step - loss: 2.3014 - accuracy: 0.1047
Loss: 2.30141019821167
Accuracy: 0.10474999994039536
WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op, _jit_compiled_convolution_op, _jit_compiled_convolution_op, _update_step_xla while saving (showing 4 of 4). These functions will not be directly callable after loading.
Traceback (most recent call last):
  File "C:\Users\{user}\PycharmProjects\img_classifier\main.py", line 47, in <module>
    model.save('img_classifier.model')
  File "C:\Users\{user}\AppData\Roaming\Python\Python311\site-packages\keras\utils\traceback_utils.py", line 70, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "C:\Users\{user}\AppData\Roaming\Python\Python311\site-packages\tensorflow\python\trackable\data_structures.py", line 823, in __getattribute__
    return super().__getattribute__(name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: this __dict__ descriptor does not support '_DictWrapper' objects

Process finished with exit code 1

我尝试过更改 IDE,最初我使用的是 VSCode,但错误更多,然后我切换到 PyCharm,这是唯一持续存在的错误。如您所见,训练模块的代码没有问题,但之后我无法保存模块。

我该如何解决这个问题?

python tensorflow deep-learning pycharm
2个回答
13
投票

你能检查一下安装了哪个版本的包wrapt吗?
我使用 tf2onnx 进行模型优化时遇到了同样的问题。问题不知从何而来,因为相同的代码几天前才工作。
我将问题归结为一个未冻结的依赖项(我认为是在张量流中): 你应该可以通过安装 1.14.1 版本的wrapt 来解决这个问题,而tensorflow 会默认安装最新的1.15.0 版本。

pip install wrapt==1.14.1

如果我能帮助您,我会很高兴。

作为替代解决方案,您可以将环境变量 WRAPT_DISABLE_EXTENSIONS 设置为 true (在导入wrapt模块之前)。 这是来自wrapt 开发人员在wrapt github 存储库上的问题中的内容。
实际上有几个用户遇到了这个问题。在tensorflow repo上这个问题是关于你的错误,到目前为止的解决方案是添加wrapt<1.15 as requirement in the current tf nightlys.

背景:

我在 Databricks 环境中使用 tf2onnx,通过将 tf 模型转换为 onnx 来优化它们。遇到同样的问题,满足以下要求:

  • opencv-python==4.7.0.68
  • 分段模型==1.0.1
  • 张量流==2.7.4
  • numpy==1.24.2
  • tensorflow-addons==0.15.0
  • 熊猫==1.3.5
  • 枕头==9.4.0
  • scikit-图像==0.18.3
  • tqdm==4.62.3
  • 火==0.5.0
  • tf2onnx==1.12.1
File "/databricks/conda/envs/mlflow-.../lib/python3.8/site-packages/tensorflow/python/training/tracking/data_structures.py", line 828, in __getattribute__
        return super(_DictWrapper, self).__getattribute__(name)
    TypeError: this __dict__ descriptor does not support '_DictWrapper' objects

通过添加要求wrapt==1.14.1我能够解决这个问题:

wrapt==1.14.1

0
投票

对于tensorflow 2.16.1也会出现此错误。 使用python 3.10版本解决。似乎 python 3.12 中的所有 tensorflow 版本都会出现错误。

© www.soinside.com 2019 - 2024. All rights reserved.