Классификация и регрессия с использованием той же нейронной сети с использованием Keras - PullRequest
0 голосов
/ 24 февраля 2019

Я хотел бы создать нейронную сеть, которая одновременно выводит метку для классификации и значение для регрессии.Я хотел бы сделать это с помощью Keras.Прямо сейчас мой код предназначен только для классификации:

 mdl = Sequential()
 mdl.add(Dense(100, activation='relu', input_dim=X_train.shape[1]))
 mdl.add(Dense(200, activation='relu'))
 mdl.add(Dense(100, activation='relu'))
 mdl.add(Dense(6, activation='softmax'))

 mdl.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

 # early stopping implementation
 filepath="weights.best.hdf5"
 checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, 
 save_best_only=True, mode='max')
 early_stop = EarlyStopping(monitor='val_acc', patience=100, mode='max') 
 callbacks_list = [checkpoint, early_stop]


 # fit network
 history = mdl.fit(X_train, y_train, epochs=2000, batch_size=32, 
 validation_split=0.2, verbose=2, shuffle=True, callbacks=callbacks_list)

Так что сейчас у меня есть функция активации softmax на выходном слое, которая соответствует вероятности, которую я использую для классификации.Как я могу изменить этот код для вывода также непрерывного значения, которое будет представлять мою проблему регрессии.Я знаю, что Keras Functional API позволяет указывать сеть с множеством входов и выходов.Кто-нибудь, кто имеет представление о том, как я могу это сделать?

1 Ответ

0 голосов
/ 24 февраля 2019

Тот же код в несколько ином шаблоне

Существует прямое преобразование вашего кода в функциональный API Keras, как показано в их документации .Вам нужно изменить объявление Sequential

mdl = Sequential()
mdl.add(Dense(100, activation='relu', input_dim=X_train.shape[1]))
mdl.add(Dense(200, activation='relu'))
mdl.add(Dense(100, activation='relu'))
mdl.add(Dense(6, activation='softmax'))

на его функциональный эквивалент:

inputs = Input(shape=(X_train.shape[1],))
layer1 = Dense(100, activation='relu')(inputs)
layer2 = Dense(200, activation='relu')(layer1)
layer3 = Dense(100, activation='relu')(layer2)
classifier = Dense(6, activation='softmax')(layer3)
mdl = Model(inputs=inputs, outputs=classifier)

(часто люди просто повторно используют одну и ту же переменную для всех промежуточных слоев, это дажесделано в примерах документации, но это ИМХО немного яснее).

Как только вы это сделаете, вы можете добавить другой выходной слой, который "ответвляется" от последнего плотного слоя layer3, и установить, что вашМодель имеет два выхода, например:

regression = Dense(1, activation='linear')(layer3)
mdl = Model(inputs=inputs, outputs=[classifier, regression])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...