TensorFlow保存图像分类模型时报错TypeError: __dict__不支持'_DictWrapper'对象
解决Keras模型保存时的
TypeError: this __dict__ descriptor does not support '_DictWrapper' objects错误 问题背景
在Windows 11系统的PyCharm开发环境中,基于CIFAR10数据集训练CNN分类模型时,训练过程正常,但执行model.save('img_classifier.model')时触发上述错误。更换IDE(从VSCode切换至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
错误原因
- 数据归一化赋值错误:代码中
testing_images, testing_images = training_images / 255, testing_images / 255一行重复赋值给testing_images,导致测试集数据被训练集归一化数据覆盖,后续模型训练、验证使用了错误的数据集,引发TensorFlow内部字典包装器异常。 - TensorFlow版本兼容性:部分新版本TensorFlow存在的bug可能触发
_DictWrapper相关的类型错误。
解决步骤
1. 修复数据归一化代码
将错误的赋值行替换为:
training_images, testing_images = training_images / 255, testing_images / 255
这行代码会正确对训练集和测试集分别做归一化处理,避免数据集混乱。
2. 调整TensorFlow版本(可选)
如果修复赋值后问题仍存在,尝试切换到稳定版本:
- 激活虚拟环境后执行:
pip uninstall tensorflow -y pip install tensorflow==2.15.0
3. 更换模型保存格式(可选)
若上述方法无效,改用其他保存格式:
- SavedModel格式:
加载时使用:model.save('img_classifier', save_format='tf')model = ker.models.load_model('img_classifier') - HDF5格式:
先安装依赖:
然后保存:pip install h5py
加载时使用:model.save('img_classifier.h5')model = ker.models.load_model('img_classifier.h5')
验证修复
修改代码后重新训练模型,执行保存操作,若未出现报错则问题解决。
内容的提问来源于stack exchange,提问作者benCombe
相关产品推荐
相关产品推荐

