You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因

  1. 数据归一化赋值错误:代码中testing_images, testing_images = training_images / 255, testing_images / 255一行重复赋值给testing_images,导致测试集数据被训练集归一化数据覆盖,后续模型训练、验证使用了错误的数据集,引发TensorFlow内部字典包装器异常。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 09:15:41