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

使用DenseNet121生成显著性图时出现'History对象不可调用'错误

解决显著性图生成时的TypeError: 'History' object is not callable问题

问题场景

使用DenseNet121完成训练后,尝试生成显著性图时触发如下错误:

TypeError: 'History' object is not callable

训练代码片段

for train_index, val_index in skf.split(X_train, y_train):
    X_train_fold, X_val_fold = X_train[train_index], X_train[val_index]
    y_train_fold, y_val_fold = y_train[train_index], y_train[val_index]
    i = i+1;
    print("Fold:",i)
    DenseNet121 = model.fit(datagen.flow(X_train_fold, y_train_fold, batch_size=32), epochs=10, verbose=1,validation_data=(X_val_fold,y_val_fold) ,callbacks=[ es_callback])

显著性图生成代码片段

# Function to generate saliency maps
def generate_saliency_map(model, X, y):
    # Convert numpy arrays to TensorFlow tensors
    X = tf.convert_to_tensor(X)
    y = tf.convert_to_tensor(y)
    X = tf.expand_dims(X, axis=0)
    with tf.GradientTape() as tape:
        tape.watch(X)
        output_tensor = model(X)
        output_class = tf.math.argmax(output_tensor, axis=-1)
        one_hot = tf.one_hot(output_class, depth=4)
        loss = tf.reduce_sum(output_tensor * one_hot, axis=-1)
    grads = tape.gradient(loss, X)
    saliency_map = tf.reduce_max(tf.abs(grads), axis=-1)
    return saliency_map
# Generate saliency maps for a few test images
for i in range(5):
    # print(X_test[i].shape)
    saliency_map = generate_saliency_map(DenseNet121, X_test[i], y_test[i])
    plt.imshow(saliency_map, cmap='gray')
    plt.show()

错误原因

model.fit()方法返回的是History对象,它仅用于记录训练过程中的损失、指标变化等信息,并非训练好的模型本身。你将这个History对象赋值给了变量DenseNet121,后续调用generate_saliency_map(DenseNet121, ...)时,实际是在尝试调用一个不可执行的History对象,因此触发报错。

解决方案

  1. 修正训练代码:用独立变量存储训练记录,保留原model变量指向训练好的模型:
for train_index, val_index in skf.split(X_train, y_train):
    X_train_fold, X_val_fold = X_train[train_index], X_train[val_index]
    y_train_fold, y_val_fold = y_train[train_index], y_train[val_index]
    i = i+1;
    print("Fold:",i)
    # 用history变量存储训练记录,原model变量仍指向训练好的模型
    history = model.fit(datagen.flow(X_train_fold, y_train_fold, batch_size=32), epochs=10, verbose=1,validation_data=(X_val_fold,y_val_fold) ,callbacks=[ es_callback])
  1. 修正显著性图生成调用:传入训练好的model而非History对象:
for i in range(5):
    saliency_map = generate_saliency_map(model, X_test[i], y_test[i])
    plt.imshow(saliency_map, cmap='gray')
    plt.show()
  1. 额外优化(可选):生成函数中的y参数未实际使用,可移除或改为基于真实标签计算损失(当前代码基于模型预测类别计算):
# 移除未使用的y参数,或传入真实标签替换output_class
def generate_saliency_map(model, X):
    X = tf.convert_to_tensor(X)
    X = tf.expand_dims(X, axis=0)
    with tf.GradientTape() as tape:
        tape.watch(X)
        output_tensor = model(X)
        output_class = tf.math.argmax(output_tensor, axis=-1)
        one_hot = tf.one_hot(output_class, depth=4)
        loss = tf.reduce_sum(output_tensor * one_hot, axis=-1)
    grads = tape.gradient(loss, X)
    saliency_map = tf.reduce_max(tf.abs(grads), axis=-1)
    return saliency_map

内容的提问来源于stack exchange,提问作者Rezuana Haque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:55:27