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
相关产品推荐
相关产品推荐

