TensorFlow中Sequential模型输入未定义的ValueError问题求助
问题:提取Keras模型编码器时触发ValueError
背景
我实现了包含Dense编码器层和自定义RBF层的网络,此前运行正常。为绘制模型安装/更新pydot、TensorFlow和Keras后代码无法运行,降级TensorFlow至2.16.1后训练恢复正常,但提取编码器时报错。
自定义RBF层代码
from tensorflow.keras.layers import Layer from tensorflow.keras import backend as K import tensorflow as tf class RBFLayer(Layer): def __init__(self, units, gamma, **kwargs): super(RBFLayer , self).__init__(**kwargs) self.units = units self.gamma = K.cast_to_floatx(gamma) def build(self, input_shape): self.mu = self.add_weight(name='mu', shape=(int(input_shape[1]), self.units), initializer='uniform', trainable=True) super(RBFLayer, self).build(input_shape) def call(self, inputs): diff = K.expand_dims(inputs) - self.mu l2 = K.sum(K.pow(diff, 2), axis=1) res = K.exp(-1 * self.gamma * l2) return res def compute_output_shape(self, input_shape): return (input_shape[0], self.units)
Keras模型实现代码
from modules_files.Feature_Selection_module import * import keras import tensorflow as tf from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras import Sequential, Model from tensorflow.keras import regularizers from tensorflow.keras.callbacks import Callback, EarlyStopping from RBFLayer import RBFLayer import os def get_neural_network_model2(**kwargs): X_train = kwargs['X_train'] y_train = kwargs['y_train'] epochs = kwargs['epochs'] verbose = kwargs['verbose'] SEED = kwargs['SEED'] input_size = X_train.shape[1] output_size = y_train.shape[1] keras.utils.set_random_seed(SEED) tf.config.experimental.enable_op_determinism() model = Sequential() model.add(Dense(input_size, activation='relu', kernel_regularizer = regularizers.L1L2(l1=1e-5, l2=1e-4), bias_regularizer = regularizers.L2(1e-4), activity_regularizer = regularizers.L2(1e-5)) ) model.add(RBFLayer(output_size, 0.5)) print(" Compile the model") model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy']) print(" Train the model") model.fit(X_train, y_train, epochs=epochs, verbose=verbose, batch_size=1000) return model
错误信息
执行encoded_model = Model(inputs=NN_model.input, outputs=NN_model.layers[0].output)时触发:
Traceback (most recent call last): File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevconsole.py", line 364, in runcode coro = func() File "<input>", line 1, in <module> File "/Users/marinopavone/PycharmProjects/RBF_layer_PORCO_DIO/modules_files/Classifiier_function.py", line 186, in get_encoder_model encoded_model = Model(inputs=NN_model.input, outputs=NN_model.layers[0].output) File "/Users/marinopavone/PycharmProjects/Degradation_Simulator/.venv/lib/python3.9/site-packages/keras/src/ops/operation.py", line 228, in input return self._get_node_attribute_at_index(0, "input_tensors", "input") File "/Users/marinopavone/PycharmProjects/Degradation_Simulator/.venv/lib/python3.9/site-packages/keras/src/ops/operation.py", line 259, in _get_node_attribute_at_index raise ValueError( ValueError: The layer sequential has never been called and thus has no defined input.
当前环境
- PyCharm 2023.3.4(专业版)
- TensorFlow 2.16.1
- macOS Sonoma 14.3(M3芯片)
已尝试方案
- 卸载重装TensorFlow和独立Keras
- 更换Model导入路径
- 多次重启PyCharm和电脑
解决方案
原因
TensorFlow 2.x的Sequential模型中,input属性仅在两种情况下会被初始化:一是构建模型时显式指定input_shape;二是模型被实际调用过(如执行predict、call方法)。尽管你执行了fit,但版本变更后的内部机制可能导致输入节点未被正确记录。
修复方法
方法1:构建模型时显式指定输入形状
在第一个Dense层中添加input_shape参数,直接初始化模型输入节点:
model = Sequential() model.add(Dense(input_size, activation='relu', kernel_regularizer = regularizers.L1L2(l1=1e-5, l2=1e-4), bias_regularizer = regularizers.L2(1e-4), activity_regularizer = regularizers.L2(1e-5), input_shape=(input_size,) # 新增该行 ) )
方法2:提取编码器前手动调用模型一次
用符合输入形状的张量触发模型调用,初始化输入节点:
# 生成与训练数据同维度的测试张量 dummy_input = tf.random.normal(shape=(1, X_train.shape[1])) # 调用模型 NN_model(dummy_input) # 再提取编码器 encoded_model = Model(inputs=NN_model.input, outputs=NN_model.layers[0].output)
方法3:改用函数式API构建模型
函数式API天生适配中间层输出提取场景,避免Sequential模型的输入节点问题:
def get_neural_network_model2(**kwargs): X_train = kwargs['X_train'] y_train = kwargs['y_train'] epochs = kwargs['epochs'] verbose = kwargs['verbose'] SEED = kwargs['SEED'] input_size = X_train.shape[1] output_size = y_train.shape[1] keras.utils.set_random_seed(SEED) tf.config.experimental.enable_op_determinism() # 函数式API构建 inputs = tf.keras.Input(shape=(input_size,)) encoder = Dense(input_size, activation='relu', kernel_regularizer = regularizers.L1L2(l1=1e-5, l2=1e-4), bias_regularizer = regularizers.L2(1e-4), activity_regularizer = regularizers.L2(1e-5))(inputs) outputs = RBFLayer(output_size, 0.5)(encoder) model = Model(inputs=inputs, outputs=outputs) print(" Compile the model") model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy']) print(" Train the model") model.fit(X_train, y_train, epochs=epochs, verbose=verbose, batch_size=1000) # 直接返回编码器模型 encoder_model = Model(inputs=inputs, outputs=encoder) return model, encoder_model
内容的提问来源于stack exchange,提问作者marino pavone
相关产品推荐
相关产品推荐

