Adr*_*ian 2 python machine-learning scikit-learn keras tensorflow
我正在尝试使用KerasClassifier
包装器以使我的工作流程对 scikit 友好。但是,当我尝试将它与以下函数一起使用时,会出现错误;使用原生 Keras 模型训练模型fit()
是可行的。(这是Tensorflow 2.2.0,在conda环境中运行)
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
Run Code Online (Sandbox Code Playgroud)
以下作品:
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)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用KerasClassifier
包装器时,出现错误:
clf = KerasClassifier(model_arch(3), epochs=10)
clf.fit(X, y)
# ValueError: The first argument to `Layer.call` must always be passed.
Run Code Online (Sandbox Code Playgroud)
我在互联网上看到的每个示例似乎都与我做的相同:定义一个返回编译后的 keras 模型的函数,然后将其传递给包装器,并安装它或在管道中使用。我注意到的唯一区别是大多数(如果不是全部)示例使用 APISequential
而不是函数式 API,但据我所知这应该不是问题,对吧?
Tensorflow 文档似乎没有给出任何我们应该传递给包装器的函数类型的示例,但由于每个示例都使用与我的类似的函数,因此我认为这是正确的。
任何人都可以透露一些信息吗?谢谢。
编辑(评论后):
我像这样导入 KerasClassifier:
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
Run Code Online (Sandbox Code Playgroud)
错误日志:
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.
Run Code Online (Sandbox Code Playgroud)
KerasClassifer
需要一个构建函数,而不是模型实例本身,它在调用时返回 Keras 模型的编译实例。因此,要以最小的更改解决此问题,您必须将其包装在函数中:
clf = KerasClassifier(lambda: model_arch(3), epochs=10)
Run Code Online (Sandbox Code Playgroud)
或者,更好的方法是将模型的参数作为关键字参数传递:
clf = KerasClassifier(model_arch, n_features=3, epochs=10)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3640 次 |
最近记录: |