KerasClassifier无法拟合模型,尽管一切正常

时间:2020-09-27 19:50:07

标签: python tensorflow machine-learning keras scikit-learn

我正在尝试使用KerasClassifier包装器来使我的工作流程 scikit友好。但是,当我尝试将其与以下功能配合使用时, 给出错误;使用本地Keras模型fit()训练模型的工作原理。 (这是在conda环境中运行的Tensorflow 2.2.0)

def model_arch(n_features: int):
    i = tf.keras.layers.Input(shape=(n_features,))

    hidden_dense = tf.keras.layers.Dense(64)(i)
    hidden_dense = tf.keras.layers.BatchNormalization()(hidden_dense)
    hidden_dense = tf.keras.layers.Activation(tf.nn.tanh)(hidden_dense)

    o = tf.keras.layers.Dense(1)(hidden_dense)
    o = tf.keras.layers.BatchNormalization()(o)
    o = tf.keras.layers.Activation("sigmoid")(o)

    classifier = tf.keras.models.Model(inputs=i, outputs=o)

    opt = tf.keras.optimizers.SGD(lr=1e-3, decay=1e-6, momentum=0.9, nesterov=True)
    classifier.compile(
        loss="binary_crossentropy",
        optimizer=opt,
        metrics=["accuracy"],
    )
    
    return classifier

以下作品:

X = np.random.random((100,3))
y = np.random.random((100,)) # 'y' is a binary vector in reality

clf = model_arch(3)
clf.fit(X, y, epochs=10)

但是,当我尝试使用KerasClassifier包装器时,出现错误消息:

clf = KerasClassifier(model_arch(3), epochs=10)
clf.fit(X, y)

# ValueError: The first argument to `Layer.call` must always be passed.

我在互联网上看到的每个示例似乎都和我一样:定义一个 该函数返回已编译的keras模型,然后将其传递给包装器,然后 适合它或在管道中使用。我注意到的唯一区别是大多数(如果没有 所有)示例都使用Sequential API而不是功能性API,但是afaik 那应该没问题吧?

Tensorflow文档似乎没有提供任何示例 函数,我们应该传递给包装器,但是由于每个示例都使用一个类似的函数 我认为这是正确的。

谁能阐明一些想法?谢谢。

编辑(在评论后):

我这样导入KerasClassifier:

from tensorflow.keras.wrappers.scikit_learn import KerasClassifier

错误日志:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/adrian/miniconda3/envs/kaggle/lib/python3.8/site-packages/tensorflow/python/keras/wrappers/scikit_learn.py", line 223, in fit
    return super(KerasClassifier, self).fit(x, y, **kwargs)
  File "/home/adrian/miniconda3/envs/kaggle/lib/python3.8/site-packages/tensorflow/python/keras/wrappers/scikit_learn.py", line 154, in fit
    self.model = self.build_fn(
  File "/home/adrian/miniconda3/envs/kaggle/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py", line 799, in __call__
    raise ValueError(
ValueError: The first argument to `Layer.call` must always be passed.

1 个答案:

答案 0 :(得分:1)

import ( "context" "fmt" "github.com/fatih/color" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func mongoDbFindOne(key, value string) bson.M { var result bson.M _ = Collection.FindOne(context.TODO(), bson.M{key:value}).Decode(&result) color.Green("[+] Found: %+v\n", result) return result } 需要一个构建函数,而不是模型实例本身,该函数在调用时将返回Keras模型的已编译实例。因此,要以最小的更改解决此问题,必须将其包装在一个函数中:

KerasClassifer

或者,更好的方法是将模型的参数作为关键字参数传递:

clf = KerasClassifier(lambda: model_arch(3), epochs=10)
相关问题