keras: возвращаемая модель.summary () против оболочки Scikit Learn - PullRequest
0 голосов
/ 24 июня 2018

Работая с керасом, я узнал, что использование обертки негативно влияет на запросы кераса и scikit learn api. Я заинтересован в решении, чтобы оба.

Вариант 1: Scikit Wrapper

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 () илиification_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', 'MultiLabel-индикатор'}

Есть ли способ, который позволяет использовать оба?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

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
_________________________________________________________________
0 голосов
/ 25 июня 2018

Функция сводки находится в этой библиотеке: from keras. models import Model Вы можете увидеть это: for example Figure

...