Keras报错:层调用时输入非符号张量,求排查解决
解决Keras中ValueError: Layer dense_1 was called with an input that isn't a symbolic tensor的问题
我来帮你排查这个报错的问题,其实是两个关键细节没处理对,咱们一步步来解决:
1. 先修复Concatenate层的调用错误
你这段代码里的Concatenate用法是错的:
concat = Concatenate([flatten, aux_input])
Concatenate是Keras的层类,得先实例化(加括号),再把输入张量的列表传进去。正确写法应该是:
concat = Concatenate()([flatten, aux_input])
原来的写法直接把输入传给了类本身,返回的不是一个可计算的张量,而是一个未初始化的层对象,后面的Dense层自然接收到无效输入,就抛出了那个报错。
2. 修正模型整体构建逻辑,让辅助输入真正参与计算
看你的完整业务代码,model_inst.build_model()返回的是原模型的softmax输出,但这个原模型根本没用到你定义的aux_input辅助输入,相当于辅助输入是孤立的,没有整合到模型流程里。
你需要调整模型构建的逻辑,把辅助输入和主模型的特征拼接起来,比如:
方案一:修改build_model方法,让它支持接收辅助输入
假设build_model原本是构建主CNN部分,你可以让它返回主模型的特征层(比如Flatten之后的张量),然后在外部完成拼接:
(x_train, y_train), (x_test, y_test) = cifar10.load_data() x_train = x_train.astype('float32') x_test = x_test.astype('float32') # 生成训练和测试的辅助数据 aux_rand_train = np.random.rand(y_train.shape[0]) aux_rand_test = np.random.rand(y_test.shape[0]) model_inst = cifar10vgg() # 定义输入张量 x_train_input = Input(shape=(32,32,3)) aux_input = Input(shape=(1,)) # 获取主模型的特征输出(假设build_model现在返回Flatten后的张量,而非最终softmax) main_feature = model_inst.build_model(x_train_input) # 拼接主特征和辅助输入 concat = Concatenate()([main_feature, aux_input]) # 后续全连接层 fc1 = Dense(512, kernel_regularizer=regularizers.l2(weight_decay))(concat) fc2 = Dense(256)(fc1) # 最终输出层 output = Activation('softmax')(fc2) # 构建完整模型,输入是主输入+辅助输入 model = Model(inputs=[x_train_input, aux_input], outputs=output) # 训练时要传入对应数量的输入,验证集也要传辅助数据 model.fit(x=[x_train, aux_rand_train], y=y_train, batch_size=batch_size, steps_per_epoch=x_train.shape[0] // batch_size, epochs=maxepoches, validation_data=([x_test, aux_rand_test], y_test), callbacks=[reduce_lr, tensorboard], verbose=2)
方案二:如果不想修改build_model,就在内部整合
如果build_model是返回完整的模型结构,那你需要在build_model方法内部加入辅助输入的拼接逻辑,确保aux_input被传入并参与计算,而不是在外部孤立定义。
另外还要注意:你代码里重复定义了aux_rand = Input(shape=(1,))和aux_input = Input(shape=(1,)),这是没必要的,统一用一个输入张量即可。
内容的提问来源于stack exchange,提问作者nirvair
相关产品推荐
相关产品推荐

