python - 张量的形状与提供的形状不兼容,Keras Tuner 中的错误
问题描述
我正在使用 Keras 调谐器。对于以下简单代码:
import keras_tuner as kt
from tensorflow.keras.regularizers import l1, l2
from tensorflow.keras.models import Sequential
# x: 100 x 20
# y: 1 x 100
tuner = kt.Hyperband(
self.build_auto_encoder_model,
objective='val_loss',
max_epochs=30,
hyperband_iterations=20)
tuner.search(x[0:80], y[0:80], epochs=30, validation_data=(x[80:], y[80:]))
best_model = tuner.get_best_models(1)[0]
def build_auto_encoder_model(hp):
model = Sequential()
regulizer_rate = hp.Choice("regulizer_rate", [1e-1, 1e-2, 1e-3, 1e-4, 1e-5])
model.add(Dense(18, input_dim=20, activation='relu', kernel_regularizer=l1(regulizer_rate)))
model.add(Dense(12, activation='relu', kernel_regularizer=l1(regulizer_rate)))
model.add(Dense(10, activation='relu', kernel_regularizer=l1(regulizer_rate)))
model.compile(optimizer=Adam(1e-2), loss='mse')
我已经尝试了不同数量的Dense
层,我收到以下错误:
张量的形状 (20, 18) 与提供的形状 (20, 15) 不兼容
但是,当完全创建一个新项目时,它可以工作。原因是什么?
解决方案
原因是由于函数代码中的一些先前错误,已创建并加载了一个对象以供将来的任何试验使用,因为默认情况下overwrite
是 turner 的变量。False
此外,在创建对象的最后一个版本中,第一层在您的示例15
中已更改为。18
解决问题的简单解决方案(而不是创建新项目)是使overwrite
变量True
以防止重新加载以前不兼容的对象进行新的更改,如下所示:
# ...
tuner = kt.Hyperband(
self.build_auto_encoder_model,
objective='val_loss',
max_epochs=30,
hyperband_iterations=20,
overwrite = True) # here
# ...
推荐阅读
- linux - 如何计算 Linux 上的 PostgreSQL 内存使用量?
- .net - Windows 10 3D 查看器的启动参数
- clang - clang 中 -mtune=native 的等价物是什么?
- c# - 如何创建谓词
在运行时动态 - python - 检查机器人框架中是否已定义变量后如何定义变量
- c# - 以编程方式将带有自定义控件的网格添加到 WPF TabControl 不会出现
- javascript - 使用 ngFor 遍历字符串中的每个字符?
- python - Python:如何在多个函数中编辑(全局)变量?
- jquery - jQuery简单的下拉菜单
- javascript - Vue 可重用的模态包装器