keras:返回 model.summary() 与 scikit learn 包装器

问题描述 投票:0回答:3

在使用 keras 时,我了解到使用包装器会对 keras 和 scikit learn api 请求产生不利影响。我对兼具两者的解决方案感兴趣。

变体 1:scikit 包装器

from keras.wrappers.scikit_learn import KerasClassifier

    def model():
        model = Sequential()
        model.add(Dense(10, input_dim=4, activation='relu'))
        model.add(Dense(3, activation='softmax'))
        model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
        return model

estimator = KerasClassifier(build_fn=model, epochs=100, batch_size=5)
model.fit(X, y)

-> 这让我可以打印 scikit 命令,例如 precision_score() 或classification_report()。但是,model.summary() 不起作用:

AttributeError:“KerasClassifier”对象没有属性“summary”

变体 2:无包装

model = Sequential()
model.add(Dense(10, input_dim=4, activation='relu'))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, y, epochs=100, batch_size=5)

-> 这可以让我打印 model.summary() 但不能打印 scikit 命令。

ValueError:不允许混合 y 类型,获取类型 {'multiclass', '多标签指示器'}

有没有办法可以同时使用两者?

python scikit-learn keras wrapper summary
3个回答
8
投票

KerasClassifier
只是
Model
中实际
keras
的包装,以便 keras api 的实际方法可以路由到 scikit 中使用的方法,因此它可以与 scikit 实用程序结合使用。但在内部它只使用可以通过使用
estimator.model
.

访问的模型。

说明上述内容的示例:

from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.datasets import make_classification
def model():
    model = Sequential()
    model.add(Dense(10, input_dim=20, activation='relu'))
    model.add(Dense(2, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

estimator = KerasClassifier(build_fn=model, epochs=100, batch_size=5)
X, y = make_classification()
estimator.fit(X, y)

# This is what you need
estimator.model.summary()

其输出是:

Layer (type)                 Output Shape              Param #   
=================================================================
dense_9 (Dense)              (None, 10)                210       
_________________________________________________________________
dense_10 (Dense)             (None, 2)                 22        
=================================================================
Total params: 232
Trainable params: 232
Non-trainable params: 0
_________________________________________________________________

1
投票

摘要的功能就在这个库里:

from keras. models import Model
你可以看到这个:


0
投票

与@Vivek Kumar的答案相同,只是更新为使用

scikeras
代替已失效的
keras.wrappers.scikit_learn

我保留了失效的位,只是注释掉了,并且直接在下面替换了

scikeras
行,有一些差异。

from keras.models import Sequential
from keras.layers import Dense
# from keras.wrappers.scikit_learn import KerasClassifier
from scikeras.wrappers import KerasClassifier
from sklearn.datasets import make_classification
def model():
    model = Sequential()
    model.add(Dense(10, input_dim=20, activation='relu'))
    model.add(Dense(2, activation='softmax'))
    model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

# estimator = KerasClassifier(build_fn=model, epochs=100, batch_size=5)
estimator = KerasClassifier(model=model, epochs=100, batch_size=5, verbose=0)
X, y = make_classification()
estimator.fit(X, y)

# This is what you need
# estimator.model.summary()
estimator.model_.summary()
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.