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

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>

错误原因

  1. HyperModel类实现不符合规范:继承HyperModel后,需实现标准的build方法(而非自定义build_model),且该方法需接收Tuner自动传入的hp参数,不能手动创建HyperParameters实例。
  2. 类实例化逻辑错误:CNNHyperModel无需传入HyperParameters对象,该对象由Keras Tuner内部管理。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:01:09