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

Keras3升级后keras.backend.function属性缺失问题咨询

问题

从Keras 2升级到Keras 3后,原Keras 2中可用的keras.backend.function函数找不到替代方案,官方文档也无相关说明,运行以下代码时触发AttributeError: module 'keras.backend' has no attribute 'function'错误:

import numpy as np

import tensorflow
import keras
from keras import layers


epoch_step = 0
num_classes = 10
input_shape = (28, 28, 1)

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255

x_train = np.expand_dims(x_train, -1)
x_test = np.expand_dims(x_test, -1)

x_100 = np.concatenate([x_train[(y_train == 1)[:]][:50], x_train[(y_train == 9)[:]][:50]])    

y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)


model = keras.Sequential(
    [
        keras.Input(shape=input_shape),
        layers.Conv2D(32, kernel_size=(3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(32, 32, 3)),  
        layers.Conv2D(32, kernel_size=(3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'),  
        layers.MaxPooling2D(pool_size=(2, 2)),
        layers.Conv2D(64, kernel_size=(3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'),  
        layers.Conv2D(64, kernel_size=(3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'),
        layers.MaxPooling2D(pool_size=(2, 2)),
        layers.Flatten(),
        layers.Dropout(0.5),
        layers.Dense(20, activation='relu', kernel_initializer='he_uniform'),
        layers.Dense(num_classes, activation='softmax'),
    ]
)


class outs1(keras.callbacks.Callback):

    def on_batch_end(self, batch, logs={}):          
               
        from keras import backend as K

        if batch % 20 == 0:

            inp = model.input
            outputs = [layer.output for layer in model.layers]
            functors = [K.function([inp], [out]) for out in outputs]


callbacks_list = [outs1()]

batch_size = 64
epochs = 30

model(keras.Input(shape=input_shape))

model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])

model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, validation_data=(x_test, y_test), verbose=1, callbacks=callbacks_list)

触发的错误信息:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[10], line 18
     14 opt = keras.optimizers.Adam(learning_rate=0.000003) #lr 0.000005 -> ~3min | lr 0.000001 -> >20min | lr lr_schedule: (0.000005; 10000; 0.9) -> ~10min | lr lr_schedule: (0.000005; 10000; 0.95) -> ~8min
     16 model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
---> 18 model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, validation_data=(x_test, y_test), verbose=1, callbacks=callbacks_list)

File ~/miniconda3/envs/PhD_1/lib/python3.11/site-packages/keras/src/utils/traceback_utils.py:123, in filter_traceback.<locals>.error_handler(*args, **kwargs)
    120     filtered_tb = _process_traceback_frames(e.__traceback__)
    121     # To get the full stack trace, call:
    122     # `keras.config.disable_traceback_filtering()`
--> 123     raise e.with_traceback(filtered_tb) from None
    124 finally:
    125     del filtered_tb

Cell In[9], line 27
     25 inp = model.input
     26 outputs = [layer.output for layer in model.layers]
---> 27 functors = [K.function([inp], [out]) for out in outputs]


Cell In[9], line 27
     25 inp = model.input
     26 outputs = [layer.output for layer in model.layers]
---> 27 functors = [K.function([inp], [out]) for out in outputs]


AttributeError: module 'keras.backend' has no attribute 'function'

解决方案

keras.backend.function在Keras 3中已被移除,有两种可靠的替代方案:

1. 使用Keras Model类构建特征提取器(官方推荐)

直接通过keras.Model将原模型的输入和目标输出层封装成可调用对象,逻辑清晰且符合Keras 3的设计规范:

# 替代原K.function的代码
inp = model.input
outputs = [layer.output for layer in model.layers]
# 构建新Model,输入为原模型输入,输出为各层的输出
feature_extractor = keras.Model(inputs=inp, outputs=outputs)
# 调用时直接传入数据即可获取所有层的输出
layer_outputs = feature_extractor(x_100)  # x_100为你的输入数据

2. 使用后端原生函数(以TensorFlow为例)

如果你的Keras后端是TensorFlow,可以直接用tf.function封装计算逻辑,和原K.function的使用方式接近:

import tensorflow as tf

inp = model.input
outputs = [layer.output for layer in model.layers]

@tf.function
def get_layer_outputs(input_data):
    return [tf.identity(out) for out in outputs]

# 调用获取输出
layer_outputs = get_layer_outputs(x_100)

修改后的回调函数示例

将原回调类中的代码替换为官方推荐的Model方案:

class outs1(keras.callbacks.Callback):
    def on_batch_end(self, batch, logs={}):          
        if batch % 20 == 0:
            inp = model.input
            outputs = [layer.output for layer in model.layers]
            # 用Model替代K.function
            feature_extractor = keras.Model(inputs=inp, outputs=outputs)
            # 取训练集中的少量数据测试输出
            test_input = x_train[:10]
            layer_outputs = feature_extractor(test_input)
            # 可添加输出处理逻辑,比如打印各层形状
            for idx, out in enumerate(layer_outputs):
                print(f"Layer {idx} output shape: {out.shape}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:23:17