GridSearchCV для количества нейронов

Я пытаюсь самостоятельно научиться выполнять поиск по сетке по количеству нейронов в базовых многослойных нейронных сетях. Я использую GridSearchCV и KerasClasifier для Python, а также Keras. Приведенный ниже код очень хорошо работает для других наборов данных, но я не смог заставить его работать с набором данных Iris по некоторым причинам, и я не могу найти причину, я что-то здесь упускаю. Результат, который я получаю:

Best: 0.000000 using {'n_neurons': 3} 0.000000 (0.000000) with: {'n_neurons': 3} 0.000000 (0.000000) with: {'n_neurons': 5}

from pandas import read_csv

import numpy
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler

from keras.wrappers.scikit_learn import KerasClassifier
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from sklearn.model_selection import GridSearchCV

dataframe=read_csv("iris.csv", header=None)
dataset=dataframe.values
X=dataset[:,0:4].astype(float)
Y=dataset[:,4]

seed=7
numpy.random.seed(seed)

#encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)

#one-hot encoding
dummy_y = np_utils.to_categorical(encoded_Y)

#scale the data
scaler = StandardScaler()
X = scaler.fit_transform(X)

def create_model(n_neurons=1):
    #create model
    model = Sequential()
    model.add(Dense(n_neurons, input_dim=X.shape[1], activation='relu')) # hidden layer
    model.add(Dense(3, activation='softmax')) # output layer
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

model = KerasClassifier(build_fn=create_model, epochs=100, batch_size=10, initial_epoch=0, verbose=0)
# define the grid search parameters
neurons=[3, 5]

#this does 3-fold classification. One can change k. 
param_grid = dict(n_neurons=neurons)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)
grid_result = grid.fit(X, dummy_y)
# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
    print("%f (%f) with: %r" % (mean, stdev, param))

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


person ARAT    schedule 29.10.2017    source источник
comment
Не смотрел ваш код, но GridSearch для DL, правда? Плохая идея имхо. Чем больше нейронов вы поместите (пока не столкнетесь с узким местом), тем лучше будет (теоретически), но это не значит, что ваша архитектура также хороша.   -  person enterML    schedule 29.10.2017
comment
Я полностью понимаю тебя. Я уже запускаю эту модель с числом нейронов 8 и получаю хорошую точность. Поскольку я новичок в Python, я просто хочу провести искусственный анализ, если это возможно.   -  person ARAT    schedule 29.10.2017
comment
(1) Я не буду с первым комментарием. Это может быть верно в отношении потерь при обучении (и хороших параметров подгонки), но использование CV является жизнеспособным подходом (где более простые схемы могут быть лучше)! (2) Код невозможно воспроизвести, так как отсутствуют как минимум данные (3) Какие еще наборы данных работают? Как вы определили, что они работают? В чем разница между этим и другими? Iris на самом деле является одним из самых простых наборов данных, и возможна высшая оценка (4) Убедитесь, что вы проверяете, что оценка делает то, что она должна делать (оценка против потери; возможно, используйте какую-то явную функцию подсчета очков) (5) Проверьте предварительные результаты лучшего разрешения   -  person sascha    schedule 29.10.2017


Ответы (1)


Ха-ха, это, наверное, самая забавная вещь, которую я когда-либо испытывал на Stack Overflow :) Проверьте:

grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=5)

и вы должны увидеть другое поведение. Причина, по которой ваша модель получает высший балл (с точки зрения cross_entropy, наличие 0 эквивалентно наилучшей возможной модели), заключается в том, что вы не перетасовывали свои данные и поскольку Iris состоит из трех сбалансированных классов, каждый из ваших каналов имел один класс, например цель:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 (first fold ends here) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (second fold ends here)2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]

Такие проблемы действительно легко решаются любой моделью, поэтому у вас есть идеальная пара.

Попробуйте перетасовать свои данные раньше — это должно привести к ожидаемому поведению.

person Marcin Możejko    schedule 29.10.2017
comment
о лол да ты прав! Боже, ха-ха, теперь я ненавижу себя. Вы абсолютно правы. Я упустил этот момент, вместо этого полностью сосредоточившись на самом методе. Думаю, меня смутило перетасовка model.fit по умолчанию. Благодарю вас! И мне жаль! - person ARAT; 29.10.2017
comment
ты понял, приятель! - person ARAT; 29.10.2017