Keras Tuner报错TypeError:输入应为张量而非HyperParameters对象
问题分析与修复:Keras Tuner触发TypeError错误
问题描述
自定义input_size和output_size构建深层神经网络时,运行Keras Tuner环节触发以下错误:
TypeError: Inputs to a layer should be tensors. Got: <keras_tuner.engine.hyperparameters.HyperParameters object at 0x000001650C5DCE50>
错误原因
- HyperModel类实现不符合规范:继承
HyperModel后,需实现标准的build方法(而非自定义build_model),且该方法需接收Tuner自动传入的hp参数,不能手动创建HyperParameters实例。 - 类实例化逻辑错误:
CNNHyperModel无需传入HyperParameters对象,该对象由Keras Tuner内部管理。 - Tuner初始化参数错误:
RandomSearch的hypermodel参数应传入HyperModel类实例,而非提前构建好的模型,否则会导致超参数对象被错误传入网络层。
修复方案及修正代码
核心修正要点
- 将自定义
build_model替换为HyperModel要求的build方法,接收hp作为参数。 - 通过类的
__init__方法传入input_size和output_size,让模型构建时能访问这两个参数。 - 优化器部分结合超参数
lr,确保学习率配置生效。 - 输出层激活函数根据任务类型调整(多分类用
softmax)。
修正后的完整代码
from tensorflow import keras from tensorflow.keras import Sequential from tensorflow.keras.layers import Dense, Dropout import keras_tuner from kerastuner import HyperModel class CNNHyperModel(HyperModel): def __init__(self, input_size, output_size): self.input_size = input_size self.output_size = output_size def call_existing_code(self, units, activation, dropout, layers, optimizer, loss): model = Sequential() model.add(Dense(units=units, input_dim=self.input_size, activation=activation)) for i in range(layers): model.add(Dense(units=units, activation=activation)) if dropout: model.add(Dropout(rate=0.25)) # 多分类任务建议用softmax激活函数 model.add(Dense(self.output_size, activation="softmax")) model.compile( optimizer=optimizer, loss=loss, metrics=["accuracy"], ) return model def build(self, hp): units = hp.Int("units", min_value=32, max_value=512, step=32) activation = hp.Choice("activation", ["relu", "tanh"]) dropout = hp.Boolean("dropout") layers = hp.Int('layers', 2, 6) lr = hp.Float("lr", min_value=1e-4, max_value=1e-2, sampling="log") loss = hp.Choice("loss", ['sparse_categorical_crossentropy', 'categorical_crossentropy']) # 绑定学习率到优化器 optimizer = hp.Choice("optimizer", [ keras.optimizers.Adam(learning_rate=lr), keras.optimizers.RMSprop(learning_rate=lr) ]) model = self.call_existing_code( units=units, activation=activation, dropout=dropout, layers=layers, optimizer=optimizer, loss=loss) return model input_size = 11 output_size = 8 # 实例化HyperModel并传入自定义尺寸参数 hypermodel = CNNHyperModel(input_size, output_size) tuner = keras_tuner.RandomSearch( hypermodel=hypermodel, objective="val_accuracy", max_trials=3, executions_per_trial=2, overwrite=True, directory="my_dir", ) tuner.search_space_summary()
内容的提问来源于stack exchange,提问作者Relative0
相关产品推荐
相关产品推荐

