WedX - журнал о программировании и компьютерных науках

Обратные вызовы Keras при выполнении перекрестной проверки

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

Чтобы изучить это более подробно, я следую блогу machinelearningmastery. и используя набор данных радужной оболочки глаза.

Это проблема классификации трех классов, и я пытаюсь использовать многослойный персептрон (пока один слой для тестирования). Моя цель сейчас — работать с обратными вызовами моделей, чтобы я мог сохранить вес лучшей модели. Ниже я пытаюсь это сделать в своем разделе network_mlp. Чтобы показать, что модель работает без обратных вызовов, я также включаю network_mlp_no_callbacks.

Вы должны иметь возможность скопировать/вставить это в сеанс Python и запустить его, без проблем. Чтобы воспроизвести ошибку, которую я вижу, раскомментируйте последнюю строку.

Ошибка: RuntimeError: Cannot clone object <keras.wrappers.scikit_learn.KerasClassifier object at 0x7f7e1c9d2290>, as the constructor does not seem to set parameter callbacks

Код: первый раздел считывает данные; вторая — модель с обратными вызовами, которая не работает; третья — модель без обратных вызовов, которая работает (для предоставления контекста).

#!/usr/bin/env python

import numpy as np
import pandas, math, sys, keras
from keras.models import Sequential
from keras.callbacks import EarlyStopping, ModelCheckpoint
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from keras.utils import np_utils
from keras.utils.np_utils import to_categorical
from sklearn.preprocessing import LabelEncoder

def read_data_mlp(train_file):
   train_data = pandas.read_csv("iris.csv", header=None)
   train_data = train_data.values
   X = train_data[:,0:4].astype(float)
   Y = train_data[:,4]
   X = X.astype('float32')

   scaler = MinMaxScaler(feature_range=(0, 1))

   # encode class values as integers
   encoder = LabelEncoder()
   encoder.fit(Y)
   encoded_Y = encoder.transform(Y)
   # convert integers to dummy variables (i.e. one hot encoded)
   dummy_y = np_utils.to_categorical(encoded_Y)

   X_train_s = scaler.fit_transform(X)

   return (X_train_s, dummy_y)

def network_mlp(X, Y, out_dim=10, b_size=30, num_classes=3, epochs=10):
   #out_dim is the dimensionality of the hidden layer;
   #b_size is the batch size. There are 150 examples total.

   filepath="weights_mlp.hdf5"

   def mlp_model():
           model = Sequential()
           model.add(Dense(out_dim, input_dim=4, activation='relu', kernel_initializer='he_uniform'))
           model.add(Dense(num_classes, activation='softmax'))
           model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
           return model

   checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
   callbacks_list = [checkpoint]
   estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0, callbacks=callbacks_list)
   kfold = KFold(n_splits=10, shuffle=True, random_state=7)
   results = cross_val_score(estimator, X, Y, cv=kfold)
   print("MLP: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

   return 0

def network_mlp_no_callbacks(X, Y, out_dim=10, b_size=30, num_classes=3, epochs=10):

   def mlp_model():
           model = Sequential()
           model.add(Dense(out_dim, input_dim=4, activation='relu', kernel_initializer='he_uniform'))
           model.add(Dense(num_classes, activation='softmax'))
           model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
           return model

   estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0)
   kfold = KFold(n_splits=10, shuffle=True, random_state=7)
   results = cross_val_score(estimator, X, Y, cv=kfold)
   print("MLP: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

   return 0

if __name__=='__main__':

   X, Y = read_data_mlp('iris.csv')
   network_mlp_no_callbacks(X, Y, out_dim=10, b_size=30, num_classes=3, epochs = 10)
   #network_mlp(X, Y, out_dim=10, b_size=30, num_classes=3, epochs = 10)

ВОПРОС: Как я могу включить обратные вызовы модели в KerasClassifier?

22.04.2017

Ответы:


1

Решение довольно близко к другому ответу, на который вы ссылались, но немного отличается, потому что они используют несколько оценок, а у вас есть только один. Мне удалось заставить работать контрольные точки, добавив fit_params={'callbacks': callbacks_list} к вызову cross_val_score, удалив список обратных вызовов из инициализации estimator и изменив save_best_only на False.

Итак, теперь подраздел кода в network_mlp выглядит так:

checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=False, mode='max')
callbacks_list = [checkpoint]
estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0)
kfold = KFold(n_splits=10, shuffle=True, random_state=7)
results = cross_val_score(estimator, X, Y, cv=kfold, fit_params={'callbacks': callbacks_list})

save_best_only=False необходим, потому что у вас не настроено разделение проверки для нейронной сети, и поэтому val_acc недоступен. Если вы хотите использовать подразделение проверки, вы можете, например, изменить инициализацию оценщика на:

estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0, validation_split=.25)

Удачи!

24.04.2017
Новые материалы

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


Для любых предложений по сайту: [email protected]