【问题标题】:ERROR:The first argument to `Layer.call` must always be passed错误:必须始终传递“Layer.call”的第一个参数
【发布时间】:2021-06-03 12:50:52
【问题描述】:

我使用的是 2.5.0 版。

我将回归问题的层序列定义为一个函数,使用 KerasRegressor 类进行包装。这样做是为了让我能够执行 RandomizedSearchCV

import os
import tensorflow as tf
import tensorflow_addons as tfa
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.layers import Input, InputLayer
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, TensorBoard
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import RandomizedSearchCV

def build_model(n_hidden = 1, n_neurons = 32, input_shape = (X_train.shape[1],), dropout = 0):
  model = Sequential()
  model.add(InputLayer(input_shape = input_shape))
  for i in range(n_hidden):
    model.add(Dense(n_neurons, activation = 'relu'))
    model.add(Dropout(dropout))
  model.add(Dense(1))
  model.compile(loss = 'mean_squared_error', optimizer = 'adam', metrics = [tfa.metrics.RSquare(y_shape=(1,))])
  return model

keras_reg = KerasRegressor(build_fn = build_model)

history = keras_reg.fit(X_train, y_train, epochs = 200, batch_size = 64, 
              validation_data = (X_valid, y_valid),
              callbacks = callbacks)
mse_test = keras_reg.score(X_test, y_test)


上面的代码有效。但是,当我尝试定义另一个名为 keras_reg_A 的 KerasRegressor 并覆盖 build_model 的默认值时,我收到错误消息“必须始终传递 Layer.call 的第一个参数”(我故意忽略了回调)

build_model_A = build_model(n_hidden = 2, n_neurons = 64, input_shape = (X_train.shape[1],), dropout = 0)
keras_reg_A = KerasRegressor(build_model_A)

history_A = keras_reg_A.fit(X_train, y_train, epochs = 200, batch_size = 64, 
              validation_data = (X_valid, y_valid))
mse_test = keras_reg_A.score(X_test, y_test)

谁能解释一下这是为什么?

【问题讨论】:

    标签: tf.keras python tensorflow keras tf.keras


    【解决方案1】:

    KerasRegressorbuild_fn 参数需要是一个返回模型的函数

    fn:任意函数

    就这么简单。你读过docs吗?

    【讨论】:

      【解决方案2】:

      KerasRegressorbuild_fn 参数需要一个函数,而不是 tf.keras.Model。如果需要覆盖build_model的默认参数,可以直接传给KerasRegressor的构造函数。

      例如:

      keras_reg = KerasRegressor(build_fn=build_model, n_hidden=2, n_neurons=32, dropout=0.5)
      

      另一种选择是定义一个新函数,例如使用lambda

      build_model_override = lambda: build_model(n_hiddens=2)
      keras_reg = KerasRegressor(build_fn=build_model_override)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-11
        • 2021-07-01
        • 2021-04-20
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-29
        相关资源
        最近更新 更多