使用RandomizedSearchCV寻优神经网络参数时遇类型转换错误求助
问题排查与解决方案
核心错误分析
你的代码存在两个关键问题,直接导致了张量转换错误:
冗余且错误的激活函数赋值
在binary_nn_builder函数中,你手动尝试将activation变量替换为keras.activations.tanh(x)或keras.activations.relu(x),但变量x从未定义,且这部分代码完全多余——你已经在Dense层参数中指定了激活函数,手动赋值会把原本的字符串类型激活函数名变成无效的张量对象,引发模型编译时的数据类型冲突。输出层激活函数逻辑错误
二分类任务的输出层必须使用sigmoid激活函数,才能让输出值落在[0,1]区间,匹配binary_crossentropy损失函数的要求。你现在将输出层激活函数与隐藏层设为一致的tanh或relu,不仅逻辑错误,还会引发数值范围不匹配导致的张量转换问题。
修正后的完整代码
import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Input, Dense from tensorflow.keras.optimizers import Adam from sklearn.model_selection import RandomizedSearchCV from tensorflow.keras.wrappers.scikit_learn import KerasClassifier def binary_nn_builder(units, activation): model = Sequential() model.add(Input(shape=x_train_norm.shape[1])) # 隐藏层使用指定的激活函数 model.add(Dense(units, kernel_initializer='normal', activation=activation)) model.add(Dense(units, kernel_initializer='normal', activation=activation)) # 输出层固定用sigmoid适配二分类任务 model.add(Dense(1, kernel_initializer='normal', activation='sigmoid')) optimizer = Adam(learning_rate=0.01) # 新版Keras中lr参数已替换为learning_rate model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy']) return model classifier_search = KerasClassifier(build_fn=binary_nn_builder, batch_size=22) parameters = { "activation": ['tanh', 'relu'], "units": np.arange(4, 20, 1).tolist() } # 确保输入数据为有效float32类型 x_train_norm = np.asarray(x_train_norm).astype(np.float32) y_train = np.asarray(y_train).astype(np.float32) rnd_search_cv = RandomizedSearchCV( estimator=classifier_search, param_distributions=parameters, n_iter=20, cv=3, verbose=0, n_jobs=-1 ) rnd_search_cv.fit(x_train_norm, y_train, verbose=0, epochs=100)
额外注意事项
- 检查
x_train_norm和y_train是否存在缺失值或非数值类型数据,可通过np.isnan(x_train_norm).any()验证,这类数据会导致类型转换失败。 - 新版TensorFlow/Keras中
Adam优化器的lr参数已被弃用,改用learning_rate避免警告。
内容的提问来源于stack exchange,提问作者Yunsong Pan
相关产品推荐
相关产品推荐

